### 編譯型語言和解釋型語言
- 編譯型語言:執行前需要經歷編譯過程,把源代碼編譯成機器語言。以后再要運行時,直接使用編譯好的文件即可。(c, c++...)
優缺點:(1):一次性編譯成平臺相關的機器語言文件,運行時脫離開發環境,運行效率高
(2):于特定平臺相關,可移植性差。
- 解釋下語言:使用專門的解釋器對源碼卓條解釋成中間語言,再將中間語言文件交給其他過程處理或直接交給機器執行。對于常見的編譯步驟分為:詞法分析->語法分析->代碼優化和字節生成。
如php執行經過:將PHP代碼經過詞法分析轉換成語言片段(Tokens)->將Tokens經過語法分析轉換成有意義的表達式(AST抽象語法樹)->再將抽象語法樹經過編譯過程編譯成opcodes(這就是中間語言)->順次的執行opcodes(物理機器無法識別opcodes,因此需要zend虛擬機)

### php執行過程
1. Scanning(Lexing)對PHP源碼進行詞法分析,將源代碼切割為多個字符串單元,分割后的字符串成為Token
2. Parsing 將Token進行語法分析,轉換成抽象語法樹(AST)
3. Compilation AST經過編譯器編譯成機器指令(PHP定義的一組指令表示,每個指令對應響應的處理函數),這些機器指令為Opcodes。(這里說的編譯器不同與編譯型語言中的編譯器,AST經過編譯器被編譯成能被解釋執行的指令,而不是匯編代碼)
4. Execution zend虛擬機依次執行Opcodes,這個執行過程就是找到指令對應的處理函數,執行其中的代碼

> 現在的php可以將Opcodes緩存住,從而不必每次執行前3步,除非PHP檢測到代碼發生了改變。從而很大程度上提高了PHP的執行效率。在php.ini配置文件中可以開啟或者關閉Opcodes緩存`opcache.enable=1`
### 指令
Zend虛擬機的指令稱為opline,每條指令對應一個opcode.PHP代碼在編譯后生成opline,Zend虛擬機根據不同的opline完成PHP代碼的執行,opline由操作指令,操作數和返回值組成,與機器指令非常類似.
opline對應的結構體
```
struct _zend_op {
handler, // 操作執行的函數
op1, // 操作數1
op2, // 操作數2
result, // 返回值
}
```
- linux 基礎
- ln 鏈接
- linux 環境變量
- linux 進程查看
- nginx
- redis
- redis 安裝
- php 底層原理
- php源碼編譯安裝
- phpize文件
- php命令行
- php7 新特性
- php7 變量
- php7 生命周期
- php sapi運行模式
- php 內存管理
- php 運行機制和Zend虛擬機
- php垃圾回收
- php 基礎
- php.ini
- php函數
- 面向對象
- php 文件上傳
- ob緩沖和頁面靜態化
- php中的session
- php cURL擴展
- composer 應用
- php 錯誤和異常
- thinkphp
- tp6容器和依賴注入
- tp6 的服務
- tp6事件
- tp6 多應用
- tp6路由
- tp6 cache
- tp6 request
- tp6 中間件
- tp6 response
- tp6 Db
- 備忘錄
- 數據庫表