国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

1fe1se / 1633人閱讀

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

前言

字節(jié)碼生成(編譯)的代碼主要集中在 zend_compile.c ,文件中包含大量的 zend_compile_xxx 函數(shù),基本上一個(gè)函數(shù)對應(yīng) 語法規(guī)則文件 zend_language_parser.y 一個(gè)非終結(jié)符,zend_compile_top_stmt 函數(shù)是所有 zend_compile_xxx 函數(shù)的入口

數(shù)據(jù)結(jié)構(gòu) zend_op

zend_op 結(jié)構(gòu)體是 PHP 字節(jié)碼抽象

// zend_compile.h

struct _zend_op {
    const void *handler;
    znode_op op1;
    znode_op op2;
    znode_op result;
    uint32_t extended_value;
    uint32_t lineno;
    zend_uchar opcode;
    zend_uchar op1_type;
    zend_uchar op2_type;
    zend_uchar result_type;
}
zend_op_array

zend_op_array 結(jié)構(gòu)體并沒有像名字那樣簡單 zend op array,它包含了大量的字段供虛擬機(jī)在運(yùn)行時(shí)使用

// zend_compile.h

struct _zend_op_array {
}
zend_compile_top_stmt

zend_compile_top_stmt 一如既往的簡單,直觀,相比之前看 ruby 源代碼而言,感覺 歐美工程師 可能真的比 島國工程師 牛叉一些

// zend_compile.c

void zend_compile_top_stmt(zend_ast *ast) {
    if (!ast) {
        return;
    }

    if (ast->kind == ZEND_AST_STMT_LIST) {
        zend_ast_list *list = zend_ast_get_list(ast);
        uint32_t i;
        for (i = 0; i < list->children; ++i) {
            zend_compile_top_stmt(list->child[i]);
        }
        return;
    }

    zend_compile_stmt(ast);

    if (ast->kind != ZEND_AST_NAMESPACE && ast->kind != ZEND_AST_HALT_COMPILER) {
        zend_verify_namespace();
    }
    if (ast->kind == ZEND_AST_FUNC_DECL || ast->kind == ZEND_AST_CLASS) {
        CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno;
        zend_do_early_binding();
    }
}

ast 是抽象語法樹(AST)的根節(jié)點(diǎn)(參考 PHP-7.1 源代碼學(xué)習(xí):語法分析 之 概述),函數(shù)首先對 ast 進(jìn)行參數(shù)驗(yàn)證,針對 ZEND_AST_STMT_LIST 節(jié)點(diǎn)類型進(jìn)行遞歸調(diào)用,然后調(diào)用 zend_compile_stmt 編譯 各個(gè) stmt,這個(gè)流程和語法規(guī)則也是精確對應(yīng)的:

start: top_statement_list { CG(ast) = $1 }
top_statement_list:
        top_statement_list top_statement { $$ = zend_ast_list_add($1, $2) }
    |    /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_STMT_LIST); }
top_statement:
    statement
    ...
zend_compile_stmt

zend_compile_stmt 函數(shù)基本上就是根據(jù) zend_ast 類型(kind)進(jìn)行 switch case

void zend_compile_stmt(zend_ast *ast) {
    if (!ast) {
        return;
    }

    CG(zend_lineno) = ast->lineno;
    ...
    switch (ast->kind) {
        case ZEND_AST_STMT_LIST:
            zend_compile_stmt_list(ast);
            break;
        case ZEND_AST_GLOBAL:
            zend_compile_global_var(ast);
            break;
        ...
        default:
        {
            znode result;
            zend_compile_expr(&result, ast);
            zend_do_free(&result);
        }
    }
    ...
}
總結(jié)

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22323.html

相關(guān)文章

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

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

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

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

    ConardLi 評論0 收藏0
  • PHP-7.1 源代學(xué)習(xí):代生成 函數(shù)定義

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

    aisuhua 評論0 收藏0
  • PHP-7.1 源代學(xué)習(xí):虛擬機(jī)字節(jié)

    前言 to be done 總結(jié)

    李增田 評論0 收藏0
  • PHP-7.1 源代學(xué)習(xí)php-cli 啟動(dòng)流程

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

    VishKozus 評論0 收藏0

發(fā)表評論

0條評論

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