lua 1.1 整个程序代码逻辑不是清晰,涉及面较广(有语法、词法分析,有字节码生成和执行方面等),要全面的分析和介绍比较困难,因此本文主要通过一个简单的脚本被解析和执行的流程来介绍lua的部分内部逻辑,带各位读者管中窥豹一把。通过这些简单的分析,希望对其他有兴趣爱好的朋友,提供一个指路的作用。
btw: lua 1.1 在中间代码生成方面还比较稚嫩,不过比起php3的纯解释要好一些,下次会写一下php3的处理流程。
======================================
一、整体执行序列
二、测试脚本原文
i = 10
while i < 12 do i=i+1 end |
三、语法树
1) I = 10 语法树
2) while 循环语法树循环语法树
四、语法分析及中间码生成 1) 赋值语句 (i = 10)的处理流程:
分析完毕之后,程序栈中字节码为:
PUSHBYTE |
10 |
STOREGLOBAL |
33 |
2) WHILE循环的处理流程:
处理完毕之后,程序栈中字节码 为:
$2à | PUSHGLOBAL |
word | 33 |
PUSHBYTE | |
12 | |
LTOP | |
PUSHNIL | |
word | 0 |
PUSHGLOBAL | |
word | 33 |
PUSH1 | |
ADDOP | |
STOREGOLBAL | |
word | 33 |
PUSHNIL | |
word | 0 |
当语法分析器离开 while_statement之前,会给两个占位的opcode赋值:
a) 第一个PUSHNIL及值0 被变更为 IFFJMP和11,代表LTOP结果如果为非时,从当前pc直接跳到最后(离开循环);
b) 第二个PUSHNIL及值0 被变更为 UPJMP和20,代表变更pc指针到循环的起始部位,循环执行该段opcode;