最近又读了一些进化论。联想到当前,最有潜力和最有影响力的几种计算机语言:C/C++,Java,.Net,D,当然其中.Net不是单一的语言,而是一个多语言的平台。其中D语言大家相对比较陌生。这里我要重点说的是C++和D。
先说C/C++。
虽然C++和C有很大的差异,但我还是要把他们放在一起,因为它们的很多共同的优缺点。先说优点:
C/C++历史悠久,有广泛的支持平台、的现有库、用户基础、性能就更不用说。但是它们有缺点,很致命,就是开发效率低。虽然使用现代C++在很大程度上改善了开发效率低下的问题。但是C++相比于C还有另外的缺点:
1. 学习难度高!以至于大家经常说,搞了5年C++,不敢说熟悉C++,更不敢妄谈精通了。对于有相当功底的C++开发人员,也经常出错。
2. 编译时间长。这主要归因于对C预处理器和语法的兼容,现代C++程序,一般都使用相当大量的模板,这使得编译时间不可接受。一个简单的spirit语法分析器,仅一个源文件,在2.4G双核至强4CPU的服务器上编译,超过一分钟。更不用说使用模板无法保密源码。
3. 当前(C++0x之前)的C++,对模板元编程的语法支持非常差,boost.mpl的那一套虽然解决了问题,但是相当丑陋。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ?>
这几个缺点在D语言中基本上不存在,主要是因为D语言是新设计的,并且它完全抛弃了C++:“对C尽最大可能兼容!”的设计思想。虽然它没有对C做最大可能的兼容,但是它仍然可以有效地与C进行合作,这在链接层次上完成,功能上有点类似于C++上的extern “C”。
需要思考的是,C++发展至今,经过了很多的演化,几乎在每一次重要的演化中,它新加的特性都得到了后来设计者都无法预料的发展和应用,最突出的就是,最近几年的模板元编程发挥出的巨大威力就是当初设计者完全没有预料到的。当第一份模板递归程序证明C++模板语言是一个图灵完备语言的时候,大家只是把它当作一个纯理论上的东西,从来没有想到它后来会在实际应用中有那么巨大的作用。就如同当初爱因斯坦发现时,没有预料到后来会有原子弹一样。
这里值得一提的是,为什么会出现这样的现象?复杂性理论告诉我们,当事物的复杂程度达到一定等级的时候,它的演化就会脱离它的设计者最初预订的目标。比如在生命诞生之初,在原生营养汤里面,有机分子终于因为某种原因随机合成了第一个有复制能力的复杂分子。在之后,一切的发展都显得那么自然而然。但是,这里有一个关键,就是在“那个东西”的复杂程度达到那个阈值之前,它的发展是非常缓慢的,甚至在达到那个阈值之前它就已经消亡了,实际上大多数情况都是这样,只有少数能越过那个门槛。
对于有生命的事物,越是有活力,越是复杂,它的变异点越多,它能产生的可能性空间就越大,从而有可能最终成功地越过门槛的概率就越高,当然它也必须有很大活力。这两点也许是相互依存的。
当然,这里的“有生命”,指的不是我们通常意义上说的生命,而是它的一个延伸。
看来,C++今日的成功,我们要归功于它的复杂。而不是单纯把它的失败归因于复杂。继续举boost.mpl的例子,因为当初C++模板的设计不是为了元编程,仅仅是为了更好地支持stl,更好地支持静态分派。因此,没有元编程中大概是最重要的一个功能:variadic template,这使得mpl.vector/mpl.map/bind/function/tuple等等的实现很难处理,需要写很多个仅仅是参数数目不同的偏特化版,这是个很繁琐无聊的工作。幸好,有人发明了boost.pp,使用最原始的C预处理来完成这个工作。结果当然是好的,boost.pp虽然比boost.mpl更丑陋,但是比起一遍遍地重复相同的代码要好得多。
从这里我们可以看到,冗余的,累赘的功能怎样发挥了它的能力。对C预处理语法的兼容一向被认为是C++最大的一个累赘,有很多人提出很多不同的惯例和方法来最大化避免使用C预处理语法,比如用inline代替带参数宏,用import(比如VC扩展允许import)代替include,用编译时常量代替宏常量等等。这些惯例和方法的确在某些方面解决了问题,规避了C++的缺陷。但是,假如C++98把预处理完全从语言中剔除,那么,在进行模板元编程时,就只能一遍又一遍地敲入重复代码,或者写出完全lisp式的代码如list<int,list<float,list<string,list<long> > > >,这比起list<int,float,string,long>如何?前者完全可以浇灭掉任何人对list的热情,而实现者要完成mpl.list,就只能重复一大堆一大堆的冗余代码,而这会浇灭实现者的热情。其结果就是,mpl仍然只停留在理论阶段,任何实际的需求都不会被发掘出来。template meta programming也只停留在理论阶段,我们现在使用template也仍然停留在“不同类对象的容器”阶段。
现在说D语言,它基本上是一个“大杂烩”式的语言,几乎所有主流语言的功能,它都实现了。它放弃了对C的语法级兼容,但是它仍然不抛弃“native code”这个设计思想,原则上它的所有语法和语义只为生成本机代码而优化。就是说,它的语法不是“为虚拟机代码而优化”,当然,理论上也可以生成虚拟机代码,但很难优化。也就是说,D语言在本质上只是一个“更好的C++”,最多,只是比“目前的C++”更好。它比C++简单,但同时也失去了C++复杂性中的变异性可能,它只能在C/C++的这个进化方向上更好。如果它想要更广泛的应用,就需要有更多变异点,在基本的设计原则上,不能和C/C++的重合太多,以防止变异的可能性空间被限制。
现在说Java/.Net,它们在本质上比较相像,都是为虚拟机而优化。而一旦有了虚拟机这个中间层,很多为本机执行而优化的可能性就失去了。我们可能在高层使用更广泛的指令集,而虚拟机这个中间层的指令集是固定的,它无法识别更高层指令集的优化。比如,我们为了优化视频解码程序,在C/C++中可以使用intrinsic,或者buildin function,它们把函数调用直接映射到CPU指令,这样,不使用汇编语言就可以使用如MMX/SSE/SSE2/3DNow等增强的指令集。而使用虚拟机,怎样实现?那就只能增加虚拟机的指令集。
分享到:
相关推荐
Basic作为早期的重要语言,至今仍具有影响力。微软的Basic解释器在市场中占据一席之地,而Borland的Turbo Basic则一度挑战了微软的地位,但最终因市场竞争而退出。 总结来说,程序设计语言的进化是一个持续创新的...
从机器语言到高级语言,再到面向对象和函数式编程,编程语言的发展反映了人类智慧的结晶,推动了软件工程的不断进步。在未来,我们可以期待更多的创新,让编程变得更加高效、易用和富有表现力。
社会变迁是语言发展的重要推动力,包括社会的分化、统一和接触。同时,语言系统内部的各个部分——语音、词汇和语法——也相互作用,共同推动语言的演变。例如,语音的改变可能导致词汇形态的调整,语法中虚词的使用...
1970年代,C语言的出现进一步推动了高级编程语言的发展,它的简洁性和灵活性使其成为系统编程和应用开发的首选。 1980年代,随着计算机系统的复杂度增加,出现了模块化和面向对象的编程概念,如C++和Objective-C,...
例如,微软与Zend公司建立了合作关系,共同推动PHP语言的发展。 PHP语言的灵活性允许它与其他技术并存,如与.NET框架结合,形成混合架构(MIX)。在欧洲和北美,PHP已被广泛应用到企业级的Web应用中,包括金融、...
从最初的机器语言到汇编语言,再到高级语言,每一次进化都降低了编程的复杂性,提升了软件开发的生产力,同时也促进了计算机技术在各个领域的广泛应用。未来,随着人工智能和量子计算的发展,我们可能会看到更多创新...
在计算机领域,语言的进化经历了从低级语言(如机器语言和汇编语言)到高级语言的过程,以提高编程效率和降低编程难度。 “Java”这个名字有着有趣的历史。最初,这门语言被称为“Oak”,灵感来源于Sun公司办公楼前...
这项研究的深入探讨,有助于人们从理论和实践层面对网络语言有更深刻的认识,为未来的网络语言研究提供新思路,同时也对模因论的发展起到了积极的推动作用。通过对网络语言现象的分析和探讨,我们能够更好地理解网络...
总结来说,计算机编程语言的演变是计算机科学和技术发展的重要驱动力,它从机器语言的低级形式逐步走向高级、抽象和人性化的语言,提升了程序员的生产力,同时也推动了计算机应用的广泛和深入。随着科技的不断进步,...
乔姆斯基的语言学理论是20世纪语言学领域最具影响力的思想之一,由美国语言学家诺姆·乔姆斯基(Noam Chomsky)提出。乔姆斯基出生于1928年,他的研究早期受到结构主义的影响,但他逐渐发展出一种全新的语言理论——...
该语言自1996年在欧洲ESPRIT项目中由Hilding Elmqvist等人开发以来,经过不断的版本更新和进化,已经成为一种与领域无关的、强大的面向对象建模语言。Modelica语言允许用户通过构造和连接软件组件来建立模型,并具有...
JAVA在计算机软件开发中的应用已经成为了技术进步的重要推动力。 在未来,JAVA语言的发展将着重于提升性能、扩展其在新兴技术领域的适用性,以及引入更加现代化的开发模式和语言特性。尽管面临来自其他新兴语言的...
- **语音、语义、词汇、语法的矛盾**: 不同语言成分之间的相互作用推动了语言的发展。 #### 四、语言发展的规律 **1. 语言发展的一般规律** - **渐变性**: 语言的变化是一个缓慢而持续的过程。 - **不平衡性**: ...
未来,随着硬件技术和算法创新的不断进步,预计LLM将在更多场景中发挥重要作用,推动自然语言处理领域的发展。 #### 五、总结 从基于传统神经网络的语言模型到基于Transformer的预训练模型,再到基于自监督学习的...
例如,智人的大脑相对于身体大小的比例远超其他动物,这一特殊性使得我们具备了高级认知能力,如语言、抽象思考和创造力。直立行走则让我们的双手解放,能够制造工具,进一步促进了技术进步和社会分工。 此外,论文...
这在早期人类的生存竞争中起到了关键作用,推动了大脑的发展,促进了社会性和语言的形成。 4. **人类的祖先**:据科学研究,人类和现代类人猿共同的祖先可以追溯到森林古猿。由于环境变迁,一部分森林古猿被迫下到...
- 学会用火是人类进化中的重要里程碑,因为它提供了烹饪食物、防御野兽、保暖等多方面的好处,从而推动了人类社会的进步。 4. **种族适应性** - 不同种族适应了地球不同区域的气候条件,例如,尼格罗人皮肤黝黑...