IntelliJ老板的一篇文章Language Oriented Programming: The Next Programming Paradigm
英文 http://www.onboard.jetbrains.com/articles/04/10/lop/
中文 http://blog.csdn.net/chelsea/archive/2005/02/17/290486.aspx
Martin Follower的一篇文章 Language Workbenches: The Killer-App for Domain Specific Languages?
http://www.martinfowler.com/articles/languageWorkbench.html
概念解釋:
DSL(Domain Specific Language): a limited form of computer language designed for a specific class of problems, 例如SQL語言,xml配置文件。
LOP(Language
Oriented Programming): the general style of development which operates
about the idea of building software around a set of domain specific
languages.
Language Workbench: the new breed of tools to do language oriented programming
LOP不是一個新的提法,不過隨著前段時間MDA(Model Driven Architecture)概念的熱炒,LOP似乎終于熬到了應用層面。Sergey Dmitriev的文章中批評了主流程序語言的不足,大概有這么幾條:
1. 通用語言表達能力(expressive power)很差,Time Delay to Implement Ideas
2. 領域概念的表達分散在實現代碼中,整體圖像迷失,因而Understanding and Maintaining Existing Code很困難。
3. 類庫等不是用領域概念表達的,因而Domain Learning Curve很陡峭。
這
些都是標準的陳詞濫調。地球人都知道,從問題描述到軟件實現之間存在著巨大的邏輯障礙,這種障礙有一部分是本質性的,即源于我們認識中的創造性因素,而另
一部分是技術性的,即源于我們使用的技術手段的限制。我們所能想到的解決的辦法就是盡量提高解決方法的抽象層次,
提升到所謂的領域層面,從而消解技術性障礙,同時輔助創造性發展。當我們的腦子里不再充斥著各種技術性細節的時候,大概就可以集中精力做些創造性工作了。
LOP把這些老帳又翻出來,到底它提供了什么新意?下面我們簡要分析一下LOP方案中概念的含義。
1. 領域(Domain)。
計算機語言與自然語言在使用上是有著深刻不同的。自然語言只是傳遞著信息,而計算機語言還要負責具體干事情,即計算機語言要同時說明怎么做和怎么用。做與
用這是兩個不同的領域,例如我現在編了一個時光機器的軟件,上面就一按鈕,只要輕輕一按,嗖的一聲我就回到了500年前。怎么樣,使用簡單吧,但實現呢?
我們當然希望在一個領域中使用最適合它的描述方法和控制指令。目前主流語言都是面向機器實現領域的(是實現領域的DSL?),加上Von
Neumann串性化體系的限制,
強迫我們用動態過程來實現靜態概念,更加劇了它對使用領域描述的不適應性。我們所要做的就是將做與用盡量分離,但同時盡量增大用的靈活性,domain
representation不僅僅給最終用戶用,還給程序員用。能在使用領域概念范圍內解決的問題,我們不要將其拖延到實現領域。在領域間進行轉換,總
存在信息轉換成本,甚至會造成信息失真。例如,一幅畫看起來結構很簡單,但是用自然語言描述起來都相當困難,更別說轉換為計算機語言了(當然,這個例子很
有可能是誤導的,因為涉及到不同的感官,其中的區別是非常深刻的,無法用單一的原因去解釋)。所謂領域區分,最重要的還是使用領域與實現領域的區分(不同
的復雜性,不同的表現形式...),而不僅僅是業務領域與計算機領域的劃分。在業務領域內部我們也要區分使用與實現。
2. 領域特定語言(DSL)
語言與庫的最大差別在于語素可以自由組合,以極低的代價構造出無數可驗證的結構,而庫函數的組合和搭配調用是冗長的,受限的,難以進行校驗的。DSL強大
的描述能力和推理能力其實是通過放棄其通用建模能力而實現的。最有效的DSL必須弱于圖靈機,必須將大量做的過程分離出去,必須引入大量的領域概念(本
體)。
在引入外部概念的時候,DSL會將其轉義為領域概念之后使用,從而消除歧義性并降低理解難度。
DSL不是在通用環境下工作,而是在明確受限的context下工作,因而概念的表達可以更加簡潔,而且領域概念之間還可以通過context構成一種整體性,例如非此即彼。
witrix平臺中的tpl模板引擎在一定程度上可以看作是一種DSL tools, 我也一直推動tpl在這個方向上發展。tpl具有強大的領域抽象能力,例如
彈出一個選擇系統用戶的窗口,直接實現為
<a href="select_user.jsp?deptId=1">選擇用戶<a>
封裝為tag之后,使用形式變為
<app:選擇用戶 部門編號="1" />
經過轉換之后,這里的調用不再是API含義,不再是說明怎么做,而是描述用什么。tpl中的標簽可以使用調用時明確指定的參數,也可以從全局
context中導入隱含的變量,從而依賴于所在領域的假定。例如,我們的很多界面控件需要與后臺交互,依賴于后臺jsplet框架,因而這些tpl標簽
選擇自動導入$thisObj和objectName等變量。領域抽象與context依賴其實正是DSL的精華所在。
(關于DSL,有些人可能會將其等價于規則引擎(rule engine), 這其實是一種誤解。規則引擎實現的是條件空間的分解與合并,它是一個獨立的技術,與DSL并沒有必然的聯系)
3. 語言工作臺(Workbench)
Workbench是LOP的使能技術。我們希望自由的構造DSL,必然需要對結構具有強大的控制能力。而文本語言總是線性的,靜態的。看看現在對自然語
言的研究吧,顯然我們對于怎樣在線性文本中塞入更多的結構缺乏本質性的認識。我們人為構造的語言,限于表現形式,其結構都異常的貧乏。計算機的腦袋是簡單
的,于是,我們想到增加維度,通過復雜的工具配合,來實現多層次,多視角,
動態的結構控制。在我看來,很多時候這是一種無奈之舉,當然也確實是目前唯一可行的辦法。
工具復雜了之后,造成的本質性障礙在于結構上的僵化,其具體表現之一就是所謂的廠家鎖定,一種結構融合上的困難。不同廠家產品的結構具有巨大的差異而無法
互相交互。xml其實正是為了解決這種結構交互困難而產生的,所以我更希望看到基于xml的工作。而在xml的形式下,能夠實施的結構變換現在也在不斷發
展當中,AOP, XSLT等等。