亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

PHP-7.1 源代碼學(xué)習(xí):字節(jié)碼在 Zend 虛擬機(jī)中的解釋執(zhí)行 之 概述

Tamic / 2864人閱讀

摘要:前言本文簡(jiǎn)要介紹虛擬機(jī)解釋執(zhí)行字節(jié)碼的基本邏輯以及相關(guān)的數(shù)據(jù)結(jié)構(gòu),關(guān)于源代碼的下載,編譯,調(diào)試可以參考之前的系列文章我們來(lái)看看執(zhí)行一個(gè)簡(jiǎn)單的腳本的調(diào)用棧由于是執(zhí)行腳本文件,所以調(diào)用了函數(shù),最終調(diào)用函數(shù)和其它語(yǔ)言編寫的系統(tǒng)軟件類似,函數(shù)中

前言

本文簡(jiǎn)要介紹 zend 虛擬機(jī)解釋執(zhí)行字節(jié)碼的基本邏輯以及相關(guān)的數(shù)據(jù)結(jié)構(gòu),關(guān)于 PHP 源代碼的下載,編譯,調(diào)試可以參考之前的系列文章

execute_ex

我們來(lái)看看執(zhí)行一個(gè)簡(jiǎn)單的腳本 test.php 的調(diào)用棧

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 

由于是執(zhí)行腳本文件,所以 do_cli 調(diào)用了 php_execute_script 函數(shù),最終調(diào)用 execute_ex 函數(shù):

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)(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 語(yǔ)言編寫的系統(tǒng)軟件類似,函數(shù)中使用了大量的宏定義,通過(guò)宏定義的名字還是能大概看出其用途

DCL_OPLINE,變量聲明

LOAD_OPLINE(),加載指令字節(jié)碼

ZEND_VM_LOOP_INTERRUPT_CHECK(),interrupt 檢測(cè)

while (1) 循環(huán),調(diào)用指令的處理函數(shù) OPLINE->handler

op_code_handler 總結(jié)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22316.html

相關(guān)文章

  • PHP-7.1 代碼學(xué)習(xí)字節(jié)碼生成 概述

    摘要:前言字節(jié)碼生成編譯的代碼主要集中在,文件中包含大量的函數(shù),基本上一個(gè)函數(shù)對(duì)應(yīng)語(yǔ)法規(guī)則文件一個(gè)非終結(jié)符,函數(shù)是所有函數(shù)的入口數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)體是字節(jié)碼抽象結(jié)構(gòu)體并沒有像名字那樣簡(jiǎn)單,它包含了大量的字段供虛擬機(jī)在運(yùn)行時(shí)使用一如既往的簡(jiǎn)單,直觀,相比 前言 字節(jié)碼生成(編譯)的代碼主要集中在 zend_compile.c ,文件中包含大量的 zend_compile_xxx 函數(shù),基本上一個(gè)函數(shù)...

    1fe1se 評(píng)論0 收藏0
  • PHP-7.1 代碼學(xué)習(xí)字節(jié)碼生成 "$a = 1"

    摘要:前言本文通過(guò)分析這個(gè)語(yǔ)句的編譯和執(zhí)行來(lái)窺探解釋執(zhí)行邏輯準(zhǔn)備參考之前的系列文章,在環(huán)境下下載,編譯源代碼將代碼導(dǎo)入中編輯運(yùn)行選項(xiàng),增加運(yùn)行參數(shù)設(shè)置斷點(diǎn)開始調(diào)試是一個(gè)測(cè)試腳本,放在目錄下,中只包含一條簡(jiǎn)單的賦值語(yǔ)句調(diào)用堆棧參考之前的系列文章 前言 本文通過(guò)分析 $a=1 這個(gè) PHP 語(yǔ)句的編譯和執(zhí)行來(lái)窺探 php-cli 解釋執(zhí)行邏輯 準(zhǔn)備 參考之前的系列文章,在 ubuntu 環(huán)境下...

    ConardLi 評(píng)論0 收藏0
  • PHP-7.1 代碼學(xué)習(xí):語(yǔ)法分析 概述

    摘要:前言使用和進(jìn)行語(yǔ)法分析和詞法分析,本文以語(yǔ)法定義文件為起點(diǎn),使用等命令行工具搜索相關(guān)源碼,以此來(lái)展示探索語(yǔ)法分析源碼思路語(yǔ)法定義文件在源代碼根目錄下通過(guò)命令查找文件我們找到了文件,里面定義了腳本的語(yǔ)法語(yǔ)法分析樹節(jié)點(diǎn)類型在查看具體的語(yǔ)法規(guī)則 前言 php 使用 lex 和 bison 進(jìn)行語(yǔ)法分析和詞法分析,本文以 bison 語(yǔ)法定義文件為起點(diǎn),使用 find, grep 等命令行工具...

    luqiuwen 評(píng)論0 收藏0
  • PHP-7.1 代碼學(xué)習(xí)php-cli 啟動(dòng)流程

    摘要:前言函數(shù)默認(rèn)構(gòu)建目標(biāo)為,相關(guān)代碼在目錄下,文件中能夠找到入口函數(shù),大概流程如下命令行參數(shù)處理初始化清理工作語(yǔ)言系統(tǒng)編程常用手法,通過(guò)中聲明函數(shù)指針類型的字段來(lái)實(shí)現(xiàn)類似面向?qū)ο笾谐橄箢惖母拍?,在文件中可以找到該結(jié)構(gòu)體的定義,這里只列出部分 前言 php cli main 函數(shù) configure & make 默認(rèn)構(gòu)建目標(biāo)為 php-cli,相關(guān)代碼在 sapi/cli 目錄下,php_...

    VishKozus 評(píng)論0 收藏0
  • PHP-7.1 代碼學(xué)習(xí)代碼生成 函數(shù)定義

    摘要:前言本文從函數(shù)定義的語(yǔ)法規(guī)則開始,簡(jiǎn)要介紹解釋器如何編譯函數(shù)定義函數(shù)對(duì)應(yīng)的節(jié)點(diǎn)為了看起來(lái)清楚一些,我們將語(yǔ)法規(guī)則定義與語(yǔ)法動(dòng)作分開根據(jù)語(yǔ)法動(dòng)作,這條函數(shù)定義規(guī)則會(huì)創(chuàng)建一個(gè)類型的結(jié)點(diǎn),我們來(lái)看看方法是一個(gè)通用的方法,通 前言 本文從函數(shù)定義的語(yǔ)法規(guī)則開始,簡(jiǎn)要介紹 PHP 解釋器如何 編譯 函數(shù)定義 函數(shù)對(duì)應(yīng)的 AST 節(jié)點(diǎn) 為了看起來(lái)清楚一些,我們將 語(yǔ)法規(guī)則定義 與 語(yǔ)法動(dòng)作分開: ...

    aisuhua 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Tamic

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<