本文是對Steve Vinoski. Multilanguage Programming.
IEEE Internet Computing, Vol. 12, No. 3, MAY/JUNE 2008, pp. 83-85 的總結。
本文的主要觀點是:在軟件開發中,要為特定的任務選擇最合適的開發語言。
作者首先介紹了在軟件集成和軟件開發中涉及的術語/技術浩如煙海,但是開發者卻只堅持某種技術,而必須使用其它技術來解決問題。這種現象在開發語言領域也是一樣。開發者總是使用自己喜歡的語言,而非解決問題最優的語言,會造成設計方案的不優。
作者指出在日常開發中了解和使用多種編程語言可以帶來顯著的好處,因為沒有任何一門語言適用于解決所有問題。而語言的存在也主要是由于它適于解決某些特定方面的問題(在解決某些問題方面比其它語言好),因此,不斷有語言出現和消亡。在編程語言設計和開發中涉及許多需要權衡的因素,因此,這為許多不同的方案和變體預留了空間。
作者指出,大部分單一語言開發者傾向選擇用于通用目的的語言(像Java、C++等),而不是特定的編程語言。通用的編程語言可用于解決更廣范圍的問題,但它們通常都是提供的折中的解決方案,不是太好,也不是太壞。當然,一些單一語言開發者盡力去挖掘語言的高級特性,來將語言的能力發揮到極致,但這些程序員仍然受制于這門語言實際的限度。
作者指出語言的選擇對開發效率是一個重要因素,選擇正確的語言所帶來的開發效率的提升是巨大和值得這么去做的。作者以對XML的處理為例闡述了此觀點。通用語言,例如Java在處理XML方面沒有專門設計上的支持,這使得開發人員在使用通用語言處理XML方面忍受這種不匹配,來進行拙笨的開發,造成非優的解決方案。在這種情況下,為了提高效率,他們通常采用一些代碼生成技術,把XML構造塊影射為靜態編程語言的構造塊(通常是類)來盡量緩解這種阻抗,即便如此,這種方式仍然是十分脆弱的。因為把高度靈活的XML構造塊轉化為嚴格的靜態的數據類型很容易造成彼此版本的不匹配。XML文檔的任何改變都需要新的代碼生成、重新構建、....這使得通過代碼生成獲得的一點點好處又被不斷維護帶來的成本所抵消。相比之下,Python、Perl、Erlang等語言都提供了XML處理模塊,甚至還帶版本化功能。更好的像ECMAscript for XML (E4X)和Scala,提供了對XML字面量的支持支持,開發人員可以直接在語言語法中寫XML。消除了阻抗,帶來了更簡化的代碼和更清晰的功能。
作者指出,選擇適當的語言所帶來的效率的提升還體現在對代碼的維護上。作者援引Fred Brooks在《人月神話》中引用的的研究發現說,所需開發和維護的工作量與指令的數目(可以理解為代碼行)是指數關系,而且這與所采用的語言無關。假設這個指數值是1.5的話,那么如果代碼行是原來的3倍的話,那么就需要5倍的開發和維護成本,如果代碼行變為原來的5倍,就需要11倍的開發和維護成本,如果代碼行變為原來的10倍,那么就需要32倍的開發和維護成本。選擇正確的語言,不僅可以減少代碼行,更快的提供解決方案和對需要的響應,這個過程可以變為積極的循環,更少的代碼帶來更好的缺陷和更容易的增強(維護),這又使得用戶更高興,提供免費的廣告宣傳和反饋,進一步促進軟件的發展。
作者指出,多語言編程的一個問題就是如何使它們協同工作。這可以分為兩類。如果是用于分布式應用集成(即不同的應用用不同的語言),那么網絡本身就通過協議提供了一個中立的方案,可以通過網絡消息等。如果不是分布式應用,當前的主流開發語言,比如微軟的CLT(公共語言運行時)所支持的語言越來越多,命令式的、動態的、函數式的,或腳本的。類似的,JVM也從一個單語言平臺演化為一個可以支持許多語言的平臺,包括JRuby、Scala、Groovy、JavaScript、E4X、Jython和其它的。而且,在JVM上,這些語言都容易學,因為都是基于字節碼,這些語言可以與Java進行互調。因此,JVM提供了一個非常好的方式來為應用的不同部分選擇最適合的語言。
作者還指出目前阻礙多語言編程的因素主要有兩個:一個管理因素;另一個開發者認為學習新語言難度很大。對于第一個因素,管理者通常認為只采用一種語言易于管理,因為大家都用同樣的語言,可以容易的替換開發人員,而且某個開發人員寫的代碼,大家也都能看懂,避免陷入只有少數人才能看懂和維護的局面。作者認為這種管理者對軟件開發和維護所涉及的成本沒有充分考慮。在一個JVM或CLR基礎之上,選擇合適的語言可以減少代碼規模和開發維護的工作量,從而降低系統的總成本,而且,較小的系統需要更少的開發者,這又是一個巨大的成本減少。對于第二個因素,相比通用語言來說,那個特定的語言,像Lisp、Python等都很簡練,核心概念并不多,初學者可以很快發現它們更具有生產力,而且,以往語言的經驗可以幫助你學習新語言。如果你掌握的語言越多,你就能更容易的學習一門新語言,也能發現解決問題的最好方式。
最后,作者以“畢竟,難道我們真的認為我們已經學到我們所需要的最后一門(終極)語言了碼?”結尾。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
歡迎您對自己所在的開發組織對于多語言編程、融合的實踐和經驗發表看法,謝謝!