世上沒有無緣無故的愛,也沒有無緣無故的恨。
語言從廣義上來講是人們進行溝通交流的各種表達符號。每種語言都有專屬于自己的符號,表達方式和規則。就編程語言來說,它也是由特定的符號,特定的表達方式和規則組成。語言的作用是溝通,不管是自然語言,還是編程語言,它們的區別在于自然語言是人與人之間溝通的工具,而編程語言是人與機器之間的溝通渠道。相對于自然語言,編程語言的歷史還非常短,雖然編程語言是站在歷史巨人的基礎上創建的,但是它還很小,還是一個小孩。它只能按編程人員所給的指令翻譯成對應的機器可以識別的語言。它就相當于一個轉化工具,將人們的知識或者業務邏輯轉化成機器碼(機器的語言),讓其執行對應的的操作。而這些指令是一些規則,一些約定,這些規則約定都是由編程語言來處理。
就PHP語言來說,它也是一組符合一定規則的約定的指令。在編程人員將自己的想法以PHP語言實現后,通過PHP的虛擬機將這些PHP指令轉變成C語言(可以理解為更底層的一種指令集)指令,而C語言又會轉變成匯編語言,最后匯編語言將根據處理器的規則轉變成機器碼執行。這是一個更高層次抽象的不斷具體化,不斷細化的過程。
在這一章,我們討論PHP虛擬機是如何將PHP語言轉化成C語言。從一種語言到另一種語言的轉化稱之為編譯,這兩種語言分別可以稱之為源語言和目標語言。這種編譯過程通過發生在目標語言比源語言更低級(或者說更底層)。語言轉化的編譯過程是由編譯器來完成,編碼器通常被分為一系列的過程:詞法分析、語法分析、語義分析、中間代碼生成、代碼優化、目標代碼生成等。前面幾個階段(詞法分析、語法分析和語義分析)的作用是分析源程序,我們可以稱之為編譯器的前端。后面的幾個階段(中間代碼生成、代碼優化和目標代碼生成)的作用是構造目標程序,我們可以稱之為編譯器的后端。一種語言被稱為編譯類語言,一般是由于在程序執行之前有一個翻譯的過程,其中關鍵點是有一個形式上完全不同的等價程序生成。而PHP之所以被稱為解釋類語言,就是因為并沒有這樣的一個程序生成,它生成的是中間代碼,這只是PHP的一種內部數據結構。
在本章我們會介紹PHP編譯器的前端的兩個階段,語法分析、語法分析;后端的一個階段,中間代碼生成。在第一節我們介紹PHP的詞法分析過程及其用到的工具[re2c](http://www.re2c.org/),第二節我們介紹在詞法分析后的語法分析過程,第三節我們以PHP的一個簡單語法實現作為本章的結束。
- 第一章 準備工作和背景知識
- 第一節 環境搭建
- 第二節 源碼結構、閱讀代碼方法
- 第三節 常用代碼
- 第四節 小結
- 第二章 用戶代碼的執行
- 第一節 生命周期和Zend引擎
- 第二節 SAPI概述
- Apache模塊
- 嵌入式
- FastCGI
- 第三節 PHP腳本的執行
- 詞法分析和語法分析
- opcode
- opcode處理函數查找
- 第四節 小結
- 第三章 變量及數據類型
- 第一節 變量的結構和類型
- 哈希表(HashTable)
- PHP的哈希表實現
- 鏈表簡介
- 第二節 常量
- 第三節 預定義變量
- 第四節 靜態變量
- 第五節 類型提示的實現
- 第六節 變量的生命周期
- 變量的賦值和銷毀
- 變量的作用域
- global語句
- 第七節 數據類型轉換
- 第八節 小結
- 第四章 函數的實現
- 第一節 函數的內部結構
- 函數的內部結構
- 函數間的轉換
- 第二節 函數的定義,傳參及返回值
- 函數的定義
- 函數的參數
- 函數的返回值
- 第三節 函數的調用和執行
- 第四節 匿名函數及閉包
- 第五節 小結
- 第五章 類和面向對象
- 第一節 類的結構和實現
- 第二節 類的成員變量及方法
- 第三節 訪問控制的實現
- 第四節 類的繼承,多態及抽象類
- 第五節 魔術方法,延遲綁定及靜態成員
- 第六節 PHP保留類及特殊類
- 第七節 對象
- 第八節 命名空間
- 第九節 標準類
- 第十節 小結
- 第六章 內存管理
- 第一節 內存管理概述
- 第二節 PHP中的內存管理
- 第三節 內存使用:申請和銷毀
- 第四節 垃圾回收
- 新的垃圾回收
- 第五節 內存管理中的緩存
- 第六節 寫時復制(Copy On Write)
- 第七節 內存泄漏
- 第八節 小結
- 第七章 Zend虛擬機
- 第一節 Zend虛擬機概述
- 第二節 語法的實現
- 詞法解析
- 語法分析
- 實現自己的語法
- 第三節 中間代碼的執行
- 第四節 PHP代碼的加密解密
- 第五節 小結
- 第八章 線程安全
- 第二節 線程,進程和并發
- 第三節 PHP中的線程安全
- 第九章 錯誤和異常處理
- 第十章 輸出緩沖
- 第十六章 PHP語言特性的實現
- 第一節 循環語句
- foreach的實現
- 第二十章 怎么樣系列(how to)
- 附錄
- 附錄A PHP及Zend API
- 附錄B PHP的歷史
- 附錄C VLD擴展使用指南
- 附錄D 怎樣為PHP貢獻
- 附錄E phpt測試文件說明
- 附錄F PHP5.4新功能升級解析
- 附錄G:re2c中文手冊