這個(gè)開源項(xiàng)目牛逼:牙醫(yī)教你用450行Go代碼寫出一個(gè)編程語言
閱讀本文大概需要 2 分鐘。
沒有系統(tǒng)學(xué)習(xí)過編譯原理的同學(xué)可能會(huì)很好奇編程語言的編譯器,Lexer & Parser,虛擬機(jī)是怎么實(shí)現(xiàn)的,同時(shí)又苦于系統(tǒng)性的教材過于枯燥。如果你之前用的動(dòng)態(tài)語言,可能也不會(huì)想到這個(gè)層面,但用了 Go 后,想深入 Go 源碼,可能會(huì)有相關(guān)想法:如何更好地掌握 Go?Go 編譯器到底是怎么實(shí)現(xiàn)的?
其實(shí),在Github上有一個(gè)項(xiàng)目,教你用 450 行的 Go代 碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的編程語言,它的語法是這樣的:
$a?=?"pen?pineapple?apple?pen."
print($a)
看上去很簡(jiǎn)單是不是?但是它包含了一個(gè)手寫的遞歸下降解析器和一個(gè)簡(jiǎn)單的解釋器。
這門語言的名字為 Pineapple Lang,雖然該語言甚至不是圖靈完備的。但寫這個(gè)語言和教程的主要目的是讓編譯原理初學(xué)者有一個(gè)預(yù)熱,簡(jiǎn)單了解一個(gè)編程語言是怎么構(gòu)建的。
運(yùn)行起來也是十分簡(jiǎn)單的:
$cd?examples/pineapple/
$go?build
$?./pineapple?hello-world.pineapple
pen?pineapple?apple?pen.
你可以直接看用 Markdown 編寫的原始版本:

通過Pineapple Lang還衍生出許多Pineapple Lang的編程語言版本,諸如Python、Typescript、Dart、Java、Ruby等:

Typescript版本是將代碼轉(zhuǎn)成JavaScript的AST,然后使用javascript的解釋器canjs執(zhí)行代碼。
簡(jiǎn)而言之,如果你想了解編譯器是怎么回事,可以通過這個(gè)項(xiàng)目入門哦。最后附上項(xiàng)目地址:https://github.com/karminski/write-a-programming-language-in-450-lines
解釋說明一下,這個(gè)項(xiàng)目的作者是國人,昵稱叫「牙醫(yī)」,并非真的是牙科醫(yī)生哈,別誤解了~
推薦閱讀
