亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

PHP7 的抽象語(yǔ)法樹(shù)(AST)帶來(lái)的變化

2020-03-24 18:56:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

什么是抽象語(yǔ)法樹(shù)?

抽象語(yǔ)法樹(shù)(abstract syntax tree,AST)是源代碼的抽象語(yǔ)法結(jié)構(gòu)的樹(shù)狀表示,樹(shù)上的每個(gè)節(jié)點(diǎn)都表示源代碼中的一種結(jié)構(gòu),這所以說(shuō)是抽象的,是因?yàn)槌橄笳Z(yǔ)法樹(shù)并不會(huì)表示出真實(shí)語(yǔ)法出現(xiàn)的每一個(gè)細(xì)節(jié),比如說(shuō),嵌套括號(hào)被隱含在樹(shù)的結(jié)構(gòu)中,并沒(méi)有以節(jié)點(diǎn)的形式呈現(xiàn)。抽象語(yǔ)法樹(shù)并不依賴于源語(yǔ)言的語(yǔ)法,也就是說(shuō)語(yǔ)法分析階段所采用的上下文無(wú)文法【文法是用于描述語(yǔ)言的語(yǔ)法結(jié)構(gòu)的形式規(guī)則。任何一種語(yǔ)言都有它自己的文法,不管它是機(jī)器語(yǔ)言還是自然語(yǔ)言。】,因?yàn)樵趯懳姆〞r(shí),經(jīng)常會(huì)對(duì)文法進(jìn)行等價(jià)的轉(zhuǎn)換(消除左遞歸,回溯,二義性等),這樣會(huì)給文法分析引入一些多余的成分,對(duì)后續(xù)階段造成不利影響,甚至?xí)购蟼€(gè)階段變得混亂。因些,很多編譯器經(jīng)常要獨(dú)立地構(gòu)造語(yǔ)法分析樹(shù),為前端,后端建立一個(gè)清晰的接口

PHP-Parser的項(xiàng)目主頁(yè)是https://github.com/nikic/PHP-Parser。可以對(duì)多版本的PHP進(jìn)行完美解析,生成一顆抽象語(yǔ)法樹(shù)。

新的執(zhí)行過(guò)程

PHP7 的內(nèi)核中有一個(gè)重要的變化是加入了 AST。在 PHP5中,從 php 腳本到 opcodes 的執(zhí)行的過(guò)程是:

1.Lexing:詞法掃描分析,將源文件轉(zhuǎn)換成 token 流;

2.Parsing:語(yǔ)法分析,在此階段生成 op arrays。

PHP7 中在語(yǔ)法分析階段不再直接生成 op arrays,而是先生成 AST,所以過(guò)程多了一步:

1.Lexing:詞法掃描分析,將源文件轉(zhuǎn)換成 token 流;

2.Parsing:語(yǔ)法分析,從 token 流生成抽象語(yǔ)法樹(shù);

3.Compilation:從抽象語(yǔ)法樹(shù)生成 op arrays。

執(zhí)行時(shí)間和內(nèi)存消耗

從以上的步驟來(lái)看,這比之前的過(guò)程還多了一步,所以按常理來(lái)說(shuō)這反而會(huì)增加程序的執(zhí)行時(shí)間和內(nèi)存的使用。但事實(shí)上內(nèi)存的使用確實(shí)增加了,但是執(zhí)行時(shí)間上卻有所降低。

以下結(jié)果是使用?。ùa大約 100 行)、中(大約 700 行)、大(大約 2800 行)三個(gè)腳本分別進(jìn)行測(cè)試得到的,測(cè)試腳本: https://gist.github.com/nikic/289b0c7538b46c2220bc.

每個(gè)文件編譯 100 次的執(zhí)行時(shí)間(注意文章的測(cè)試結(jié)果時(shí)間是 14 年,PHP7 還叫 PHP-NG 的時(shí)候):

2ffde0f17be08a25232c915f5ff8131.png

單次編譯中的內(nèi)存峰值:

6d9437f9a25a3fe4e3451c6f934bed7.png

單次編譯的測(cè)試結(jié)果可能并不能代表實(shí)際使用的情況,以下是使用 PhpParser 進(jìn)行完整項(xiàng)目測(cè)試得到的結(jié)果:

a51a66e380c96d91248e28570d531e0.png

測(cè)試表明,使用 AST 之后程序的執(zhí)行時(shí)間整體上大概有 10% 到 15% 的提升,但是內(nèi)存消耗也有增加,在大文件單次編譯中增加明顯,但是在整個(gè)項(xiàng)目執(zhí)行過(guò)程中并不是很嚴(yán)重的問(wèn)題。

還有注意的是以上的結(jié)果都是在沒(méi)有 Opcache 的情況下,生產(chǎn)環(huán)境中打開(kāi) Opcache 的情況下,內(nèi)存的消耗增加也不是很大的問(wèn)題。

語(yǔ)義上的改變

如果僅僅是時(shí)間上的優(yōu)化,似乎也不是使用 AST 的充足理由。其實(shí)實(shí)現(xiàn) AST 并不是基于時(shí)間優(yōu)化上的考慮,而是為了解決語(yǔ)法上的問(wèn)題。下面來(lái)看一下語(yǔ)義上的一些變化。

yield 不需要括號(hào)

在 PHP5 的實(shí)現(xiàn)中,如果在一個(gè)表達(dá)式上下文(例如在一個(gè)賦值表達(dá)式的右側(cè))中使用 yield,你必須在 yield 申明兩邊使用括號(hào):

 ?php$result = yield fn(); // 不合法的$result = (yield fn()); // 合法的

這種行為僅僅是因?yàn)?PHP5 的實(shí)現(xiàn)方式的限制,在 PHP7 中,括號(hào)不再是必須的了。所以下面這些寫法也都是合法的:

 ?php$result = yield;$result = yield $v;$result = yield $k = 

當(dāng)然了,還得遵循 yield 的應(yīng)用場(chǎng)景才行。

括號(hào)不影響行為

在 PHP5 中,

 ?php($foo)[ bar ] = baz # PHP Parse error: Syntax error, unexpected [ on line 1

但是在 PHP7 中,兩種寫法表示同樣的意思。

同樣,如果函數(shù)的參數(shù)被括號(hào)包裹,類型檢查存在問(wèn)題,在 PHP7 中這個(gè)問(wèn)題也得到了解決:

 ?phpfunction func() { return [];function byRef(array $a) {byRef((func()));

以上代碼在 PHP5 中不會(huì)告警,除非使用 byRef(func()) 的方式調(diào)用,但是在 PHP7 中,不管 func() 兩邊有沒(méi)有括號(hào)都會(huì)產(chǎn)生以下錯(cuò)誤:

PHP Strict standards: Only variables should be passed by reference ...

list() 的變化

list 關(guān)鍵字的行為改變了很多。list 給變量賦值的順序(等號(hào)左右同時(shí)的順序)以前是從右至左,現(xiàn)在是從左到右:

 ?phplist($array[], $array[], $array[]) = [1, 2, 3];var_dump($array);// PHP5: $array = [3, 2, 1]// PHP7: $array = [1, 2, 3]# 注意這里的左右的順序指的是等號(hào)左右同時(shí)的順序,# list($a, $b) = [1, 2] 這種使用中 $a == 1, $b == 2 是沒(méi)有疑問(wèn)的。

產(chǎn)生上面變化的原因正是因?yàn)樵?PHP5 的賦值過(guò)程中,3 會(huì)最先被填入數(shù)組,1 最后,但是現(xiàn)在順序改變了。

同樣的變化還有:

 ?php$a = [1, 2];list($a, $b) = $a;// PHP5: $a = 1, $b = 2// PHP7: $a = 1, $b = null + Undefined index 1 

這是因?yàn)樵谝郧暗馁x值過(guò)程中 $b 先得到 2,然后 $a 的值才變成1,但是現(xiàn)在 $a 先變成了 1,不再是數(shù)組,所以 $b 就成了null。

list 現(xiàn)在只會(huì)訪問(wèn)每個(gè)偏移量一次

 ?phplist(list($a, $b)) = $array;// PHP5:$b = $array[0][1];$a = $array[0][0];// PHP7:// 會(huì)產(chǎn)生一個(gè)中間變量,得到 $array[0] 的值$_tmp = $array[0];$a = $_tmp[0];$b = $_tmp[1];

空的 list 成員現(xiàn)在是全部禁止的,以前只是在某些情況下:

 ?phplist() = $a; // 不合法list($b, list()) = $a; // 不合法foreach ($a as list()) // 不合法 (PHP5 中也不合法)

引用賦值的順序

引用賦值的順序在 PHP5 中是從右到左的,現(xiàn)在時(shí)從左到右:

 ?php$obj = new stdClass;$obj- a = $obj- $obj- b = 1;var_dump($obj);// PHP5:object(stdClass)#1 (2) { [ b ] = int(1) [ a ] = int(1)// PHP7:object(stdClass)#1 (2) { [ a ] = int(1) [ b ] = int(1)}

__clone 方法可以直接調(diào)用

現(xiàn)在可以直接使用 $obj- __clone() 的寫法去調(diào)用 __clone 方法。 __clone 是之前唯一一個(gè)被禁止直接調(diào)用的魔術(shù)方法,之前你會(huì)得到一個(gè)這樣的錯(cuò)誤:

Fatal error:Cannot call __clone() method on objects -use clone $obj instead in...

變量語(yǔ)法一致性

AST 也解決了一些語(yǔ)法一致性的問(wèn)題,這些問(wèn)題是在另外一個(gè) RFC 中被提出的:https://wiki.php.net/rfc/uniform_variable_syntax.

在新的實(shí)現(xiàn)上,以前的一些語(yǔ)法表達(dá)的含義和現(xiàn)在有些不同,具體的可以參照下面的表格:

ef06c90d0c156dc94ae7e6ae37c3714.png

整體上還是以前的順序是從右到左,現(xiàn)在從左到右,同時(shí)也遵循括號(hào)不影響行為的原則。這些復(fù)雜的變量寫法是在實(shí)際開(kāi)發(fā)中需要注意的。

相關(guān)推薦:《PHP教程》

以上就是PHP7 的抽象語(yǔ)法樹(shù)(AST)帶來(lái)的變化的詳細(xì)內(nèi)容,PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产精品欧美一区二区三区| 激情亚洲一区二区三区四区| 99综合电影在线视频| 亚洲av人人澡人人爽人人夜夜| 欧美性巨大欧美| 一区二区黄色片| 日韩不卡一区二区三区| 精品88久久久久88久久久| 精品九九久久| av成人激情| 在线播放日韩精品| 久久精品亚洲7777影院| 中文字幕免费精品一区| 日韩在线观看免费高清| 天堂va蜜桃一区二区三区漫画版| 国产三区在线视频| 国产在线拍揄自揄拍无码| 日韩国产高清一区| 亚洲成av人片| 国产精品电影| 久久精品美女| 男人操女人免费网站| 色www精品视频在线观看| 久久综合一区二区三区| 亚洲国产视频a| 青青草成人网| 国产欧美亚洲精品| 亚洲天堂美女视频| 亚洲午夜激情网站| 欧美丝袜美女中出在线| 欧美军同video69gay| 在线成人欧美| 精品在线观看免费| 国产综合精品一区| 久久免费黄色| jizz中国女人| 91蜜桃臀久久一区二区| 久久深夜福利| 一区二区三区四区五区精品视频| 亚洲三级网址| 亚洲欧美在线视频| 一本大道av一区二区在线播放| 国产一区二区三区直播精品电影| 亚洲欧美日韩国产综合| 亚洲第一精品在线| 一色屋免费视频| 新67194成人永久网站| 成年人黄色大片在线| 囯产精品一品二区三区| 日本一级淫片免费放| 无码内射中文字幕岛国片| 中文字幕在线观看播放| 亚洲自拍偷拍一区二区三区| 精品久久久久久无码国产| 国产美女视频一区二区| 久久久国产精华液999999| 国产精品久久久久久久久久久久| 国产欧美久久久久| 丁香婷婷久久久综合精品国产| 手机av在线免费观看| 黄色av网站在线看| 哥也色在线视频| av在线收看| 成人动漫视频在线观看| 欧美人与牲禽动交com| www久久精品| 国产精品最新乱视频二区| 男人网站在线观看| 成人激情在线观看| 香港三级日本三级| 11024精品一区二区三区日韩| 色偷偷亚洲男人天堂| 日韩专区一区二区| 成人好色电影| 星空影院最新电视剧免费观看| 国产精品视频久久久久| 2020最新国产精品| 稀缺小u女呦精品呦| 99精品在线免费| 都市激情久久久久久久久久久| 精品粉嫩超白一线天av| 999精品视频在线观看| 中文字幕+乱码+中文字幕明步| 国产国语videosex另类| 秋霞av亚洲一区二区三| 91中文精品字幕在线视频| 最新国产热播激情视频| 日本国产在线| 国产在线视频福利| 欧美77777免费视频| 亚洲欧洲激情在线乱码蜜桃| 国产日韩视频在线| 国产欧美日韩中文久久| 激情五月婷婷六月| 两个人看的无遮挡免费视频| 麻豆传媒一区| 日本欧美加勒比视频| 午夜精品视频一区二区三区在线看| 一本—道久久a久久精品蜜桃| 五级黄高潮片90分钟视频| 亚洲欧美电影在线观看| 黑森林精品导航| 欧美一区视久久| 97精品视频在线播放| 国产又爽又黄免费软件| 偷窥自拍亚洲色图| www.亚洲一二| 国产欧美精品日韩精品| 国产精品入口夜色视频大尺度| 中文字幕2020第一页| 国产精品国产三级国产普通话三级| 亚洲精华液一区二区三区| 欧美视频二区欧美影视| 欧美一区三区三区高中清蜜桃| 一色屋色费精品视频在线看| 国产写真视频在线观看| 国产v综合v| 国产91色在线|| hs网站在线观看| 在线免费观看av网址| 人妻精品久久久久中文| 尤物精品在线| 午夜视频一区二区三区| 久久精品国产露脸对白| 成人淫片免费视频95视频| 加勒比久久综合| 在线日韩国产精品| 国产精品污视频| 国产日产欧美精品| 7799精品视频天天看| 成人网在线视频| 亚洲丝袜精品| 国产成人在线视频免费播放| 国产亚洲精品一区二区在线观看| 国产一级视频在线| 久久精品首页| 欧美视频小说| 麻豆久久久久久| 欧美人体大胆444www| 久热国产精品视频| 亚洲精品成人无码| 欧美一区二区三区在线电影| 在线欧美亚洲| 在线国产伦理一区| 亚洲永久精品大片| 伊人www22综合色| 91蜜桃网站免费观看| 精品福利一区| 国产成人在线网址| 亚洲欧美日韩另类| 丝袜国产日韩另类美女| 亚洲欧美日韩成人| 三级a性做爰视频| 4444kk在线观看| 男女猛烈无遮挡| 一卡二卡三卡在线观看| 91精品视频在线播放| 日韩午夜在线影院| av在线播放亚洲| 日韩成人综合网| 日韩av影视| 精品视频在线观看免费| 少女频道在线观看高清| 97视频在线观看播放| 韩国三级午夜理伦三级三| 精品av久久久久电影| 国产成人在线视频免费播放| 欧美日韩精品高清| 最新av在线播放| 国产美女久久久久| 国产精品视频公开费视频| 天堂网在线观看视频| 夜夜狠狠擅视频| 2021av在线| 视频在线观看入口黄最新永久免费国产| 一区二区伦理片| 日韩在线亚洲| 欧美制服丝袜第一页| 日本一区二区免费在线观看视频| 另类一区二区三区| 嫩呦国产一区二区三区av| 中文字幕日韩欧美| 老司机凹凸av亚洲导航| 欧美美女在线直播| 无码人妻少妇伦在线电影| 国内久久婷婷综合| aa一级黄色片| 国产美女被遭强高潮免费网站| 免费看污网站| 美女视频黄的免费| 中文字幕亚洲一区二区av在线| 影音先锋成人资源网站| 日韩一区二区免费视频| 亚洲日韩成人| 色婷婷久久一区二区三区麻豆| 亚洲精品动漫久久久久| 国产午夜精品无码| 狠狠色丁香婷综合久久| 欧美亚洲另类久久综合| 在线一区日本视频| 欧美精品第1页| 国产麻豆精品久久| 免费在线成人网| 亚洲精品国产精品乱码不99| 亚洲亚洲免费| 国产亚洲欧美日韩一区二区| 国产精品久久久久aaaa九色| 欧美丰满少妇人妻精品| 国产高清精品一区二区三区| 小黄鸭精品aⅴ导航网站入口| 深夜精品寂寞黄网站在线观看| 精品无吗乱吗av国产爱色| 欧美日韩1080p| 欧美美女15p| 怡红院av一区二区三区| 怡红院成永久免费人全部视频| 四虎永久免费在线| 欧美成人免费在线视频| 欧美三级不卡| 久久久久国产精品麻豆| 国产精品亚洲一区二区在线观看| 欧美亚洲另类在线| 中文字幕免费高清在线观看| 久热这里只有精品6| 国产精品熟女一区二区不卡| 黑人与亚洲人色ⅹvideos| 国产精品va无码一区二区三区| 在线看的av网站| 久久大香伊蕉在人线观看热2| 丝袜中文在线| 国产911在线观看| 欧美日韩精品一二三区| 97涩在线观看视频| 亚洲国产欧美精品| 亚洲a视频在线| 国产不卡一二三区| 中文字字幕在线中文乱码电影| 欧美精品久久久久久久久25p| 这里只有精品视频| www.成人在线| 国产夫妻在线观看| 日韩欧美在线番号| 中国一级免费毛片| 亚洲成人黄色在线观看| 第一福利在线视频| 欧美日韩中国免费专区在线看| 91久久精品无嫩草影院| 亚洲成a人片在线www| 福利小视频网站| 精品99久久| 91成人在线免费观看| 欧美国产精品劲爆| 精品久久精品| 国产精品中文字幕在线| 国产麻豆欧美日韩一区| 国产精品一区二区av影院萌芽| 国产一区二区在线观看免费视频| 久久久久久久影院| 黑人巨大精品欧美一区免费视频| 成人久久18免费网站麻豆| 69堂免费精品视频在线播放| 99免费看香蕉视频| 亚洲欧美另类综合偷拍| 69堂免费视频| 中文字幕一区二区三区在线观看| 伊人成综合网伊人222| 999国产精品亚洲77777| 久久精品男人天堂| 奇米影视一区二区三区小说| 欧美在线看片| 欧美色图亚洲视频| 麻豆国产尤物av尤物在线观看| 成人黄色免费短视频| www.男人的天堂.com| 亚洲综合天堂网| 国产主播一区二区| 免费看一级大片| 日韩在线一级片| 国产欧美视频一区二区三区| 九九热在线视频观看这里只有精品| 九九九热视频| 999久久久久久| 欧美在线性视频| 精品亚洲男同gayvideo网站| 成人性生交xxxxx网站| 污污免费在线观看| 中文无码日韩欧| 性网站在线播放| 免费看国产片在线观看| 日韩中文在线不卡| 欧美极度另类videos高清| 国产高清在线不卡| 精品国产髙清在线看国产毛片| 91精品国产99久久久久久红楼| 日韩国产高清在线| 欧美精选一区| 一区二区在线观看av| 中文字幕人妻熟女人妻洋洋| 图片小说视频色综合| 国产视频在线观看一区| 大吊一区二区三区| 十八禁一区二区三区| hd国产人妖ts另类视频| 欧美一区二区网站| 希岛爱理一区二区三区av高清| 免费看日本黄色片| 午夜视频免费看| 美女视频一区二区| 在线 丝袜 欧美 日韩 制服| 奇米色777欧美一区二区| 欧日韩不卡在线视频| 亚洲视频在线视频| 国产在线你懂得| 97影院理论片在线播放| 国产夜色精品一区二区av| 国产一区美女| 77777少妇光屁股久久一区| 成人性a激情免费视频| 欧美一区二区福利视频| 精品日产乱码久久久久久仙踪林| 奇米视频888战线精品播放| 成**人特级毛片www免费| 国产欧美精品一区二区三区-老狼| 免费无遮挡无码永久视频| 日韩美女视频在线观看| 色aⅴ色av色av偷拍| xfplay资源站色先锋在线观看| www.久久色|