中国编译器高手
㈠ 从c语言到fpga高手,我是怎么炼成的
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为 国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能给刚入行的朋友们一点点帮助。一转眼我在IT行业学习工作已经七年多了,这期间我做过网页,写过MIS、数据 库,应用程序,做过通信软件、硬件驱动、协议栈,到现在做操作系统内核和 IC相关开发,这中间走了很多弯路,也吃了不少苦。
我上的是一个三流的高校,就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了, 大一开学前的假期我就开始了学习,记得我买的第一本书是《计算机基础DOS3.0》,大家别吓着了,其实当时已经普及了DOS6.22了,只是我在书店里 看到了DOS4.0,5.0,6.0的书,以为像英语那样是第四、五、六册,记得当时到处找DOS1.0,现在想想也幸好我没有找到:)开学前我学完了 PASCAL,那时既没有计算机也没有人可以请教,我连程序是什么的概念都没有,只好死记硬背代码,然后拿纸写,我一直到大三才有了一台486,在这之前 用纸写了多少程序我也记不清楚了,只知道最长的一个我拿A4大小的草稿纸写了30 多页,我的C语言、C++ 、VC都是在这样的条件下入门的。所以说条件是可以克服的,希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房,我的心情激动的无 与伦比,但是一上机我立刻傻了眼,他们用的是英文版的Win3.1,我的那点DOS知识都见了鬼,上机提心吊胆的一阵瞎摸,一不小心把Word弄成了全 屏,怎么都还不了原,当时真是心急如焚,我以为机器被我弄坏了。第一个C语言程序,就是那个经典的HelloWorld,我调了几个星期,上机机会非常 少,也没有书告诉我开发环境(TC2.0)需要设置,而且开始我都不知道有编译器,我甚至自作聪明把写好的程序扩展名从.c改成.exe,结果可想而知。 大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了,大一下四门课挂了彩,三类学校就是这点好,挂上一二十门也照样毕业。不过扯远点 说,我那么刻苦都及不了格,可见我们国家的计算机教育有多死板。
大二准备学VC和BC,当时难以取舍,后来选了VC,不为别的,只为书店里两本书,VC 那本便宜6块钱。我的努力在班上无人能及,学的日夜不分,大三有了计算机后更是如此,很多次父亲半夜教训我说我不要命了,我一直觉得自己基础差,记忆又不 行,条件也不好,所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋,让我哭笑不得。我用的是486,16M内存,1G硬盘, 当时同学们的配置都是P166MMX,我安装 一个Windows NT4.0需要一个通宵,编译一个BC5.0向导生成的程序需要近两个小时,我的显示器是个二手的,辐射非常大,开机屏幕冒火花,看起来很酷的:),有一 次程序写的太久,觉得怎么白色的编辑器背景变成了紫色,以为显示器坏了,后来才发现眼睛不行了,不过说来也奇怪,到今天我的视力还能保持1.5,真是个奇 迹。但是就是那台破机器陪伴了我两年,让我学会了VC、Delphi、SQLServer等。后来那台机器给我阿姨打字用,据她说一天她正打的开心,一股 青烟夹着火苗从显示器钻出来,之后它才寿终正寝。
大三假期找了个机会在一个计算机研究所实习,与其说实习不如说是做义工,工作了两个月一分钱没有拿。但是这两个月对我的发展帮助很大,让我早一步了解 了社会,刚去的时候我当然是一窍不通,在那里我熟悉了网络,学会了Delphi和Oracle。由于工作很认真,得到了比较好的评价,在一位长者的引荐 下,我开始和他们一起做项目,这使我在大三大四就有了自己的收入,大四又找了两家MIS公司兼职,虽然钱不多,但是在学生期间有1000多的收入我已经非 常满足了,我终于用自己赚的钱把计算机换了。大四下开始找工作,这时我的工作经验已经比较多(当然现在想想非常幼稚),开始听父母的想去那个研究所, 实习过那个部门也希望我能去,但是不知道为什么最后不了了之,这种单位就是比较官僚,我一气之下就到了我兼职的一个公司做MIS的TeamLeader。 在大三到毕业一年的时间,做过了各种MIS,从煤气、烟厂、公安、铁路、饮食到高校,什么有钱做什么,工作也很辛苦,经常加班和熬通宵,从跟客户谈需求到 设计、编码、测试、交付都要上。那时觉得很有成就感,觉得自己还不错,现在想想真是很肤浅。
刚走上工作岗位的学生很容易被误导,各种开发工具让人眼花缭乱,同时也觉得很受公司器重,但这样工作永远是一个低层次的开发者。不要跟我说什么系统分 析有多么多么重要,多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗,国内又有几个公司能够做的很到位很规范?我是ISO9000内审 员,也在Rational公司受过多次培训,拿了4个证书,还有一个公司让我去做 CMM。这些我听过很多,但是很多事情到国内就变了性质,一个公司不是通过了ISO9000或者CMM就能规范了,我现在在一家有几十年历史的外企工作, 里面的管理不是一般国内企业能及的。作为一个毕业不久以前没有步入过社会的学生,几乎不可能在很短的时间掌握系统分析和设计,面向对象、UML只是一个工 具,关键是人本身的思想,不是说你熟悉了C++、Rose就能够做出好的设计,相反如果你具备了很高的素质,你可以用C写出比别人用C++更加模块化的程 序。
话说远一些,国内软件开发行业有一个怪圈,很多人觉得VC > Delphi > VB,真是很搞笑。这几个软件我都做过开发,说白了他们都是工具,应该根据应用的需要选择采用哪个,而不是觉得哪个上层次。如果你因为用某个开发工具很有 面子而选择的话,只能说明你很浅薄。如果说层次,那么这些工具都不上层次,因为它们用来用去都是一些系统的API,微软的朋友不会因为你记住他们多少个 API或者多少个类就会觉得你很了不起,你永远只是他们的客户,他们看重的是你口袋里的银子。我也做过系统内核,我也封装过很多API,同样我也不会看重 那些使用这些API做二次开发的客户,除非他能够作出自己独到的设计。
至于有人认为C++ > C那更是让人笑掉大牙,不妨你去打听一下,现在有几个操作系统内核是用C++写的,又有几个实时系统用的是C++,当然我也不是说C++不好,但是目前的 内核和实时系统中C++还无法与C匹敌,至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言,而在于你干什么工 作。你的设计体现了你的技术层次。
这样干了一年我觉得非常苦闷,做的大多数都是熟练工种的活,个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海,寻求更好的发展,并且打算放弃我以前的MIS转到通信行业。
写到这里不能不提到我女朋友,我们是在来上海前半年认识的,她大四在我公司实习,公司派她给我写文档,我们的感情发展的很快。她告诉我很多事情,她家 原本是改革开放的第一批暴发户,她母亲爱打牌,输掉了几百万,还欠了很多债,她有男朋友,但是她对他没有感情,只因为他给了她母亲两万多块钱,后来还强迫 她写了四万块的借条,她男朋友背叛过她并且不止一次打她,现在逼她结婚不然就要她还钱。这人居然还是一个高校的老师!她母亲把父亲给她的学费花了,因为拖 欠学费她没有办法拿到毕业证。她母亲现在有病需要钱,我拿出了自己的一点积蓄并且跟朋友们借了一些,替她交了学费并给她母亲看病(后来才知道看病的钱又不 知所终,就连她母亲是不是有病我都不知道,但她也是没有办法)。这个时候我家知道了一些事情,坚决反对我和她在一起,她原来的男朋友也极力破坏。无奈之下 我们决定早一点离开这个伤心的城市,并且瞒着我们家。由于时间仓促,我只准备了4000块钱,她仅有的几百块钱也被她母亲要去了,我买了三张票,一张是中 午的,两张是晚上的,中午我的家人把我送上船,他们一离开我就下了船,我和她乘坐晚上的船离开了这个我和她生活了很多年的城市,带走的只是一身债务。没有 来过上海的我们两个性倔强,都不愿意去麻烦同学和朋友。来到上海是傍晚6点半,我们都不知道该去哪里,我们找了一个20块钱的旅馆,这个房间连窗户都没 有,7月份的天气酷热难耐,房间里非常闷热。第二天我们开始租房子,因为身上的钱不多,我们基本都是步行,花了一个星期时间,不知道在浦东转了多少圈后找 到了一个400块的房子,但是我们都不了解上海是付三压一,还要付半个月的中介费,买了一些锅碗瓢盆后,我们身上只有800块钱了,工作都还没有着落,这 800块钱要支持到我们拿到第一个月工资,为了省钱我们自己做饭,每天买菜只花两块钱,她非常喜欢吃(也可能她在大学经常挨饿的原因),看到她现在这样省 吃俭用我真的很不忍心。她以前的男朋友也没有放过她,经常打电话来骚扰,并且来上海看她,还说了不少恐吓她的话,她过于善良,说他以前毕竟帮助过她,叫我 不要与他一般见识。以后的每天在家就是苦等面试通知,原本我想迅速找一家MIS公司解决眼前的困难,但是她坚持让我不要放弃自己的理想,终于功夫不负有心 人,我找到了一家通信公司,4000块的工资虽然赶不上MIS公司给我开出的价位,但也够在上海生存。她也找到了工作,第一天上班她哭了,这是她来上海第 一次流泪,我心里很难受也很感动。
由于是全新的行业,我把自己降到了零点,我学的VC、Delphi、数据库派不上用场,摆在我面前的是嵌入式、协议、信令一些我从未接触过的知识。我 知道我没有退路,于是拼命的学习,我把自己当做一个应届毕业生一样,一分努力一分收获,半年过去我终于熟悉了工作,并且得到了公司的表彰,薪水也加了一 级。后面的日子里我们省吃俭用,把欠朋友的1万多块钱还了,日子终于上了正轨。这时女朋友告诉我她想考研究生,我也很支持,于是她辞职在家备考。
另外,在这里我要感谢我的ProjectManager,他原来是一个大通信公司的产品经理,对人非常和善,我从他那里学到了很多知识,而且他也给了 我许许多多无私的帮助。在工作上他给我充分的空间和信任。记得公司安排我维护一个接入服务器软件,由于代码量不算太小(5万行),资料和文档都不齐全,我 维护起来非常吃力,所以想重新把它做一遍,公司领导不太支持,可能觉得工作量太大,但是他极力支持我,私下里他让我放手去做,我的维护工作他挤时间做。在 他的支持下,我花了半年时间完成了接入服务器的软件,并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP /IP和很多通信的知识,我花了一年时间终于使自己从MIS开发转到了通信行业,并且站稳了脚跟。我的开发大量是对硬件的直接操作,不再受微软的操作系 统,VC、Delhpi这些开发工具的约束,我终于看到了另外一片天空。
我做事情喜欢追根问底,随着开发的深入,软件开发与硬件联系越来越紧密,硬件知识的匮乏又对我的发展产生了障碍,而且芯片技术基本上掌握在国外公司的 手里,这对做系统级设计是一个非常大的制约,一个新产品出来,第一道利润(也往往是最丰厚的利润)常常都被IC公司如Intel、Motorola赚去 了,国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍,并打算离开通信行业,进入IC设计相关领域。
当然我明白如果我对硬件了解的非常少,没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础,学一些相关知识为以后做准 备。就像我开始从MIS转到通信一样,我看过大量通信方面的书,并且给一个ISP做过RADIUS计费分拣台,在这样的背景下这家通信公司才给了我这个机 会。我在的通信公司是做系统设计的,有不少PCB Layout硬件人员,平常我就注意向他们学习,由于我做的是软件,在公司看硬件资料不好意思,所以开始只好在家看,刚来上海工作我连续一年都在加班,后 来不加了,因为我要挤出时间学习,通常我12点左右睡,第二天5点半起,我上班比较早,地铁上如果人不多我也用来看书。学习当然不会是一帆风顺的,有些实 在不懂的问题就积累起来问硬件人员,他们的帮助使我学习进度快了很多,因为在没有人点拨的情况下自学,我的一半时间是花在解决疑难问题上,但这种问题经常 是别人的一句话就可以让我豁然开朗,我非常庆幸我有这样的学习环境。在后面的一年里,我学会了看硬件原理图,学会了简单的硬件设计(模拟电路方面还有不小 的差距),事情就是这样的,当你安安份份做软件,别人永远认为你是软件开发人员,在你开始学习硬件时别人未必会认同,有位中兴通讯的朋友还对我说过,一个 人不可能把所有东西都学完。我也明白这一点,但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的,同事们也都习以为常了。这 个时候我可以把硬件资料堂堂正正的拿到公司看,没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD(软交换的终端设备)系统方案,包含 软硬件的选型、设计等内容,这个方案得到了公司和同事们的认同,让我感到非常欣慰。
技术是相辅相成的,当我的硬件有了一定的进步后,我的软件设计也有了很大的提高,我可以从更深层次理解问题,我做的接入服务器CPU是 Motorola PowerPC860,熟悉的朋友都知道860 QMC与软件的批量数据传输通常采用BD表的方式,硬件人员做驱动的时候习惯采用固定BD表,每接收或发送数据都将数据从BD表拷贝到用户Buffer, 或从用户Buffer拷贝到BD表,由于理解的比较深入,我自己重新实现了这个过程,采用动态BD表的方式,驱动从一个网口接收数据,提交给我的软件进行 三层交换,直至从另外的接口发送出去,没有进行一次拷贝。这样的设计大大提高了性能,使系统的指标接近理论值。软硬件的结合使我的设计水平上了一个台阶。 我现在写的这个操作系统,编译后我把程序反编译成汇编,找出其中不优化的代码,然后在C程序中进行调整。举个例子,很多CPU没有专门的乘法指令,这个大 家应该都知道,在这种CPU上进行一个乘法操作常常会花费大量的指令周期,有的朋友会说这个我知道,我会尽量避免采用×号,但是事情往往不是那么简单,你 知道 C语言中数组的下标操作是怎么实现的吗?仔细看看反汇编的代码你就会明白,同样是通过下标的定位操作,C编译器会有时候会产生位移指令,但有时候会用乘法 实现,两者效率往往是天壤之别,所以明白这些问题你才能将系统性能提升到极致。这些问题就不多说了,有兴趣的话以后可以共同探讨。
话说远一点,我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识,尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常 大的帮助,否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司Project Manager那里也得到了验证。他告诉我们公司现在的802.11芯片产品的软件经理原本是做该芯片硬件设计的,某某某原本是做软件的,现在在做IC, 类似的例子还有很多,只是在国内这样的风气不是非常流行。
我有一些心得体会与大家分享,只有当我干好本职工作后,我才会学习与工作关系不大的技术,这样公司的上司才不至于反感,在入门阶段的问题我通常不去问 那些资深人士,而是问一些资历比较浅的朋友,比如刚毕业不久的学生,因为他们往往会跟你详细的讲解,而资深人士通常觉得你的问题太简单,所以回答的也很简 单,我又不好意思多问。等技术上了一定的层次后我才会问他们,他们也能给你比较深入的回答。另外,有些朋友说我机会比较好,他们也希望能从事新的工作可惜 没有机会,我听了只有苦笑,我的机会了解的人都应该知道,我没有出生在什么IT世家:)也没有谁一路提拔我,所有的路都是自己走出来的,我母亲去世比较 早,我的后母(我叫她阿姨)看着我努力过来的,一次她看我大年30还在写程序,她说像我这样努力木头都能学出来。
我的最终目的是IC而不是PCB,所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的,后面的路又要靠自己了,我买了不少相关的 书,在网上也查了很多的资料,我花了大量的时间去学习VHDL,并且用软件进行了一些简单的设计和仿真(没有设计ASIC,只是针对FPGA),随着学习 的深入,我渐渐明白了IC设计的基本流程,同时也明白了这条路的艰辛。这个时候我已经做好了跳槽的准备,我向一家业界有一定知名度的IC设计公司投了简 历,并通过了漫长的面试(4个多小时)。其他的一切我都比较满意,唯独薪资差强人意,我也明白原因,因为我是这个行业的新人,我没有经验,我再一次将自己 清零了。公司老板问我6000多一个月能不能接受,我知道他也是照章办事。想想我通信行业的朋友们,基本上都是年薪10万以上,月薪过万的也比比皆是,朋 友们也帮我介绍了不少待遇不错的公司,我该怎么选择,当时我很犹豫,我热爱我的事业,我向往我的追求,但我也是一个普通的人,我也需要养家糊口,我也想早 一点买房买车。生活给我出了一道难题。
爱因斯坦在63岁时说过“一个人没有在30岁以前达成科学上的最大成就,那他永远都不会有。”这句话给了我很大的压力和震动,我马上就26岁了,离 30只有四年时间,我必须抓紧这几年宝贵的时间,努力达到我技术上的最高峰。为了这个理想,为了能离自己的梦更近一些,我选择了这家IC公司,我明白自己 的薪资和公司刚进来的硕士研究生相差无几,但为了今后的发展只能忍受,一切又得重新开始。换行业是一个非常痛苦的过程,尤其从一个春风得意的位置换到一个 陌生的岗位,感觉象从温暖的被子里钻出来跳进冰水中,让人难以接受。在原来那家通信公司,我是唯一两年时间涨了五次工资的员工,公司和同事都给了我极大的 认可,工作上也常常被委以重任。但现在这一切都成了过去,在新的公司我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始,我把自己看作 新毕业的学生,我要用自己的努力得到公司的认可。进入新的行业是非常痛苦的,我告诉自己必须忍受这一切,虽然外面有很多诱惑,但是既然作出了选择我就不允 许自己轻易放弃。
我现在已经在这家新公司上了一个多月的班,开始非常艰难,现在慢慢适应了。第一 个月结束时,Team Leader找我谈话,说我是新进员工中最优秀的一个,我心里很欣慰,这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友,她给了我很大的支持和鼓 舞,每次在我动摇的时候她都在鼓励我,让我坚持自己的理想,刚来上海是她让我不要勉强去做MIS,这次也是她让我顶住了月薪过万的诱惑,没有她我可能不会 有今天的成绩。现在的公司有自己的操作系统,自己的CPU、DSP和其它芯片,在这里我能学到世界上最先进的技术,我们的设计开发不再完全依赖别人的硬件 和系统,这让我很开心。我打算等工作步入正轨后,全力学习新的知识,实现我的理想。在后面的两年里我给自己定下了几个目标:
努力做好本职工作,在工作上得到公司和同事们的认同;
努力学习IC硬件设计知识,多向同事请教,并利用一切机会多实践;
实现我的实时操作系统的主要部分,完成TCP/IP协议栈模块,并免费发布源代码;
和我女朋友结婚并买一套小房子,这是最重要的,因为我明白事业是可以重来的,但是珍贵的感情很难失而复得。
在这里提一下我现在开发的操作系统,它是一个实时嵌入式系统,目前支持:
a.时间片轮转调度和基于优先级调度,最多64个优先级;
b.抢占式实时内核;
c.为了便于移植,主体用标准C实现;
d.汇编代码非常少,不到100行;
e.支持任务管理,各任务有独立的堆栈;
f.进程同步和通信目前完成了Semaphore,Message Queue正在调试;
g.实现了定时系统调用;
h.可以在windows上仿真调试
我还打算下一步实现优先级反转保护,Event Flag,Data Pipe,内存管理(以前实现过)、驱动接口等。 在这之后我还会努力完善它,比如加入文件系统,协议栈、调试接口等。希望朋友们提出自己的意见和建议,在此不胜感激!
就像有的朋友说的,我的经历或许会给一些朋友产生误导,在这里我必须说明一下。我来上海以前学习过于拼命,常常晚上只睡3个多小时,我身高1米71, 那时只有108斤(我现在130多),家人也说我这样拼命活不过60岁,但是当时的我太固执,我对他们说只要能实现理想活50岁我就够了。那时的拼命使我 的身体受到了影响,有一次早上突然腰肌剧痛难忍,痛的我倒在床上站不起来。虽然我现在已经比较注意,但有时候还会隐隐作痛。后来在女朋友说服了我,来上海 以后我不再如此。我经常引用父亲的一句话,而且我也发现拼命不是办法,我可以熬一两个通宵,最多的一次我连续工作了三天三夜,但是我半个月都没有恢复过 来,这样是不是得不偿失?
学习工作应该是一个长期的过程,像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度,我要保证每天尽量有相对充沛的精 力,一些年轻的朋友觉得自己也应该拼命努力,这让我多少有些担心,如果我的故事能让你在学习工作上多一点兴趣,我会感到很开心,但如果误导了某些朋友,让 你做一些不值得的付出,我会感到很内疚。
㈡ 什么是计算机高手,电脑高手,密码高手,编程高手呢举例说明
这么说吧,前两者,计算机高手,电脑高手,其实这个称呼很笼统,举例子的话:修电脑修的好的,精通操作系统配置设置的,而且就包括后者的编程高手其实都包括在内.而这前两种称呼呢,一般都是不太懂这些东西的朋友一种笼统的称呼,而如果细化的来看,就可能有很多种了,
咱们看看密码高手,这种人精通破译密码,你总看谍战片对吧?那里面就有人很精通破译敌人电报密码,这个不一定是电脑领域的,只不过现在在IT界安全变得很棘手,而试图进行密码破译的人很多.举例说明的话,你看你系统设置的那个管理员密码,那个其实就可破解,就是由精通破解的朋友写出程序然后开机直接进入另一个系统就可以破解掉了.
编程高手呢?就是写代码很厉害的,写代码你懂吗?编程序,因为你所有用的程序都是要有人去写代码再由编译器编译出来的.写代码的人很多,厉害的也很多.这个标准嘛,就是你写出的程序运行快,占用资源少,别人写1天的你1小时就搞定了,别人实现的很头痛的功能你很轻松就实现了.包括现在跟你交流的这个网页,都是需要人写的.嗯就是这个样子,例子实在太多了举不胜举
㈢ 有人超越C++之父吗
C ++ 的 背 影
——C++之父Bjarne Stroustrup印象 左轻侯 2002.11.4
热爱C++的朋友请不要误会,我并不是在暗示“C++已经日薄西山”,或者任何类似的意思。从语义上来说,C++作为一门编程语言,当然不会有什么背影。事实上,我想说的是一个人的背影。因此这个题目显得有点突兀,甚至哗众取宠。但是我想,在C++社群中,每一个人都会同意,有一个名字就是C++的象征。这个名字当然就是Bjarne Stroustrup。
Bjarne Stroustrup博士,1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责人,AT&T 贝尔实验室和ACM成员。1979年,Stroustrup开始开发一种语言,当时称为"C with Class",后来演化为C++。1998年,ANSI/ISO C++标准建立,同年,Stroustrup推出其经典着作The C++ Programming Language的第三版。
2002年10月,Stroustrup首次访问中国。
接触IT界的时间越长,我就越明显地发现,那些曾经在媒体上喧嚣一时的话题,往往只是些无关紧要的事情,而真正有着深刻意义和影响的大事,却很容易默默无闻。
Stroustrup的访华,在技术圈子里引起了很大的轰动。多少年来,中国的程序员一直通过翻译的着作这样的间接渠道(往往滞后时间很长),在黑暗中辛苦摸索。直到互联网普及之后,我们才能够通过网络在第一时间追踪最新的技术,与国外的同行进行技术交流,慢慢地、一步步地拉近与世界的距离。今天,我们终于有机会当面请教这位世界级的大师,直接聆听这个领域中最权威的声音。我们再也不用费尽心思去琢磨蹩脚翻译背后的作者的思想,不用迷惑于那些经常出自于一知半解的专家之口、不知道经过多少次转述、真伪难辨的惊人之论了。在得知Stroustrup访华的消息之后,我就和一些朋友谈到,这是一个开始,希望中国的技术界能够契此机会,依靠大家的努力,与国际上的技术社群建立稳定的交流机制,希望这件事标志着中国的程序员们不再是一个孤立、被国际社会遗忘的群体,真真正正成为世界大家庭的一员。
不过,除了主办方做的一些宣传之外,Stroustrup的到来,几乎没有见诸于任何主流媒体,虽然Stroustrup的成就和对计算机界的影响力,足以与当代任何一个人相比,虽然这次事件的意义,远远超过许多国内IT圈子里的鸡毛蒜皮。
Stroustrup的这次访华,行经北京、西安、杭州、上海四个城市,时间长达半个月。在此期间,我有幸见过他三次。
第一次是他刚刚到达北京的第二天,华章的两位朋友请他在北海后门的一家饭店吃饭,留了一个机会给我和他共进晚餐。我至今对北京的堵车痛恨无比,因为那天正好是周末,加上大雨,我竟然比预定的时间晚了一个多小时到达目的地。当我气急败坏地冲进那家饭店时,一眼就看到,在最靠里面的角落里,华章的两位朋友中间,坐着一位老外。
他站起来,很有礼貌地和我握手。他本人和那张着名的照片(在C++社区中尽人皆知)上的样子很象,有点秃顶,衣着随便,与其说是一位来中国访问的专家,不如说是一个在自己家中随意进餐的蓝领。我用英语结结巴巴地解释了迟到的原因,他点着头“哦”了好几声,一副“理解理解”的样子,仿佛他也曾深受堵车之苦。虽然我们素昧平生,但对方的神情和简单的几句话,却一下子拉近了我们的距离。这句话听起来象书上的套话,但身临其境的我,却的确有这样的感觉。
在这次见面之前,我曾经想象过Stroustrup会是一个什么样的人,会不会比较高傲。因为我知道,大凡超群绝伦的人物,往往在性格上都有一些偏执,何况以C++之父的身份?但是和我想象的完全相反,Stroustrup非常和善,具有技术人员特有的那种极佳的幽默感,很爱笑,甚至可以说有点天真。当我说了一句倾慕的话之后,他居然会象个孩子一样不好意思。
饭店里很吵,其实不是谈话的好地方。我的口语水平本来就不好,大学毕业后又荒废了好几年,但是面对Stroustrup,不知为什么,我居然勇气百倍,用这种洋泾滨英语连说带比划,跟他说了一些事情。我告诉他,我翻译过他的一个关于C++的风格与技术的FAQ,而且正在阅读他的名着《C++程序设计语言》;我告诉他,中国有很多C++程序员,大家期待他的到来已经很久了;我告诉他,中国的程序员缺乏与国外社群的交流,希望我们能够推动这种交流;我还为自己的口语水平而道歉(BS很理解地回答英语也不是他的母语),希望能够通过Email交流……
然后Stroustrup用一连串低沉的英语作为回答,但并不是那种严肃的学术性的发言,而是说得很随意,也很投入,显然他在打动别人之前先打动了自己。说得精彩之处,他会左顾右盼,然后和我们一起开怀大笑。
这是一家普通的饭店,菜也是很普通的菜。BS和北京街头随处可见的老外并没有多少区别。说着说着,我突然有一种冲动,我想,这些坐在我们旁边自顾自高谈阔论的人,会不会知道角落里这个谈笑风生、自得其乐的老外,就是一位震铄当代的大师,一位为人类做出过伟大贡献的人?
“人和人,真的是很不一样……”我想。
由于BS明天一早还要赶飞机去西安,所以我们相聚的时间相当有限。出了店门,我们挥手告别。我的收获是BS在《C++程序设计语言》中文版上的签名和一张合影。
回到家里,整个夜晚我都在房间走来走去。同租的室友问我:“你今天好象很激动啊?”
“当然,”我回答说,“因为我见到了这个领域的巅峰。”
Stroustrup的行程是先到北京安顿,然后飞往西安,按照西安-北京-杭州-上海这个顺序进行正式访问。在等待Stroustrup回北京的时候,我在csdn上看到了一个贴子:《Bjarne Stroustrup在西安的讲座很令人失望》。点进去看,倒不是对讲座的内容失望,而是批判举办活动中的一些现象,这也正是我最担心的。其实我知道举办方作出了很大努力,有些技术上的问题情有可原,对于这次事件本身来说,算不得什么大不了的事情。但是触动我的是,文中说到Stroustrup演讲完以后,听众们提问的情况。贴子的原文如下:
“……那位主持人在宣布开始提问后,就走了出去,之后混乱的场面就开始了,我坐在地板上听了几个问题,大多是问C++、C#、Java哪门语言更好之类的问题,这些人可能并不了解Bjarne Stroustrup,他本人早都说过不会对语言的优劣进行评述,可这些人还是不停的问,甚至还有人问Bjarne Stroustrup,在计算机和自己的女朋友当中他更喜欢哪一个?是不是更喜欢计算机?这种问题,我不想作什么评论,好好的机会,就这样......唉!!我可以明显的看到Bjarne Stroustrup的脸上有不悦的表情。在看到前面的人越聚越多,并开始拼命的想抢到话筒的时候,我决定还是早点离开为妙,我从地上站起身来,拍拍身上的尘土,大踏步的离开了。”
我以前并没有和Stroustrup打过交道,也不知道他对中国的印象如何。我曾猜想过,Stroustrup是如何看待中国的?是不是把我们当作一个遥远的蛮荒之地来看待,就象我们看待非洲某个小国一样?如果真是这样,那也一点都不奇怪,毕竟中国在国际上的形象是一个IT市场,而不是一个IT领跑者。当然随便进行这种猜测是不礼貌的,但是那也要我们能够赢得人家的尊敬才行。当得知有见到Stroustrup的机会时,我和朋友曾经互相勉励:“不要丢中国程序员的脸啊。”
一年多以前,我曾对朋友说过:“这几年中国程序员的水平是长进了很多,以前是不知道自己水平有多差,现在是知道自己水平有多差了。”IT技术的核心在国外,我们开放国门的时候也并不长,水平比不上人家,是没有办法的事情。知道自己水平差以后,无非是两点,一是要承认现实,二是要想办法追赶。
进入计算机这个行业以来,我已经见过了无数自以为或被人以为是高手的妄人,种种气焰无庸详说,尽管在Stroustrup面前他们连学生的资格都远远够不上。中国到底有多少人在使用C++?有多少人对C++有深入全面的了解(虽然我知道水平高的人肯定是有的)?我们的民族软件产业,到底是由一群什么人在支撑?
期待中的大师终于来了,期望中的face-to-face的交流场面也终于出现了,面对显示器屏幕,我突然有一种莫名的孤独苍凉的感觉。
第二次见到Stroustrup,也是在饭店里,由我作东,北京的几个程序员朋友和他进行一次小范围的交流。该死的历史又一次重演了,又是周末,又是大雨,我又一次迟到了。不同的是,当我再次气急败坏地冲进饭店时,看到了不同的场景。Stroustrup一个人坐在桌子的一边,左右座位都是空的,其他人坐在他的对面,大家都不说话,只有他一个人在默默地吃东西。他好象已经习惯了我的迟到,问了我一句:“You got lost?”
也许是受到了这种气氛的影响,我坐在他旁边的时候,一时居然不知道应该说什么好。虽然我很想为他在西安的遭遇说几句道歉的话,但又开不了口。
他拿起手头的一份英文报纸,指着上面的Texas大学对我说:“A small world.”原来他已经受聘担任Texas大学的教授了。我问:“Then you leave AT&T?”他说AT&T仍然保留了他的位置。我还问过他关于Lippman加入微软担任VC.net首席架构师的事情,与我的预料不同,他似乎对微软的编译器评价很高。
但是总的来说,这一次Stroustrup比上一次要沉默得多,很少发笑,大多数时候都在默默吃东西。我终于忍不住,问了一个也许不太礼貌的问题:“Do you feel lonely in China?”Stroustrup没有听明白“lonely”这个词,当他弄明白了之后,很严肃地说:“No.”他指指对面,又指指外面,说(当然是用英文):“他们,还有很多人,他们都给了我很好的待遇。”“希望中国能给您留下一个好印象。”“现在就已经是这样了。”但愿如此。
吃完饭后,Stroustrup去宾馆接受一家媒体的采访。我和几个朋友继续聊天。虽然他们和我一样,因为口语水平的限制,没有能和Stroustrup畅所欲言,但是兴奋之情都溢于言表。有一位还嚷嚷着要去报考Stroustrup的研究生,虽然后者说他已经收到了数以千计的application。
在白石桥的人行天桥上,望着黑暗的天空下来来往往的车流,我对一个朋友说,我为Stroustrup感到不平。象比尔·盖茨、拉里·埃利森这种人访华,都会享受国宾级的待遇,媒体上也会铺天盖地地宣传。Stroustrup无论从成就还是从影响力上来说,都和他们是一个层次的,为什么他的中国之行会这样朴素、低调、默默无闻?对方略作思考后回答,因为盖茨和埃利森都身为大商业公司的首脑,可以直接影响中国的市场和政府。而Stroustrup虽然发明了C++和实际掌握着C++语言的标准,但他对业界的影响并不那么直接,他本人也不是有钱人。我说:“这个我也知道,但我还是为他感到不平。”
Stroustrup在1979年发明C++语言,至今已经二十多年,一直在为C++的完善、发展和标准化而奋斗。在在Stroustrup的理想中(也是他一直在不懈提倡的),C++应该是一种中立的、开放的、不依赖于任何平台的、不被任何一家商业公司所操纵的语言,它的标准掌握在ISO C++标准委员会中。在这一点上,C++和Delphi与Java这样的语言有着本质的区别。
虽然C++出现得很早,但是它的ISO标准经过千锤百炼,迟至1998年才正式出台。Stroustrup不满商业公司为了自己的利益,把C++变成各种乱七八糟的方言,花了很多心血在C++的标准化工作上面。在来自世界各地的志愿者们的共同努力下,新的C++标准和标准库都已经臻于完美。从这个意义上来说,Stroustrup创立的不仅仅是一种语言,而是一种文化。Stroustrup成功了(C++也许是当前使用最广泛的通用工业语言),但他仍然有很多事情要做。Stroustrup的这次中国之行,可以看作是他和他的理念与中国软件界的一次正面接触。从我看到的情况来说,至少中国软件界的气氛,与Stroustrup浑身上下的气质并不那么相投。
网上有一个所谓IEEE对Stroustrup专访的文章,很明显是一个愚人节笑话,内容是Stroustrup宣扬他故意将C++设计得难以学习,是为了提高程序员的薪水。不知哪位好事之徒把它译成了中文,导致了我几乎在常去的每一个论坛(包括非技术性的论坛)上都发现了这个东西的转贴(有时还是一而再再而三的转贴),底下跟着一大堆煞有介事的评论。在后来的通信中,我把这个事告诉了Stroustrup,他显然当成了笑话来听,回答说:“It doesn't matter as long as they don't believe it.”
我该怎么回答他,告诉他其实大家都信以为真?
最后一次见到Stroustrup,是在北京大学的一个C++语言研讨会上。前一天在清华的演讲我没有去,据说相当成功。北大的这个研讨会是内部性质的,规模不大,实行凭证入场的方式,应该是保证了参与者的质量。与会的还有几位重量级的人物,包括《C++程序设计语言》的译者、北大的裘宗燕教授,另外慕名而来的估计也不少。
我无论如何不能再迟到了,提前一个小时到了会场。我刚到,就陆陆续续有人进来了,一边互相打听着“C++之父的研讨会是不是在这里”。很多人带着Stroustrup着作的各种版本,估计是来寻求签名的。终于,Stroustrup在华章公司和北大计科系的人的簇拥下出现了,今天他看起来精神不错。
首先是Stroustrup做了一个题为《Speak C++ Like a Native》(将C++作为一种母语)的演讲,概要地说明了C++的设计思想和几种编程风格。内容比较基础,而且在西安交大和清华做的演讲也是这个,我没有太在意。接下来是由举办方邀请的人进行比较正式的发言,裘宗燕第一,熊节第二,我排在第三个。我提的是一个关于通过C++语言开发跨平台程序的问题,询问C++为什么没有一个象Delphi那样的跨越平台的framework,以及将现有的标准库是否有往这方面发展的意向。这个问题发挥的弹性很大,可以详细讨论,也可以几句话带过去。但是Stroustrup象回答前两个问题一样,非常详尽和耐心地做了回答,从C++的目标和定位说起,谈到标准库和商业公司的专有库的区别,谈到因为资金问题标准库不太可能发展成为包罗万象的framework,最后建议我可以尝试一些比较优秀的第三方库。在说话的时候,Stroustrup一直注视着我的眼睛,不断打着手势,认真得让我有愧疚的感觉,因为我的理解往往跟不上他的言锋。
最精彩的是自由答问时间,很多人都已经跃跃欲试了。我已经无法详细地回忆起当时的具体情形,总之发言非常踊跃。在我的印象中,似乎没有出现特别有创意的问题(当然在这种即兴发言中,很难出现这种好问题),不过大多数的问题都有相当的水平。其实不用听他们问的内容,只需要看到那一张张神情专注而略显紧张的年轻的脸,就能够让人产生一种熟悉而亲切的感觉……毋庸讳言的是,其实有不少问题纯属浪费时间,因为类似的问题Stroustrup早已经回答过许多次了,在网上稍微查找一下就能找到答案。这种情况应该可以从一个侧面说明,中国程序员作为一个整体,与国外的交流还是太少了,仍然缺乏放眼世界的胸襟和眼光。
“Stroustrup真可怜,被人一遍又一遍地问这些同样的问题,”负责陪同Stroustrup的一位朋友忍不住嘀咕说,很容易想象,这种场面他已经见过好多回了。尽管如此,Stroustrup仍然不厌其烦地解答着每一个问题,认真得让人想起近代历史上的传教士,这份耐心真是让我佩服无己。很显然,今天他兴致很高,特别是遇到了good question的时候,发挥的时间远远超过了预定的期限。几个小时的热烈讨论,让Stroustrup已经略显疲态,后来不得不背靠着墙壁说话(不知为何,他就是不愿意规规矩矩地坐着,整个自由答问期间都是采用站立的姿势,甚至常常用一只脚踩在椅子上)。但是当主持者向他示意时间已到,可以结束时,他却摇手反对,表示要继续讨论下去。现场发出了一片善意的笑声……
晚饭由北大的一位副教授做东,作陪的有华章的几位编辑,C-View的孟岩和王昕,科泰的陈榕。陈榕在微软工作过多年,英语很好,和Stroustrup聊了很长时间,谈的是业界的一些事情,基本上没有涉及技术问题。
曲终人散,我们走出北大的校门,Stroustrup将在第二天飞往上海。临上车之前,他很严肃地和我们中的每一个人握手道别,并表示感谢。不知中国之行带给他的是什么?但我知道,他带给我们有很多,包括以后建立的联系。在北京的夜色中,这个年过五十、头发已经稍微有些花白的丹麦人转身离去,留下一个沉默的背影。
再见,Stroustrup。
㈣ 为什么要学习编译原理(转)
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名着的相关数论。 推荐参考书 虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java那样的编译器来说还是太难了。不仅写编译器困难,学习闷数编译原理这门课程也比较困难。 第一本书的原名叫《CompilersPrinciples,Techniques,andTools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐?砘?嘴域确实?忻?所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是着名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译蚂罩首原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。 第二本书的原名叫《ModernCompilerDesign》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。 第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器TinyC.等你把整本书看完,差不多自己也可以写一个TinyC了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。 推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。 编译原理的实质 几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间闷悉代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。 词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。 语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。 等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。 关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。 本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。 关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢? 编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课
㈤ 现代C/C++编译器有多智能
最近在搞C/C++代码的性能优化,发现很多时候自以为的优化其实编译器早就优化过了,得结合反汇编才能看出到底要做什么样的优化。
请熟悉编译器的同学结合操作系统和硬件谈一谈现代c/c++编译器到底有多智能吧。哪些书本上的优化方法其实早就过时了?
以及程序员做什么会让编译器能更好的自动优化代码?
举个栗子:
1,循环展开,大部分编译器设置flag后会自动展开;
2,顺序SIMD优化,大部分编译器设置flag后也会自动优化成SIMD指令;
3,减少中间变量,大部分编译器会自动优化掉中间变量;
etc.
查看代码对应的汇编:
Compiler Explorer
【以下解答】
举个之前看过的例子:
int calc_hash(signed char *s){ static const int N = 100003; int ret = 1; while (*s) { ret = ret * 131 + *s; ++ s; } ret %= N; if (ret < 0) ret += N; //注意这句 return ret;}
【以下解答】
举个简单例子,一到一百求和
#include int sum() { int ret= 0; int i; for(i = 1; i <= 100; i++) ret+=i; return ret;}int main() { printf("%d\n", sum()); return 0;}
【以下解答】
话题太大,码字花时间…
先放传送门好了。
请看Google的C++编译器组老大Chandler Carruth的演讲。这个演讲是从编译器研发工程师的角度出发,以Clang/LLVM编译C++为例,向一般C++程序员介绍理解编译器优化的思维模型。它讲解了C++编译器会做的一些常见优化,而不会深入到LLVM具体是如何实现这些优化的,所以即使不懂编译原理的C++程序员看这个演讲也不会有压力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
演示稿:https://meetingcpp.com/tl_files/mcpp/2015/talks/meetingcxx_2015-understanding_compiler_optimization_themed_.pdf
录像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不开请自备工具…)
Agner Fog写的优化手册也永远是值得参考的文档。其中的C++优化手册:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog
要稍微深入一点的话,GCC和LLVM的文档其实都对各自的内部实现有不错的介绍。
GCC:GNU Compiler Collection (GCC) Internals
LLVM:LLVM’s Analysis and Transform Passes
========================================
反模式(anti-patterns)
1. 为了“优化”而减少源码中局部变量的个数
这可能是最没用的手工“优化”了。特别是遇到在高级语言中“不用临时变量来交换两个变量”这种场景的时候。
看另一个问题有感:有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? - 编程
2. 为了“优化”而把应该传值的参数改为传引用
(待续…)
【以下解答】
推荐读一读这里的几个文档:
Software optimization resources. C++ and assembly. Windows, Linux, BSD, Mac OS X
其中第一篇:http://www.agner.org/optimize/optimizing_cpp.pdf
讲解了C++不同领域的优化思路和问题,还有编译器做了哪些优化,以及如何代码配合编译器优化。还有优化多线程、使用向量指令等的介绍,推荐看看。
感觉比较符合你的部分需求。
【以下解答】
一份比较老的slides:
http://www.fefe.de/source-code-optimization.pdf
【以下解答】
利用C++11的range-based for loop语法可以实现类似python里的range生成器,也就是实现一个range对象,使得
for(auto i : range(start, stop, step))
【以下解答】
我觉得都不用现代。。。。寄存器分配和指令调度最智能了
【以下解答】
每次编译poco库的时候我都觉得很为难GCC
【以下解答】
有些智能并不能保证代码变换前后语义是等价的
【以下解答】
诶诶,我错了各位,GCC是可以借助 SSE 的 xmm 寄存器进行优化的,经 @RednaxelaFX 才知道应该添加 -march=native 选项。我以前不了解 -march 选项,去研究下再来补充为什么加和不加区别这么大。
十分抱歉黑错了。。。以后再找别的点来黑。
误导大家了,实在抱歉。(??ˇ?ˇ??)
/*********以下是并不正确的原答案*********/
我是来黑 GCC的。
最近在搞编译器相关的活,编译OpenSSL的时候有一段这样的代码:
BN_ULONG a0,a1,a2,a3; // EmmetZC 注:BN_ULONG 其实就是 unsigned longa0=B[0]; a1=B[1]; a2=B[2]; a3=B[3];A[0]=a0; A[1]=a1; A[2]=a2; A[3]=a3;
【以下解答】
提示:找不到对象
【以下解答】
忍不住抖个机灵。
私以为正常写代码情况下编译器就能优化,才叫智能编译器。要程序员绞尽脑汁去考虑怎么写代码能让编译器更好优化,甚至降低了可读性,那就没有起到透明屏蔽的作用。
智能编译器应该是程序猿要较劲脑汁才能让编译器不优化。
理论上是这样的。折叠我吧。
【以下解答】
编译器智能到每次我都觉得自己很智障。
【以下解答】
虽然题主内容里是想问编译器代码性能优化方面的内容,但题目里既然说到编译器的的智能,我就偏一下方向来说吧。
有什么更能展示编译器的强大和智能?
自然是c++的模版元编程
template meta programming
简单解释的话就是写代码的代码,写的还是c++,但能让编译器在编译期间生成正常的c++代码。
没接触过的话,是不是听上去感觉就是宏替换的加强版?感觉不到它的强大呢?
只是简单用的话,效果上这样理解也没什么
但是一旦深入下去,尤其翻看大神写的东西,这明明看着就是c++的代码,但TM怎么完全看不懂他在干什么?后来才知道这其实完全是另外一个世界,可是明明是另外一个世界的东西但它又可以用来做很多正常c++能做的事....
什么?你说它好像不能做这个,不能做那个,好像做不了太多东西,错了,大错特错。就像你和高手考试都考了100分的故事一样,虽然分数一样,但你是努力努力再努力才得了满分,而高手只是因为卷面分只有100分.....在元编程面前,只有想不到,没有做不到。
再回头看看其他答案,编译器顺手帮你求个和,丢弃下无用代码,就已经被惊呼强大了,那模板元编程这种几乎能在编译期直接帮你“生成”包含复杂逻辑的c++代码,甚至还能间接“执行”一些复杂逻辑,这样的编译器是不是算怪兽级的强大?
一个编译器同时支持编译语法相似但结果不同却又关联的两种依赖语言,这个编译器有多强大多智能?
写的人思维都要转换几次,编译器转着圈嵌着套翻着番儿地编译代码的代码也肯定是无比蛋疼的,你说它有多强大多智能?
一个代码创造另外一个代码,自己能按照相似的规则生成自己,是不是听上去已经有人工智能的发展趋势了?
上帝说,要有光,于是有了光。
老子曰,一生二,二生三,三生万物。
信c++,得永生!
===
FBI WARNING:模板元编程虽然很强大,但也有不少缺点,尤其对于大型项目,为了你以及身边同事的身心健康,请务必适度且谨慎的使用。勿乱入坑,回头是岸。
【以下解答】
c++11的auto自动类型推断算么....
【以下解答】
智能到开不同级别的优化,程序行为会不同 2333
【以下解答】
这个取决于你的水平