Hunter的大杂烩 技术学习笔记

December 7, 2008

LUA 1.1 编译及运行流程简要分析

Filed under: 技术话题 — hunter @ 10:26 pm

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 被变更为 IFFJMP11,代表LTOP结果如果为非时,从当前pc直接跳到最后(离开循环);

b) 第二个PUSHNIL及值0 被变更为 UPJMP20,代表变更pc指针到循环的起始部位,循环执行该段opcode

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress