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