摘要
在過去幾年裡,在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只能使用流行的內容管理系統,其中要求是沒有太多的編程和定製是必要的。