posts - 176, comments - 240, trackbacks - 0, articles - 7

          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似乎終于熬到了應(yīng)用層面。Sergey Dmitriev的文章中批評了主流程序語言的不足,大概有這么幾條:
          1. 通用語言表達(dá)能力(expressive power)很差,Time Delay to Implement Ideas
          2. 領(lǐng)域概念的表達(dá)分散在實(shí)現(xiàn)代碼中,整體圖像迷失,因而Understanding and Maintaining Existing Code很困難。
          3. 類庫等不是用領(lǐng)域概念表達(dá)的,因而Domain Learning Curve很陡峭。

          這 些都是標(biāo)準(zhǔn)的陳詞濫調(diào)。地球人都知道,從問題描述到軟件實(shí)現(xiàn)之間存在著巨大的邏輯障礙,這種障礙有一部分是本質(zhì)性的,即源于我們認(rèn)識中的創(chuàng)造性因素,而另 一部分是技術(shù)性的,即源于我們使用的技術(shù)手段的限制。我們所能想到的解決的辦法就是盡量提高解決方法的抽象層次, 提升到所謂的領(lǐng)域?qū)用?,從而消解技術(shù)性障礙,同時輔助創(chuàng)造性發(fā)展。當(dāng)我們的腦子里不再充斥著各種技術(shù)性細(xì)節(jié)的時候,大概就可以集中精力做些創(chuàng)造性工作了。 LOP把這些老帳又翻出來,到底它提供了什么新意?下面我們簡要分析一下LOP方案中概念的含義。

          1. 領(lǐng)域(Domain)。
              計算機(jī)語言與自然語言在使用上是有著深刻不同的。自然語言只是傳遞著信息,而計算機(jī)語言還要負(fù)責(zé)具體干事情,即計算機(jī)語言要同時說明怎么做和怎么用。做與 用這是兩個不同的領(lǐng)域,例如我現(xiàn)在編了一個時光機(jī)器的軟件,上面就一按鈕,只要輕輕一按,嗖的一聲我就回到了500年前。怎么樣,使用簡單吧,但實(shí)現(xiàn)呢? 我們當(dāng)然希望在一個領(lǐng)域中使用最適合它的描述方法和控制指令。目前主流語言都是面向機(jī)器實(shí)現(xiàn)領(lǐng)域的(是實(shí)現(xiàn)領(lǐng)域的DSL?),加上Von Neumann串性化體系的限制, 強(qiáng)迫我們用動態(tài)過程來實(shí)現(xiàn)靜態(tài)概念,更加劇了它對使用領(lǐng)域描述的不適應(yīng)性。我們所要做的就是將做與用盡量分離,但同時盡量增大用的靈活性,domain representation不僅僅給最終用戶用,還給程序員用。能在使用領(lǐng)域概念范圍內(nèi)解決的問題,我們不要將其拖延到實(shí)現(xiàn)領(lǐng)域。在領(lǐng)域間進(jìn)行轉(zhuǎn)換,總 存在信息轉(zhuǎn)換成本,甚至?xí)斐尚畔⑹д妗@?,一幅畫看起來結(jié)構(gòu)很簡單,但是用自然語言描述起來都相當(dāng)困難,更別說轉(zhuǎn)換為計算機(jī)語言了(當(dāng)然,這個例子很 有可能是誤導(dǎo)的,因?yàn)樯婕暗讲煌母泄伲渲械膮^(qū)別是非常深刻的,無法用單一的原因去解釋)。所謂領(lǐng)域區(qū)分,最重要的還是使用領(lǐng)域與實(shí)現(xiàn)領(lǐng)域的區(qū)分(不同 的復(fù)雜性,不同的表現(xiàn)形式...),而不僅僅是業(yè)務(wù)領(lǐng)域與計算機(jī)領(lǐng)域的劃分。在業(yè)務(wù)領(lǐng)域內(nèi)部我們也要區(qū)分使用與實(shí)現(xiàn)。

          2. 領(lǐng)域特定語言(DSL)
              語言與庫的最大差別在于語素可以自由組合,以極低的代價構(gòu)造出無數(shù)可驗(yàn)證的結(jié)構(gòu),而庫函數(shù)的組合和搭配調(diào)用是冗長的,受限的,難以進(jìn)行校驗(yàn)的。DSL強(qiáng)大 的描述能力和推理能力其實(shí)是通過放棄其通用建模能力而實(shí)現(xiàn)的。最有效的DSL必須弱于圖靈機(jī),必須將大量做的過程分離出去,必須引入大量的領(lǐng)域概念(本 體)。
              在引入外部概念的時候,DSL會將其轉(zhuǎn)義為領(lǐng)域概念之后使用,從而消除歧義性并降低理解難度。
              DSL不是在通用環(huán)境下工作,而是在明確受限的context下工作,因而概念的表達(dá)可以更加簡潔,而且領(lǐng)域概念之間還可以通過context構(gòu)成一種整體性,例如非此即彼。
              witrix平臺中的tpl模板引擎在一定程度上可以看作是一種DSL tools, 我也一直推動tpl在這個方向上發(fā)展。tpl具有強(qiáng)大的領(lǐng)域抽象能力,例如
                 彈出一個選擇系統(tǒng)用戶的窗口,直接實(shí)現(xiàn)為 
                  <a href="select_user.jsp?deptId=1">選擇用戶<a>

              封裝為tag之后,使用形式變?yōu)?br>         <app:選擇用戶 部門編號="1" />
              經(jīng)過轉(zhuǎn)換之后,這里的調(diào)用不再是API含義,不再是說明怎么做,而是描述用什么。tpl中的標(biāo)簽可以使用調(diào)用時明確指定的參數(shù),也可以從全局 context中導(dǎo)入隱含的變量,從而依賴于所在領(lǐng)域的假定。例如,我們的很多界面控件需要與后臺交互,依賴于后臺jsplet框架,因而這些tpl標(biāo)簽 選擇自動導(dǎo)入$thisObj和objectName等變量。領(lǐng)域抽象與context依賴其實(shí)正是DSL的精華所在。
              (關(guān)于DSL,有些人可能會將其等價于規(guī)則引擎(rule engine), 這其實(shí)是一種誤解。規(guī)則引擎實(shí)現(xiàn)的是條件空間的分解與合并,它是一個獨(dú)立的技術(shù),與DSL并沒有必然的聯(lián)系)

          3. 語言工作臺(Workbench)
              Workbench是LOP的使能技術(shù)。我們希望自由的構(gòu)造DSL,必然需要對結(jié)構(gòu)具有強(qiáng)大的控制能力。而文本語言總是線性的,靜態(tài)的。看看現(xiàn)在對自然語 言的研究吧,顯然我們對于怎樣在線性文本中塞入更多的結(jié)構(gòu)缺乏本質(zhì)性的認(rèn)識。我們?nèi)藶闃?gòu)造的語言,限于表現(xiàn)形式,其結(jié)構(gòu)都異常的貧乏。計算機(jī)的腦袋是簡單 的,于是,我們想到增加維度,通過復(fù)雜的工具配合,來實(shí)現(xiàn)多層次,多視角, 動態(tài)的結(jié)構(gòu)控制。在我看來,很多時候這是一種無奈之舉,當(dāng)然也確實(shí)是目前唯一可行的辦法。
              工具復(fù)雜了之后,造成的本質(zhì)性障礙在于結(jié)構(gòu)上的僵化,其具體表現(xiàn)之一就是所謂的廠家鎖定,一種結(jié)構(gòu)融合上的困難。不同廠家產(chǎn)品的結(jié)構(gòu)具有巨大的差異而無法 互相交互。xml其實(shí)正是為了解決這種結(jié)構(gòu)交互困難而產(chǎn)生的,所以我更希望看到基于xml的工作。而在xml的形式下,能夠?qū)嵤┑慕Y(jié)構(gòu)變換現(xiàn)在也在不斷發(fā) 展當(dāng)中,AOP, XSLT等等。
          主站蜘蛛池模板: 安阳市| 武清区| 将乐县| 南昌县| 铜山县| 陇南市| 金山区| 来宾市| 绵阳市| 三原县| 香格里拉县| 双流县| 洛川县| 宜宾市| 巨野县| 哈尔滨市| 瑞昌市| 巴林左旗| 乐东| 合山市| 京山县| 晋城| 岗巴县| 山东省| 容城县| 海南省| 东兰县| 汾西县| 始兴县| 长阳| 博兴县| 定日县| 张北县| 沂南县| 雷山县| 剑河县| 大化| 新和县| 明星| 康保县| 新民市|