js编译原理

去了解一门学问,没有渠道,就要按照逆向倒推的思维去进行拆解。今天对js的编译原理进行细微的分析。

js是一门“解释执行”的语言,程序中一段源代码的执行一般会执行三个步骤,通常叫做编译。分别是

1.分词/词法分析

这些代码块被称为词法单元(token)。例如,var a = 2;。这段程序通常会被分解成为下面这些词法单元:var、a、=、2

2.解析/语法分析

这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树。这个树被称为“抽象语法树”(Abstract Syntax Tree,AST)     

3代码生成

将AST转换为可执行代码的过程称被称为代码生成 。

负责编译的成员:

  1。JavaScript引擎:从头到尾负责整个 JavaScript 程序的编译及执行过程。

  2。编译器:负责语法分析及代码生成等脏活累活。

  3。作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

比如,var a = 1

1。遇到 var a ,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果已拥有,编译器会忽略该声明,继续进行编译;否则它会要求作用域在当前作用域的集合中声明一个新的变量,并命名为 a 。

2。接下来编译器会为引擎生成运行时所需的代码,这些代码被用来处理 a = 1 这个赋值操作。引擎运行时会首先询问作用域,在当前的作用域集合中是否存在一个叫作 a 的变量。如果是,引擎就会使用这个变量;如果否,引擎会继续查找该变量。

如果引擎最终找到了 a 变量,就会将 1 赋值给它。否则引擎就会举手示意并抛出一个异常!

总结:变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。

{

"type": "Program",

"body": [

{

"type": "VariableDeclaration", //变量声明

"declarations": [

{

"type": "VariableDeclarator",

"id": {

"type": "Identifier", // 变量标记识别码

"name": "a"

},

"init": {

"type": "Literal",

"value": 2,

"raw": "2"

}

}

],

"kind": "var" // 类型

}

],

"sourceType": "script"

}

具体的如何拆解js,可以去借助这个工具
recast

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

槿畔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值