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