从上文可知,核心的runtime环境的代码在 src/runtme/eval,本文主要简单概述此处的代码实现,下面的叙述按文件夹分类。
一、runtime:运行时的核心数据结构(符号表)
1、assoc_list.cpp 变量关联表
2、code_coverage.cpp 代码覆盖率工具
3、file_repository.cpp php文件的jit缓存
4、variable_environment.cpp 维护各个函数、变量等所属的环境(如所属的类、作用范围等)
5、variant_stack.cpp 变量栈结构(可以用于记录函数调用关系)
6、eval_state.cpp 最重要的runtime信息都收集在这里面,比如当前有哪objects、每个object有哪些method、全局函数、常量……
7、eval_object_data.h 记录一个class的信息
8、eval_frame_injection.h 函数调用中的一个栈帧
二、ext
此目录封装了往runtime中添加外部函数的方法,
三、parser
解析器,利用YACC实现的parser(EBNF语法文件是hphp.y, hphp.tab.cpp是工具生成的),此parser与compiler目录中的不同,此处主要是为语义解析服务的(可以理解TreeWalker)。对于hiphop php vm来说,语义处理就是想办法将php代码映射为c++代码(需要runtime提供大量的外部函数)。
1、hphp.y概述
文法开始符号:start
文件包含关系、语句添加等的处理在src/runtime/eval/parser/parser.cpp中, 就onXXX()此树遍历器的输出是一个AST,顶层节点是statement
四、debugger 利用socket实现的调试器
最后真正开始处理的是 void DebuggerProxy::processInterrupt(CmdInterrupt &cmd)
五、base
基本数据结构声明
六、ast
针对 parser解析出的AST进行语义处理(即具体的对每一层树节点 将php代码转为c++代码)
每个statement的统一接口是
virtual Statement *optimize(VariableEnvironment &env) { return NULL; } // 优化语句
virtual void eval(VariableEnvironment &env) const = 0; // 处理语句关系
virtual void byteCode(ByteCodeProgram &code) const; //
dump(std::ostream &out) const = 0; // 输出c++的代码
PS:
Eval::Construct 发展出的继承结构写的很漂亮
七、analysis 分析作用域
八、runtime 语义处理即翻译php到c++的主流程
eval.cpp Variant eval(LVariableTable *vars, CObjRef self, CStrRef code_str,bool prepend_php /* = true */)
1、php源代码预处理
2、ParseString() 树遍历
3、s->eval(env); 语义分析(递归往下走)
九、函数调用的实现
函数调用基本思路:根据符号表信息,找到object、method、variable等执行环境信息、每次进入一个函数时建立一个thread的栈帧,将php函数调用转化为外部函数的执行逻辑
分享到:
相关推荐
HipHop VM(HHVM)是Facebook推出的用来执行PHP代码...Facebook于12年十二月初发布了一个博文,宣布他们的解释型PHP运行环境HHVM(HipHop VM)已经达到甚至超过了编译型PHP运行环境HipHop的运行速度。 标签:HHVM
HipHop PHP:Facebook出品的PHP虚拟机,运行时和JIT
Facebook PHP SDK 4.0
HHVM即HipHop Virtual Machine,目前是3.0版本,出自Facebook,它先将PHP和Hack程序编译为中间字节码,然后通过just-in-time (JIT)编译器将字节码动态翻译为x64机器代码,应用上了非常多的编译优化技术。...
Facebook的RocksDB平台发展概述.docx
Facebook 开源动画库 POP 实现真实衰减动画
facebook架构
kaggle-Facebook-V, 在Kaggle上,Facebook竞争对手的第二 2nd-place Facebook Facebook Facebook Facebook Facebook Facebook这是我在 Facebook V: 预测中的工作库,它预测了我在。关于这些想法和一些讨论的概述可以...
Laravel开发-facebook-php-sdk-laravel Facebook PHP SDK与Laravel配合使用的包装。
NULL 博文链接:https://hfutfei.iteye.com/blog/747570
Django-facebook, 在 python 中,Facebook开放图api使用 Django 框架实现了 基于 Thierry Schellenbach ( mellowmorning.com ) 的 Django 状态现在,Django 和Facebook都在迅速改变。 同时,我在一个初创公司上班,...
facebook-like-button, Facebook社交插件'Like'的实现 Facebook like-button 的Facebook'像'社交插件插件的实现。官方的 Facebook没有为Android提供这样的组件。这个库使用 WebView 来显示 <iframe> 插件。...
The facebook php sdk example
Laravel开发-facebook 用于Laravel 4的Facebook PHP SDK包
NULL 博文链接:https://eric-gao.iteye.com/blog/1590430
Facebook 数据库 java 用户信息存储提取
Laravel开发-laravel-facebook-php-ads-sdk 用于Laravel的Facebook广告API SDK
使用自定义的按钮,实现Facebook授权登陆,跳转后显示用户的信息,并且在跳转后的页面可以选择退出登陆。代码简洁,很容易理解。
Facebook 营销介绍概述
适用于PHP的Facebook SDK(v5) 该存储库包含开源PHP SDK,可让您从PHP应用程序访问Facebook平台。安装Facebook PHP SDK可以与一起安装。 运行以下命令: composer require facebook/graph-sdk 请注意,将Facebook ...