AST

是什么

AST(Abstract Syntax Tree)抽象语法树,是源代码的抽象语法结构的树状表现形式。

作用

  1. 理解AST可以帮助您编写更符合编程语言规范的代码,避免潜在的语法和逻辑错误。
  2. 有效利用编程工具:熟悉AST有助于您更有效地使用诸如集成开发环境(IDE)、代码编辑器、代码重构工具、静态代码分析工具等开发工具,从而提高编程效率。
  3. 编译器和解释器开发:如果您对编译器和解释器的开发感兴趣,了解AST是非常重要的,因为它是编译器和解释器处理源代码的关键数据结构。
  4. 代码优化:了解AST有助于您识别和应用代码优化技术,例如删除无用代码、简化复杂表达式和优化循环等,从而提高代码运行性能。
  5. 自定义工具开发:如果您需要为特定领域或任务开发自定义的代码生成、转换或分析工具,了解AST将使您能够更高效地完成这些工作。
  6. 语言设计与实现:如果您有兴趣设计和实现新的编程语言或扩展现有编程语言,了解AST将帮助您更好地理解编程语言的语法和结构,从而为您的设计和实现提供基础。

生成AST

  1. 词法分析:将源代码分解成词法单元(token)。
  2. 语法分析:将词法单元流转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树,这就是AST。
  3. 语义分析:将AST转换成另一种形式,这种形式可以更方便地被后续阶段使用,例如中间代码或者直接的机器代码。

在生成AST之后,编译器或解释器通常会执行以下操作:

  1. 语义分析:编译器或解释器对AST进行语义分析,以检查源代码中的语义错误。这包括类型检查、符号解析、作用域分析等。在这个阶段,编译器或解释器会确保源代码符合编程语言的语义规则,例如检查变量是否已声明、函数调用参数是否匹配等。
  2. 优化:在某些情况下,编译器或解释器会对AST进行优化。这包括常量折叠(将常量表达式替换为其计算结果)、无用代码删除、循环优化等。优化的目的是提高生成的目标代码的运行性能,同时保持程序的语义不变。
  3. 代码生成:最后,编译器或解释器会根据AST生成目标代码。目标代码可以是汇编语言、机器代码、字节码或其他编程语言的源代码。在这个阶段,编译器或解释器会将AST中的语法结构转换为目标代码中的指令、数据结构等。

JS转化过程

const fs = require('fs')
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generator = require('@babel/generator').default;

// 读取js文件
const jscode = fs.readFileSync('./demo.js', {
  encoding: 'utf-8'
});

// 生成ast
const ast = parser.parse(jscode);

// 遍历ast
traverse(ast, {
  FunctionDeclaration(path) {
    path.node.id.name = 'output'
  }
})

console.log(ast);

// 生成新的js代码
// const { code } = generator(ast);
const output = generator(ast);


console.log(output);
贡献者: huxiguo