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