1. 解釋語言的語言學習
抽象地說,開始設計一門新語言時,咱們須要對這門語言進行描述,描述的主要目的在於告訴使用者如何根據一系列規則來理解使用該語言獲得一系列結果(即語言的語義)。flex
這個【描述】所使用的媒介,是一個用來解釋語言的語言,或者稱爲meta-language(元語言)。而使用meta-language來描述新語言的過程,就是實現這門新語言的解釋器的過程。spa
舉個例子,如同天然語言的語法同樣,一我的學習一門天然語言的過程,其實就是在腦中構造一個這門語言的解釋器,而這個解釋器就是這門語言的語法集合。而這些語法,就是描述這門語言的語言(人類在嬰兒時期沒有任何語言基礎的狀況下一步一步構建母語的解釋的過程真的美妙 :p )。 設計
可是和天然語言不一樣的是,天然語言相對的寬鬆語法,形成不少場景下的多義性(同時也產生了天然語言所特有的朦朧的美感 :p )。而程序語言的嚴謹性,要求使用一個可以形式化的meta-language來進行構造,程序語言須要嚴格地驗證其一些性質,以此保證其可執行性和準確性(你大概不會喜歡一個按本身心情返回不一樣結果的系統)。orm
2. 對 PL meta-language 的建模遞歸
工欲善其事,必先利其器。設計一門語言的開始,咱們得先對meta-language進行建模。ip
考慮一下,咱們須要什麼?1.表達式,2.求值規則。element
1 告訴咱們若是有一個表達式 B ,那麼B屬不屬於這個語言的表達式範疇。2 則告訴咱們表達式 B 的求值過程。get
咱們發現使用集合[2]很適合用來對咱們設想的meta-language進行建模。具體過程以下:it
對於1,經過定義包含遞歸結構的BNF[3]表示表達式集合。咱們如今想設計一個能表示OR運算的語言,其能表示嵌套的or運算。其BNF表示以下:
B = t | f | ( B . B )
"." 表示或運算符,上面的這個BNF表示肯定了表達式集合B,前兩項 t (true) 和 f(false) 稱爲終結項( 我的更傾向於叫原子項 ),由於這兩項是在上述的定義中最基本不可再分的元素;這個集合中的元素有:B = { t , f , (t.f) , (t.( f . t)) .... }。由於咱們在上面的第三項加入了一個遞歸定義,因此這個集合如今包含了嵌套的表達式而不只僅是簡單的 t 或者 f 。
對於 2,使用 relation 來對求值過程進行構建,在構建以前,先說明一下relation一些後面將用到的性質。
- relation 是一個有序對 ( ordered pair ) 集合 ( A relation is a set whose element is ordered pair) ,若是有關係 r 使得 a r b 且 c r d , 那麼 r 就是有序對集合: r = {<a,b>,<c,d>}
- 對於任意x,有<x,x>∈ r ,則稱關係 r 具備自反性(reflexive)
- 對於任意<x,y>∈ r ,<y,z>∈ r,有 <x,z>∈ r ,則稱關係 r 具備傳遞性(transitive)
- 對於任意<x,y>∈ r ,有<y,x>∈ r ,則稱關係 r 具備對稱性(symmetric)
- 若是關係 r 同時具有自反性,傳遞性,對稱性,則稱其爲等價關係
使用關係 r 與等價關係關係 rt 建模,能夠獲得下面的OR求值規則:
- ( t . B ) r t
- ( f . B ) r B
- B r B' → B rt B'
- B rt B
- B1 rt B2 → B2 rt B1
- B1 rt B2 且 B2 rt B3 → B1 r t B3
關係 rt 描述了求值的過程,所以咱們把關係 rt 稱爲求值關係。如今咱們能夠利用上面的規則來對一些表示式進行求值。好比對 ( f. (f . t) ) 進行求值:
f ∈ B , t ∈ B → ( f . t ) ∈ B
( f . t ) ∈ B , ( t . B ) rt t → ( f. (f . t) ) rt ( f . t )
t ∈ B ,( f . B ) rt B → t
上面的這一個過程稱爲規約(reduction)。看起來很不錯,再讓咱們嘗試着使用上面的定義對錶達式 ( (f . t) . f ) 進行求值。
發現問題了嗎?上面的規則沒法對( (f . t) . f ) 進行求值,可能你一眼就能看出結果爲 t ,可是咱們的定義沒法推導出來。爲何?由於 f 放到了表達式的後面,這個表達式明顯應該被理解爲 ( B . f ) ,可是對於 ( B . f )而言, 咱們的求值關係沒有諸如 ( B . f ) r B 的規約規則。
這時候須要擴充求值關係 r :
- B1 r B2 → B1 rc B2
- B rc B' → ( B . B1 ) rc ( B' . B1 )
通過擴展的關係 rc 稱爲compatible clojure(這個概念在大多數地方沒法查到)。
增長自反-傳遞性:
- B1 rc B2 → B1 rrt B2
- B rrt B → ( B . B1 ) rc ( B' . B1 )
- B1 rrt B2 且 B2 rrt B3 → B1 rrt B3
增長對稱性:
- B1 rrt B2 → B1 re B2
- B1 re B2 → B2 re B1
最終擴展獲得的關係 re 稱爲關係 r 的 reduction relation。
上面以描述OR運算過程做爲例子,引入了集合語言來對語言進行描述,固然即使是設計一個最簡單的語言,所須要的還不只僅是上述這些內容。篇幅侷限,先記錄到這裏。
3. 參考文獻