第三十七章 诗人和程序员
如果有人问你,诗人跟程序员有关系吗? 千万不要随便回答说没关系,虽然这两个职业看起来风马牛不相及,但实际上,诗人和程序员还真有很密切的关系。 “Ifshouldseeyou,afterlongyear.” “HowshouldIgreet,withsilenceandtears“,这两句是著名的诗人拜伦的名句, “一别经年,若再见,问候你的,是我的沉默,还有泪水“ 你会问,诗人有了,程序员呢? 别急,拜伦的女儿,AdaLovelace,是世界上第一个程序员,她的父亲是伟大的诗人,母亲是一位业余数学家,她没有继承父亲的浪漫,却继承了母亲的数学才能。 Ada帮助巴贝奇设计了世界上第一台计算机-巴贝奇的分析机。 并书写了第一个巴贝奇分析机的程序,一个解伯努利方程的程序(巧合的是,伯努利方程是流体力学的基础,也是所有飞行器上能飞上天的理论基础)。 我们今天所使用的什么fornext,什么dowhile包括子程序的概念,全部来自Ada,神奇不? Ada和他父亲一样,在最灿烂的年华就离开了,他们在世上都只呆了短短三十六载。 天妒英才,莫过于此啊。 王一男唏嘘了一会诗人和程序员之间的关系,把容与公司几个程序员,还有116所的飞控程序设计员唬得一愣一愣的。 老板就是老板啊,一个简简单单的开场白,硬生生被他弄出花来了。 他在白板上写下 “Ada”,三个字母。 “今天,我们就来讲一讲Ada” “Ada是米国军方使用的程序设计语言,也是华国大量军工企业使用的程序设计语言” “所以说兔子是最大的美粉,这是没问题的”, “当然,这样做也没毛病”,“ADA设计出来,正是为了应对软件危机的” “上世纪六七十年代,由于软件规模的扩大,质量越来越难以保证,bug增加的速度甚至超过了软件开发的速度” “所以有了软件危机一说,什么人月神话啊,什么米有免费的银弹之类的著作都是讲这些的” “后来米国国防部就针对这些问题,专门设计了一个新的语言,就是Ada” 王一男说,”我觉得Ada最成功的地方,就在于他回答了一个核心问题,什么问题呢“ ”就是在软件开发中,什么是最重要的“, “我觉得当年设计Ada的米国国防部所分析的程序设计语言设计时候考虑的优先顺序,直到今天都还是正确的”,王一男在白板上写下三个词, “稳定性“”可维护性“”表达能力“ “稳定性毫无疑问是最重要的,如果程序不能稳定运行,任何军用系统,都不可能将它投入实际使用。” “可维护性在几十年前是被忽略的,但是今天,大家越发认识到它的重要作用了,程序的生存周期越长,可维护性的重要性越高“ “程序写出来容易,但是程序就像生命一样,会跟周围的环境发生作用,会慢慢的长大,会变化,会生长,会成熟,也会老去。” “很多程序的寿命要超过人的寿命,所以,不同的人会来维护他,修改他,首先要读懂它” “读都读不懂,怎么长大?而可读性,正是可维护性中最重要的一部分” “表达能力是我给总结的,虽然从理论上来说,任何程序设计语言的表达能力跟只有向前和向后两个指令的图灵机是等价的“ “但是语言能力还是体现在无歧义啊,简洁,清晰等等上,所以最早的设计目标,跟自然语言接近啥的,被我理解为表达能力” “不得不说,米国国防部还是非常强大的” “Ada语言至少领先工业界三十年以上” “当工业界还在为挖掘每一个时钟周期的性能而绞尽脑汁的时候,人家已经把可维护性放在仅次于稳定性的位置了” “所以116所选择Ada作为飞控系统的开发语言,那是非常有远见的” 李文静在台下举手了,“你说的很好,很正确” “不过我们接下来该怎么干呢” ”难道我们重新用哥德尔系统理解的语言重写一遍飞控吗“,李文静的话还没说完呢,就听见呯呯的声音,116所的几个程序开发人员口吐白沫,瘫倒在椅子上。 ”还是我们写一套编译器,将使用Ada语言书写的飞控系统编译成哥德尔系统能够理解的语言“, 呯呯的声音又响起来了,这回是赵天成和李飞口吐白沫,瘫倒在椅子上。 ”GoodQuestion“,王一男指了指李文静,”很好的问题“, “要不怎么说咱们是最佳拍档呢” “这就要感谢我们伟大的开源事业了” “有一个开源项目,叫做LLVM的,有人知道吗” 立刻好几个人举起了手,王一男指着116所的一个程序员,“你来说说吧” “LLVM是LowLevelVirtualMachine的意思,也就是低级虚拟机,它实际上是一组规范和工具的集合,为开发现有语言的编译器,甚至设计新的程序设计语言,提供了一个非常强大的基础“ ”Perfect“,王一男夸奖了一句。 “DragonEgg有人知道吗“,王一男接着问。 这回没人举手了,李文静举手说,”龙蛋哇,这个谁不知道“ 没等王一男骂人呢,李文静坐了下来,“开个玩笑,活跃一下气氛嘛” “这是一个GCC的后端,或者说LLVM的前端,能够将GCC和LLVM连接起来”,王一男说, “GCC你们都知道吧” “废话,别侮辱我们的智商好吗”,“GCC是一组开源的编译器,包括C/C ,Fortran,当然也包括了Ada语言的编译器,我们116所目前使用的就是GCC” “好了,齐活啦”,王一男拍了拍手。他在黑板上先画了一个圆圈,然后在里面写上 “116所飞控代码”, “一共多少行代码”,王一男问116所的攻城狮, “大概四百多万吧”。 偷偷咽了一口口水,王一男在圆圈了添上”400万行“的字样。 然后在旁边又画了一个圆圈,在里面写上“GCC”,再画了一条带箭头的线,从“116所飞控代码”指向“GCC”。 “这样大家能理解吧,GCC可以编译116所的飞控代码”,王一男说。 “这步没问题,我们也是用GCC来编译成飞控计算机使用的机器代码的”,116所的攻城狮说。 王一男在“GCC”圆圈的边上又画了一个圆圈,然后在里面写上“龙蛋”两个字。 “龙蛋就是将GCC和LLVM连接起来的东西”,王一男说, 他在“GCC”圆圈添上一条带箭头的线通往“龙蛋”,然后在“龙蛋”圆圈后面又添上一条带箭头的线。 在箭头指向处,王一男打上一个大大的问号。 “看明白了吗”,王一男问。 所有的人都摇了摇头,“作者大大,臣妾真的不明白” 王一男指了指赵天成和李飞, ”我们之前在研发哥德尔系统的时候,曾经使用过LLVM,你们还记得吗?“ ”当然记得,哥德尔系统的一部分核心用的就是LLVM的IR“, ”等等“,”IR“(IntermediateRepresention),就是那个通用的中间表示,能够被LLVM输出,同时又能被哥德尔系统理解的那个东西?“ ”宾果“,王一男打了个响指, 在那个大大的问号那里,他重重地写下IR两个大字。 “这样,整个流程就全通了,我们不用重写飞控的代码”,116所倒下的攻城狮立刻坐了起来。 “也不用写编译器”,李飞和赵天成也满血复活了。 “利用现有的这些工具链,我们可以将116所的飞控代码自动编译成LLVM的中间代码” “我们现在要做的事情,只是将这些中间代码,跟前段时间我们建立的理论模型对应起来,添加必要的输入输出模块” “添加实际控制面的虚拟模型和代码” “然后,就可以用成吨的数据来训练哥德尔系统了” “简单不简单,完美不完美?”,王一男显然又把自己嗨到了,按照他的设想,现在应该是大家高呼“完美,简单”, 当然如果有识相的来一句“王一男万岁”,就更完美了。 “干活啦”,李文静一巴掌打破了王一男的幻想。 ”咱们这里面,写代码最牛是你,所以能者多劳,你就把整体框架先弄出来,我们负责补充啦“ ”老大威武“,这回,连116所的程序员也跟在屁股后面喊上了,”老大威武!“ 王一男想了一下,确实,整体框架这东西,人多了还真不一定有用,需要保证思路的一致性,让其他人来弄,他还真不放心,进度也没有保证。 “好吧,给我三天时间,我会给世界一个奇迹“ “让你们看看传说中卡马克。王”(卡马克是Doom的开发者,以独立开发游戏引擎而闻名于世,他一个人写了三代Doom游戏引擎) 王一男把自己关在一个独立的办公室里面,禁止任何人打扰他。 电话也关机,办公室里面一个冰箱是必须有的,他让人然后扛了一箱子雪碧和一箱子方便面进去,把张琪家里的那套价值好几十万的音响给勒索了过来,电话里他是这么说的,“音响没有,我就干不了活,我干不了活,116所的事情一定就砸了,116所的事情砸了,公司就开不下去了,你自己看着办吧” 之后整整三天时间,整个公司都能隐约听到重金属摇滚的声音。 三天后,门打开了,王一男胡子拉碴,神情憔悴的走了出来,对着门外的李文静和赵天成说, “git里面我刚提交了版本,你们看看吧,所有文档都在/doc目录下” “所有示例代码都在/samples目录下面” “你们叫上116所的攻城狮一起研究吧,我去睡一觉”。 “八个小时之后,所有人一起开工!”