基於文本替換的解譯器:小結

來源:互聯網
上載者:User

\(\newcommand{\mt}[1]{\text{#1}}\)

關於文法

我們現在用的這種充滿括弧和首碼運算式的文法叫做“S運算式”。 S運算式看似奇怪,其實是一種簡約風格的文法。 S運算式的運算式一般是這麼設計的: 首先第一個詞表示這個運算式的類別(如if運算式還是let運算式), 然後後面依次列出這個運算式的所有元素, 最後用一對括弧把整個運算式括起來。 比如if運算式有三個元素條件運算式和兩個分支運算式,所以if運算式是$(\mt{if} \; L \; M \; N)$; 加法則是一個加號後面跟上要相加的運算式:$(+ \; M \; N)$。

與其說S運算式文法簡單,不如說S運算式幾乎沒有文法。 S運算式的代碼已經是一棵抽象文法樹。 它的一個很明顯的好處是解譯器幾乎不用做文法分析。 關於文法分析,編譯原理課程已是闡之未盡,我也沒什麼可說的。 我想說的都是一些語義方面的內容,所以我希望盡量避免文法分析。 減掉一些東西意味著減少許多麻煩(位移歸約衝突夠玩一陣子了)。 文法分析有時候會出現一些意想不到的bug。 比如《UNIX痛恨者手冊》裡有個例子,假設p是C語言的一個指向浮點數的指標。 現在要計算*p的倒數,於是有這麼一小段代碼:

1 1/*p

嗯?

S運算式一直被詬病括弧多。 其實許多人(這些人應該都沒學過Lisp)不喜歡S運算式的原因不在於括弧多,而是因為S運算式與C語言(或者JAVA、Python)“不夠像”。

See you later, alligator

為了引用方便,應該給我們正在實現的這門語言起個名字,就叫Alligator吧。

Alligator的文法: \begin{equation*}\begin{array}{lcl} M, N, L &=& X \\ &|& b \\ &|& \lambda X.M \\ &|& (\mt{fix} \; X_1 \; X_2 \; M) \\ &|& (+ \; M \; N) \\ &|& (- \; M \; N) \\ &|& (\mt{iszero} \; M) \\ &|& (M \; N) \\ \end{array}\end{equation*}

值: \begin{equation*}\begin{array}{lcl} V &=& X \\ &|& b \\ &|& \lambda X.M \end{array}\end{equation*}

宏: \begin{equation*}\begin{array}{lcl} (\mt{if} \; L \; M \; N) &=& (((L \; \lambda X.M) \; \lambda X.N) \; 0) \\ && \text{其中}X \notin FV(M), X \notin FV(N) \\ (\mt{let} \; X \; N \; M) &=& (\lambda X.M \; N) \\ (\mt{letrec} \; X_1 \; X_2 \; N \; M) &=& (\lambda X_1.M \; (\mt{fix} \; X_1 \; X_2 \; N)) \end{array}\end{equation*}

Alligator採用call-by-value的調用方式,它的求值過程如下(continuation passing): \begin{equation*}\begin{array}{lcl} \left<X, \kappa\right>_v &\rightarrow_v& \left<X, \kappa\right>_c \\ \left<b, \kappa\right>_v &\rightarrow_v& \left<b, \kappa\right>_c \\ \left<\lambda X.M, \kappa\right>_v &\rightarrow_v& \left<\lambda X.M, \kappa\right>_c \\ \left<(\mt{fix} \; X_1 \; X_2 \; M), \kappa\right>_v &\rightarrow_v& \left<\lambda X_2.M[X_1 \leftarrow (\mt{fix} \; X_1 \; X_2 \; M)], \kappa\right>_c \\ \left<(o^n \; M_1 \; M_2 \; ... \; M_n), \kappa\right>_v &\rightarrow_v& \left<M_1, \left<\mt{opd}, \kappa, o^n, (M_2 \; ... \; M_n), ()\right>\right>_v \\ \left<V, \left<\mt{opd}, \kappa, o^n, (M_{i+1} \; ... \; M_n), (V_1 \; ... \; V_{i-1})\right>\right>_c &\rightarrow_c& \left<M_{i+1}, \left<\mt{opd}, \kappa, o^n, (... \; M_n), (V_1 \; ... \; V_{i-1} V)\right>\right>_v \\ \left<V, \left<\mt{opd}, \kappa, o^n, (), (V_1 \; ... \; V_{n-1})\right>\right>_c &\rightarrow_c& \left<V', \kappa\right>_c \\ && \text{其中} V' = o^n(V_1, ..., V_{n-1}, V) \\ \left<(M \; N), \kappa\right>_v &\rightarrow_v& \left<M, \left<\mt{arg}, \kappa, N\right>\right>_v \\ \left<V, \left<\mt{arg}, \kappa, N\right>\right>_c &\rightarrow_c& \left<N, \left<\mt{fun}, \kappa, V\right>\right>_v \\ \left<V, \left<\mt{fun}, \kappa, \lambda X.L\right>\right>_c &\rightarrow_c& \left<L[X \leftarrow V], \kappa\right>_v \end{array}\end{equation*}

===我是穿越的分割線================================================

本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

由於寫解譯器太歡樂了,所以我不知不覺就把Alligator寫到這個系列大約三分之二的進度。下面連結是Alligator解譯器的代碼:

https://github.com/sKabYY/Alligator

這個Alligator包含多參數函數、互遞迴、賦值、記憶體回收、letcc與cc、異常處理等新功能。

testcases.rkt是測試用的例子。運行alligator.rkt檔案會測試testcases.rkt裡的例子。

1 racket alligator.rkt

alligator-cps.rkt對Alligator做了CPS變換和一些簡單的CPS代碼最佳化。一個很有意思的地方是做完CPS變換後,一些語句如異常處理就消失了。CPS代碼最佳化寫得比較亂,做了beta展開、eta歸約和常數摺疊三個最佳化。是處於實驗階段的代碼,都是拍腦袋就寫的,估計bug比較多。運行alligator-cps.rkt檔案會測試testcases.rkt裡的例子。

1 racket alligator-cps.rkt

輸出比較多,可能需要重新導向到檔案再看。

長路漫漫

本來只想打發鬱悶的時間而隨便寫寫。現在發現寫文章不僅能改善心情,對加深理解也有好處。我把後面想寫的內容列下了,以激勵自己。

1.基於文本替換的解譯器。

2.環境。引入環境,CEK,範圍(靜態,動態),SECD,無名變數,加入多參數。

3.狀態。顯式引用,隱式引用,記憶體回收,按需傳值,按引用傳值。

4.Continuation。letcc與cc,異常處理,多線程。

5.CPS變換,CPS代碼最佳化?

6.類型系統……(待定)

7.物件導向……(待定)

程式語言這領域我才剛跨過半條腿,如有謬誤,歡迎斧正。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.