抽象语法树AST(Abstract Syntax Tree)

JavaScript执行从读取文件到生成机器码,经历词法分析、语法分析和语义分析。词法分析识别单词符号,生成令牌流;语法分析将令牌流转化为抽象语法树AST;语义分析审查类型,收集类型信息。了解AST对于前端开发者理解插件和工具的实现至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaScript 的执行过程

JS执行的第一步是读取 js 文件中的字符流,然后通过词法分析生成令牌流Tokens,之后再通过语法分析生成 AST(Abstract Syntax Tree),最后生成机器码执行。

模版语法-->抽象语法树AST-->渲染函数(h函数)-->虚拟节点(diff在此运行)-->界面生成AST需要用到指针算法和Stack数据结构

什么是AST(抽象语法树)?

抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。

为什么要了解AST ?

如果你想了解 前端 常用的一些插件或者工具是如何实现的?那么你就得了解 AST,比如说Javascript转译、代码压缩、css预处理器、elint、pretiier等功能的实现,都是建立在 AST 的基础之上。

JavaScript 是一种解释型脚本语言,与 C、C++ 等语言需要先编译 再运行不同,使用 JavaScript 编写的代码 不需要 编译成目标源码, 可以直接运行(编译和解释是一次性完成的)。

编译 是把 输入的源程序 翻译生成为目标代码(例如,字节码等),并存下来(无论是存在内存中还是磁盘上),后续可直接执行此目标代码,即可以复用;
解释 是对 输入的 源程序 边翻译边执行 一次性 完成,期间不生成可存储的目标代码

一些编程语言 是同时采用 编译器 解释器 来实现的,包含Python,Java, C、C++ 等,先将代码编译为字节码,运行字节码时再进行解释。所谓“解释型语言”并不是 不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已 。

词法分析

词法分析 是编译过程的 第一个阶段也称之为扫描(Scanner)。这个阶段的任务可以看成是-从左到右一个字符一个字符地读入源程序,从中识别出一个个“单词”符号,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号);

通过词法分析程序实现上述读入源程序,识别符号的任务,词法分析过程依据的是语言的词法规则;

输出:词法分析程序输出的“单词”常以二元组的方式输出,即单词种别和单词自身的值

认识:词法, 定义组成语言的单词, 是语言中最小单元;

词法分析,也称之为扫描(scanner),简单来说就是调用 next() 方法,一个一个字母的来读取字符,然后与定义好的 JavaScript 关键字做比较,生成对应的令牌流Tokens。令牌Token是一个不可分割的最小单元,例如 var 这三个字符,它只能作为一个整体,语义上不能再被分解,因此它是一个令牌Token。词法分析器里,每个关键字是一个令牌Token ,每个标识符是一个令牌Token,每个操作符是一个令牌Token,每个标点符号也都是一个令牌Token。除此之外,还会过滤掉源程序中的注释和空白字符(换行符、空格、制表符等)。

最终,整个代码将被分割进一个令牌流Tokens列表(或者说一维数组)。

语法分析

语法分析 是编译过程的 一个逻辑阶段,此阶段的任务是在词法分析的 基础上 将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等;语法分析会将词法分析出来的令牌流转化成 有语法含义抽象语法树AST(Abstract Syntax Tree)。同时,验证语法,语法如果有错的话,抛出语法错误。

语法是用户数据与控制信息的结构与格式

认识:语法-- 将单子组织成有含义的短语和句子的规则,正如英语翻译中的语法;

1. 语法分析的任务是判断源程序在结构上是否正确,是上下文无关的;
2. 语义分析的任务是判断结构正确的源程序所表达的意义是否正确,是上下文有关的。一个是检查你说话的“主谓宾”结构,一个是检查你说话的意思。

语义分析(Syntax analysis)

语义分析 是编译过程的 一个逻辑阶段,语义是解释控制信息每个部分的意义,它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应,此阶段的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查;

收集类型信息供后面的代码生成阶段使用;

语义分析将审查类型并报告错误:不能在表达式中使用一个数组变量,赋值语句的右端和左端的类型不匹配;

认识:语义-- 结合上下文,可以推导出语句的真实含义,也就是我们输入中文之后翻译出来的英文含义,或输入英文,翻译出来的中文;

举例认识:

我现在要翻译一句话,如下图所示:

词法分析:想要获取这句话的意思,那么首先我需要输入信息,系统进行一个个单词识别,也就是录入源程序,这属于词法分析;

语法分析:这句话录入程序,接下来系统就要进行识别每一个单词分别都是什么格式,英语语法的主谓宾、定状补,进而确定要翻译的语句的结构;

语义分析:获取了句子的单词,词性,接下来就是最后的输出阶段啦,语义分析,通过语义分析输出该翻译字句的中文含义:“她很漂亮宛如一个小仙女”;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值