AST解釋器和字節(jié)碼解釋器

自己原來(lái)做過(guò)一個(gè)編譯相關(guān)的項(xiàng)目(全局優(yōu)化問(wèn)題變量相關(guān)性分組軟件的實(shí)現(xiàn)),用的是字節(jié)碼解釋器,沒(méi)有用AST解釋器。當(dāng)時(shí)基于的考慮是實(shí)現(xiàn)起來(lái)簡(jiǎn)單清晰,好調(diào)試,不像AST那么復(fù)雜,自己心中也是一直有個(gè)疑問(wèn),到底哪種方法更好?今天總結(jié)一下。
字節(jié)碼結(jié)構(gòu)更緊湊,內(nèi)存局部性好,解釋執(zhí)行性能高。
從工程上說(shuō),字節(jié)碼解釋器也有利于把代碼組織得更清晰,把關(guān)注點(diǎn)清晰的分離開(kāi)來(lái)。
AST解釋器有一些額外的開(kāi)銷,而字節(jié)碼解釋器可以節(jié)省這些開(kāi)銷。
AST解釋器開(kāi)銷在于:

  1. AST上有些沒(méi)有執(zhí)行語(yǔ)義的節(jié)點(diǎn),但解釋器在執(zhí)行時(shí)不得不訪問(wèn)它們,增加了解釋開(kāi)銷。SquirrelFish文中用語(yǔ)句塊(block)的舉例,這個(gè)不錯(cuò):一個(gè)block僅用于把一堆語(yǔ)句聚合在一起,自身并沒(méi)有“有效的”執(zhí)行語(yǔ)義,但解釋器為了訪問(wèn)到這個(gè)block的子節(jié)點(diǎn)卻不得不訪問(wèn)這個(gè)block。AST的節(jié)點(diǎn)種類相對(duì)于解析樹(shù)(parse tree)通常要精簡(jiǎn)許多(括號(hào)、分號(hào)之類的token通常都扔掉了),但用于解釋執(zhí)行還是不夠精簡(jiǎn)。
  2. AST通常使用鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)(父節(jié)點(diǎn)用指針指向子節(jié)點(diǎn)),解釋執(zhí)行需要遍歷AST,就得跟隨這些指針不斷做間接訪問(wèn)。外加AST常會(huì)攜帶一些跟解釋執(zhí)行沒(méi)直接關(guān)系的額外信息,這使得AST節(jié)點(diǎn)比較“肥”,占用更多內(nèi)存,而對(duì)解釋執(zhí)行有用的信息在內(nèi)存里分隔得更開(kāi),不緊湊。
  3. AST中每種節(jié)點(diǎn)的結(jié)構(gòu)未必相同,有多少個(gè)子節(jié)點(diǎn)、哪些子節(jié)點(diǎn)有用、要按什么順序去訪問(wèn)那些子節(jié)點(diǎn),都需要針對(duì)每種節(jié)點(diǎn)專門(mén)實(shí)現(xiàn);換句話說(shuō),必須確定了節(jié)點(diǎn)種類才能確定遍歷順序,這也不利于解釋器實(shí)現(xiàn)得緊湊。
  4. AST解釋器的核心遍歷邏輯最自然的實(shí)現(xiàn)方式是遞歸;當(dāng)然,執(zhí)行狀態(tài)得順著遞歸通過(guò)參數(shù)傳遞。(SquirrelFish文中還提到AST解釋器要在節(jié)點(diǎn)間傳遞狀態(tài)帶來(lái)額外開(kāi)銷。這主要是以前的JavaScriptCore的實(shí)現(xiàn)太紗布了,不能怪AST解釋器本身的概念不好?)

什么是語(yǔ)法制導(dǎo)翻譯?

解釋器邊做語(yǔ)法分析邊執(zhí)行相應(yīng)位置的語(yǔ)義動(dòng)作(semantic action)而不構(gòu)建AST(例如計(jì)算器,針對(duì)語(yǔ)義,直接執(zhí)行相應(yīng)的操作),于是在完成語(yǔ)法分析的時(shí)候也就完成了解釋執(zhí)行。假如不直接做解釋執(zhí)行,這些語(yǔ)義動(dòng)作也可以用來(lái)生成代碼(例如字節(jié)碼),邊做語(yǔ)法分析邊完成了代碼生成,中間也不需要AST。理解語(yǔ)法制導(dǎo)翻譯的最重要的一點(diǎn)就是:那些嵌在語(yǔ)法里的語(yǔ)義動(dòng)作,都可以看作epsilon匹配——匹配空字符串,也就是總是可以匹配——匹配到它們的時(shí)候就執(zhí)行里面的代碼。這樣就很好理解這些代碼是什么時(shí)候執(zhí)行的,而它能訪問(wèn)到的上下文都是怎樣的。

參考資料:

  1. 為什么大多數(shù)解釋器都將AST轉(zhuǎn)化成字節(jié)碼再用虛擬機(jī)執(zhí)行,而不是直接解釋AST?
  2. 符號(hào)表和抽象語(yǔ)法樹(shù)是什么關(guān)系??jī)烧咴诰幾g器設(shè)計(jì)中是否必需?
  3. 值得推薦的入門(mén)書(shū)(RednaxelaFX書(shū)評(píng))
  4. 虛擬機(jī)隨談(一):解釋器,樹(shù)遍歷解釋器,基于棧與基于寄存器,大雜燴
  5. 《自制編程語(yǔ)言》集中討論帖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 標(biāo)題: Rakudo and NQP Internals子標(biāo)題: The guts tormented imple...
    焉知非魚(yú)閱讀 1,525評(píng)論 1 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評(píng)論 19 139
  • 周末還看了楊絳先生的《我們仨》里頭第一部分,我們仨失散了,先生為何是用了做夢(mèng)的方式,以及渡假的方式來(lái)表示呢。山一程...
    愛(ài)花的小巫閱讀 735評(píng)論 0 0
  • 有沒(méi)有一刻,突然覺(jué)得自己很頹廢? 不美貌,不成功,不聰明,甚至不開(kāi)心;覺(jué)得自己焦慮萬(wàn)分,覺(jué)得自己一無(wú)是處。 此時(shí),...
    卿本嘉檸閱讀 366評(píng)論 2 2
  • 英孚家長(zhǎng): 您好! 孩子今天主要學(xué)習(xí)U3L1: 1.學(xué)習(xí)了有關(guān)天氣的形容詞: 1.出太陽(yáng)的sunny 刮風(fēng)的 wi...
    EmilyJia閱讀 178評(píng)論 0 0

友情鏈接更多精彩內(nèi)容