zoukankan      html  css  js  c++  java
  • PHP-7.1 源代码学习:字节码在 Zend 虚拟机中的解释执行 之 概述

    本文简要介绍 zend 虚拟机解释执行字节码的基本逻辑以及相关的数据结构,关于 PHP 源代码的下载,编译,调试可以参考之前的系列文章

    execute_ex

    我们来看看执行一个简单的脚本 test.php 的调用栈

    execute_ex @ zend_vm_execute.h : 411
    zend_execute @ zend_vm_execute.h : 474
    php_execute_script @ zend.c : 1474
    do_cli @ php_cli.c : 993
    main @ php_cli.c : 1381 

    由于是执行脚本文件,所以 do_cli 调用了 php_execute_script 函数,最终调用 execute_ex 函数:

     
    ZEND_API void execute_ex(zend_execute_data *ex)
    {
        DCL_OPLINE
    
    #ifdef ZEND_VM_IP_GLOBAL_REG
        const zend_op *orig_opline = opline;
    #endif
    #ifdef ZEND_VM_FP_GLOBAL_REG
        zend_execute_data *orig_execute_data = execute_data;
        execute_data = ex;
    #else
        zend_execute_data *execute_data = ex;
    #endif
    
    
        LOAD_OPLINE();
        ZEND_VM_LOOP_INTERRUPT_CHECK();
    
        while (1) {
    #if !defined(ZEND_VM_FP_GLOBAL_REG) || !defined(ZEND_VM_IP_GLOBAL_REG)
                int ret;
    #endif
    #if defined(ZEND_VM_FP_GLOBAL_REG) && defined(ZEND_VM_IP_GLOBAL_REG)
            ((opcode_handler_t)OPLINE->handler)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
            if (UNEXPECTED(!OPLINE)) {
    #else
            if (UNEXPECTED((ret = ((opcode_handler_t)OPLINE->handler)www.90168.org(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)) != 0)) {
    #endif
    #ifdef ZEND_VM_FP_GLOBAL_REG
                execute_data = orig_execute_data;
    # ifdef ZEND_VM_IP_GLOBAL_REG
                opline = orig_opline;
    # endif
                return;
    #else
                if (EXPECTED(ret > 0)) {
                    execute_data = EG(current_execute_data);
                    ZEND_VM_LOOP_INTERRUPT_CHECK();
                } else {
    # ifdef ZEND_VM_IP_GLOBAL_REG
                    opline = orig_opline;
    # endif
                    return;
                }
    #endif
            }
    
        }
        zend_error_noreturn(E_CORE_ERROR, "Arrived at end of main loop which shouldn't happen");
    }

    和其它 C 语言编写的系统软件类似,函数中使用了大量的宏定义,通过宏定义的名字还是能大概看出其用途

    • DCL_OPLINE,变量声明

    • LOAD_OPLINE(),加载指令字节码

    • ZEND_VM_LOOP_INTERRUPT_CHECK(),interrupt 检测

  • 相关阅读:
    解决PKIX:unable to find valid certification path to requested target 的问题
    Linux 上的常用文件传输方式介绍与比较
    用VNC远程图形化连接Linux桌面的配置方法
    红帽中出现”This system is not registered with RHN”的解决方案
    linux安装时出现your cpu does not support long mode的解决方法
    CentOS SSH配置
    es6扩展运算符及rest运算符总结
    es6解构赋值总结
    tortoisegit安装、clon、推送
    es6环境搭建
  • 原文地址:https://www.cnblogs.com/tianshifu/p/6379733.html
Copyright © 2011-2022 走看看