十年(三)续之语言进化论

语言进化论

相比较开发工具的世界大战, 计算机语言之间的竞争要显得安静和优雅的多。

从语言看, 80年代之前,PC没有流行, 计算机语言只是被用来工业用、商用和军用大型机以及科学计算中。成名的是Fortune, Cobol, Ada等等。直到苹果和PC的出现,计算机语言,才和普通程序员有了关系。

汇编 其 实不能算一种语言, 因为它只是机器语言的符号化。就像我的毕业设计,仅仅是把机器码加上不同的寻址方式,映射到相应的符号而已。但这是我大学里第二喜欢的语言(第一是C), 因为它太强大了,它可以简单的让你的BIOS清零,改变显示模式,或者是让你的机器再也不能工作:p 那时不可能接触商业应用, 因此最喜欢的,也就是开发游戏做这种神奇的事情, 因此汇编用的很多。所以我考高程的时候,汇编完全没有复习,我选的编程题也都是汇编的。

Basic 的前身是大名鼎鼎的Fortran,也许是Fortran太过精密了, 他的创始人G. KemenyThomas E. Kurtz 才在1964年创造了Basic。

这 是我最最早接触的语言,但是它要比C更高级,因为它是解释型的。它不会直接被编译成汇编而像c那么容易伤害系统。它是为最基础的编程者设计的, 因此叫做“Beginner's All-purpose Symbolic Instruction Code”. 那时候完全是用来教学生用的。他没有复杂的语言特性,更没有OO,非常简单,而且人机交互很好,你可以边写边运行。

我见过和用过的Basic有Apple上的Rom Basic, Dos上的qbasic、IBM Basic, 长城紫金机上的GWBasic,

Basic优秀的图形API使它很容易编写游戏程序,这是Apple和DOS搭载Basic的原因。后来的Visual Basic其实已经和那个时代的Basic没多大关系了, 只是语法比较像而已。

现在让我们怀念的Basic, 应该只是Apple上那个最初和我们见面的Basic,和使用它编写出的各种飞机导弹吧。

C/C++ 是曾经最叱咤风云和最受争议的语言。

C 语言的前身是B语言, 它是Unix的开发者-Bell Labs的Dennis Ritchie和Ken Thompson在1970为UNIX开发出的。C在1972同样由这两位科学家研发成功,1980年ANSI C正式成为C语言的第一个标准。现在所有的C 编译器都支持ANCI C.

从1983年c with class正式改名C++开始, C++一直独领风骚, 直到java出现。90年代末期,尽管BS改进了STL, ANSI-ISO出版新的c++标准, 但是C++的劣根性导致它已经不适应现代IT对软件开发的效率和可靠性的要求。

 

C++的劣根性
1. 首先,C/C++直接和OS打交道的方式使他过于危险。它几乎没有任何约束的操作内存,文件系统和各种设备。程序员直接面对OS的结果是每个人都可能造成 系统的崩溃。C/C++程序员最痛苦的经历可能就是查各种引起程序崩溃的bug,可能是数组越界,可能是空指针, 可能内存copy越界, 也可能是OS的API使用不当,甚至是因为使用的OS dependant的exception处理机制。C++的不可靠性使得它不再适用于一些非常关键的地方,比如航天航空控制程序。
2.最令C程序员烦恼的另一件事可能就是内存泄漏了。C对内存的操作完全由程序员控制。所以,C++程序有可能到处充满着因为没有释放内存造成的无底洞。
3.STL 用了及其复杂的方式来实现, 这是我非常不明白的。STL虽然提供了一些好处, 但是,每当你不得不trace进STL的代码时你会因其代码的复杂度望而却步。包括STL的interface也不太友好, 显得神秘而复杂。STL的初衷应该是给程序员带来方便,但是BS这样的超级牛人,是很难指望写出正真“简单”的东西给人用的。
4.C++号称支持 OO, 但是充其量他只是支持"OO", 而不是纯OO的。对于人类来说, 如果你不约束它, 那么你的期望是会落空的。因为这等于将OO还是不OO的选择交给了程序员,但是,交给人类太多的选择不是一件好事,况且你都知道什么是好什么是坏时你还不 强制程序员使用好的。因此我们看到的C++程序都是OO和非OO混用的,或者是C和C++混用的, 这还不如不支持OO, 应为这样的程序更加混乱。所以, 当我开始适应JAVA时, 我觉得终于长出了一口气, "这才是正真显得简单和方便的语言“。因为我们不需要再选择使用OO的写法还是非OO的写法。人都用惰性, 只要你给他选择,他一定会选择简单的非OO,而在高兴时才废脑筋写一点OO的东西。
5. C++的标准其实来的很迟,98年的标准很多弊病, 2005年又出了TR1. 这些都已经不能影响C的前途了。各个厂商在实现C++时都添加了自己的特性和细节,这也是C++标准不够严格造成的。所以即使你完全使用标准C编写的程 序, 还是不能在多个OS上简单的编译通过,而是一定要做很多改动。
6. C++的预编译指令一样把过多的事情交给了程序员。其实大多数的这些预编译指令都是C++标准应该负责的,而应该对程序员透明。更加不应该被写在程序里。程序里面应该只有逻辑。
7. C++被诟病最多的, 可能是他的重用性了。不管是lib,dll,dom/dcom还是什么东西,用到最后,还是直接copy 代码来的简单。
那些都是垃圾。因为C++缺乏像java那种对命名空间的管理。你甚至没有办法让你们的那么多模块和别人的不重名。应用别人的模块时,充斥着重复定义或找不到符号的错。Dll Hell就是程序员的地狱。

写 这么多C/C++的缺点, 其实因为我曾经是C/C++的狂热爱好者,从进大学开始,就开始自学,我的记得大二才正式教C语言,C语言和数据结构是我两门唯一超过90分的课程。即使 在我很久不用C的时候,我还是会怀念使用它的那段日子, 和它给程序员带来的乐趣。因为它的运行速度那么高效,它有那么多奥秘可以研究。我写NCSE(new C script engine)的潜意识里,可能也包含着要改进C语言的冲动。

其实我们最热爱的,应该是纯C,在C++出世之前,它的代码还是那么的单纯和优雅。当然,系统复杂到一定程度,完全面向过程的C才开始显现它的不足。

Java, 1990 年时, sun公司为自己的OS研发的C/C++语言,烂到了让SUN的程序员无法忍受的地步, 于是,sun的创始人首席科学家Bill Joy打算在C++的基础上开发出更容易使用的语言。java之父James Gosling,一开始打算修改和扩展C++,最后放弃而决定开发一个全新的语言。(这是明智的选择,我一直认为很多东西到了一定时间是必须重新写一个, 而无法再升级或者扩展的,就像windows,就像SAP那个很幼稚很假的NetWeaver和背后其实很旧很真的Abap Rx)。

这 个全新的语言开始不叫java,叫做OAK, 他被用于SUN为微波炉等智能家电开发的嵌入式操作系统。直到1995年,不可阻挡的internet大潮,让sun决定把这一语言用于浏览器,才在 sunworld大会上正式以“java”的名字发布。1996年,JDK1.0诞生。

可以说, java是因为嵌入是系统而被怀孕的,是因为internet而出生的。

java 虽然不是C++直接的子孙, 但是它的血脉里留着的完全是C++的血。它其实就是C家族的全新成员。它的出现,也完全是出于C++的诸多无法克服的缺点。比如不完全面向对象, 没有内存回收,直接面向OS等等。Java几乎解决的了所有C家族上一代的问题。但是它有自己的问题 - 太慢。

java的推行是在1996年,我在上物理大课,坐在最后一排的我们几个同学, 却在传阅一份电脑报还是什么报纸,上面整版的介绍新的即将风靡全球的语言-java。因为几乎所有的OS都已经宣称支持Java,号称这一神奇的语言将全面取代C/C++。

但是,直到21世纪初,我们还是很不喜欢java的,虽然在北美可能java已经很热。特别是java在出了j2ee以后。但是,缓慢的速度,和奇怪的UI API,让人对它完全提不起兴趣。

直到我们中国的诸如电信局,证券交易所, 基金公司,都直接要求使用J2EE的时候,我们才不得不使用java。但仍然只是在web上使用,app层仍然使用C++,只是用JNI封装成java接口供java调用。但是JSP同样也不觉得比ASP好用。

直 到进入SAP,设计完全有德国人说了算, 我们再也没机会用C了,才只好完全使用java开发。但是SAP庞大,缓慢并且不稳定的NetWeaver AS(它的内容是j2ee实现的好几倍),让人不堪忍受。而且JAVA和C不一样的是,用VC只要有MSDN就什么都搞定了,但是java有无数的 spec要读要学,每样东西都搞很多新的很复杂的概念,JSR不停的出,而程序员最不喜欢的就是看这种东西了。为了偶尔能享受一点编程的乐趣, 我不得不业余时间再改改以前的C程序。

在被迫使用了多年java之后, 终于对它开始有点喜欢了。因为如果抛开这么多繁琐的框架和概念的话,java语言本身确实还是有一定优越性的。

他最大的优越性就是解决了C++无法解决的重用性, 你可以任意的使用别人写的模块,而几乎不用做任何担心。其次,是你不必再担心它崩溃了, 即使他崩溃了, 也不是你的错:p

至于它是OO的,这勉强也可以算作java的优越性之一。因为OO本身还是颇具争议的。

脚本语言

快 速但是低级的C退下巅峰,严谨但是缓慢而沉重的java也开始慢慢跟不上时代的发展。特别是Web2.0誉满全球之后。跟上快速变化的应用开发才是硬道 理。java和C++时代的三层甚至N层架构, 在web时代,显得那么的笨拙。开发效率和运行效率之间的平衡问题变得史无前例的重要。Web,游戏开发等等领域,外围框架都已经定好,比如游戏 server,比如http server, 更本没必要接触OS,和调用所有OS层的API, 也完全没有必要理会编译过程。所需要的只是描述好逻辑而已。

而且,更重要的是快速运转的软件生命周期,不必停机就能看到运行结果的代码。

所 以,语言已经到了必须细化到各个领域的时候,没有一种语言适合所有场景。 适合所有应用的语言必然会太泛而使用起来不够高效。因此游戏使用自己的脚本语言定义游戏内容, Web浏览器使用js实现逻辑,web server使用php、perl,asp,jsp等各种脚本语言来实现逻辑。

从本质上说,脚本语言是当某种系统发展到一定程度,它的 内部逻辑复杂多变到不适合写死在程序里的时候, 用另一种运行在这一系统中的脚本来实现逻辑,达到满足系统灵活性要求的语言。比如运行在Web Server上的asp,jsp,php,ruby等,比如运行在Quake中的C, 运行在其他游戏引擎中的lua和python.

所以,脚本语言其实比java等高级语言已经又高出了一个等级。

 

战争

80年代是AppleII和DOS统治的时代,因此Basic和汇编成为主要的应用开发语言,但是都很不友好。TP的出现让人耳目一新,真正了解了什么是“开发环境”。从而Borland的产品几乎统治了整个DOS时代。

90年代是Pascal、basic走向没落,C和汇编欣欣向荣, java还在襁褓中的时代。

90 年代末直到最近, java占据了半壁江山,从桌面应用到网站,企业应用各个领域, java以其优越的跨平台特性和完美的OOP特性,曾赢得全世界开发人员的青睐。同时,在web和游戏浪潮的推动 下,php,perl,python,ruby等脚本语言成为崛起的新军。

但是非常可惜,java被sun的老头们毁了,我一直这么认 为,在j2ee出现的时候,在Java2出现的时候, 就开始了。我觉得他们太学者了, 就像Bjarne StrouStrup一样, 傲慢而缺乏对现实软件开发世界程序员们底层工作的体验。所以,我也认为2000之后的Bjarne Stroustrup,其实也是在拖C++的后腿, 还好有boost这些草根发展起来的类库,让c++世界总算有些进步。我写java,纯粹是因为工作原因, 因为SAP用JAVA, 因为电信和基金公司等等非常有钱的公司喜欢缓慢而复杂的J2EE,而其实SAP用java也是因为顶端市场的客户非常喜欢J2EE,为什么他们喜欢 J2EE,可能是因为它支持Unix、linux,和IBM,HP和SUN以及其他中间件厂商的竭力推广java, 为什么他们极力推广java,因为那样才可以让客户升级硬件和"服务"

:D (当然, 这是我的个人看法, java fans们不要砸我:P)

我喜欢java的地方是, 他的代码非常干净工整,非常容易做代码生成工具和其他的refactoring/revers enginerring等等。相比之下,其他语言显得比较乱,不容易被机器读,所以,就代码而言, 作为程序员我还是比较喜欢Java的。

但 是,Steve Jobs就是不愿意让iphone运行java,他在一次访问中对记者说"Java’s not worth building in [to the phone]. Nobody uses Java anymore. It’s this big heavyweight ball and chain."

最近,听说一个Big news, 就是SAP打算放弃java,换句话说,SAP 从2002年收购inqmire开始,所有花在java stack上的数十万人月将付诸东流。SAP VMC(java vm 集群),JCO, J2EE application, webdynpro,portal,XI,乃至整个NetWeaver和AP(见我以前的blog"SAP技术概述”),都可能要放弃或者重写。这个消息 太冲击了。如果是真的话,只能说,SAP也太有魄力了。另一方面, 德国人似乎确实一直不太喜欢java,他们还是喜欢自己的ABAP和C(ABAP比java更工整数倍,比较符合德国人的个性),整个SAP把工具从 ABAP转向java的所谓“NetWeaver"运动,应该就只是Shai Agassi父子在倡导, 如今Shai 人走茶凉,SAP的老头子比sun更多,他们从来就不买MS和sun的面子,所以回归ABAP也不是一个完全出乎意料的事情。

我一直没 有用过C#, 因为工作中没有用到。据说c#和java差不多, 但是我相信一定会比java好用, 因为C#不是开放的,微软没有像sun一样只管制定一个比一个复杂的RFC和spec, 而离应用越来越远, 并且放任java 社区混乱的进行各种framework的开发。 因而C#和.Net产品化程度会比较高.

2000年之后, 脚本语言得到广泛的发展。Quake有自己的C脚本, 和我在Stockstar开发的NCSE(new c script engine)差不多。随着web的蓬勃发展,弱类型的脚本语言php,perl,python,ruby,js等等也迎来了自己的春天。他们成为web 开发者的最爱。但是, 自由的语法让代码比较难于维护,也不容易像java一样从设计直接导出代码或者从代码做refactoring或者reverse engineering。但没有关系, web上的主要矛盾是需求的快速变化,需要的工具非常“轻”。因此,非常需要脚本语言这种不需要编译,不需要重启服务器,learning curve相对较平,总体比较Lightweight的语言。

而企业级开发,主要矛盾在于系统的稳定,可靠,可扩展,可定制和更高的安全性等等。产品化程度要求较高。因此需要Heavyweight 的java。事实上这一领域也已经被java占领。

桌 面应用,是一个非常令人感兴趣, 但是非常令人头疼的问题。他的主要矛盾,是UI,数据集中,和跨平台,但是目前仍然没有非常好的语言可以选择。因此,这个领域的大战正越来越近。我的看 法,是会走内嵌浏览器+local web server+internet server的套路,因为这样UI可以使用html/css来进行快速开发,UI通过访问local web server实现逻辑和解决数据存贮和同步问题, 逻辑可以使用任何一种脚本语言实现。整个方案是跨平台的。这是一个我一直看好的解决方案。不过微软和Abode也在这领域推出了如Adobe Air等新的产品。

手机和嵌入式系统的应用方兴未艾,但我不看好java在这个领域的前景,C仍然是这个领域目前的选择。因为手机上性能很关键,而且java在UI方面的api一直很烂。

从 80年以前的C和ASM平分天下, 到90年代的C++独领风骚,到本世纪初C/C++,C#, JAVA三分天下的局面,在最近几年已经在有所改变。 每种类型的语言都在他们擅长的领域攻城略地,独霸一方。不停的有新来者抢走地盘。C/C++, java, C#这三个传统豪强,虽然近年来失去不少领地,但是其霸主地位和实力还是难以撼动的。

-------------------------------------------------------------------------------------------------------------------------------------------------------

战后总结:

Basic就像一个小学生,顽皮可爱,但是不能做大事。

Pacal就像一个老师, 严谨优雅,风度翩翩。

汇编就是远古神秘的巫师,现在已经很少人懂它了。

C/C++就像一位大侠 ,功成名就,技艺高超,无所不能,但是稍嫌复杂,有些飘忽不定,比较难管理,和有些跟不上时代。

而java仿佛一个一丝不苟的工程师,可以建造高楼大厦,但是有些过于严谨,做事经常上纲上线,在一些小应用,总觉得java的做法太大动干戈了。

脚本语言是武功秘籍是代代相传的邪派豪门,武功诡异而高效,并且可以极短时间练成。

总而言之, 语言是随着应用需求的发展不断发展的。了解你的需求,选择正确的语言,是每个设计师要做的。

-----------------------------------------------------------------------------------------------------------------------------------------------------

从整个开发世界来看,分为逻辑和数据。计算机语言实现了逻辑,各种数据协议实现了数据的存储,访问和变换,比如各种网络协议,加密协议,各种文件格式和编码格式。数据实现的发展是另一条非常重要的主线,这个以后再讲。

十年(一)

十年(二)

十年(三)

十年(三) 续 之圣战篇

十年(三)续之语言进化论

十年(三)续之游戏世界篇

你可能感兴趣的:(java,C++,c,OO,D语言)