縱觀80年代以來的成功應用軟體,凡是獲得長久成功者,絕大多數具有如下特點:
以一種系統語言(通常是C/C++)於OS API之上提供一高層的應用程式運行時(runtime),包括一個高層次、面嚮應用進行語義最佳化的虛擬機器,一個龐大的應用程式級API庫(基於普通過程的函數庫,或基於OO的類庫,或基於component的構件庫),一個具有可擴充性的軟體體系架構(尤以外掛程式式結構或面嚮應用的framework為典型),以及,最理想地,一個面嚮應用的語言引擎。整個應用以系統語言與應用級語言共同完成。擴充時主要使用應用級語言,亦可使用系統級語言,無論哪種,都必須依賴一個擴充架構。
且看一些例子:
1. Emacs,以C開發核心,並實現elisp解譯器,可用C及elisp實現原子函數。整個程式用C及elisp共同完成,並可以任一種方式進行擴充。
2. AutoCAD,以C/C++開發核心,實現AutoLISP,整個程式用C/C++及AutoLISP共同完成,可用C/C++/AutoLISP/VB擴充。同樣來自Autodesk公司的3D Max亦裝備有Max指令碼。
3. Mathematica,以C開發核心,實現Mathematica語言,整個程式用C及Mathematica語言共同完成,主要使用Mathematica進行應用開發。
4. Matlab,以C/C++開發核心,實現Matlab語言,整個程式用C/C++及Matlab語言共同完成,主要使用Matlab進行應用開發,也可使用C/C++/Fortran進行擴充。
5. Microsoft Office,基於COM體系,C/C++編寫核心模組,VB負責整合,並提供VBA供應用開發。
6. TeX,Pascal編寫核心解譯器,以宏擴充的方式開發高層系統。
還有如SAP、Perl、Python此類例子數不勝數
此種思路,屢獲成功,實當為我輩悉心模仿。其核心痛點有二,一是runtime的設計,動態性的實現,framework之權衡(需要面嚮應用,全如Eclipse那般靈活,對於特定應用領域而言並非最優),對底層計算平台的抽象(真正成熟的網路應用開發,應當將網路透明化);二是應用級語言的設計與實現,設計是關鍵,也是中國程式員之最弱點,
面嚮應用的高層語言的設計,相當於機械工業中的大型成套裝置製造,是主幹行業,核心技術。要設計出好的應用語言,要求設計者一通系統程式設計技術,對解譯器的及其與系統的互動、擴充的實現技術非常熟悉,二要深刻理解程式設計語言理論,精通形式語言理論及語言發展曆史,能不受困於20年來的主流思想,以最自然的方式提供所需語義,三是要熟悉應用領域,為設計提供方向引導。目前國內的教育體制及浮躁氣息,很難培養出如Larry Wall這樣的大師。
.NET CLR提供了上述所需的具動態性的runtime,FCL提供了完備的支援庫,這就使我們開發高品質應用程式的難度大大降低。但是VB和C#就應用開發來說,層次還顯得稍低。下一步應當是提供類似Python那樣的動態語言。.NET平台上的動態語言是什麼樣子?有兩種可能,一是把Python直接移植過來,我相信這是一定會發生的事,但是就微軟官方來說,它會採取另一條路,那就是直接把C#和VB指令碼化。而我估計在這一過程中,VB會優先。
最終我們會走向特定於領域的語言,我覺得這方面的一個典範是Mathematica,