從零開(kāi)始實(shí)現(xiàn) Lua 解釋器之介紹

警告??:這將是一個(gè)又臭又長(zhǎng)的系列教程逻炊,教程結(jié)束的時(shí)候,你將擁有一個(gè)除了性能差勁犁享、擴(kuò)展性差余素、標(biāo)準(zhǔn)庫(kù)不完善之外,其他方面都和官方相差無(wú)幾的 Lua 語(yǔ)言解釋器炊昆。說(shuō)白了桨吊,這個(gè)系列的教程實(shí)現(xiàn)的是一個(gè)玩具語(yǔ)言威根,僅供學(xué)習(xí),無(wú)實(shí)用性视乐。請(qǐng)謹(jǐn)慎 Follow洛搀,請(qǐng)謹(jǐn)慎 Follow,請(qǐng)謹(jǐn)慎 Follow佑淀。

前言


編譯原理是計(jì)算機(jī)科學(xué)的一個(gè)重要且復(fù)雜的知識(shí)體系留美。這個(gè)系列教程也只是你入門前的墊腳石。但即使如此伸刃,也并不代表這個(gè)教程就很簡(jiǎn)單独榴,如果決定開(kāi)始,請(qǐng)堅(jiān)持到底奕枝。這是一個(gè)認(rèn)真嚴(yán)肅的教程(咳咳)棺榔,它不像網(wǎng)絡(luò)上的其他類似教程,要么實(shí)現(xiàn)一個(gè)“高級(jí)計(jì)算器”就完事了隘道,要么語(yǔ)法分析還沒(méi)講完症歇,就太監(jiān)了。也不像其他的 Lua 源碼閱讀類的指導(dǎo)教程谭梗,去教你怎么閱讀并理解官方實(shí)現(xiàn)的 Lua 解釋器的源碼忘晤。但我相信完成本教程后再去讀官方實(shí)現(xiàn)的源代碼,也會(huì)輕松很多激捏。

本教程將從零開(kāi)始设塔,一磚一瓦的構(gòu)建出一個(gè)完整的解釋器。不使用任何自動(dòng)化的工具远舅,也不使用任何第三方庫(kù)闰蛔,從詞法分析到虛擬機(jī),全部親力親為图柏。我們將要實(shí)現(xiàn)的語(yǔ)言起名為 SLua序六,意思是 Simple Lua。

前置要求


本教程并不是面向編程初學(xué)者的蚤吹,你至少需要滿足以下要求才可以繼續(xù)閱讀:

  • 本教程使用的編程語(yǔ)言為 Google 出品的 Go 語(yǔ)言例诀。Go 語(yǔ)言上手非常容易,如果你有過(guò)其他任何語(yǔ)言的編程經(jīng)驗(yàn)裁着,請(qǐng)花幾個(gè)小時(shí)閱讀這篇教程:墻外多語(yǔ)言版繁涂、墻內(nèi)中文版

  • 本教程的定位不是教科書二驰,因此不會(huì)過(guò)多的提及關(guān)于編譯原理的理論性的內(nèi)容扔罪,而更加注重實(shí)踐。所以诸蚕,這要求你至少要知道編譯過(guò)程流水線的基本步驟以及每個(gè)步驟的作用步势,比如:詞法分析氧猬、語(yǔ)法分析、虛擬機(jī)等坏瘩。

  • 既然要實(shí)現(xiàn) Lua 語(yǔ)言的解釋器盅抚,自然要求你熟悉 Lua 語(yǔ)言,即使沒(méi)有用它寫過(guò)項(xiàng)目倔矾,至少要熟悉 Lua 語(yǔ)言的語(yǔ)法及語(yǔ)言特性妄均。

面向人群


  • 如果你很想知道腳本語(yǔ)言的解釋器的工作原理,請(qǐng)繼續(xù)閱讀哪自。
  • 如果你不僅想知道工作原理丰包,還想親自實(shí)現(xiàn)一個(gè),請(qǐng)繼續(xù)閱讀壤巷。
  • 如果你學(xué)完學(xué)校開(kāi)設(shè)的編譯原理課程邑彪,除了學(xué)會(huì)了 LEX 和 YACC,其余的還是一無(wú)所知胧华,請(qǐng)繼續(xù)閱讀寄症。

開(kāi)發(fā)方式


我們不準(zhǔn)備從一開(kāi)始就著手實(shí)現(xiàn)一個(gè)完完整整的解釋器,支持所有的 Feature矩动,這樣無(wú)疑會(huì)顧此失彼有巧,也會(huì)極大的拉高教程的閱讀門檻。所以我們會(huì)先抽取 Lua 中一些最最基本的特性悲没,實(shí)現(xiàn)一個(gè)可以工作的原型篮迎。在原型之上,我們?cè)俨粩嗵砑犹匦允咀耍钡酵瓿蔀橹埂?/p>

在第一個(gè)版本中甜橱,我們會(huì)將一些比較重要的 Feature 都砍掉,將目光集中在整個(gè)流程的實(shí)現(xiàn)上峻凫。

所以渗鬼,第一個(gè)版本將:

  • 不支持 Table
  • 不支持函數(shù)和閉包
  • 不支持 for 循環(huán)語(yǔ)句
  • 不支持 repeat...until 循環(huán)語(yǔ)句
  • 不支持多行注釋和多行字符串

閹割的差不多了,看看還剩下什么:

  • 變量的聲明及賦值(全局變量和局部變量)
  • do ... end 代碼塊
  • if ... elseif ... else ... end 分支語(yǔ)句
  • while 循環(huán)語(yǔ)句
  • 單行注釋
  • 單行形式的字符串
  • 各種單目和雙目的運(yùn)算符

編譯流程


SLua 的編譯共分為以下幾個(gè)階段:

  • 詞法分析:將用戶輸入的文本形式的源代碼分解為一個(gè) Token 列表
  • 語(yǔ)法分析:將詞法分析的輸出作為輸入荧琼,生成無(wú)語(yǔ)義信息的抽象語(yǔ)法樹(shù)(AST)
  • 語(yǔ)義分析:完善 AST 中的語(yǔ)義相關(guān)的信息
  • 代碼生成:根據(jù) AST 生成字節(jié)碼
  • 虛擬機(jī):解釋并執(zhí)行字節(jié)碼
  • 標(biāo)準(zhǔn)庫(kù):提供系統(tǒng)級(jí)的實(shí)用函數(shù)

教程的章節(jié)安排也和編譯流程保持一致。

獲取源代碼


代碼已托管到 Github 上:SLua差牛,每一個(gè)階段的代碼我都會(huì)創(chuàng)建一個(gè) release命锄,你可以直接下載作為參照。雖然提供了源代碼偏化,但并不建議直接復(fù)制粘貼脐恩,因?yàn)檫@樣學(xué)到的知識(shí)會(huì)很容易忘記。

剛開(kāi)始玩 Github 和簡(jiǎn)書侦讨,所以沒(méi)有任何粉絲和關(guān)注量(哭)驶冒,如果你覺(jué)得這篇教程有幫助苟翻,請(qǐng)不要吝嗇給文章點(diǎn)個(gè)喜歡,給 Github 上的項(xiàng)目點(diǎn)個(gè) Star骗污。如果能 Follow 一下簡(jiǎn)書和 Github 的賬號(hào)就更好啦崇猫,我也會(huì)更加有動(dòng)力將這個(gè)系列寫下去。:)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末需忿,一起剝皮案震驚了整個(gè)濱河市诅炉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屋厘,老刑警劉巖涕烧,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異汗洒,居然都是意外死亡议纯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門溢谤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痹扇,“玉大人,你說(shuō)我怎么就攤上這事溯香■旯梗” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵玫坛,是天一觀的道長(zhǎng)结笨。 經(jīng)常有香客問(wèn)我,道長(zhǎng)湿镀,這世上最難降的妖魔是什么炕吸? 我笑而不...
    開(kāi)封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮勉痴,結(jié)果婚禮上赫模,老公的妹妹穿的比我還像新娘。我一直安慰自己蒸矛,他們只是感情好瀑罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著雏掠,像睡著了一般斩祭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乡话,一...
    開(kāi)封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天摧玫,我揣著相機(jī)與錄音,去河邊找鬼绑青。 笑死诬像,一個(gè)胖子當(dāng)著我的面吹牛屋群,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坏挠,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芍躏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了癞揉?” 一聲冷哼從身側(cè)響起纸肉,我...
    開(kāi)封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喊熟,沒(méi)想到半個(gè)月后柏肪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芥牌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烦味,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁拉。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谬俄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃理,到底是詐尸還是另有隱情溃论,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布痘昌,位于F島的核電站钥勋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辆苔。R本人自食惡果不足惜算灸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驻啤。 院中可真熱鬧菲驴,春花似錦、人聲如沸骑冗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沐旨。三九已至森逮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磁携,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工良风, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谊迄,地道東北人闷供。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像统诺,于是被迫代替她去往敵國(guó)和親歪脏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容