一些絮絮叨叨:
有次在查babel的相关资料的时候翻到了AST这个陌生的词汇,然后看到有些大佬在讨论AST啥啥啥的,一看觉得有点意思,就把相关的文章放进了收藏夹。
过了不知道多久之后,以前因为“太长不看”的文章由于某种机缘巧合被翻了出来,发现还是很值得学习一下的。
AST是什么
AST(Abstract Syntax Tree),中文名为抽象语法树。
一开始接触AST的时候以为只是javascript里面的一个概念,实际上并不然,其实这个概念是计算机科学里面的一个概念,是源代码语法结构里面的一种抽象表示。算的上是编译原理里面的一个小内容(看到某位大佬说的)
为什么要有AST
最简单的一个理解就是:为什么javascript的编译器可以分得清我们写的各种奇奇怪怪的代码呢,例如说函数定义,变量赋值,是依照什么规则来进行解析的呢?
用我个人理解的话来说,就是为了让代码可以变成被机器识别并处理的一种标准结构——将一个文件里面的代码按照AST的标准进行拆分,直到分到不可分解的原子粒度为止,然后机器就可以根据这些原子粒度的处理方法进行统一处理这个分解结果就是抽象语法树。
例如 1+1 这个表达式 可以被分解为 操作数(1) 操作符(+) 操作数(1)
1+1 的抽象语法树通过这种方式代码就可以被统一处理,例如说编译成对应的机器码进行操作
AST怎么用
看到这里可能就会有小伙伴产生疑问了,这种底层的东西跟我们有什么关系呢?常见的关于开发的案例如下:
1. 代码编辑器的智能提示,代码编辑器通过AST及一些交互手段知道你指中的是什么内容,并且分析出这个是什么东西,并且给出提示
2. babel的编译器,我们使用babel的时候会经常看到babylon这个东西,有时候就没过于深究,其实babylon就是babel的AST解析器,然后babel主要充当的是对AST的调整功能,然后重新输出。
这里提一嘴:babel的整个工作流程就是code->AST->遍历AST,替换变量名->重新导出代码,babel就是负责了后两步的逻辑。可能基于AST的代码兼容方案都是这种处理方式(笔者没有开发过)
3. 设计一门新的编程语言,将自己的语言编译成某种其他语言等 一个简单的编译器
这里也可以看得出来,其实AST更加多情况下是用在制作工具或者插件这个环节的,懂得这个简单的小知识也可以帮助大家理解很多插件的运行逻辑,希望可以帮到大家。
如果有其他基于AST的常见插件的话,也可以写下来分享一下~
参考资料:
1. AST抽象语法树——最基础的javascript重点知识,99%的人根本不了解
2. AST抽象语法树
网友评论