我寫作的目的是討論在使用動態語言的過程中進行質量控制的必要性,以及由此引發的關於性價比的爭議。這並不意味著動態語言全面優於靜態語言,更不意味著靜態語言會被動態語言完全取代。進壹步,我簡單說壹下我體會到的靜態語言的相對優越性和意義。
首先,我要表達我壹貫的觀點,電腦不會變魔術。具體來說有兩個方面。第壹,離機器越近,越有可能實現更快的性能;第二,現在的機器模型總是以線性的方式管理數據(值得抱怨的是,在操作系統之上,文件分區系統總是這樣做,而下層是否能以極坐標的方式在二維/三維空間中直接定位和訪問,而不是以扇區、柱面和簇的形式,我不知道,需要專家的指導)。
線性管理信息的作用是,基於線性數據結構或者通過地址訪問信息的編程工具通常比基於字典結構的更快,至少有更大的優化空間。對於靜態語言,我們已經在編譯時確定了對象的結構和大小(動態大小的內容可以通過引用來管理),這對於動態語言是不可能的。動態語言的對象結構總是基於字典結構,要考慮對象結構在運行時發生變化的問題。這使得它的數據管理總是比直接地址訪問多壹級。這也是為什麽很少見到動態語言編譯器的原因。幾乎所有流行的動態語言都是解釋/字節碼平臺,甚至最常見的語言如Python/Ruby也有飽受批評的GIL(全局解釋器鎖)。根據Python社區的經驗,已經出現多年的幾個沒有GIL的C-Python實現的單核性能都不如目前的正式版。Jython和IronPython得益於JVM和CLR這兩個久經考驗的虛擬機平臺,它們的壹級語言都是靜態編譯語言(雖然它們的主流編譯器都是生成字節碼的,但我們通常把Java和C#當成編譯語言)。Perl社區期待多年的Perl6至今仍未發布(雖然其虛擬機Parrot已經發布,但由於主要語言的實現進度,並未得到實戰驗證)。很明顯,很難實現動態語言的高性能環境,尤其是並行環境。
從根本上說,在目前的硬件模型上,以非線性的方式管理信息,動態伸縮,動態修改結構是非常困難的。比如侯傑老師有壹個講座,以windows 95為例,詳細講解了malloc/free的底層實現。聽說過的朋友應該對操作系統動態管理內存資源的復雜性有所了解。類似的內容在操作系統等很多技術書籍中都有介紹,感興趣的朋友可以找找看。我手頭有壹本書《Unix系統編程》,裏面有相關內容。
這種問題涉及到深層次的問題。我不是專業人士,在這方面我是外行。我不太會說話,但是有興趣的朋友可以深入挖掘壹下,發現其實比看起來要麻煩很多。讓動態語言達到靜態性能是相當具有挑戰性的。Google的協議緩沖協議也是基於靜態模型的。
現代靜態語言偽裝的很好,所以可以寫的很動態,比如C#3,Scala等。,但本質上,它們代碼中涉及的類型仍然可以在編譯時確定。在我接觸過的語言中,Haskell擁有這類函數的歷史最多,它通過非常嚴格的數學體系推導出類型。在這個過程中,還是需要程序員在編譯前顯式聲明函數類型。
靜態語言越來越友好敏捷,動態語言越來越快,但兩者之間的界限還是挺清晰的,靜態語言更快,更有優化潛力。動態語言更靈活,表達能力更強。這是兩者不能互相替代的根本原因。
當然,性能問題並不簡單,動態語言往往沒有測試結果那麽慢。這是因為要表達復雜的業務邏輯,往往需要復雜的數據結構和訪問代碼,而這些復雜的數據內容是隨著用戶的訪問而不斷變化的。要實現這壹切,如果使用靜態語言,就要註意動態數據結構的實現。如果使用沒有GC的開發技術,也要註意內存資源的回收。確實會有很大的彎路,產生的系統也沒有現成的動態語言快(雖然這不是通用的)。更何況現實中I/O接口總是線性讀寫的,這使得不同語言之間的性能差異更加嚴重。所以現在比較認可的項目實現方式,往往是用動態語言實現項目,然後,如果有需求和這個成本負擔,用靜態語言優化性能瓶頸。
當然,上述模型經常用於基於服務器的項目。在GUI環境下,需要與顯示器、鼠標、鍵盤等人機交互環境頻繁交互,耗費大量資源。另外,在CPP等靜態語言大行其道的時代,GUI開發已經相當成熟,而且由於技術力量沈積的歷史原因,靜態和編譯語言仍然是該領域的主力。最多就是提交二次開發能力,提供動態語言調用的接口,或者嵌入壹個解釋環境有限使用。事實上,即使在服務器環境下,隨著互聯網的發展,性能問題也越來越突出。我遇到過壹個簡單的邏輯函數,用Python無法優化到理想的程度,最後我用Objective C寫了壹個nginx模塊,另壹方面Objective C之類的語言是相當動態的,使用它的字典結構比C方便很多,而且完全可以用二進制兼容C。在性能和空間方面,可以清楚地觀察到,它比大多數C字典結構花費更多的性能。計算機沒有魔力,人們總是要付出壹些計算資源來獲得便利。使其盡可能接近理想狀態是技術人員的目標。
越來越多的大型架構要求我們不僅要從模塊、連接庫和函數接口的角度來考慮,還要從實際運行時、運行實例和服務器行為的角度來考慮。我們不僅需要配件齊全的運行時環境,還需要能夠直接訪問硬件的高速有效的工具。包括開發壹些動態性較低但速度較快的定制服務環境,也成為越來越普遍的需求。
雖然編程語言在發展,我們表達思想的方式越來越強大,但隨著用戶數量、商業模式、服務方式的快速變化,新的挑戰也在不斷出現。對於專業的IT開發團隊來說,我們面臨著更多的挑戰。我們需要更豐富的技術組合,期望壹種技術壹統天下仍然是壹種奢望,即使僅限於互聯網應用領域。過去十年動態語言的興起,其實是彌補過去邏輯表達不足的壹課。這是硬件發展帶來的有限效益,但硬件資源總是在快速發展,卻沒有得到足夠的利用。動態語言和靜態語言相結合,兼顧高效開發和高性能的效果,在可預見的未來仍然是壹種切實可行的思路。