测试评价了一些非主流编译器……极度杯具
导师的任务完成的差不多了,考研也复习差不多了,这两天有空把Windows下能跑的十几种编译器编译选项、优化效果等研究了一下。
每种编译器的编译、链接选项我都从头到尾看了,收获挺不小的,以以前使用VC和gcc的经验,各种其他编译器的编译连接选项都不算晦涩了,基本上各种编译器分别适合不同情况的最优化编译选项组合能排出来了。不过对于VC和gcc之外的编译器,我的感觉除了失望基本没有其他的想法……
主流编译器就是VC和gcc两种,其他的或是非主流、或是过气的老编译器,而这些非主流和过气编译器里,过气编译器的表现明显强于非主流的开源编译器。
PS:自带IDE比较强大的就用他们自己的,否则就用codeblocks配置一个环境,主要是测试编译选项比Makefile方便。
先从体积优化说起,这个非常直观,坊间谣言总是说微软在编译器中动了手脚加了垃圾,VC的程序最大,其实恰恰相反(坊间很多对于微软的谣言,实在不太理解,可能这就是强者效应吧,垄断组织、强权政府的谣言总是很多,但往往失实……),VC的体积优化是最强的,用简单程序测试,其生成代码是最紧凑的,垃圾也是最少的,唯一算得上垃圾的也就是那个dos头后面的rich signature,几十字节,非微软的编译器都没有。VC和gcc是仅有的两个能将helloworld小程序编译到500多字节的编译器,其他的编译器都在1KB以上,普遍在3~5KB,也是动态链接API或CRT,也是调整了entry和alignment,但是这些个非主流编译器都会放大量的垃圾信息在exe文件里,甚至于c源文件的名称、路径、自定义函数名这种东西也会编译进去,链接还去不掉这些,运行库、API导入库也非常不合理,明明只调用一个库函数或API,连进去的东西一大堆,明明没有使用运行库,也逼着我连接crt(我的习惯是先禁用默认库,再将需要的库连接,这样非常清晰),不像VC和GCC指定入口点之后可以完全抛弃运行库。体积测试,最终的第一名是VC5.0,编译出来的和MASM win32汇编一样大,并且其在效率测试里也仅次于gcc和vc6排第三………………呵呵,VC5是VC现代化的起点,为后来的VC定了形的,由于效率测试中普遍使用的是crt,crt库偏慢(有许多安全增强,并且全部是多线程安全的)的VS2003,VS2005、VS2008就落后于VC5/6和gcc了,不过仅仅在0.5~3%……
废话了那么多,其实现在才是正题,评价一下几个非主流/过气编译器吧。
openwatcom:曾经的dos游戏专属编译器watcom死掉后的开源版本,虽然版本号只有0.9.25,但是却是从watcom 11.0发展而来,实际上在非主流编译器里openwatcom是最成熟的,也是最可靠地,无论效率优化测试,体积优化测试表现都非常号,效率基本和VS03齐平,比VS05和VS08快,相信也是watcom一向的长项——crt库的功劳,体积测试api版helloworld只有2kb,printf版1.5kb,和VC不指定alignment是基本一样,openwatcom的alignment理论上也可以很小,但是只有默认的512能正常运行……256都报错,VC可是能指定到4的!相对于dos时代的效率之王,openwatcom褪色不少,但相对于其它的非主流编译器,openwatcom是很优秀的,值得一提的是,他的自带ide很不错,编辑功能虽然不强,但是编译、连接选项却很全面,我这种深受VC影响的人,特别喜欢这样的IDE,可以直接替代编译器的文档,而即便如此openwatcom的文档也是非主流里最丰富的。
borland C++:3.0版是dos时代使用最广泛的编译器,除了本身很优秀,一半的功劳来自于它的IDE,因为从纯效率来说不如当时的watcom,但是用户界面却友好了许多,虽然他是16位的,生成的也是16位程序,但效率测试仅比主流的VC、gcc慢10%左右(这是不是也说明Windows 16位虚拟机很高效,我的感觉就像.net一样,启动慢,但运行极快)。当时与borland C++竞争的主要是VC 1.x系列(而watcom一般用来做最后生成产品,VC和BC才是开发中使用的),VC 1.52的exe比BC几乎慢了一倍,编译成com文件速度倒是差不多……3.0版之后,BC迅速走下坡路,4.x版失败不用多说,5.5版被某些人吹得像神(就因为免费?),但现实是——和同时代的VC6相比,效率和体积优化都被压制了……当然,总体上来说,5.5版虽然不神奇,但仍算得上一款优秀的编译器,毕竟标准的支持比VC6要好得多,算是和VC6平手吧。再之后,borland就开始吃老本了,后面的c++ buider我基本无视…当然微软出了VS03之后,也在吃老本,看VS2010的表现了。
lcc:貌似是个人或小团体作品?如果真是那样,也不过分苛求,跑同样的代码消耗的时间大约是主流编译器的1.5倍,差距很明显,而且它那个IDE太难用了……还好,这个lcc的选项极少,命令行操作也简单,用codeblocks配置环境也很好用。鼓励一下作者,但大家别拿这东西当真,就一玩具而已……
turbo C 2.0/turbo C++ 3.0:轮到初学者的明星了,如果说borland C++的优秀名副其实,那早不了几年的turbo C++能够如此流行完全是拜谭浩强所赐……当年,Microsoft C++等其它的编译器厂商太不争气,给了同样不咋地的turbo C++以生存空间,按道理说,borland C++ 3.0一出世,turbo C++就该进垃圾桶了,可是………………不多说了,同样是16位编译器,borland C++ VS turbo C++ 3.0,都是borland的产品,IDE几乎一摸一样(仅外观上,编码质量上BC3还是明前高出一头的,至少可以随意切换出来,tc那就黑了……),大家,尤其是TC的死忠们,自己去测试一下吧,TC会用BC就会用,我告诉你效率差不是以百分比计算的,而是N倍,N>10……
digital mars compiler:就是发明D语言的那个公司……标准支持还可以,可是……只要连着printf几条中文……后面的任何东西都无法输出了……一个字——烂,32位的编译器,头一次见中文支持这么差的。
SDCC:看见codeblocks的列表里有他,而且有人推荐,而且版本号2.9也不算低了……结果呢?标准库一塌糊涂,人家TC、gcc、vc………………所有编译器都能编译的程序你编译不了,为什么?很简单……include文件夹寥寥20个h文件,平均每个2kb……大量宏、类型、函数都没有(告诉大家,连FILE*都没有,连clock_t都没有,人家的sqrt接受double,他只接受float!),标准库可是编译器的门面啊,而且你的crt的组织结构明显就不是通用的那种,似乎也不打算让用户使用glibc等来代替,我只能送你四个字——烂到极点。很明显,该编译器想自立门户,自己带了一套crt,说真的,你学gcc那样不带crt,让人家去用glibc,也许还能挽回点什么……这个编译器非常有个性,打算所有平台通吃,所以在CRT里提供了多达6种平台的crt,但是最基本的crt功能却一塌糊涂……