提问
◆ Perl、Python、Ruby和PHP各自有何特色?
◆ 为何动态语言多做为轻量级的解决方案?
◆ LAMP为何受欢迎?
◆ Ruby on Rails为何会流行?
◆ 编程语言的发展趋势是什么?
讲解
“剩下四种动态语言,咱们将之归为后台脚本语言。”冒号说着画了张图表——
引号听得仔细:“我记得您开始是把这些语言划分为C族静态语言、非C族静态语言和动态语言三类的。”
冒号解释:“那是按语法来划分的,偏重理论;如今是按应用来划分,偏重实践。”
句号旋即联想到:“这种分法貌似三层架构——前台语言对应表现层;平台语言和后台脚本语言对应业务逻辑层;系统语言对应数据层。”
“的确有几分神似,但千万不可混淆。”冒号提醒道,“三层架构(three-layer architecture)是模块设计上的逻辑划分[1];而这里是按语言应用范围进行的物理划分——与用户交互的是前台语言,与机器交互的是系统语言,介于其中的为前台提供服务同时又须要底层系统服务的是后台语言。”
逗号询问:“后台语言又细分红平台语言与后台脚本语言?”
“这是基于程序(program)与脚本(script)、静态与动态而分的。”冒号进行说明,“其实Perl,PHP,Python和Ruby都有本身的虚拟机(virtual machine),从这种意义上说它们也可做为平台语言。但在实际应用中,它们没有Java平台和.NET平台那种整合凝聚力和核心做用,一般做为轻量级的解决方案。”
问号想探个究竟:“这是因为它们都是动态语言的缘故吗?”
冒号回答:“理论上动态语言一样能承担大型应用,但实践上它们多做为粘合语言或用于中小型应用。用句时髦的话来形容,暂时仍是主流的配角或非主流的主角。毕竟在运行效率、类型安全、可用资源、开发工具、技术支持等方面,它们与Java、C#相比尚有必定差距。另外它们同属‘草根’语言,虽有开源社区的大力支持,在影响力上与后者未可同日而语。”
叹号揣测:“说不定在不久的未来,动态语言也会成为主流的主角。”
“世易时移,殊难逆料。但有一点能够确定,语言的发展趋势必定是动静结合、刚柔并济。”冒号断言,“一方面以Java和C#为表明的静态语言中嫁接了动态语言的枝条;另外一方面以Java和.NET为表明的平台与动态语言的交壤地带也在逐步扩大。好比JRuby容许Ruby与Java之间互相调用,相似的还有Jython、IronRuby、IronPython等等。此外值得一提的是,动态语言最活跃的舞台当数LAMP,L-A-M-P。”
引号接茬:“L是Linux,A是Apache,M是MySQL,P是PHP。这四大组件造成了一个完整的开源网络开发平台。”
冒号补充道:“P也可指Perl、Python,甚至Ruby。”
逗号调侃:“惋惜Ruby的‘R’比‘P’多了一根尾巴。”
“有人为了自圆其说,干脆让P表示‘Programming language’,这下全部语言都囊括其中了。老外就喜欢玩这种首字母缩略(acronym)的文字游戏,尤为LAMP正好还有‘灯’的含义,寓意开源世界的一盏明灯,他们必定更得意了。”冒号语带调笑,“前面咱们曾说起,网络应用是生长动态语言最肥沃的土壤,而LAMP就是这块土壤上搭建的平台。做为网络平台,LAMP以其开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等特点而与Java平台和.NET平台鼎足三分,尤为受中小企业的欢迎。LAMP中Linux是操做系统,Apache是Web服务器,MySQL是数据库系统,而咱们当下最关心的是‘P族语言’:PHP、Perl、Python还有Ruby。”
问号建议:“做为动态语言,它们的共性上节课已经谈了很多,能说说它们的个性吗?”
“它们的个性极为鲜明:Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯。先看老大哥Perl,它博采众家之长,综合了C语言的结构、sed的正则表达式、AWK的关联数组(associative array)、Lisp的表(list)和Unix Shell的命令,此外还有借鉴了一种语言,大家知道是哪一种吗?”冒号突然卖了个关子。
逗号猜测:“应该是某种OOP语言吧。”
“Perl中确有很多C++的影子,但它的对象模型在5.0之后才引入,典型的半路出家,远不如前面的特征那么天然。与其说是一种天然而然的发展,不如说是在OOP潮流裹挟下的一种身不禁己的迎合。真正深刻骨髓的借鉴是天然语言。”冒号给出了答案,“咱们提过,Perl的发明者Larry Wall是一名语言学家,他认为程序语言应该与天然语言同样,简洁天然、易读易写、表达多样、不拘一格。Perl还有很多的格言或哲学,使得编程语言一改严谨刻板的面孔,散发出浓郁的人文气息。”
叹号幽了一默:“我见过Perl的代码,人文气息没闻出来,但我怀疑有乙醚气息——看一会就以为晕晕乎乎的。”
众人大笑。
“有人仅用一行Perl代码就实现了RSA算法,你看了那还不得当场晕倒啊?”冒号打趣道,“Perl的各类魔符好似一把把锋利的剪刀,作起文本裁剪之类的工做来游刃有余。这是它最大的长处,当初Perl就是Wall用来作Unix系统管理的,之后在CGI上的普遍应用也得益于此。这也赋予Perl极强的粘协力,于是有‘internet上的胶带(duct tape)[2]’的说法。它又号称瑞士军刀,精练而复杂,实用而强大。但Perl过于灵活自由,缺少规范,影响了程序的可读性、一致性、整洁性和可维护性。不熟悉该语言的当然如读天书,熟悉语言而不熟悉问题的也颇费思量。相比之下Python被认为是Perl有力的挑战者,不只在于它自然的OO设计和丰富的类库,更重要的是它对程序员友好度大大超过Perl。Python也有一系列的被称为禅(Zen)的哲学,很多与Perl是针锋相对的。好比:Perl认为作一件事能够有多种方法,而Python认为一件事应该最好只有一种方法;Perl追求语言的表现力,Python追求简单优雅;Perl喜欢隐性暗示,Python强调显性明示;Perl强调紧凑,Python强调松散; Perl的语法和语义丰富,Python的语法和语义简单而类库丰富。或许Python最让人不习惯的是它对空白符敏感性。”
引号感到惊奇:“对空白符敏感?这个倒真怪异。”
冒号见惯不怪:“虽然有点违反习惯,但很是符合Python一向的规范简洁的风格——一方面从语法上保证了良好的编码风格;另外一方面,每一个代码块再也不须要起始的大括号或begin/end之类的,减小了的代码行数。顺便插一句,另一种优雅的语言Haskell一样对空白符敏感,或许优雅正是来自对细节和规范的重视吧。此外许多人抱怨Python中的自引用self太多,却不知这也是它倡导显式表达的一种体现。总的看来,Python主要的问题仍是在性能效率上不尽如人意。”
叹号好奇地问:“Ruby怎么样?听说它将取代Java。”
“不要轻言‘取代’二字。”冒号规诫道,“Java没有取代C++,也不会被Ruby取代,至多只是一种再分配。不过Ruby的确是门很可爱的语言,兼具Perl的表现力和Python的可读性。Ruby背后最具特点的理念是:关注程序员使用语言时的感觉超过语言自己的功能。通俗地说,兵器的称手比锋利更重要;文雅地说,应给予程序员更多的人文关怀。就拿代码块(block)和迭代器(iterator)来讲,虽然均非Ruby独创,但其语法最为赏心悦目。相似的例子比比皆是。Ruby的元编程能力特别强,也是它高度灵活的一种体现,但并非全部人都喜欢这种风格。Ruby的主要弱点有两个:一个与Python相似,在性能上还有待提升;另外一个是它的线程由用户空间(user space)而不是内核空间(kernel space)来管理[3],不能充分利用多核或多CPU。真正让Ruby变得煊赫一时的是web应用框架 Ruby on Rails(RoR)的成功,它们还催生了Java平台上的Groovy语言和Groovy on Grails框架。RoR奉行的CoC(Convention over Configuration)和DRY(Don’t repeat yourself )原则以及MVC架构看似了无新意,但与Ruby结合以后,便如一只猱身而上灵猫,马上陪衬出Java和.NET大象般的身影。”
逗号有些怀疑:“框架居然捧红了语言,框架真有这么重要吗?”
“若是web应用中动态页面较少或业务逻辑不复杂,框架的价值并不大。之前CGI编程就是往Perl之类的代码中嵌入HTML代码,如同Java中的Servlet;PHP则单纯地在HTML代码中插入PHP代码,如同早期的JSP。没有MVC,也无论什么三层架构,更没有ORM。可是——”冒号拖了个转折音,“一旦业务逻辑变得复杂,开发人员增多,手工做坊式编程开始捉襟见肘,引入框架这个流水生产线来提升生产力即是大势所趋。”
句号不解:“我想Perl、Python和PHP必定也有很多框架,Java中的框架更是泛滥成灾,何以独独RoR脱颖而出?”
冒号做出分析:“正值web2.0和敏捷开发(agile development)的概念流行之际,RoR将AJAX与Ruby组合在一块儿成为绝佳的回应。之前各类web应用框架是很多,但在RoR以前轻量级套餐式解决方案并很少。Perl中的Catalyst、Python中的Pylon还有PHP中的CakePHP等应是效仿之做。所以RoR出现的时机可说是不早不晚,正当其时。此外,Perl和PHP因为过于流行,反而有很多的历史包袱,人们习惯了将表示逻辑和业务逻辑编织在一块儿。至于Java企业解决方案,框架太多,搭配组合更多,增长了选择的难度。即便采用最多见的轻量级SSH(Struts+Spring+Hibernate)组合,维护起来也比RoR繁杂得多。”
叹号愈发担心:“听这意思,Java仍是危险啊!”
“言之过早。”冒号不觉得然,“首先RoR还有待进一步检验,目前不管是应用广度仍是深度上尚没法与Java相提并论;其次Java在性能、安全等方面仍是有很多优点,而这些对于大型和关键性的应用来讲尤其重要。即便在中小型web应用中,RoR较之PHP还远为不及。”
问号接下话题:“PHP为什么如此流行?”
“由于它简单、专注。”冒号答得很干脆,“与Python和Ruby一开始就定位通用语言不一样,PHP是专为网络而生的。同早期的Perl类似,PHP起初主要起文本过滤器的做用,只不过Perl多处理文件流(file stream),而PHP多处理套接字流(socket stream)。PHP的语法简单,且为网络应用度身定造,受到网络开发人员的追捧当在情理之中。它虽很实用很流行,但并不完美。好比:变量名大小写敏感而函数名大小写不敏感;函数命名规则不一致;不支持namespace和unicode[4];与Perl同样,它的对象模型不是先天的,直到PHP 5才真正完善;对线程支持不足;相比Perl、Python和Ruby,它的功能稍显单薄等等。”
引号忽然想起:“我记得您在第一堂课提到PHP还能用于桌面应用。”
“不只PHP,Perl、Python还有Ruby,都能做为前台语言来开发命令行或图形界面的应用。一样地,VB、Delphi和JavaScript也能做为后台语言。现代的程序语言既有本身的专长,又向通用化和全能化发展,以争取更多的生存空间。试想一下,现代的程序员又未尝不是如此呢?”言及于此,冒号收住话题,“语言简评告一段落,还有很多既有趣又有用的语言,在此就不一一评说了。咱们看到,每种编程语言都有其独特的惯例用法和哲学理念,它们与编程范式一道造成了语言的编程风格。体悟愈深者编程语感愈强,思惟与语言愈交融无碍,渐从必然王国走向自由王国。”
逗号满怀憧憬:“那是否是一种人剑合一的境界?”
“或许人器合一更准确吧,程序员可不能只会一种兵器哟。”冒号故意抠他的字眼,“如今请你们每人写一句对本节课的感言。”
众人沉思片刻,齐齐挥笔而就——
叹号——没有最好的语言,只有最合适的语言。
逗号——没有糟糕的语言,只有糟糕的程序员。
问号——没有一种语言是万能的,只会一种语言是万万不能的。
引号——废除对语言的宗教信仰,创建对语言的哲学思惟。
句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。
冒号读罢大悦,顺手一掌拍出五记马屁:“精彩之极!可谓字字珠玑、句句联璧啊。兹决定,给诸位的奖赏是——立时下课!”
众人欣然领赏而去。
插语
[1] 有两种三层架构,一种是three-layer architecture,一种是three-tier architecture。它们常常换用,但实际上是有分别的:前者仅仅在逻辑进行划分,然后者在物理上也进行了划分——不一样层次的模块运行在不一样的主机上。
[2] 很多地方译做‘输送带’、‘传送带’,由于duct有‘输送管’、‘导管’之意,因而想固然地认为这代表Perl在internet上起着输送做用。却不知‘duct type’专指一种万能的粘性极强的胶带,用以比喻Perl的粘协力。
[3] 这类线程被称为绿色线程(green thread),也称伪线程。据称Ruby2.0将支持原生线程(native thread)。
[4] PHP将在5.3.0支持namespace,将在6.0支持unicode。程序员
总结
◆ 比起Java平台和.NET平台,动态语言轻便灵活、开发效率高,但整合凝聚力还不够,在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有必定差距,故一般做为轻量级的解决方案。
◆ LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台,具备开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优势。
◆ Perl精练、复杂、强大、灵活、自由、隐晦、表现力强,但规范性、可读性、一致性、整洁性和可维护性较差。
◆ Python优雅规范、简洁明晰、易学易用、类库丰富,但效率稍差,有些人不喜欢它对空白符敏感的特性。
◆ Ruby语法精巧、高度灵活,兼具Perl的表现力和Python的可读性,尤为注重程序员的感觉,但其性能和线程模型尚有待改进。
◆ PHP简单、专注、实用、流行,在但相比其余三种语言,在语法和功能上稍有欠缺。
◆ RoR是一种轻量级套餐式的web应用解决方案,是由好的设计(MVC架构和CoC、DRY原则)加上好的语言(Ruby)在好的时机(web2.0和敏捷开发风行之际)打造出的好的框架。
◆ 静态语言与动态语言从语言特征到运行环境都在逐渐融合。
◆ 程序员应该与程序语言同样,既要有本身的专长,又要向通用化和全能化发展。
◆ 编程语言惯例用法、哲学理念和编程范式造成了语言的编程风格。web