facebook hiphop php vm 实现概述
一、src目录概述:
compiler:编译器
expression:php的expression所对应的ast node使用的数据结构
statement:对应php的语句
parser:生成出来ast
analysis:静态语义分析(变量类型、作用域、常量表、变量表、函数表……)
ffi:多语言交互层(大概是实现胶水的接口)
hphp:入口
idl:接口定义
system:php这一层的系统环境
third_party:借用的第三方包
util:工具类
runtime:整个转换器的运行时系统
tmp:生成的文件
ext:包装给php使用的外部函数,即php中使用的一些基础功能需要有对应的c++实现(因为此runtime是用c++实 现 的,所以这些函数也只能用c++来写),当然在实现时可以使用第三方包
base:运行时中要使用的基础数据结构和功能(ext中的外部函数的功能需要此处的支持)
eval:核心的runtime环境
可以看出这些代码中大家最关心的应该是compiler和runtime模块。
二、入口
hphp/main.cpp
三、compiler概述
1、分析的层次关系从大到小是 package----class---funtion---variable---constant。
2、scanner和parser的实现和一般的编译器的实现是一样的,scanner的出口int getNextToken(ScannerToken &t, Location &l);,parser的出口Parser::ParseString()
3、静态分析;采用遍历者模式,分析结果封装在analusis_result这个数据结构中,即此数据结构存储此阶段的结果。具体的代码中主要分析了类中的函数情况、函数中表达式情况、控制流图(ControlFlowGraph)、表达式字典、数据流(如检查赋值语句的左值是否合法)、符号表等
四、runtime概述
1、入口 eval.cpp
2、RequestEvalState 管理符号表信息
今天就先写这些,如果有人感兴趣的话,我再往细里写吧!
一、src目录概述:
compiler:编译器
expression:php的expression所对应的ast node使用的数据结构
statement:对应php的语句
parser:生成出来ast
analysis:静态语义分析(变量类型、作用域、常量表、变量表、函数表……)
ffi:多语言交互层(大概是实现胶水的接口)
hphp:入口
idl:接口定义
system:php这一层的系统环境
third_party:借用的第三方包
util:工具类
runtime:整个转换器的运行时系统
tmp:生成的文件
ext:包装给php使用的外部函数,即php中使用的一些基础功能需要有对应的c++实现(因为此runtime是用c++实 现 的,所以这些函数也只能用c++来写),当然在实现时可以使用第三方包
base:运行时中要使用的基础数据结构和功能(ext中的外部函数的功能需要此处的支持)
eval:核心的runtime环境
可以看出这些代码中大家最关心的应该是compiler和runtime模块。
二、入口
hphp/main.cpp
三、compiler概述
1、分析的层次关系从大到小是 package----class---funtion---variable---constant。
2、scanner和parser的实现和一般的编译器的实现是一样的,scanner的出口int getNextToken(ScannerToken &t, Location &l);,parser的出口Parser::ParseString()
3、静态分析;采用遍历者模式,分析结果封装在analusis_result这个数据结构中,即此数据结构存储此阶段的结果。具体的代码中主要分析了类中的函数情况、函数中表达式情况、控制流图(ControlFlowGraph)、表达式字典、数据流(如检查赋值语句的左值是否合法)、符号表等
四、runtime概述
1、入口 eval.cpp
2、RequestEvalState 管理符号表信息
今天就先写这些,如果有人感兴趣的话,我再往细里写吧!