【编译技术】:AST——基础的基础
目录
1. AST 是什么?
2. AST 有什么用途?
3. 基本编译过程?
4. 有哪些主流 AST 工具?
1. AST 是什么?
在计算机科学中,抽象语法树(abstract syntax tree 或者缩写为 *AST*),或者语法树(*syntax tree*),是源代码的抽象语法结构的树状表现形式,这里特指编程语言的源代码。树上的每个节点都表示源代码中的一种结构。之所以说语法是「抽象」的,是因为这里的语法并不会表示出真实语法中出现的每个细节。
例如:
var a = 3;
a + 5
AST:
2. AST 有什么用途?
AST 用途有很多:
- 代码转换(例:Babel)
- 语法检查(例:JSLint)、风格检查(例:JSHint);
- IDE 的错误提示、格式化、高亮、自动补全等(例:IDEA、WebStorm);
- 混淆、优化、压缩、打包(例:Webpack、Rollup)
- 语言扩展(例:TypeScript、JSX、CoffeeScript)
- CSS 预处理器
- ...等等
这些工具都建立在 AST 的基础之上。
3. 基本编译过程?
大多数编译器主要来说分为三个阶段:
- 解析(Parsing):将原始代码转换成 AST。
- 转换(Transformation):分析、修改 AST。
- 代码生成(Code Generation):根据转换后的 AST, 生成代码。
4. 有哪些主流 AST 工具?
有很多,下面是几个知名度比较高的...
- esprima
- Esprima (esprima.org, BSD license) is a high performance, standard-compliant ECMAScript parser written in ECMAScript (also popularly known as JavaScript).
- espree
- Espree started out as a fork of Esprima v1.2.2, the last stable published released of Esprima before work on ECMAScript 6 began. Espree is now built on top of Acorn, which has a modular architecture that allows extension of core functionality. The goal of Espree is to produce output that is similar to Esprima with a similar API so that it can be used in place of Esprima.
- ECMAScript
- estraverse
- Estraverse (estraverse) is ECMAScript traversal functions from esmangle project.
- escodegen
- Escodegen (escodegen) is an ECMAScript (also popularly known as JavaScript) code generator from Mozilla's Parser API AST.
- estraverse
- UglifyJS
- UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
- acorn
- A tiny, fast JavaScript parser, written completely in JavaScript.
- babel
- @babel/parser:解析
- The Babel parser (previously Babylon) is a JavaScript parser used in Babel.
- @babel/traverse:转换
- @babel/generator:生成
- @babel/parser:解析
参考资料:
Understanding ASTs by Building Your Own Babel Plugin: https://www.sitepoint.com/understanding-asts-building-babel-plugin/ the-super-tiny-compiler: https://github.com/jamiebuilds/the-super-tiny-compiler LangSandbox: https://github.com/ftomassetti/LangSandbox Ruslan's Blog: https://ruslanspivak.com/archives.html
工具箱:
可视化 AST 工具: https://astexplorer.net/ ECMAScript Tooling: https://github.com/estools
JS 引擎:
SpiderMonkey: The Mozilla JavaScript runtime https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey
AST 规范:
The ESTree Spec: https://github.com/estree/estree
AST 解析器:
UglifyJS: https://github.com/mishoo/UglifyJS2 acorn: https://github.com/acornjs/acorn esprima: http://esprima.org/ https://github.com/jquery/esprima espree: https://github.com/eslint/espree @babel/parser: https://github.com/babel/babel/tree/master/packages/babel-parser
Babel 插件:
Babel 插件手册: https://github.com/jamiebuilds/babel-handbook/blob/master/translations/zh-Hans/plugin-handbook.md babel-plugin-hello-world: https://github.com/RReverser/babel-plugin-hello-world
- 从零开始写项目第二篇【登陆注册、聊天、收藏夹模块】
- 关于Java你不知道的10件事
- 03-移动端开发教程-CSS3新特性(下)
- 大数据面试题整理
- 02-移动端开发教程-CSS3新特性(中)
- 强悍!Java 9 中的9个新特性
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程
- R语言时间序列和ARIMA模型预测拖拉机销售的制造案例研究
- Windows10下安装linux子系统学习笔记
- 项目实践 | 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)
- [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播地图
- WEB前端安全自查和加固
- 硬核!IDEA 中使用 Git 完整入门教程!
- 神器你值得拥有——CoolFormat代码一键自动格式化工具,支持Verilog
- 一个简单现实案例挑战 PowerBI 水平测试 - 深度解析
- [译]使用DOT语言和GraphvizOnline来可视化你的ASP.NETCore3.0终结点01
- 探索 React 内核:深入 Fiber 架构和协调算法
- [经验]使用Keil MDK+Jlink-OB下载失败的解决办法
- ESP8266两种工作模式数据传输测试
- 『真香警告』这33个超级好用的CSS选择器,你可能见都没见过。