一些絮絮叨叨:
有次在查babel的相關(guān)資料的時(shí)候翻到了AST這個(gè)陌生的詞匯,然后看到有些大佬在討論AST啥啥啥的亭饵,一看覺得有點(diǎn)意思休偶,就把相關(guān)的文章放進(jìn)了收藏夾。
過了不知道多久之后辜羊,以前因?yàn)椤疤L不看”的文章由于某種機(jī)緣巧合被翻了出來踏兜,發(fā)現(xiàn)還是很值得學(xué)習(xí)一下的词顾。
AST是什么
AST(Abstract?Syntax?Tree),中文名為抽象語法樹碱妆。
一開始接觸AST的時(shí)候以為只是javascript里面的一個(gè)概念肉盹,實(shí)際上并不然,其實(shí)這個(gè)概念是計(jì)算機(jī)科學(xué)里面的一個(gè)概念疹尾,是源代碼語法結(jié)構(gòu)里面的一種抽象表示上忍。算的上是編譯原理里面的一個(gè)小內(nèi)容(看到某位大佬說的)
為什么要有AST
最簡單的一個(gè)理解就是:為什么javascript的編譯器可以分得清我們寫的各種奇奇怪怪的代碼呢,例如說函數(shù)定義纳本,變量賦值窍蓝,是依照什么規(guī)則來進(jìn)行解析的呢?
用我個(gè)人理解的話來說繁成,就是為了讓代碼可以變成被機(jī)器識別并處理的一種標(biāo)準(zhǔn)結(jié)構(gòu)——將一個(gè)文件里面的代碼按照AST的標(biāo)準(zhǔn)進(jìn)行拆分吓笙,直到分到不可分解的原子粒度為止,然后機(jī)器就可以根據(jù)這些原子粒度的處理方法進(jìn)行統(tǒng)一處理這個(gè)分解結(jié)果就是抽象語法樹朴艰。
例如 1+1 這個(gè)表達(dá)式 可以被分解為 操作數(shù)(1) 操作符(+) 操作數(shù)(1)
通過這種方式代碼就可以被統(tǒng)一處理观蓄,例如說編譯成對應(yīng)的機(jī)器碼進(jìn)行操作
AST怎么用
看到這里可能就會有小伙伴產(chǎn)生疑問了,這種底層的東西跟我們有什么關(guān)系呢祠墅?常見的關(guān)于開發(fā)的案例如下:
1. 代碼編輯器的智能提示,代碼編輯器通過AST及一些交互手段知道你指中的是什么內(nèi)容歌径,并且分析出這個(gè)是什么東西毁嗦,并且給出提示
2. babel的編譯器,我們使用babel的時(shí)候會經(jīng)郴仡酰看到babylon這個(gè)東西狗准,有時(shí)候就沒過于深究,其實(shí)babylon就是babel的AST解析器茵肃,然后babel主要充當(dāng)?shù)氖菍ST的調(diào)整功能腔长,然后重新輸出。
這里提一嘴:babel的整個(gè)工作流程就是code->AST->遍歷AST验残,替換變量名->重新導(dǎo)出代碼捞附,babel就是負(fù)責(zé)了后兩步的邏輯∧唬可能基于AST的代碼兼容方案都是這種處理方式(筆者沒有開發(fā)過)
3. 設(shè)計(jì)一門新的編程語言鸟召,將自己的語言編譯成某種其他語言等?一個(gè)簡單的編譯器
這里也可以看得出來,其實(shí)AST更加多情況下是用在制作工具或者插件這個(gè)環(huán)節(jié)的氨鹏,懂得這個(gè)簡單的小知識也可以幫助大家理解很多插件的運(yùn)行邏輯欧募,希望可以幫到大家。
如果有其他基于AST的常見插件的話仆抵,也可以寫下來分享一下~
參考資料:
1.?AST抽象語法樹——最基礎(chǔ)的javascript重點(diǎn)知識跟继,99%的人根本不了解
2.?AST抽象語法樹