一 : 谷歌发布新项目,旨在将Python代码编译为Go
【51CTO.com快译】Python很可能遭遇另一位强劲的编程语言对手:谷歌Go。
作为一项实验性项目,谷歌公司的Grumpy能够将Python代码转换为Go形式,这意味着Python程序将能够在编译后利用Go工具链作为静态二进制文件运行。其对Python的转换相当于创建了一款Go应用。
在一篇开源发布博文中,谷歌公司指出,该项目能够加快其Python开发型YouTube前端的升级工作。谷歌公司在此前的工作也遇到了Python用户的普遍困扰:很难利用CPython——以C语言编写的默认Python解释器——进行有效扩展。
谷歌公司表示,“我们认为Grumpy拥有远超CPython的实际工作负载扩展潜力。”
以小失换大得
尽管Grumpy需要通过Go工具链将Python代码转换为静态二进制文件,但这并不会给其运行速度带来多少影响。毕竟已经存在众多将Python编译为二进制形式的项目,考虑到Python本身的动态类型系统特性,其很难通过这种方式实现提速。举例来说,Cython只有在开发者提供静态C类型信息时才能实现加速。
根据谷歌的说法,Grumpy能够通过消除部分CPython遗留负担加速Python代码。其中提速效果最明显的是刻意舍弃对C扩展模块的支持以换取速度提升。目前存在着大量使用C扩展模块的资源库,其中相当一部分来自Python标准库(例如用于同C代码对接的ctypes)。
由于不再支持C扩展,Grumpy并不具备CPython的全局解释器锁(Global Interpreter Lock),而这通常被视为顺利实现Python并发负载运行的最大障碍。Grumpy还将使用Go的垃圾回收机制进行内存管理,而不再沿用CPython的类似机制。
Grumpy允许导入Go软件包并配合与Go模块同样的语法加以使用,从而在Python与GO之间建立起紧密的互操作性。这不禁让人联想到pythonnet项目,其允许Python与.Net程序集实现互操作性。
缺失部分
Go及其工具链目前已经被众多第三方用于开发新型语言。其中Have项目利用Go作为转换目标,而Oden项目则利用Go工具链在Haskell或者Lisp当中创建一种新的函数性语言。Oden项目已经于去年年底停止开发,不过Have项目则仍在积极推进当中。
利用Grumpy,Go的工具链将有助于帮助庞大的Python用户社区解决诸多现实难题。虽然谷歌公司的实际使用效果应该更好,毕竟Grumpy是专门针对其需求打造的项目,但我们也相信广泛Python社区同样将借此解除或者应对诸多既有障碍。不过,这一切都要视Grumpy项目的实际发展状况而定。
举例来说,Grumpy仅支持Python的早期Python 2.x语法,另外亦有众多标准库未完成移植,exec或eval这样的函数也尚无法正常使用。
而最重要的缺失部分并非对C扩展本身的支持,而是依赖于C扩展的各类资源库。失去了C扩展,意味着只有最为普通的Python脚本才能编译并运行在Grumpy的当前互操作机制之下。虽然谷歌方面也可以利用Go语言编写出相关替代方案,但其中某些大型Python库——例如NumPy——将完全不可用,而此类库正是Python整体生态系统中的重要组成部分。
原文标题:Google boosts Python by turning it into Go
原文作者:Serdar Yegulalp
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】
了解更多热点新闻,请关注51CTO《科技新闻早报》栏目!
二 : 写代码时减少bug的八种方式
在我们公司的内部邮件中有一个有趣的讨论:如何在写代码的时候减少bug。(www.61k.com]在这里总结一下,将一些结论记在这里。
对模块进行单元测试或集成测试:遵循测试-代码-测试的原理,写一些成功或失败的案例帮助你识别函数所有可能的输入和代码相应的处理。
使用工具:在java中使用 Findbugs来静态分析代码找出bug。 在Ruby应用程序中 GetExceptional能追踪所有的错误,然后将错误输出来。Selenium能很轻松的在不同的浏览器中帮助你检查网页元素是在正确的位置上。使用这些工具非常的爽,能使你工作非常轻松。
编译器警告:不要忽视编译器的警告。它能很容易帮你识别代码中的bug。在调试你代码之前,使用最高级别的警告来编译你的代码,查看是否存在明显地错误。
代码审查:在将代码提交到正式的环境中之前,让你的同事帮你审查一下你写的代码。代码审查是在其他人的代码中找出错误的一种挑战。
日志:日志工具像log4j安装非常方便的。它可以将日志分为三种类型:error, warning和info来记录代码的大量操作。通过日志很容易追踪到发生了什么。
使用现有的库:不要去造轮子。如果已经存在了经过测试的非常好的代码库,而且你又计划实现这个代码库的同样的功能,那就使用这些代码吧。这个代码库已经被很多开发人员使用过,而且它应该是经过无数次的测试的。
伪代码:在开始编写模块代码之前,写一些伪代码是非常好的方法。
避免分心:分心是缺陷代码的头号敌人。一个GTalk或者Twitter都会打断你的思路。使用类似Pomodoro的技术和类似RescueTime的工具来集中你的注意力。
英文原文:8 ways to reduce bugs while coding
三 : 编辑解读:轻量化和“偷工减料”两码事
关于“钢板厚度能否决定车辆被动安全性好坏”一直是比较争议的话题,在国内人们的传统观念中,往往钢板越厚、车身越重,意味着安全性越高。没错,这样的车身在发生碰撞时确实能够保持更好的车身完整性,但是它真的能保护车内成员的安全吗?到底什么样的车身才真正安全?众所周知,车辆的安全是由框架结构和钢板等多方面决定的,单一极端的想象是与现实不符的。在全球节能环保的大背景下,汽车轻量化已经成为了全球汽车业的发展趋势。而轻量化和“偷工减料”是两码事,想要琢磨明白,请接着往下看。
钢板厚重的车就一定安全吗?
这里所说的轻量化当然不是指某些厂家为了盈利而不顾消费者的生命安全,偷工减料。它是等同于新能源的一项新科技,是未来汽车的发展方向。何谓轻量化?在解决节能与环保这一汽车业最重要的命题时,当前大热的节能与新能源汽车技术是一条路径,另一条路径则是轻量化技术——即如何在保证安全性的前提下使汽车“瘦身”。
轻量化的意义
轻量化这一概念最先起源于赛车运动,它的优势其实不难理解,重量轻了,可以带来更好的操控性,发动机输出的动力能够产生更高的加速度。由于车辆轻,起步时加速性能更好,刹车时的制动距离更短。随着“节能环保”越来越成为了广泛关注的话题,轻量化也广泛应用到普通汽车领域,在提高操控性的同时还能有出色的节油表现。汽车的油耗主要取决于发动机的排量和汽车的总质量,在保持汽车整体品质、性能和造价不变甚至优化的前提下,降低汽车自身重量可以提高输出功率、降低噪声、提升操控性、可靠性,提高车速、降低油耗、减少废气排放量、提升安全性。有研究数字显示,若汽车整车重量降低10%,燃油效率可提高6%-8%;若滚动阻力减少10%,燃油效率可提高3%;若车桥、变速器等装置的传动效率提高10%,燃油效率可提高7%。汽车车身约占汽车总质量的30%,空载情况下,约70%的油耗用在车身质量上。因此,车身变轻对于整车的燃油经济性、车辆控制稳定性、碰撞安全性都大有裨益。
轻量化技术起源于赛车运动
轻量化如何保障乘客的安全?
轻量化的好处不难理解,然而大家最关心的问题是:车轻了,安全吗? 安全性是消费者买车最关心的问题。正因为如此,欧系车、美系车等重量较重的车型,一直以安全性在中国市场著称。而在外观、配置、油耗等方面极具优势的日、韩系车,往往给人不够安全的印象。这只是大家的认识误区吗?
其实,汽车的重量的确与安全性没有必然联系,二者并不矛盾。汽车轻量化实现途径和关键技术主要有以下几方面:
具有更高强度的轻质材料的应用
构成汽车的2万多个零件中,约86%是金属材料,且钢铁占了约80%,这表明通过材料的轻量化来减轻汽车自重有巨大潜力。目前,铝合金、镁合金、高强度钢、工程塑料和复合材料等轻质材料的开发与应用在汽车的轻量化中发挥了重大作用。
铝合金是目前汽车材料中应用最多的轻质材料,铝具有良好的机械性能,其密度约为钢铁的1/3,易加工,导热性、耐腐蚀性好,铝合金强度高,同时具有良好的吸能性。据美国铝学会的报告,汽车上每使用0.45kg铝就可减轻车重1kg,理论上铝制汽车可以比钢制汽车减重40%左右。因为铝合金具有以上优点,所以铝合金成为在汽车上使用最多的轻质材料。奥迪A8采用ASF全铝合金车身,创纪录的使用了546kg的铝合金材料,它的重量要比同等车型的钢制车身轻50%。此外,越来越多的铝制轮毂和全铝发动机出现在各种车型上,并且逐步替代传统的钢制零部件。铝合金的应用还面临一些问题,最大的缺点就是焊接工艺性差,成本控制也是关键因素之一。
奥迪ASF全铝车身框架
高强度钢也是一种广泛应用的轻量化材料,它的应用可以减少钢板的设计用量和厚度。高强度钢保留了甚至提高了钢材的优点,特别是在安全性方面。与铝、镁、复合材料等相比,高强度钢板的原料与制造价格较低,经济性较好,可以大量取代现在所用的车用钢材,支撑起乘员舱结构的钢材通常使用的都是高强度钢,甚至屈服强度是高强度钢两倍以上的超高强度钢。不过,高强度钢难成形、回弹大等问题使得加工比较困难,需对应措施来解决。
结构轻量化设计与优化
在承载式车身中,车身的结构设计和钢材的强度都是决定安全的重要因素。工程师通过强大的设计软件可以优化设计和校核汽车结构的强度和刚度,减少车身重量和钢板厚度,使零部件中空化、小型化或复合化,确保整车的质量和性能。要想在材料成本、轻量化、安全性能等多目标中寻求最佳结合点,就需要多种材料组合的使用,而针对多材料组合必须合理设计安排使用各材料的最佳的部位。高档汽车采用空间框架的结构,部件多为多功能的大型铸件,大型整体结构和高比例的锻压件,可以减少车身零件的数量,一系列的优化设计使得整车轻量化的同时提升了安全性能。
车辆的安全性主要在于事故发生时对人员的保护,而不是对车的受损程度来衡量。重量大的车跟重量轻的车碰撞,重量大的车受损程度比较小,但是人员的受损程度跟吸能式车身设计以及主被动安全配置有密切联系。例如在某些车型上通过优化的结构设计,可以更好的将碰撞吸收的能量分散到强度很高的A柱和车身底部,提高了乘客的安全性的同时也降低了对对方车辆的攻击性。
事实上,汽车的安全性对于不同部位有不同要求。比如没有缓冲区的左右两侧,必须通过碰撞钢梁等高刚性部件来提高安全性。而对于有缓冲区的前后部分,保险杠、发动机、行李箱的吸能更加重要。
车门内侧防撞梁有些采取垂直布局,还有一些采用对角线式,也就是从底部的门框一直延伸到窗玻璃的底部边缘。无论其具体位置如何,车门防撞梁都是保护乘客最直接有效的坚固结构,它可以降低乘员可能遭受的来自外部的力量。事实证明,车门防撞梁在车辆撞击固定物体(比如树木)时的保护效果非常明显。
新型制造工艺技术
关乎到车身整体结构强度的重要因素还有焊接工艺。在很多关键的位置,常常需要两种甚至两种以上的材料进行拼焊,如果焊接强度不足,车身的整体强度会大打折扣。另外,在车辆的一些位置除了靠焊接来连接之外,还要加注结构胶,以实现隔音、提高密封性或增加连接强度等目的。
因此,轻量化技术本身并不与安全性相矛盾。真正安全的车身应该是“该刚性时就刚性,该变形时就变形”。只是在实际中,可能一些车型的“轻量”并不是因为技术的进步,而是所谓偷工减料,这样才会影响到车身安全。例如,国内某些合资品牌两厢车型连基本的后防撞钢梁都没有,一旦发生严重追尾事故,坐在后排的乘客安全可想而知。
轻量化技术的发展&小结
实际上,在应对节能与环保的问题上,国际车企对于轻量化都十分重视。目前,欧洲、美国、日本等主要汽车生产厂商都在推进汽车轻量化项目。欧洲的汽车制造商正在进行“超轻型汽车”工程,力争减轻车重30%。轻量化领域,我国则相对落后。中国汽车工程学会专家介绍,目前,国际上平均每车每年自重减轻1%,国内自主乘用车较国外同类车自重高约8%~10%,国内自主商用车较国外同类车自重高约10%~15%。正是看到这种差距,我国12个整车厂和研发机构共同成立了“汽车轻量化技术创新战略联盟”,试图通过联合研发一定时间内达到跨国公司目前整车的轻量化水平。相信在不久的将来,轻量化汽车将会走进千家万户,与“新能源”技术共同打造一个更加清新环保的地球。
四 : 编译50字节代码耗费4G内存
想用宏和内联汇编做些邪恶的事情(仅仅试着做一些怪异的测试,目的无关紧要),我决定写个程序让Vistual Studio的C++编译器分配4GB的内存,然后处于卡死状态。
写个50字节的代码就可以了。
一开始我可能没注意到我的机子并没有4GB的空闲内存,疯狂的数据分页,需要找到4GB的内存,使得我的笔记本在几分钟内都毫无反应。如果你的机子有超过4GB的空闲内存,使用ETW做内存分析倒是个很好的测试,看看你可以复现我的结果吗?
我简化了代码,只留下的最基本的精华部分,只是觉得这样很好玩:
- voidtest()
- {
- __asm{addeax
- __asm{addeax
- }
这是编译器的输出:
- errorC2414:illegalnumberofoperands
- errorC2414:illegalnumberofoperands
- errorC2400:inlineassemblersyntaxerrorin‘opcode’;found‘endoffile’
- fatalerrorC1060:compilerisoutofheapspace
我是在Windows 64位上运行的,编译器是32位的大型地址进程,所以堆空间耗尽意味着分配大约4GB的内存空间。我连续进行多次编译,可以看出每次4GB的内存使用量都在飙升。
我很好奇,到底是哪部分编译程序在分配这些内存。我使用cl.exe编译器,用etwheap.bat记录了所有的堆空间和 VirtualAlloc 分配 ,并再次编译了源文件。事实证明我本应该使用wprui’s VAlloc Usage选项去获取追踪。仅仅只有几MB是从堆上分配的,大部分都是使用VirtualAlloc来分配的,如图所示:
接下来,为了完成调查,我查看了所有的调用栈。我们可以看到内联汇编程序的语法分析器正在使用它自己的VirtualHeap分配大量的Asm Tokens。VirtualHeap::Create 预留内存空间,VirtualHeap::HeapExtend提交内存。再深入研究下(没有显示)发现内存空间预留在512KB的内存块,被提交在 32KB的内存块。
还有一些细节,不是很清楚,像为什么VirtualHeap::HeapExtend调用 VirtualHeap::Create,但是却没有源代码,难以得知。
所以我们不再探究了,我像往常一样将把这个问题提交给VC++团队。如果他们解决了这个问题,我并不惊讶,这也算不上是一个严重的问题。第一次遇到这个问题时,因为我的机子没有4GB的空闲内存,所以才注意到它。
编译器是32位进程也是件好事儿,要不然它还会继续消耗内存,将远远超过4GB。条件限制万岁!
这些测试都是在VC++ 2010 的调试版本上进行的,我没试过其他版本。
Linux变体
还有一个很类似的问题(链接器在一个很简单的程序上消耗了大量内存,详情见 栈溢出)。
Windows糟透了?
我预料到有人会说Windows太烂了,这就是为什么当遇到这个问题时,我的笔记本几分钟内都毫无反应。但是如果在Linux和OSX系统上分配 (或写入)4GB的内存,并不会引发严重的系统延迟问题,但其实这说明不了什么。我的笔记本只有8GB的内存,大部分都在被使用,想获取到空闲的4GB内 存的唯一可能的办法就是把大量的数据写到磁盘上。笔记本的硬盘相当慢,如果我是在工作机子上(32GB的内存,20GB可用)或者当笔记本上只有很少的程 序在运行时(5GB空闲内存),做同样的测试,4GB内存的分配和释放不到5秒中就可以完成。
Reddit的讨论链接在这儿。
额外补充
很奇怪,怎么会有一些博客文章比其他人的更受欢迎…
有人在复现这个问题时遇到了困难,这个bug只能确定在VS2010 SP1 出现,并且test函数放在源文件的最后。
这显然不是一个严重的bug—代码也有缺陷,编译器有给出了警告并且指出问题所在,也没出现什么大问题。但是它的确是一个失败的词法分析程序。尤其 是,内存不足会阻止VC++去报告一些括号不匹配的问题—假如你在test函数之后再添加一个函数,词法分析完成后,额外的警告就会显示出来了。
编译错误代码时给出出错的信息提示是很重要的,这也是Clang的显式设计目标之一。
在 Visual Studio SP1 中复现这个 Bug 了。见下图或查看原图。
原文链接:http://randomascii.wordpress.com/2013/08/14/50-bytes-of-code-that-took-4-gb-to-compile/
译文链接:http://blog.jobbole.com/46106/
五 : 对话,减少代沟
发布时间:2017-04-11
曾经,我认为爸爸在我心里是那么高大,说出的话富有哲理,能让浪子幡然大悟。可是,随着年龄的增长,自己也有了学问和主见,总觉得爸爸说的都是错的,后悔自己错把爸爸当偶像,父女关系每况愈下。甚至在我升入初二学业更加繁重下,我用各种借口使前来跟我“聊聊”的爸爸黯然离开。
不知何时,好像有一个叫“代沟”的词横在我和爸爸之间,谁有不肯翻越。可有一次,推翻了我这个观念。有一天,我看一个视频,相信很多人都看过。视频里说“10岁以前,我骑在爸爸肩上,窝进爸爸怀里,觉得爸爸真高,需要我去仰望,正如在我心中的地位。上知天文,下晓地理,似乎就没有他答不上来的;可10岁以后,我们越来越高,渐渐能和父亲平视,甚至更高一筹,也渐渐不尊重父亲,无视,不理睬,让父亲伤透了心。”视频看到这时,我不禁愣住了。
这不就是现实中的我吗?总以代沟为理由,去漠视父亲,爸爸跟我讲话爱答不理,一次次地让爸爸欣然来找我聊天,却落寞离去。爸爸有什么错?他只不过想要和自己女儿聊天,了解自家闺女的生活罢了。突然间想到朱自清的背影,想见却无法再见,我不想再看到爸爸每次在台灯闪耀独自离去的孤独,我想听爸爸爽朗的大笑!
于是,我不再封闭自己,我开始让爸爸融入我的生活,我又感觉我在爸爸面前就像一个在沙漠中饥渴无比的人突遇一片甘霖,我想吸取爸爸话里的文化,我现在根本就不知道代沟是什么,我和爸爸有时就像一对志同道合的朋友,谈天说地,任何话题都能轻松自如地融入。现在,我们家规定了一条很重要的规矩,就是不管什么时候,我们家都必须对话半小时。
代沟,或许实有,但是我们要用对话来减少,现在的我,感觉与爸妈对话,是多么愉悦的事,他们的社会阅历比我丰富,知识面比我广泛,我做错了事,有他们指点,豁然开朗!所以,对话,是世间最幸福美妙的事!
初二:宋紫莹
本文标题:减少代码编译量-谷歌发布新项目,旨在将Python代码编译为Go61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1