V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
flash866
V2EX  ›  问与答

大神讲解的 HHVM 原理,没有看懂,盼解释!!!

  •  
  •   flash866 · 2015-01-09 17:01:40 +08:00 · 2556 次点击
    这是一个创建于 3613 天前的主题,其中的信息可能已经有所发展或是发生改变。

    http://www.csdn.net/article/2014-12-19/2823234?foxhandler=rssreadrenderprocesshandler

    HHVM提升PHP性能的途径,采用的方式就是替代Zend引擎来生成和执行PHP的中间字节码(HHVM生成自己格式的中间字节码),执行时通过JIT(Just In Time,即时编译是种软件优化技术,指在运行时才会去编译字节码为机器码)转为机器码执行。Zend引擎默认做法,是先编译为opcode,然后再逐条执行,通常每条指令对应的是C语言级别的函数。如果我们产生大量重复的opcode(纯PHP写的代码和函数),对应的则是Zend多次逐条执行这些C代码。而JIT所做的则是更进一步,将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发JIT的条件是代码或者函数被多次重复调用。

    “而JIT所做的则是更进一步,将大量重复执行的字节码在运行的时候编译为机器码,达到提高执行效率的目的。通常,触发JIT的条件是代码或者函数被多次重复调用。”这句话没有弄懂:
    1、JIT技术是不是指对编译生成的HHVM字节码(类似ZEND生成的OPCODE)进行二次编译成机器码?都生成机器码了,那岂不是在解释器中不用再解释了?

    2、原文中说道PHP7中有一句话:“AST(Abstract Syntax Tree,抽象语法树),目的是在PHP编译过程引入一个中间件,替代直接从解释器吐出opcode的方式。让解释器和编译器解耦,可以减少大量Hack代码,同时,让实现更容易理解和维护。”这个“解耦”也无法理解!

    4 条回复    2015-01-09 17:34:12 +08:00
    tabris17
        1
    tabris17  
       2015-01-09 17:05:22 +08:00
    和LuaJIT PyPy 一个原理
    flash866
        2
    flash866  
    OP
       2015-01-09 17:22:52 +08:00
    @tabris17 “目的是在PHP编译过程引入一个中间件,替代直接从解释器吐出opcode的方式。让解释器和编译器解耦,可以减少大量Hack代码,同时,让实现更容易理解和维护。”重点是这个啊!完全看不懂!!
    tabris17
        3
    tabris17  
       2015-01-09 17:29:36 +08:00
    @flash866 建议先学点编译原理知识,否则是很难理解
    husinhu
        4
    husinhu  
       2015-01-09 17:34:12 +08:00
    interpreter -> dynamic translator.
    一个是用C模拟,那么会对应很多汇编;
    后者是直接汇编翻译,并且加上优化。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:59 · PVG 02:59 · LAX 10:59 · JFK 13:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.