langcc新一代的編譯器編譯器
langcc 是一個(gè)工具,它以標(biāo)準(zhǔn)BNF風(fēng)格的格式獲取語(yǔ)言的形式化描述,并自動(dòng)生成一個(gè)編譯器前端,包括語(yǔ)言的抽象語(yǔ)法樹(shù)(AST)和遍歷的數(shù)據(jù)結(jié)構(gòu)定義、一個(gè)詞典、一個(gè)解析器和一個(gè)pretty-printer。
langcc 也是以下技術(shù)報(bào)告的配套軟件實(shí)現(xiàn),這些報(bào)告描述了對(duì)經(jīng)典LR解析范式的若干創(chuàng)新:
- Zimmerman, Joe. Practical LR Parser Generation. arXiv, 2022.
- Zimmerman, Joe. langcc: A Next-Generation Compiler Compiler. arXiv, 2022.
langcc可以用來(lái)替代lex和yacc(或flex和bison)的組合。但langcc提供了許多額外的功能,包括:
- 通過(guò)獨(dú)立的數(shù)據(jù)類型編譯器 (
datacc) 自動(dòng)生成 AST 數(shù)據(jù)結(jié)構(gòu)。 - 完整的 LR 解析器生成作為默認(rèn)值,而不是更具限制性的 LALR。
- 通過(guò)明確的“混淆輸入對(duì)”,而不是不透明的移位/減少錯(cuò)誤,清晰地呈現(xiàn) LR 沖突。
- LR 自動(dòng)機(jī)的新效率優(yōu)化。
- LR 范式的擴(kuò)展,包括遞歸下降 (RD) 解析操作,從而產(chǎn)生更小、更直觀的自動(dòng)機(jī)。
- LR 范式的擴(kuò)展,包括每個(gè)符號(hào)屬性,這對(duì)于許多工業(yè)語(yǔ)言結(jié)構(gòu)的有效實(shí)現(xiàn)至關(guān)重要。
- LR 語(yǔ)法 (CPS) 的一般轉(zhuǎn)換,顯著擴(kuò)展了該工具可以支持的語(yǔ)法類別。
與以前的編譯器前端生成器不同,langcc高效且通用,足以捕獲完整的工業(yè)編程語(yǔ)言,包括 Python 3.9.12 ( grammars/py.lang ) 和 Golang 1.17.8 ( grammars/go.lang )。在這兩種情況下,langcc自動(dòng)生成比每種語(yǔ)言的標(biāo)準(zhǔn)庫(kù)解析器更快的解析器(分別快 1.2 倍和 4.3 倍)。事實(shí)上,langcc所支持的語(yǔ)法類足夠通用,該工具是 self-hosting 的:即可以勇“語(yǔ)言的語(yǔ)言”本身中表達(dá)“語(yǔ)言的語(yǔ)言”,并用于langcc 生成自己的編譯器 front-end。
更多細(xì)節(jié)可見(jiàn)源碼庫(kù)中 bootstrap.sh 和 grammars/meta.lang 文件。
langcc是一個(gè)研究原型,尚未在生產(chǎn)中廣泛使用。但開(kāi)發(fā)團(tuán)隊(duì)表示,它本質(zhì)上是穩(wěn)定的且功能完整的,并且可以用作獨(dú)立工具來(lái)促進(jìn)對(duì)新編譯器和編程語(yǔ)言的快速探索。
