原文地址:http://klau.si/php-vs-python-vs-ruby
摘要
在过去几年里,在web应用程序编程中,脚本语言变得越来越受欢迎。本论文试图在如今三种最受欢迎的语言:PHP、Python和Ruby中找到其中的差异、优点、缺点。很明显,他们有他们自己的观点和支持,所以要陈述客观事实并满足一种科学的方法是一项困难的任务。这三种语言将在web应用程序环境进行有关历史、进化、流行程度、语法、语义、功能、安全性和性能方面做评估。最后,一个最终的结论将建议最有前途的一种语言。
1、介绍
动态脚本编程语言已经到达主流市场通用的编程语言。他们有一定的属性去与语言c++等经典静态语言做区分:
-- 他们是动态类型
-- 他们注重语法
-- 他们有一个自动内存管理和垃圾收集
-- 他们大多是解释性的(而非编译性)
这些属性对于web应用程序开发是有吸引力的,因为它们支持快速成型、快速代码变更和测试例程。根据所选择的特定语言,也存在特定差异语言的价值。然而,本文不是关于比较动态语言和静态语言,而是比较三种动态语言:PHP、Python和Ruby之间的比较。在这介绍我将给出一些关于历史和流行的语言的细节。论文的主要部分工作是关于比较语法和语义、语言特点、安全性和性能。最终将会有一个结论列出所有的发现和提出基于程序员和用户的需要建议。
本文的阐述的是一个对三种语言的介绍,功能和可能性的概述,以及当评估一门工程语言时,对于web开发和决策指导相关的属性的比较。
1.1 历史
Web应用程序开发的历史相对较短。一开始全几乎是链接一些静态文件。Mehdi Jazayeri指出这段web应用程序工程和软件工程相似的历史,但在web应用程序工程规模小得多[14]。他表明在早期并没有比较多的结构和生成脚本是用Perl编写从而来产生web页面。因而嵌入脚本中的内容和HTML标记代码有比较大的问题,导致管理代码困难。这个时候,PHP以一种相反的方法进入市场:脚本代码插入到HTML内容。
PHP由拉姆Lerdorf开始于1994年,这是一个首字母缩写代表“个人主页”(在1997年用PHP取代:超文本预处理器)。PHP语言是由PHP团队开发,现在也成了实际上的标准[12],起因于没有正式的语言规范。它是在开源许可条款下发布并且开发文档是在线免费的[13]。
随着web应用程序工程的成熟,软件工程师认识到一个关注点分离对于实现大而复杂的项目是必要的。一个著名的在web开发中设计模式有了新的关注:模型-视图-控制器[17]。PHP从一开始并不支持面向对象编程,但它的功能不断地被添加到语言中,从而赶上使用模型-视图-控制器设计模式的需要。
与此同时,Python编程语言也有些年了。Python在1991由Guido van Rossum开发,就在万维网发布公共使用很短的一段时间内。它从一开始是一个全功能的通用语言并没有像PHP那样专门用作web脚本语言。它的语言也没有正式规范,但事实上的标准是由Python软件基金会[20](其实现参考CPython,这是因为它是用C编写的)。还有其他几个项目提供一个兼容的Python实现:例如Jython是用Java编写的,并使用Java平台的底层。IronPython是用c#编写的,利用的是.NET框架。一个名为PyPy的实现是用Python本身写的。类似于PHP,Python有强大的开源背景,也附带全面的在线开发文档[10]。
另一个编程语言诞生于1995:Ruby,这是由时与Yukihiro Matsumoto所开发的脚本语言,它和Python相比有着非常相似的理念。Ruby是完全面向对象的编程语言,受到编程语言Smalltalk的强烈影响。Ruby有一个用C写的实现规范,并且是开源(再一次类似于PHP和Python)。Ruby语言发展是由一个开放社区协作完成的,其背后并没有正式的基地或组织。语言规范和开发文档都是在线免费可获得的[9]。
1.2 流行程度
所用语言的流行程度对于公司拥有一个足够大的员工池是相当重要的。不受欢迎的和未知的语言对于维护和发展存在是一个计划的冒险,同样对于编写软件而言。因而,决策项目应该使用哪种语言还依赖于编程语言的流行因素。
在这一点上我想提到流行的测量非常困难的。任何形式的结果不能被视为真正的科学证据,因为很难收集代表性数据。
受欢迎程度的一个指标是TIOBE编程社区指数[6]。它基于熟练的工程师、课程、第三方供应商和搜索引擎评级的编程语言排名。网站说道,“指数可以用来检查你的编程技能是否仍跟得上潮流或在做出战略决策时应采用什么编程语言开始建立一个新的软件系统。”2009年5月PHP是排在第四位,第六位Python和Ruby on第十。
另一个方法是测量等网络媒体讨论IRC,新闻组等。Anton Ertl提供一则统计不同公司应用不同语言的数据页面。截至2009年3月,Python是排名第一,Ruby是排在第四位和PHP第九。类似于TIOBE指数,有一个关于编程语言受欢迎程度网站,也是基于IRC评级和讨论性质网站如Slashdot[5]。这个规范化的讨论网站最后显示Python排名第三位,Ruby在第六位和PHP第九。
考虑web编程语言的背景下,我们也可以考虑现有的软件生态系统。如前所述,所有三种语言有着密切的关系,都是免费和开放源码的软件,所以有许多web框架和内容管理系统供使用。PHP被最流行的内容管理系统使用,如MediaWiki、Drupal、Joomla和Wordpress,这里只列出了其中的一些。Python最受欢迎的web框架有Zope应用程序服务器,并运用于内容管理系统像Plone、Django。Ruby提供众所周知的Ruby on Rails的web框架,但是还没有流行的内容管理系统供使用。
PHP为中小企业和私人客户提供一个主要的优势:它是可以在几乎每一个共享主机提供商上使用,并且如今是最容易在服务器上建立运行环境的。
总之,PHP、Python和Ruby总是在十大流行的语言,都是世界上著名的语言。PHP在搜索引擎评级上有优势并且在主机托管提供商上是可用的。Python在讨论媒体评级上具有优势。PHP提供了最受欢迎的全功能的内容管理系统,网站建设上允许没有编程技能,而Python和Ruby则阐述了可用的web框架,提供更大的灵活性,但也需要更多的编程工作。
2、语法和语义比较
这一章将会注重于代码片段和编程语言结构的讨论,这些能在三种语言:PHP、Python、Ruby中进行比较。
2.1 PHP
正如在介绍中提到,PHP发明了直接在文档内容中嵌入代码的技术。一个简单的例子如清单1.1所示,当传入请求时,脚本被触发,内建的PHP echo命令被执行。
清单1.1. PHP代码嵌入在一个HTML文档
清单1.2. 一个简单的检查登录信息的PHP示例
这对于小型和静态web页面是有用的,但是随着网络的发展和应用越来越复杂,嵌入代码转移到templateles(模板引擎),这对于视图、设计和外观是负责的。
业务逻辑代码分离其他文件,从而提高清晰度和可维护性。这里给出了一个典型的PHP代码片段例子,在清单1.2中显示了基本的语言结构。这是取自Armin Ronacher的在web应用程序上关于安全性的工作[19]。
如你所见,PHP语法来自C语言中的语法,函数是语言中的中央元素。如今的版本并没有命名空间(将会在未来的PHP 5.3中引入),所有的函数需要有独特的名字。变量必须先 $ 符号开头并且不需要初始化,可以访问全局变量与一个特殊的关键字(“global”)。PHP有一个弱类型系统使用隐式类型转换,例如一个整数和一个字符串可以在一个布尔表达式中比较。这经常引起混乱和不确定性——操作符应该使用在哪种情况,但是在PHP文档中有比较表和提示。
在上面的例子中MySQL数据库语句直接集成于代码中,这在PHP中很长一段时间中是一个缺点,因为数据库系统与PHP函数紧密耦合。直到PHP 5.1支持PDO(PHP数据对象)后,这是一种利用基于构造的功能,从而抽象数据库层的方法。
面向对象编程的范例对于PHP语言是相对较新的,其在PHP 4得到引进,在PHP 5中得到增强。然而,PHP的程序代码根在现在的大多数PHP web框架和内容管理系统中是明显的,但对于从面向过程到面向对象方法有一个迁移过程。
PHP一直被认为对初学者容易学习。示例代码在网上很多地方可得并且实现共同任务的代码行数少。作为一个web应用程序的完整软件技术,著名的LAMP栈(Linux Apache MySQL PHP)是免费的并有良好的文档和教程。许多程序员熟悉其语法,因为它类似于众所周知的语言如C和Java。PHP的行为总是非常强劲的——使用着隐式类型转换、保持warning警告、只有当发生严重错误时才会出现error警告(这是初学者的一个优势,但却也是复杂的代码的开发陷阱)。这些因素给PHP强大的用户基础和在许多系统上的贡献。
2.2 Python
Python是一种开始不是特别专注于web应用程序的语言,直到一段时间后web脚本在Python中开始变得常见。第一个方法是使用CGI(公共网关接口)的方式如清单1.3所示。
清单1.3. 一个简单的返回一个Hello World 字段的Python脚本
Web框架是用Python编写的,但他们使用不同的技术如CGI,mod Python等,从而与Web服务器网关进行通信。因此,框架对于不同的web服务器或不同的网关接口是不兼容的。此问题的解决方案是WSGI:“WSGI是Web服务器网关接口。它是一个规范的与web服务器和应用程序服务器通信的web应用程序(尽管它应用远不如此)。它是一个Python的标准,详细描述了在PEP 333。”[7]WSGI允许改变环境或网络应用程序的网关系统,而无需接触源代码。所以它的优点是更方便。根据WSGI ,一个Python web应用程序可以在其最简单的形式来实现,如清单1.4所示。
清单1.4. 通过WSGI的Hello World程序
拥有统一接口对于这种方法是有好处的,但对于初学者而言也有点复杂。更多的细节必须是显式而不是隐式地定义,就如同在PHP或上面的CGI的解决方案一样。
清单1.5显示了与PHP的登录验证示例相同的部分,但现在在Python中实现。这也是来自Armin Ronacher在web应用程序安全上的工作[19]。
清单1.5. 在Python函数中验证登录信息
与PHP相比,Python从一开始是一种面向对象的语言,但它并不局限于这种模式,还支持过程式编程和一些函数特性。有人证明它的语法很容易阅读和理解,因为它只有少量的关键词。Python语法不同于PHP和Ruby的一个主要的语法属性:代码块内缩进是强制性的(例如函数体)。这意味着源代码总是被严格地结构,大多数其他编程语言是不这么强制的。在Python中语句定义不需要用冒号隔开(换行符表示结束一行),但它是允许使用它们的。
Python的类型系统是强大的。在运行时错误有一个最近的调用traceback,,给开发人员提供调试信息。
2.3 Ruby
Ruby是一种只拥有一个主要web框架的编程语言:Ruby on Rails。它使用CGI作为网关,也提供了自己的web服务器,但其只被建议用于开发和测试。在这里我将跳过一个hello world示例。清单1.6展示了利用Ruby实现的验证登录功能的示例。
清单1.6. 利用Ruby验证登录信息
Ruby语法类似于Python,但语义有一点不同:Ruby是纯粹的面向对象并且以Smalltalk语言语法为结构。这意味着原始类型与复杂类型是不同的,对象间通过发送消息通信。每个对象都可以收到任何消息和在某处以异常处理的方式处理未知的消息。所有的语言结构,包括原始的对象如作业,被视为接收特定参数消息的对象。
Ruby也由换行符分隔语句,也可以附加一个分号结束时。Ruby并不像Python使用强制缩进,它是利用do做关键字(或大括号的缩写形式)来表示代码块。它还支持过程性编程范式,一些函数式语言结构和元数据编程。
Ruby遵循最小惊讶原则,这意味着该语言被设计成直观地使用,预期行为应与实际行为对应。Ruby是一个极其动态的语言,可以在运行时改变每一个对象的行为,包括变异内置类型的语义的能力。这可能会导致完全意想不到的结果,例如在条件字句中扭转’true’和’false’的意义将打破大多数程序。因此确保所有的程序是可以信任是必要的,并需要定义一些规则或指导方针说明什么是可以改变的,什么是不能改变的。
2.4 可读性和可用性
对于编程语言用户来说,定义怎样使可读性和可用性是困难的。PHP遵循一种非常特别的方法,广泛记录和可能会为c程序员最熟悉。Python以其严格的强制缩进和少量集的关键字可能会是对编程初学者的最佳选择。最后,Ruby可能会吸引Smalltalk爱好者和有经验的程序员,因其优雅和强大的编程表现力。
尽管Python似乎拥有三种语言中可读性最好的语法(因为强制缩进的结构),而Ruby似乎是最有用的(因为它的最小惊讶原则)。当然,PHP是一种可读性强的语言,因为大多数程序员都熟悉基于c的语法。
3、语言特点比较
这一章将会罗列一些编程语言的特点,这些在一些案例中是有用的并且在web应用程序开发中是有用的。
3.1 异常处理
异常处理在所有三个语言都有提供。Python和Ruby从一开始就提供,PHP在版本5中添加。因此一些PHP内容管理系统在他们的代码和框架缺乏适当的异常处理支持——这个功能普及并不广泛。
语言之间的差别只是通过其他关键词构成的语法。PHP 有”try / catch /finally”来处理异常和”throw”操作来触发异常。Python使用” try /except/finally”和”raise”,Ruby提供” begin /rescue/ensure”和”raise”。系统在所有语言上的工作都非常相似,处理上如大多数程序员期望它。Python版本2.5引入了一个新的附加功能,允许对象定义标准清理操作(例如文件对象关闭上无论操作后是失败或成功)。程序员不必关心再”finally”,这样可以减少源代码长度和确保正确的清理,这可以在大型程序对性能产生影响。参考见PEP 343[1]。
3.2 关系型数据库抽象
几乎所有现代web应用程序需要一个数据库底层存储和检索数据。为了开发一个易于使用、安全、独立于供应商接口的关系型数据库,能从普通、老式的SQL语句中摘要的一个好方法是必要的。
PHP与MySQL数据库系统有着悠久的历史。PHP web应用程序曾经以及现在都与特定的数据库紧密耦合。自从PHP 5.1版本推出之后,一个称为PHP数据对象(PDO)的概念被引进并作为基于sql的数据库系统的抽象层。通过使用PDO和标准SQL语句,现在可以在不改变太多web应用程序的源代码的情况下更改数据库系统。来自第三方库的对象关系映射(ORM)也是可被利用的,但他们并不被大多数现有的内容管理系统使用,PHP web框架只使用其中一些。
Python在PEP 249 中指定了一个数据库API[2],鼓励在访问不同的数据库访问不同的数据库系统时的相似性模块的开发。当使用流行的Python web框架,经常会看到一些ORM工具被包括进来,并进一步添加了抽象层来允许面向对象数据库访问。
Ruby在唯一流行的web框架——Ruby on Rails中使用ActiveRecord系统,从而提供一个ORM模式。它能作为ORM工具像其他语言框架一样完成类似任务。
总之,在三种语言中都存在数据库抽象的支持,并且ORM广泛运用于所有web框架。PHP是有点落后于其他两种语言,因为其数据库抽象尚未被现有长期存在的PHP项目所应用。
3.3 函数式语言特性
Python和Ruby都支持函数式语言的特性。它们都拥有应用在列表和集合类型中的列表理解机制;被当作第一类公民的函数和一个用于写匿名函数的”lambda”关键字。
Ruby实现了闭包——一个以代码块作为函数调用参数的概念(Python可以达到同样的行为)。这是一个函数式特性,使用第一类函数与自由变量从而在闭包中保持他们的作用域和生命周期。
PHP没有特别关注函数式编程,虽然它也可以实现一个函数名作为字符串存储在一个变量中,然后使用它来调用一个函数引用。这只是一个非常基本的和不完整的功能行为,因此PHP不能优雅提供函数式范式。
3.4 交互式解释
PHP、Python和Ruby标准实现都提供了窗口交互式解释的功能。这意味着翻译可以在一个交互模式中启动,在交互模式中一些命令行逐行地接受语句和表达式并且立即打印出结果。它可以被加以利用例如直接测试小代码片段和观察结果,或直接对语法进行实验而不需要编辑、保存和运行包含代码的文件。这个功能对初学者尤其有价值,对经验丰富的程序员也是有一定的测试作用的。
交互式的开发和测试是存在的,在所有三种语言都应用得很好。
3.5 Duck类型
Duck 类型在面向对象的动态类型语言是一种多态性范式。一个对象的属性和方法确定对象的适用性和而不是由对象的类型决定的。Python和Ruby促进和鼓励使用duck 类型并且提供了适当的捕获异常的机制,而PHP并不被指定为能利用duck类型的语言,而是建议通过继承多态的使用。PHP引入了一个概念,叫做类型提示,其中函数或方法的参数被特定的类型指定,当传递错误类型时会抛出错误。
利用duck类型编写软件的程序员应该考虑使用Python或Ruby而不是PHP。
3.6 PHP主要的缺点
PHP平台有一些主要的缺点,Nikolaj Cholakov[8]描述了这些并我们在这里进行总结。PHP允许使用未初始化的变量,通常拥有独特的命名约定和使用了一个不同参数命令的相似函数。也还没有命名空间,所以函数需要有独特的函数名;可用函数的数量非常多,其中一些执行相同的任务,容易让程序员搞混。错误处理被解决两次:面向过程利用”set_error_handler()“而面向对象的利用异常处理。
PHP也臭名昭著的特性,如”register_globals”和”magic quotes”,但他们已经从语法中移除了,本文将不讨论了。
3.7 其它区别
在这两种语言间还有其他详细的区别,但这些对web应用程序并不特别重要。PHP不支持线程(并发编程)和Python和Ruby 提供了”yield”语句来作为生成函数(在Python和Ruby之间有一个在yield使用上语义的区别),这里只列出了其中的一点点细节,并不过多涉及。
4、安全性比较
web应用程序最强调安全的首要部分是用户的输入。为了避免攻击,关键是要清洁和确保从外面提交给web应用程序数据的安全,例如用户名和密码凭据、评论、论坛的帖子或其他方面的内容。在本节中,我将讨论一些流行的攻击技术。
4.1 SQL注入
SQL注入是一种利用具有特殊意义的用于查询数据库的SQL语句字符(例如字符串”——“用作评论转义序列)进行的攻击。在PHP中,可以使用函数来摆脱这种特殊字符是可行的(参见清单1.2为例),但这是独立于数据库的和不可移植的。使用带有PDO(PHP数据对象)的SQL语句的做法是被提倡的,其中查询在建立在安全的方式(恶意数据会被编码或自动逃脱)。Python利用数据库API也实现相同的方法(参见清单1.5),Ruby在Rails框架中也提供了这种自动支持。如果使用这些API,那么SQL注入对于所有这三种语言都不是一个问题。
4.2 跨站脚本攻击(XSS)
跨站脚本是一种向web应用程序内容中插入事先准备好的恶意脚本片段的攻击,然后在受害者的浏览器中执行。相应的对策是要严格地清理向用户提供的输入(在这种情况下,攻击者提供的)输入。PHP、Python和Ruby 提供函数来逃避有潜在危险的输入,并且许多在web框架中模板引擎也提供逃避甚至自动逃避。所有这三种语言都事先设计好来处理这种攻击。
4.3 服务器端代码执行
脚本语言通常都有一个非常危险的特性——破坏一个web应用程序的安全:” eval()”或”exec()”。这个函数的目的是执行的代码存储在一个字符串变量中。如果字符串变量是由用户生成的内容组成,使用eval将导致一个巨大的安全漏洞。所有这三种语言都提供这种功能,但并不鼓励使用。
4.4 PHP安全缺陷
PHP可以以一种安全的方式使用,然而也有一些核心安全问题源于一个糟糕的语言设计。有像Suhosin等项目一样提供一个保护系统和一个PHP硬化补丁,从而修复与缓冲区溢出相关或者是格式字符串漏洞的问题。PHP允许匮乏的编程实践会在web应用程序开发过程中导致许多的bug。国家漏洞数据库中,大约三分之一的存储漏洞与php相关的。考虑到这一点,强调安全的应用程序的话PHP可能不是最好的选择。
4.5 性能比较
性能、速度和响应能力对于web应用程序都是很重要的因素,虽然这些特点很难去客观衡量。整个系统环境影响性能:例如网络速度和响应时间、数据库连接、web服务器的性能、服务器硬件性能、同时还有发生的请求的数量等。
然而,编程语言的选择也会产生影响,即特定语言的实现。计算机语言基准评分游戏[3]能尝试比较不同编程语言方面的性能。网页上说,“我们如何实现测试语言的实现?我们不能,我们测量特定的程序。”利用普通认识的语言解决编程任务,并且运行在相同的硬件和操作系统。在最后的名单上基于结果对PHP、Python和Ruby进行排名。主要是因为这些脚本语言不被编译为机器代码,但在运行时解释,这三种语言均相对较接近,在整个测试排名中表现不超过10%的不同。这些三种语言没有一种表现出明显优于其它两种的情况。有趣的是,Ruby从版本1.8到1.9有一个巨大的性能提升,1.9版本的中位数大概是版本1.8的两倍(这似乎与1.9版本是与字节码编译器以及虚拟机执行有关的缘故)。在清单中还有JRuby实现,其执行非常相似的参考实现。
提高性能的一种常见方法是使用缓存系统的速度优化。PHP扩展非常普遍和广泛使用缓存进行编译字节码,以避免在每个请求中都去解析和编译源代码。Python还提供了web应用程序的缓存系统,即memcached2,更通用的内存缓存系统最初应用于Django web开发框架。Ruby也能进行应用缓存机制,如刚提到的memcached。
总之,总结一个整体性能赢家是困难的,毕竟这几个语言所有评级的结果几乎一样。
6、相关的工作
有很多关于处理web应用程序工程的文献:Mehdi Jazayeri写了一篇关于web应用程序的趋势和现状的有趣文章[14],Vosloo和Kourie web提出了web框架的概述和概念[22],Armin Ronacher则记录了非常实用的与安全相关的问题[19]。本文的切入点只是一个很小的选择的显式使用而已,预计随着web开发的不断成长,将来会有更多的发现。
脚本语言也涉及了很多的文章,如Luis Rei et al.的关于脚本语言大观的作品,如Ronald Loui利用脚本语言描述表达编程的实用主义[16]。
另外本文还有有一些材料是关于每个语言之间的对比。Nikolaj Cholakov 对于PHP进行了分析并总结了一些缺点[8]而Xavier Spriet 提出了一些关于PHP安全和配置的一些建议[21]。Gred Lindstrom[15]介绍和解释了Python编程,David Geer对Ruby on Rails进行了一个总体的介绍[11]。
因为PHP、Python和Ruby都是免费和开源的语言,有很多相关的工作和帮助在网上都可以获取,可参考本文提供的web资源[13][10][9]。
7、结论
本文从一个web应用程序工程的视角提出了三种动态编程语言PHP、Python和Ruby的各个方面。其中,性质、特点和安全性我们都进行了相应的探讨和分析以给出语言之间的比较。对于各种语言相应的程序员(或用户)而言,优缺点都进行了一定的指出。
决定选择哪种语言应该首先基于以下的用例:web应用程序要完成的是什么目标?如果是用于普遍的任务譬如web商店或新闻网站等,那么也许一个PHP内容管理系统是最好的选择。它支持快速开发并且能根据个人的需要进行扩展。缺点是在灵活性上:扩展与系统的数据模型和内部程序流紧密相关。如果软件打算用于更专门的目的,那么最好肯定是从头开始搭建web框架。在这种情况下考虑表1,其中的标准对于你在不同案例上对不同语言的选择的建议是重要的,包括从最佳选择到最差选择。
列表 1. PHP, Python and Ruby 基于不同情况的比较
特点选择 | 详细描述 | 最佳 | 中等 | 最差 |
受欢迎程度 | 工作市场 | PHP | Python | Ruby |
可靠性 | 在大多数存在的系统 | PHP | Python | Ruby |
可读性 | 维护性和依人而异 | Python | PHP Ruby | - |
可用性 | 快速成型和发展 | Ruby | Python | PHP |
安全性 | 对于重要的应用场合 | Python Ruby | PHP | - |
性能 | 运行速度和执行时间 | PHP Python Ruby | - | - |
数据库抽象 | 供应独立和对象关系映射 | Python Ruby | PHP | - |
异常处理 | 错误控制和恢复 | Python Ruby | PHP | - |
函数特征 | 函数式编程技术可能性 | Python Ruby | - | PHP |
为了更好地理解不同语言之间相互的不同点,可参看图示1
图1 语言间的相对比较,衡量标准从0(最差)变化到10(最好)
免责声明:编程语言PHP、Python和Ruby都是永久性的发展,所以这个表可能会在未来几个月或者未来几年相应改变。我们试图从客观事实中获得结果,并进行语言的分析。然而,选择编程语言总是与个人的经验有关,因此讨论语言常常是个人倾向和并带有一定的非理性因素。
作为最后的建议,我认为使用Python web应用程序作为通用的用例,Ruby有强大的后盾但尚未形成流行趋势。PHP只能使用流行的内容管理系统,其中要求是没有太多的编程和定制是必要的。
更多推荐
php、python、ruby——web脚本语言的比较
发布评论