Why Concrete Syntax Doesnt Matter

P.S. 這是寫給想設計語言的人看的,如果你只是一個用戶,不用看了,Syntax的確很重要。

假設你想寫一門編程語言。

你想了一會語言大體有什麼特性,然後寫下一些展示這些特性的示常式序,並且註明它們的輸出是啥。

錯!絕大部分時候你不應該這樣做!你的切入點應該是parser輸出的中間結構(多為AST)入手,圍繞這東西寫各種evaluator/type checker/compiler等,以後再去搞Parser。

0.首先,無論如何,你最初設計的語法都會被你反覆修改:注釋能不能嵌套?用// /**/ 還是(**)還是#還是;還是;;?tab space有沒有意義?def還是define? = 還是 := 還是 :- 還是 <-?這些東西都是互相不兼容的,你就這麼多個符號,你選了=做賦值,=?做等價測試,過幾天你覺得=?丑想用=做等價測試你就要選另一個東西給賦值。但是如果你是做語言其他方面,就沒這麼destructive(儘管feature有時候還是會衝突):你今天寫下Type Checking明天寫個Compiler後天寫GC過幾天再寫FFI,儘管你寫一個東西的時候很可能要去改其他的,但是你是在不停的加東西,而不是單純的換下一個改上另一個。

1. 難。誠然,你可以手寫LL Parser,折騰Parser Combinator,Parser Generator,幾十行,大不了100行代碼就夠了。但是對比一個Simple Evaluator,比如SICP上的eval呢?一個要去折騰各種API,寫至少幾十行parser,然後再寫幾十行(很多時候還不到,比如UTLC with HOAS 10行足矣,untyped實現5行就夠)Eval,另一個直接從Eval出發,rapid prototyping上講高下立判。

2. 不必要。除非你的語法真的真的很有特點,(圖形化編程界面,APL,這裡的標準是一個陌生人看到會不會說一句WTF),不然沒有人會僅因你語法漂亮去用你語言。先把大部分精力花在更有意義的東西上,好好折騰有看點的特性,再去考慮語法。

3. 更準確的說,我不是說Syntax不重要-有兩種Syntax,Concrete Syntax,Abstract Syntax,Concrete Syntax是你看得見的東西,Abstract Syntax是Evaluator等東西接受的數據結構,舉例來說,一個Parser接收Concrete Syntax(絕大部分時候為string)返回Abstract Syntax,然後由Evaluator執行(有的時候Parser直接Eval Concrete Syntax,在這說的不是這種)。Abstract Syntax是很重要的,(比如說Graph/Tree,Binding怎麼表達,怎麼搞得extensible,支不支持generic programming(見A Generic Abstract Syntax Model for Embedded Languages),是不是homoiconic的,有沒有richly typed),搞得不好,自己用著不爽,性能不好,還甚至macro功能打折扣(homoiconicity)

4. 好,你語言折騰得差不多了,其他人有興趣,想用,(或者你自己開始在裡面寫很多程序),這時候你可以怎麼搞?有一點:別以漂亮的名頭把Syntax(含Abstract Syntax)搞的很複雜。或許你自己覺得反正自己只需要寫一次,如果其他人用起來爽,就值得了。然而不是這麼簡單:還有人要去搞Syntax highlighting/Debugger/IDE support/Autocomplete/Static Analyzer這些亂七八糟的東西,搞得太麻煩的話你用戶一想起你那麻煩的Syntax就打退堂鼓了(對,複雜如C艹一樣這些東西應有盡有,但是C艹是在TIOBE上派前幾的語言啊,開發團隊,開發出來的受益人群,狂熱粉(這些人才可能很抖M地單槍匹馬寫完整的Parser然後寫奇怪的工具)數量都不是你一個沒人知道的language能比的)

5. 你也可以機智點,把parser暴露出來,這樣寫Analyzer/Optimizer的人就不需要自己再寫一次了,如果要解放寫Editor/Highlighting的人的生產力parser給AST加上奇怪的Annotation估計也可以

6. 還有一個方法:直接不在語言中欽定任何最終用戶Concrete Syntax,只欽定一個AST的Format(binary可以XML可以隨便搞個Concrete Syntax也惡意)用於保存/交流,然後由各種用戶的Editor等去渲染成代碼。最好這些工具是可自定義的(或者,由於會有很多工具(比如git上看是一碼事,emacs上看是一碼事,xxx上看是一碼事),這個自定義的東西本身也有一個配置文件標準),這樣就從根本上斷絕各種Syntax之爭:如果你覺得XX更漂亮自己自定義下那些工具就是了,你折騰你的我折騰我的,井水不犯河水。並且這還能玩各種奇奇怪怪的東西:比如說Concrete Syntax沒要求是String,這樣可以搞Structural Editor/Graphical Editor給喜歡Structural Editing的人/初學者用。

註:456可以一起上

另:其實6在50多年前就提出了。。。歷史裡面真是有很多有意思的東西。

(The Next 700 PL)

Revised Report on the Algorithmic Language Algol 60

推薦閱讀:

天乾物燥,小心摳圖 —— A journey of matting
為何一個byte有8bit而不是7/9/4/16bit ?
從工作角度出發,學習編譯原理和操作系統哪個對於個人幫助更大?

TAG:编程语言 | 计算机科学 | 编程语言理论 |