又看到语言之争,各种吐嘈,唉…… 说说我的看法,我觉得一门编程语言用到极致就行了,何必纠结语法层面的差异?
因为历史原因,我用.NET比较多,当然Windows编程、Java编程、Linux/Unix编程、C/C++编程、Python,JavaScript等动态语言甚至是汇编编程我也粗有研究,也测试过一门动态编程语言Python。刨去Visual Studio昂贵的费用(我一开始用的是盗版,当然现在因为Bizspark的关系终于用上正版了……),说实话我还是比较喜欢C#的,做项目的时候,我这个人没什么节操,什么语言来钱快用什么语言。
那怎么个来钱快呢?
1. 学习成本比较低,在编程时碰到不会用的函数我一般都是点点点,在下拉框里找。不知道我是人笨还是怎么回事,反正我每次写Python,JavaScript、PHP这些程序的时候,每次都得Google,比如啥“Open a database in python”,“Javascript substring”啦之类的。
也许你会说不是有Eclipse吗?Eclipse的确是一个很伟大的编辑器,但就一点不好,这个慢啊!每次打开工程,就会让我有种天黑下来的感觉。特别是挂上一些插件,特别是Maven的插件,Oh My Lady Gaga,随便打开一个开源工程就在那更新什么Index,晕死,其实我就是想小小的编译一下代码看看效果,然后就看到命令行一阵阵的输出下载什么不知所云的包文件,Maven果如其名,像我这种非Java内行,总是要从这个天黑等到那个天黑才能编译完一个小程序。
2. 编译方面,这方面我对C/C++最大的抱怨就是,现在内存都已G计算了,怎么还是在用KB内存时代的单文件编译再链接的方式编译程序?随便写个程序就是各种-I,-L,-l选项,更让人抓狂还有C++ mangling这东东,不仅不同编译器的mangling方式不一样,这个编译器不能链接那个编译器生成的库文件也就罢了!同一个编译器不同版本Mangling也有问题,我04年改squid的源码,加一个代理计费的功能,数据库用的是Oracle,为了方便用C++和OCCI写计费程序,我靠,同样是Oracle的OCCI库,我在Mandrake(这个版本的Linux稍微新一点的IT人估计都没听说过)竟然无法链接OCCI库,就是因为Oracle发布OCCI时是在Redhat等GCC 3上编译的,而我的系统是GCC 4?!为了避免格盘装Redhat(我那个时候的机器是512M内存的赛扬机,虽然早就开始玩VMware,但那个配置跑虚拟机基本上等于自杀,而Mandrake那时的界面的确比Redhat好看好多,什么WindowMaker, Enlightenment之类的窗口管理器真的会让你有种黑客的感觉),于是我就用OCI实现了最小集合的OCCI的接口,才搞定这个事情。
更不要提什么autoconf, automake, make之类各种诡异的语法了,还有gdb全命令行的调试界面,哦,对了,如果有兴趣,建议你玩玩emacs里启动gdb、jdb之流体验一下伪所见即所得的源码级调试支持。
3. 编辑器支持,这一点我对Python抱怨非常大,前些天我自己给svn写的python插件出了点小问题,那我得调试修复代码呀!各种print那就不说了,更要命的是,原来的python程序是在emacs下写的,为了图快就用Visual Studio编辑,结果Visual Studio里的Tab键代表的空格数有那么一点点的小差别,解释器也不告诉你是哪一行,就说了一个什么“Indention miss match”就退出了。最后还是在记事本里编辑才解决这个问题,12345678(个空格),一行行地修复。本来我费了些功夫才在自己设计的编程语言里加上缩进支持的,经过这一闹腾彻底把那些代码删了。
这方面,Object-C我就不想说什么了,xcode运行的好端端的,突然就不见了……大概是因为我在PC上用虚拟机跑Mac OS X引起的吧。
4. 调试支持,这也是为什么我喜欢用C#、.NET的原因,各种调试支持,什么跟进到数据库的存储过程,远程调试,跟进远程DCOM RPC接口,内存验尸分析,C#和C++的混合调试啦,在生产服务器调试时自动帮你从源码服务器上下载正确版本的源码啦。Python、PHP等动态语言我不知道各位是怎么调试的,对我这种不常用的人来说,就是各种print…… 如果不是后面浏览器里集成了JavaScript调试支持,以前也是各种window.alert – 邦邦邦邦,object undefined - 。
Java其实对调试的支持做的也还可以,JDK里也有不少的工具,比如jstack, jhat之类的,jhat的OQL的思想的确不错!只不过很可惜,如果是在生产服务器上用,找源码有时还是蛮费劲的。当然如果机器配置差点,大白天也会看到日食的。
5. 可配置性,这里我恨透了所有以XML做配置文件的程序,只要是配置错那么一点点就罢工,这也就罢了,象tomcat竟然还有好几个xml配置文件,什么context.xml,server.xml,web.xml。象我这样性急的人,有时就是想部署一个简单的网站而已,结果就是各种less catalina.xxxx.log,Google “How to deploy a servlet in tomcat”。好容易部署成功吧,运行一下又挂了,less一下:
Org.Hibernate.XXXException……
只好用eclipse attach tomcat进程上去看看……
6. 类库支持,什么gem、pear之类的,我就不明白为什么rubygems这种看起来跟红宝石、葡萄酒一样的单词怎么就会变成敏感词汇?
在Ubuntu上装个PHPUnit都费劲,就仅仅是因为PHPUnit需要用最新的pear安装,然后我用pear自己给自己升级就不知道怎么的装到home目录里了?结果是不停地cp –r ~/pear/XXXX /usr/share/pear/XXXX
7. 编写GUI程序的便利性,当然C++有QT,WTL, MFC,Python有pygtk,Java有swing之类的东东,但我实在不想就为了在窗口上放个按钮控件,注册一个点击事件,一会用boost::function之类的玩意封装个回调函数,一会写个什么new IXXXX() { void Click(); }神马的匿名类。
拖拖拉拉,这点点那点点多好?
我上面抱怨了这么多,各位编程大牛肯定觉得是我太菜,不懂就别瞎说。
别的语言我就不多说了,我觉得其实一个程序没有必要非要用一门编程语言写,哪个合适就用哪个好了,比如去年我用C#给网游写些辅助,除了访问内存、调用函数用些C++和汇编外(其实都可以用C#写,但是不想P/Invoke麻烦),在进程里注入个.NET虚拟机也不觉得有什么不方便的地方,而且从里面开一个remoting服务,避免了很多写前台管理程序的各种烦。
那我最近写个C#程序,有几个Java的库没心思找替换的库,用ikvm好像也没什么大问题,而且在Linux用mono跑这个程序也没有问题哦。
至于在一些规则系统里,需要运行python、ruby、javascript等动态脚本写的规则定义时,无非就是用DLR解释运行一下好了。
至于调用COM组件,在IE里把.NET程序当作ActiveX控件,与Win32/COM互操作,我觉得COM Interop在这方面做得已经很好了。
再不济,如果是分布式环境,大不了就用Ioc和SOA整合一下其他语言写的系统好了,为什么非要纠结于一两门编程语言语法上的优劣呢?
不好意思,函数语言还没研究过,就不提它们了。