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