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

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

Typescript版本是將代碼轉(zhuǎn)成JavaScript的AST,然后使用javascript的解釋器canjs執(zhí)行代碼。
簡(jiǎn)而言之,如果你想了解編譯器是怎么回事,可以通過(guò)這個(gè)項(xiàng)目入門哦。最后附上項(xiàng)目地址:https://github.com/karminski/write-a-programming-language-in-450-lines
解釋說(shuō)明一下,這個(gè)項(xiàng)目的作者是國(guó)人,昵稱叫「牙醫(yī)」,并非真的是牙科醫(yī)生哈,別誤解了~
我是 polarisxu,北大碩士畢業(yè),曾在 360 等知名互聯(lián)網(wǎng)公司工作,10多年技術(shù)研發(fā)與架構(gòu)經(jīng)驗(yàn)!2012 年接觸 Go 語(yǔ)言并創(chuàng)建了 Go 語(yǔ)言中文網(wǎng)!著有《Go語(yǔ)言編程之旅》、開源圖書《Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)》等。
堅(jiān)持輸出技術(shù)(包括 Go、Rust 等技術(shù))、職場(chǎng)心得和創(chuàng)業(yè)感悟!歡迎關(guān)注「polarisxu」一起成長(zhǎng)!也歡迎加我微信好友交流:gopherstudio
