JetBrains的MPS出來了,Martin Fowler也大力搗鼓出一篇《Language Workbenches: The Killer-App for Domain Specific Languages?》,成為有志于LOP、DSL領(lǐng)域的總領(lǐng)性文章。
首先,了解Martin Fowler的立場(chǎng)很重要。但似乎為了保證閱讀率,MF把立場(chǎng)擺到了最后。
1. LOP帶來的兩個(gè)最大優(yōu)點(diǎn)是
a. 通過新的封裝及思維模式,提高程序員的生產(chǎn)率。
b. 改變程序員與領(lǐng)域?qū)<业年P(guān)系,最理想情況是領(lǐng)域?qū)<抑苯佑肈SL編程。
MF認(rèn)為第2點(diǎn)比第1點(diǎn)帶來的效果大得多,但也困難得多。COBOL剛出來的時(shí)候已經(jīng)有人提領(lǐng)域?qū)<抑苯泳幊塘耍Y(jié)果呢?
2.現(xiàn)在大家對(duì)DSL應(yīng)該是什么樣子的還知之甚少,文本語言?圖形語言?一切都還在假設(shè)。
3.現(xiàn)在的LOP工具還在非常初始的階段。
4.但MF同時(shí)認(rèn)為LOP是目前最有趣的想法,不論它日后成不成功,都會(huì)激發(fā)出大量有趣的思想與實(shí)踐,留意一下LOP是絕不會(huì)吃虧的事情。
是不是熱情驟減?本來MPS的發(fā)布使LOP看起來像是明天就可以開始動(dòng)手的事情,現(xiàn)在又變成了雖然很有趣,但還遠(yuǎn)沒到下山摘果子時(shí)候。
從頭讀一遍文章
1.開頭 A Simple example of LOP
Martin舉的這個(gè)例子占了全文1/3的篇幅,又長又不刺激神經(jīng),看得大家頻頻起身吃零食,上廁所....
2.傳統(tǒng)的LOP
MDA不是什么新概念,DSL當(dāng)然也用不著是,DSL其實(shí)早就在我們身邊,包括
1.Unix下用yacc打造的微型DSL
2.Lisp,fp用自身來構(gòu)造DSL
3.XML配置文件
4.GUI描述文件(VB, Delphi....)
5.Adaptive Object Models and Active Data Models? (沒完全理解)
(注:SQL也算吧)
3.External DSL和Internal DSL
DSL分內(nèi)外兩種,像yacc這種把DSL parser后translate成base語言的屬于External DSL。
而Lisp這種用語言本身來構(gòu)造新的語言的稱為Internal DSL。
External DSL的好處是它可以是任何樣子的,不受Base語言的制約。另外它也通常是運(yùn)行時(shí)解釋的。
不好的地方:
第一, 它需要花很多時(shí)間去設(shè)計(jì)語言,寫Parser,寫Generator,寫IDE。
第二, 不能直接使用Base語言的IDE,在后IntelliJ時(shí)代這讓人很不爽.
第三, 需要學(xué)太多語言和思維方式,不是指if-else語法的不同,而是在java里我們已經(jīng)習(xí)慣了用Object和Method來表達(dá)想法,但在其他DSL里則可能要運(yùn)用完全不同的概念,比如文章開頭的例子。
而Internal DSL和External DSL的優(yōu)缺點(diǎn)很多地方正好調(diào)轉(zhuǎn)。而且Lisp,Smalltalk的語法和我們平常的Java,C#差別很大。還有,最近Ruby們好像也有可能用來寫Internal DSL了。
正是因?yàn)閮煞NDSL都缺點(diǎn)明確,所以DSL在今天這么不普及。Language workbeanch,正是為了使External DSL變得容易而出現(xiàn)的。
4.今天的Language Workbeanch
有Intentional Software的IP, JetBrains的MPS和微軟的軟件工廠。
1.一段DSL將有一個(gè)Editble reprensentation,一個(gè)storage reprentsentation,一個(gè)編譯后的excuteble reprentsentation,一個(gè)在editor中的AST-Astraction reprensentation。其中editble和storage reprensentation可以合一,也可以分開。
2.定義一個(gè)新DSL的三個(gè)步驟:
a.定義語言的schema
b.定義編輯器
c.定義Generator
一個(gè)DSL可以擁有多種編輯器和代碼生成器。
5.Language WorkBench的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.省卻了寫Parser,直接定義抽象語法。
2.省卻了寫IDE。
3.IDE的語法提示與語法檢查,給領(lǐng)域?qū)<抑苯泳帉懱峁┝丝赡埽@是COBOL時(shí)代沒有的。
4.DSL與項(xiàng)目的良好集成,可以項(xiàng)目與DSL語法一起refactor,可以一邊設(shè)計(jì)語言一邊使用語言。
缺點(diǎn):
1.Vendor專屬,用了MPS,就不可能再轉(zhuǎn)到IP或者微軟,因?yàn)樗麄冎g根本沒有標(biāo)準(zhǔn)可言。
2.但Generator并沒有比以前簡(jiǎn)單(要命阿)。
3.現(xiàn)在代碼以astraction reprensention為中心,版本管理,AST支持diff/merge的問題。
6.我的立場(chǎng)
試用了一下MPS,因?yàn)镚enerator還沒有革命性的突破,MPS還沒到真正可用的時(shí)候。
不過幾個(gè)月間,MPS EAP已經(jīng)從初始的150版本升級(jí)到220,讓人無法忽略它的進(jìn)度。