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. 領域概念的表達分散在實現(xiàn)代碼中,整體圖像迷失,因而Understanding and Maintaining Existing Code很困難。
3. 類庫等不是用領域概念表達的,因而Domain Learning Curve很陡峭。
這
些都是標準的陳詞濫調(diào)。地球人都知道,從問題描述到軟件實現(xiàn)之間存在著巨大的邏輯障礙,這種障礙有一部分是本質(zhì)性的,即源于我們認識中的創(chuàng)造性因素,而另
一部分是技術性的,即源于我們使用的技術手段的限制。我們所能想到的解決的辦法就是盡量提高解決方法的抽象層次,
提升到所謂的領域?qū)用妫瑥亩饧夹g性障礙,同時輔助創(chuàng)造性發(fā)展。當我們的腦子里不再充斥著各種技術性細節(jié)的時候,大概就可以集中精力做些創(chuàng)造性工作了。
LOP把這些老帳又翻出來,到底它提供了什么新意?下面我們簡要分析一下LOP方案中概念的含義。
1. 領域(Domain)。
計算機語言與自然語言在使用上是有著深刻不同的。自然語言只是傳遞著信息,而計算機語言還要負責具體干事情,即計算機語言要同時說明怎么做和怎么用。做與
用這是兩個不同的領域,例如我現(xiàn)在編了一個時光機器的軟件,上面就一按鈕,只要輕輕一按,嗖的一聲我就回到了500年前。怎么樣,使用簡單吧,但實現(xiàn)呢?
我們當然希望在一個領域中使用最適合它的描述方法和控制指令。目前主流語言都是面向機器實現(xiàn)領域的(是實現(xiàn)領域的DSL?),加上Von
Neumann串性化體系的限制,
強迫我們用動態(tài)過程來實現(xiàn)靜態(tài)概念,更加劇了它對使用領域描述的不適應性。我們所要做的就是將做與用盡量分離,但同時盡量增大用的靈活性,domain
representation不僅僅給最終用戶用,還給程序員用。能在使用領域概念范圍內(nèi)解決的問題,我們不要將其拖延到實現(xiàn)領域。在領域間進行轉(zhuǎn)換,總
存在信息轉(zhuǎn)換成本,甚至會造成信息失真。例如,一幅畫看起來結(jié)構很簡單,但是用自然語言描述起來都相當困難,更別說轉(zhuǎn)換為計算機語言了(當然,這個例子很
有可能是誤導的,因為涉及到不同的感官,其中的區(qū)別是非常深刻的,無法用單一的原因去解釋)。所謂領域區(qū)分,最重要的還是使用領域與實現(xiàn)領域的區(qū)分(不同
的復雜性,不同的表現(xiàn)形式...),而不僅僅是業(yè)務領域與計算機領域的劃分。在業(yè)務領域內(nèi)部我們也要區(qū)分使用與實現(xiàn)。
2. 領域特定語言(DSL)
語言與庫的最大差別在于語素可以自由組合,以極低的代價構造出無數(shù)可驗證的結(jié)構,而庫函數(shù)的組合和搭配調(diào)用是冗長的,受限的,難以進行校驗的。DSL強大
的描述能力和推理能力其實是通過放棄其通用建模能力而實現(xiàn)的。最有效的DSL必須弱于圖靈機,必須將大量做的過程分離出去,必須引入大量的領域概念(本
體)。
在引入外部概念的時候,DSL會將其轉(zhuǎn)義為領域概念之后使用,從而消除歧義性并降低理解難度。
DSL不是在通用環(huán)境下工作,而是在明確受限的context下工作,因而概念的表達可以更加簡潔,而且領域概念之間還可以通過context構成一種整體性,例如非此即彼。
witrix平臺中的tpl模板引擎在一定程度上可以看作是一種DSL tools, 我也一直推動tpl在這個方向上發(fā)展。tpl具有強大的領域抽象能力,例如
彈出一個選擇系統(tǒng)用戶的窗口,直接實現(xiàn)為
<a href="select_user.jsp?deptId=1">選擇用戶<a>
封裝為tag之后,使用形式變?yōu)?br>
<app:選擇用戶 部門編號="1" />
經(jīng)過轉(zhuǎn)換之后,這里的調(diào)用不再是API含義,不再是說明怎么做,而是描述用什么。tpl中的標簽可以使用調(diào)用時明確指定的參數(shù),也可以從全局
context中導入隱含的變量,從而依賴于所在領域的假定。例如,我們的很多界面控件需要與后臺交互,依賴于后臺jsplet框架,因而這些tpl標簽
選擇自動導入$thisObj和objectName等變量。領域抽象與context依賴其實正是DSL的精華所在。
(關于DSL,有些人可能會將其等價于規(guī)則引擎(rule engine), 這其實是一種誤解。規(guī)則引擎實現(xiàn)的是條件空間的分解與合并,它是一個獨立的技術,與DSL并沒有必然的聯(lián)系)
3. 語言工作臺(Workbench)
Workbench是LOP的使能技術。我們希望自由的構造DSL,必然需要對結(jié)構具有強大的控制能力。而文本語言總是線性的,靜態(tài)的。看看現(xiàn)在對自然語
言的研究吧,顯然我們對于怎樣在線性文本中塞入更多的結(jié)構缺乏本質(zhì)性的認識。我們?nèi)藶闃嬙斓恼Z言,限于表現(xiàn)形式,其結(jié)構都異常的貧乏。計算機的腦袋是簡單
的,于是,我們想到增加維度,通過復雜的工具配合,來實現(xiàn)多層次,多視角,
動態(tài)的結(jié)構控制。在我看來,很多時候這是一種無奈之舉,當然也確實是目前唯一可行的辦法。
工具復雜了之后,造成的本質(zhì)性障礙在于結(jié)構上的僵化,其具體表現(xiàn)之一就是所謂的廠家鎖定,一種結(jié)構融合上的困難。不同廠家產(chǎn)品的結(jié)構具有巨大的差異而無法
互相交互。xml其實正是為了解決這種結(jié)構交互困難而產(chǎn)生的,所以我更希望看到基于xml的工作。而在xml的形式下,能夠?qū)嵤┑慕Y(jié)構變換現(xiàn)在也在不斷發(fā)
展當中,AOP, XSLT等等。