热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl/PHP/Python/Java/Ruby的拟人课堂讨论

比起Java平台和.NET平台,动态语言轻便灵活、开发效率高,但整合凝聚力还不够等方面也有一定差距,故通常作为轻量级的解决方案。LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台,具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等

!预览

  • 语言的发展趋势一定是动静结合、刚柔并济
  • Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯
  • 或许优雅正是来自对细节和规范的重视
  • (RoR)与Ruby结合之后,便如一只猱身而上灵猫,立刻衬托出Java和.NET大象般的身影

?提问

  • Perl、Python、Ruby和PHP各自有何特点?
  • 为什么动态语言多作为轻量级的解决方案?
  • LAMP为什么受欢迎?
  • Ruby on Rails为什么会流行?
  • 编程语言的发展趋势是什么?

:讲解

“剩下四种动态语言,我们将之归为后台脚本语言。”冒号说着画了张图表——

用户

前台语言:Visual Basic,Delphi,Javascript

平台语言:Java,C#

后台脚本语言:Perl,PHP,Python,Ruby

系统语言:C,C++,D

机器

引号听得仔细:“我记得您开始是把这些语言划分为C族静态语言、非C族静态语言和动态语言三类的。”

冒号解释:“那是按语法来划分的,偏重理论;现在是按应用来划分,偏重实践。”

句号旋即联想到:“这种分法貌似三层架构——前台语言对应表现层;平台语言和后台脚本语言对应业务逻辑层;系统语言对应数据层。”

“的确有几分神似,但千万不可混淆。”冒号提醒道,“三层架构(three-layer architecture)是模块设计上的逻辑划分;而这里是按语言应用范围进行的物理划分——与用户交互的是前台语言,与机器交互的是系统语言,介于其中的为前台提供服务同时又需要底层系统服务的是后台语言。”

逗号询问:“后台语言又细分成平台语言与后台脚本语言?”

“这是基于程序(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)’的说法。它又号称瑞士军刀,精练而复杂,实用而强大。但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)来管理,不能充分利用多核或多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;与Perl一样,它的对象模型不是先天的,直到PHP 5才真正完善;对线程支持不足;相比Perl、Python和Ruby,它的功能稍显单薄等等。”

引号突然想起:“我记得您在第一堂课提到PHP还能用于桌面应用。”

“不仅PHP,Perl、Python还有Ruby,都能作为前台语言来开发命令行或图形界面的应用。同样地,VB、Delphi和Javascript也能作为后台语言。现代的程序语言既有自己的专长,又向通用化和全能化发展,以争取更多的生存空间。试想一下,现代的程序员又何尝不是如此呢?”言及于此,冒号收住话题,“语言简评告一段落,还有不少既有趣又有用的语言,在此就不一一评说了。我们看到,每种编程语言都有其独特的惯例用法和哲学理念,它们与编程范式一道形成了语言的编程风格。体悟愈深者编程语感愈强,思维与语言愈交融无碍,渐从必然王国走向自由王国。”

逗号满怀憧憬:“那是不是一种人剑合一的境界?”

“或许人器合一更准确吧,程序员可不能只会一种兵器哟。”冒号故意抠他的字眼,“现在请大家每人写一句对本节课的感言。”

众人沉思片刻,齐齐挥笔而就——

  • 叹号——没有最好的语言,只有最合适的语言。
  • 逗号——没有糟糕的语言,只有糟糕的程序员。
  • 问号——没有一种语言是万能的,只会一种语言是万万不能的。
  • 引号——废除对语言的宗教信仰,建立对语言的哲学思维。
  • 句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。

冒号读罢大悦,顺手一掌拍出五记马屁:“精彩之极!可谓字字珠玑、句句联璧啊。兹决定,给诸位的奖赏是——立时下课!”众人欣然领赏而去。

。总结

  • 比起Java平台和.NET平台,动态语言轻便灵活、开发效率高,但整合凝聚力还不够,在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有一定差距,故通常作为轻量级的解决方案。
  • LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台,具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点。
  • Perl精练、复杂、强大、灵活、自由、隐晦、表现力强,但规范性、可读性、一致性、整洁性和可维护性较差。
  • Python优雅规范、简洁明晰、易学易用、类库丰富,但效率稍差,有些人不喜欢它对空白符敏感的特性。
  • Ruby语法精巧、高度灵活,兼具Perl的表现力和Python的可读性,尤其注重程序员的感受,但其性能和线程模型尚有待改进。
  • PHP简单、专一、实用、流行,在但相比其他三种语言,在语法和功能上稍有欠缺。
  • RoR是一种轻量级套餐式的web应用解决方案,是由好的设计(MVC架构和CoC、DRY原则)加上好的语言(Ruby)在好的时机(web2.0和敏捷开发风行之际)打造出的好的框架。
  • 静态语言与动态语言从语言特征到运行环境都在逐渐融合。
  • 程序员应该与程序语言一样,既要有自己的专长,又要向通用化和全能化发展。
  • 编程语言惯例用法、哲学理念和编程范式形成了语言的编程风格。

本文地址:http://www.nowamagic.net/librarys/veda/detail/826,欢迎访问原出处。


推荐阅读
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了一种处理AJAX操作授权过期的全局方式,以解决Asp.net MVC中Session过期异常的问题。同时还介绍了基于WebImage的图片上传工具类。详细内容请参考链接:https://www.cnblogs.com/starluck/p/8284949.html ... [详细]
  • 本文讲述了作者从最初对软件工程的选择迷茫到逐渐喜欢并坚持学习的经历。作者在大学期间通过学习专业课和参与项目开发,不断挑战自己并取得成就感。虽然曾考虑过转专业和复读,但最终决定坚持学习软件工程,并为自己的未来努力奋斗。作者还提到了大学生活与自己最初的预期不同,但对此并没有太多抱怨。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
_____Fmr丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有