• 技术文章 >后端开发 >php教程

    facebook hiphop php vm 兑现概述(二)

    2016-06-13 13:17:59原创396

    facebook hiphop php vm 实现概述(二)
    从上文可知,核心的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函数调用转化为外部函数的执行逻辑

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp eval runtime parser php
    上一篇: PHP截取中文字符串函数~包括GB2312跟UT-8 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • php实现通过JSON RPC与go通讯(附代码)• 浅析怎么使用PHP做异步爬取数据• PHP8.3要有新函数了!(json_validate函数说明)• 设计API接口时,要注意这些地方!• PHP网站常见一些安全漏洞及防御方法
    1/1

    PHP中文网