摘要:轉載轉載目前編程語言可以分為兩大類第一類是像,,之類的編譯型語言,它們的共性是運行之前必須對源代碼進行編譯,然后運行編譯后的目標文件。初始化完成后讀取腳本文件,引擎對腳本文件進行詞法分析,語法分析。
轉載 http://www.php-internals.com/book/?p=chapt02/02-03-00-how-php-script-g...
轉載 http://www.laruence.com/2008/06/18/221.html
目前編程語言可以分為兩大類:
第一類是像C/C++, .NET, Java之類的編譯型語言, 它們的共性是: 運行之前必須對源代碼進行編譯,然后運行編譯后的目標文件。
第二類比如:PHP, Javascript, Ruby, Python這些解釋型語言 腳本語言, 他們都無需經過編譯即可"運行",雖然可以理解為直接運行,
但它們并不是真的直接就被能被機器理解, 機器只能理解機器語言,那這些語言是怎么被執行的呢, 一般這些語言都需要一個解釋器, 由解釋器來執行這些源碼, 實際上這些語言還是會經過編譯環節, 只不過它們一般會在運行的時候實時進行編譯。為了效率,并不是所有語言在每次執行的時候都會重新編譯一遍, 比如PHP的各種opcode緩存擴展(如APC, xcache, eAccelerator等),比如Python會將編譯的中間文件保存成pyc/pyo文件, 避免每次運行重新進行編譯所帶來的性能損失。
PHP腳本的執行
PHP的腳本的執行也需要一個解釋器, 比如命令行下的php程序,或者apache的mod_php模塊等等。 前一節提到了PHP的SAPI接口, 下面就以PHP命令行程序為例解釋PHP腳本是怎么被執行的。 例如如下的這段PHP腳本:
程序的執行
如上例中, 傳遞給php程序需要執行的文件, php程序完成基本的準備工作后啟動PHP及Zend引擎, 加載注冊的擴展模塊。
初始化完成后讀取腳本文件,Zend引擎對腳本文件進行詞法分析,語法分析。然后編譯成opcode執行。 如果安裝了apc之類的opcode緩存, 編譯環節可能會被跳過而直接從緩存中讀取opcode執行。
腳本的編譯執行
PHP在讀取到腳本文件后首先對代碼進行詞法分析,PHP的詞法分析器是通過lex生成的, 詞法規則文件在$PHP_SRC/Zend/zend_language_scanner.l, 這一階段lex會會將源代碼按照詞法規則切分一個一個的標記(token)。PHP中提供了一個函數token_get_all(), 該函數接收一個字符串參數, 返回一個按照詞法規則切分好的數組。 例如將上面的php代碼作為參數傳遞給這個函數:
Lex就是一個詞法分析的依據表。 Zend/zend_language_scanner.c會根據Zend/zend_language_scanner.l(Lex文件),來輸入的 PHP代碼進行詞法分析,從而得到一個一個的“詞”,PHP4.2開始提供了一個函數叫token_get_all,這個函數就可以講一段PHP代碼 Scanning成Tokens;
執行
分析這個返回結果我們可以發現,源碼中的字符串,字符,空格,都會原樣返回。每個源代碼中的字符,都會出現在相應的順序處。而,其他的比如標簽,操作符,語句,都會被轉換成一個包含倆部分的Array: Token ID (也就是在Zend內部的改Token的對應碼,比如,T_ECHO,T_STRING),和源碼中的原來的內容。
接下來,就是Parsing階段了,Parsing首先會丟棄Tokens Array中的多于的空格,然后將剩余的Tokens轉換成一個一個的簡單的表達式
1.echo a constant string 2.add two numbers together 3.store the result of the prior expression to a variable 4.echo a variable
然后就改Compilation階段了,它會把Tokens編譯成一個個op_array, 每個op_arrayd包含如下5個部分:
1.Opcode數字的標識,指明了每個op_array的操作類型,比如add , echo
2.結果 存放Opcode結果
3.操作數1 給Opcode的操作數
4.操作數2
5.擴展值 1個整形用來區別被重載的操作符
比如,我們的PHP代碼會被Parsing成:
這個要介紹操作數了,每個操作數都是由以下倆個部分組成:
a)op_type : 為IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CV b)u,一個聯合體,根據op_type的不同,分別用不同的類型保存了這個操作數的值(const)或者左值(var) 而對于var來說,每個var也不一樣
IS_TMP_VAR, 顧名思義,這個是一個臨時變量,保存一些op_array的結果,以便接下來的op_array使用,這種的操作數的u保存著一個指向變量表的一個句柄(整數),這種操作數一般用~開頭,比如~0,表示變量表的0號未知的臨時變量
IS_VAR 這種就是我們一般意義上的變量了,他們以$開頭表示
IS_CV 表示ZE2.1/PHP5.1以后的編譯器使用的一種cache機制,這種變量保存著被它引用的變量的地址,當一個變量第一次被引用的時候,就會被CV起來,以后對這個變量的引用就不需要再次去查找active符號表了,CV變量以!開頭表示。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21066.html
摘要:而對于標簽來說,一篇文章可以有多個標簽,同一個標簽下也可能有多篇文章,所以我們使用,表明這是多對多的關聯關系。理解多對一和多對多兩種關聯關系我們分別使用了兩種關聯數據庫表的形式和。表明一種一對多的關聯關系。 設計博客的數據庫表結構 博客最主要的功能就是展示我們寫的文章,它需要從某個地方獲取博客文章數據才能把文章展示出來,通常來說這個地方就是數據庫。我們把寫好的文章永久地保存在數據庫里,...
摘要:德國公司已經將標準以及附加程序應用在其在全球工廠之間的數據交互以及在刀具采購,機床使用等方面與合作伙伴之間的信息交換,提高了企業生產效率,節省了生產成本。可擴展齒輪描述語言齒輪數據接口標準主要由可擴展齒輪描述語言及數據轉換接口組成。 為解決齒輪設計、制造、測量和在役等各個階段的數據種類和格式繁雜,數據交互困難且缺少相應自動化系統的問題,提出了基于XML語言的可擴展齒輪描述語言(eXte...
摘要:大家好,我是一行最近在知乎看到一個問題你的編程能力從什么時候開始突飛猛進仔細思考了一下,我那編程能力突飛猛進的時候,腰都快給我叉彎了,那時不要太得意在一行我讀研究生之前還不是計算機相關專業,而讀研的時候誤打誤撞進了一個 ...
閱讀 3027·2023-04-25 20:22
閱讀 3345·2019-08-30 11:14
閱讀 2597·2019-08-29 13:03
閱讀 3187·2019-08-26 13:47
閱讀 3228·2019-08-26 10:22
閱讀 1274·2019-08-23 18:26
閱讀 620·2019-08-23 17:16
閱讀 1917·2019-08-23 17:01