日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > PHP > 正文

PHP7 的抽象語法樹(AST)帶來的變化

2020-03-24 18:56:55
字體:
來源:轉載
供稿:網友

什么是抽象語法樹?

抽象語法樹(abstract syntax tree,AST)是源代碼的抽象語法結構的樹狀表示,樹上的每個節點都表示源代碼中的一種結構,這所以說是抽象的,是因為抽象語法樹并不會表示出真實語法出現的每一個細節,比如說,嵌套括號被隱含在樹的結構中,并沒有以節點的形式呈現。抽象語法樹并不依賴于源語言的語法,也就是說語法分析階段所采用的上下文無文法【文法是用于描述語言的語法結構的形式規則。任何一種語言都有它自己的文法,不管它是機器語言還是自然語言。】,因為在寫文法時,經常會對文法進行等價的轉換(消除左遞歸,回溯,二義性等),這樣會給文法分析引入一些多余的成分,對后續階段造成不利影響,甚至會使合個階段變得混亂。因些,很多編譯器經常要獨立地構造語法分析樹,為前端,后端建立一個清晰的接口

PHP-Parser的項目主頁是https://github.com/nikic/PHP-Parser。可以對多版本的PHP進行完美解析,生成一顆抽象語法樹。

新的執行過程

PHP7 的內核中有一個重要的變化是加入了 AST。在 PHP5中,從 php 腳本到 opcodes 的執行的過程是:

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

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

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

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

2.Parsing:語法分析,從 token 流生成抽象語法樹;

3.Compilation:從抽象語法樹生成 op arrays。

執行時間和內存消耗

從以上的步驟來看,這比之前的過程還多了一步,所以按常理來說這反而會增加程序的執行時間和內存的使用。但事實上內存的使用確實增加了,但是執行時間上卻有所降低。

以下結果是使用小(代碼大約 100 行)、中(大約 700 行)、大(大約 2800 行)三個腳本分別進行測試得到的,測試腳本: https://gist.github.com/nikic/289b0c7538b46c2220bc.

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

2ffde0f17be08a25232c915f5ff8131.png

單次編譯中的內存峰值:

6d9437f9a25a3fe4e3451c6f934bed7.png

單次編譯的測試結果可能并不能代表實際使用的情況,以下是使用 PhpParser 進行完整項目測試得到的結果:

a51a66e380c96d91248e28570d531e0.png

測試表明,使用 AST 之后程序的執行時間整體上大概有 10% 到 15% 的提升,但是內存消耗也有增加,在大文件單次編譯中增加明顯,但是在整個項目執行過程中并不是很嚴重的問題。

還有注意的是以上的結果都是在沒有 Opcache 的情況下,生產環境中打開 Opcache 的情況下,內存的消耗增加也不是很大的問題。

語義上的改變

如果僅僅是時間上的優化,似乎也不是使用 AST 的充足理由。其實實現 AST 并不是基于時間優化上的考慮,而是為了解決語法上的問題。下面來看一下語義上的一些變化。

yield 不需要括號

在 PHP5 的實現中,如果在一個表達式上下文(例如在一個賦值表達式的右側)中使用 yield,你必須在 yield 申明兩邊使用括號:

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

這種行為僅僅是因為 PHP5 的實現方式的限制,在 PHP7 中,括號不再是必須的了。所以下面這些寫法也都是合法的:

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

當然了,還得遵循 yield 的應用場景才行。

括號不影響行為

在 PHP5 中,

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

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

同樣,如果函數的參數被括號包裹,類型檢查存在問題,在 PHP7 中這個問題也得到了解決:

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

以上代碼在 PHP5 中不會告警,除非使用 byRef(func()) 的方式調用,但是在 PHP7 中,不管 func() 兩邊有沒有括號都會產生以下錯誤:

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

list() 的變化

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

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

產生上面變化的原因正是因為在 PHP5 的賦值過程中,3 會最先被填入數組,1 最后,但是現在順序改變了。

同樣的變化還有:

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

這是因為在以前的賦值過程中 $b 先得到 2,然后 $a 的值才變成1,但是現在 $a 先變成了 1,不再是數組,所以 $b 就成了null。

list 現在只會訪問每個偏移量一次

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

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

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

引用賦值的順序

引用賦值的順序在 PHP5 中是從右到左的,現在時從左到右:

 ?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 方法可以直接調用

現在可以直接使用 $obj- __clone() 的寫法去調用 __clone 方法。 __clone 是之前唯一一個被禁止直接調用的魔術方法,之前你會得到一個這樣的錯誤:

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

變量語法一致性

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

在新的實現上,以前的一些語法表達的含義和現在有些不同,具體的可以參照下面的表格:

ef06c90d0c156dc94ae7e6ae37c3714.png

整體上還是以前的順序是從右到左,現在從左到右,同時也遵循括號不影響行為的原則。這些復雜的變量寫法是在實際開發中需要注意的。

相關推薦:《PHP教程》

以上就是PHP7 的抽象語法樹(AST)帶來的變化的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩欧美亚洲国产| 欧美 日韩 国产 高清| 国产乱码在线观看| 天天综合日日夜夜精品| 欧美日韩国产中字| 视频一区不卡| 欧美国产日韩综合| a天堂在线资源| 一二三区精品视频| 99在线国产| 一区二区三区鲁丝不卡| 免费在线亚洲| 日韩国产欧美在线视频| 91精品国产高清久久久久久| 欧美日韩精品免费看| 日韩中文在线视频| 欧美在线视频第一页| 久久综合久久综合九色 | 51精品免费网站| 久久人人精品| √新版天堂资源在线资源| 日韩欧美中文字幕一区| 国产字幕在线看| 国产一区精品| 精品激情国产视频| 日韩一级中文字幕| 日韩国产成人| 精品视频www| 日韩精品a在线观看91| 欧美日韩亚洲视频| 在线免费视频一区二区| 欧美日韩国产中字| 亚洲综合在线视频| 欧美日韩国产123区| 国产成人精品三级| 欧美日韩第一区日日骚| 国产精品视频福利一区二区| 亚洲二区自拍| 日本精品在线中文字幕| 日韩一级视频在线观看| 国产一区久久| 国产区在线看| 91精品蜜臀在线一区尤物| 欧美中文字幕在线视频| 中文字幕第一页在线播放| 日韩欧美三级视频| 国产99在线 | 亚洲| 在线欧美一级视频| 国产日韩亚洲欧美| www.久久久精品| 国产欧美日韩精品在线| 99精品999| 国产福利久久久| 欧美日韩精品在线| 欧洲精品二区| 婷婷综合福利| 在线欧美一级视频| 精品成人久久av| 中文字幕久久av| 国产午夜精品久久| 亚洲乱码中文字幕| 不卡在线视频| 在线观看一区日韩| 欧美日韩国产不卡在线看| 日韩欧美在线视频| 亚洲一区在线观看网站| 免费视频最近日韩| 国产欧美一级| 91精品国产色综合久久不卡蜜臀| 91精品国产色综合久久久蜜香臀 | 亚亚洲欧洲精品| 久久99久久99精品中文字幕| 精品久久蜜桃| 久久婷婷中文字幕| 国产在线播放一区二区| 99久久精品国产成人一区二区| 欧美日韩精品区| 一区二区三区精品在线| 亚洲欧洲国产视频| 亚洲图片小说综合| 亚洲第一页中文字幕| 精品在线一区二区三区| 91精品国产自产在线| 亚洲一区精品电影| 中文亚洲免费| 欧美三级一区二区三区| 中文亚洲免费| 亚洲电影中文字幕在线观看| 亚洲一区在线观看网站| 精品欧美不卡一区二区在线观看| 黄色片免费在线| 91久久精品国产91久久| 欧美日韩国产高清| 欧美日韩高清在线| 欧美日韩在线视频一区| 欧美日韩在线不卡| 欧美乱大交xxxxx另类| 久久夜色精品国产欧美乱极品| 91精品国产高清久久久久久| 不卡一区二区三区视频| 一区二区日韩视频| www.中文字幕在线| 亚洲国产无线乱码在线观看| 国产福利在线导航| 国产最新在线| 亚洲 欧美 日韩系列| 欧美日韩综合在线| 中文字幕 欧美 日韩| 日韩一级中文字幕| 91精品国产免费| 国产福利久久| 在线中文字幕视频| 国产欧美日韩精品在线| 国产日产一区二区三区| 中文字幕欧美亚洲| 欧美在线日韩精品| 顶级网黄在线播放| 免费在线播放av| 日本a级黄色| 91久久视频| 国产香蕉精品视频| 欧美日韩在线播放一区| 日韩视频国产视频| av一卡二卡| 欧洲精品二区| 亚洲第一中文字幕在线观看| 91精品国产综合久久久久| 国产一区久久| 国产一级片播放| 亚洲黄色一区二区| 欧美日韩乱国产| √天堂资源中文www| 91精品国产欧美日韩| 日韩精品中文字幕第1页| 成人精品视频一区| 国产一区久久| 欧美日韩国产综合视频在线观看 | 日韩av二区| 国产999精品在线观看| 日韩欧美国产不卡| 国产三级在线| 91亚洲欧美| 精品久久蜜桃| 欧美日韩一级黄| 极品久久久久久| 欧美日韩国产不卡在线看| 精品久久在线观看| 日韩三级视频在线看| 日韩视频在线免费看| 在线一区免费| 中文在线日韩| 国产日韩精品在线观看| 日韩精品视频在线观看免费| 99视频在线看| 欧美日韩高清一区二区不卡| 日本一欧美一欧美一亚洲视频| 麻豆精品视频入口| 婷婷久久综合网| 欧美一级一级性生活免费录像 | 国产字幕中文| 国产日韩精品在线看| 日本不卡视频一区| 天天综合日日夜夜精品| 日韩欧美中文字幕精品| 久久综合久久综合九色| 在线资源av| 国产日韩免费| 久久精品不卡| 91精品国产综合久久香蕉的特点 | 欧美,日韩,国产在线| 精品国产欧美| 蜜桃久久av| 免费在线视频一级不卡| 蜜桃久久av| 欧美日韩综合在线| 亚洲最大黄色| 中文字幕在线观看网址| 国产激情三区| 日韩wumaV| 国产蜜臀在线| 亚洲视频在线观看三级| www.中文字幕在线观看| 红桃视频国产一区| 欧美不卡一区二区| 欧美国产中文| 欧美日韩国产区| 欧美日韩中文字幕精品| 欧美日韩国产黄色| 欧美一级久久久久久久久大| 成人一区二区不卡免费| 国产成人综合精品| 中文在线第一页| 中文精品电影| 亚洲a级在线播放观看| 欧美片网站免费| 欧美日韩成人综合| 久久riav| 日韩精品在线免费观看视频| 免费看日韩精品| 亚洲国产午夜精品| 中文字幕伊人| 中文字幕亚洲一区在线观看| 日韩免费高清一区二区| 日韩精品视频在线观看视频| 国产日产一区二区三区 | 亚洲理论中文字幕| 亚洲高清中文字幕| 九七久久人人| 午夜少妇久久久久久久久| 欧美日韩在线中文字幕| 欧美久久久精品| 国产一区久久久| 国产天堂素人系列在线视频| 不卡视频一区二区三区| 久久精品日韩欧美| 日韩精品在线中文字幕| 欧美日韩精品欧美日韩精品| 亚洲成在线观看| 国产丝袜在线播放| 91精品久久久久久久久久| 亚洲一区在线观看网站| 欧美午夜精品在线| 国产蜜臀在线| av亚洲免费| 最新中文字幕在线| 日韩免费视频一区二区视频在线观看| 久久久99精品久久| 久久精品久久精品国产大片| 91精品国产自产在线观看永久∴| 日韩欧美成人一区二区三区| 欧美日韩精品欧美日韩精品一| 日韩精品在线播放| 日韩在线视频观看| 中文字幕欧美日韩在线不卡| 亚洲国产欧美91| 欧美一级手机免费观看片| 在线观看免费国产成人软件| 国产福利在线播放| 久久久精品午夜少妇| 国产高潮久久久| 午夜黄色小视频| 亚洲综合视频一区| 国产一二三精品| 久久香蕉一区| 欧美日韩亚洲天堂| 日韩精品在线网站| 本道综合精品| 久久精品最新免费国产成人| 91精品在线免费| 日韩视频一区在线观看| 最近中文字幕在线中文高清版| 午夜国产视频| 国内精品不卡| 日韩欧美一级精品久久| 国产欧美日韩精品在线| 日韩欧美在线1卡| 色综合婷婷久久| 国产视频一二区| 欧美不卡视频一区| 欧美三级日韩三级国产三级| www..com日韩| 日韩欧美国产综合| 亚洲高清视频一区| 国产绿帽一区二区三区| 91精品国产综合久久香蕉最新版| 国产一级久久久| 精品三级av| 国产不卡一区| 欧美日韩中文字幕综合视频| 欧美日韩高清在线| www.三级.com| 91精品国产91久久久久久不卡 | 在线视频你懂得一区| 日韩精品在线免费播放| 亚洲综合在线视频| 国产欧美日韩中文| 97最新国自产拍视频在线完整在线看| 欧美日韩在线三级| 色www精品视频在线观看| 欧美日韩在线综合| 亚洲 欧美 精品| 亚洲国产欧美日韩精品| 91精品国产色综合久久久蜜香臀| 成人a在线观看| 欧美91精品| 日韩.com| 在线精品日韩| 中文网丁香综合网| 亚洲欧洲在线观看av| 91九色精品视频| 日韩亚洲欧美中文高清在线| 日韩在线视频在线观看| 国产伦精品免费视频| 国产一级片网站| 欧美日韩一二三| 亚洲一级在线| 欧美精选午夜久久久乱码6080| 日本啊v在线| 国产区高清在线| 日韩免费视频| 久久99精品久久久| 黄色国产在线| 日韩精品在线看| 国产福利三区| 久久久水蜜桃| 日韩免费看网站| 一区精品在线播放| 精品在线91| 日韩.com| 999精品视频在线观看播放| 国产一区精品在线| 1区2区3区在线视频| 美女尤物久久精品| 久久精品女人| 极品久久久久久| 国产偷国产偷亚洲清高网站| 欧美人妻一区二区三区| 国产三级在线| 视频在线一区二区| 中文字幕日韩欧美在线| 日韩在线a电影| 日韩精品视频免费播放| 日韩中文字幕国产| 亚洲视频日韩| 中文字幕乱码在线| 中文字幕 亚洲视频| 国产午夜精品视频| 国产黄色片中文字幕| 日韩精品在线网站| 国产丝袜一区| 欧美日韩亚洲一| 日韩免费视频一区| 中文字幕亚洲视频| 日韩欧美中文在线| 亚洲精品中文字幕乱码三区不卡| 欧美日韩午夜在线| 日韩精品视频在线看| 欧美一级久久| 欧美日韩国产区| 在线免费播放av| 亚洲3区在线| 色综合婷婷久久| 国产色综合网| 欧美日韩国产页| 日韩一级免费在线观看| 日韩欧美中文字幕在线视频| 国产欧美 在线欧美| 午夜视频在线观看一区| 午夜国产福利一区二区| 亚洲欧美日本国产专区一区| 日韩精品福利一区二区三区| 日韩精品在线免费观看视频| 日韩美女视频一区二区在线观看| av丝袜在线| 亚洲高清在线免费| 免费在线视频一级不卡| 欧美日韩国产系列| 91精选在线| 在线三级av| 亚洲高清在线观看一区| 一二三区精品视频| 日韩国产一区三区| 国产日韩在线亚洲字幕中文| 午夜国产在线视频| 国产不卡在线观看视频| 欧美日韩一区二区在线视频| 亚洲综合在线不卡| 国产一二三区精品视频| 欧美日韩中文字幕精品| 国产激情在线视频| 午夜伦欧美伦电影理论片| 欧美激情一区二区三区在线| 久久电影国产免费久久电影| 午夜精品一区二区三区视频免费看| 狠狠色噜噜狠狠狠狠97| 日韩精品视频免费| 日韩中文字幕在线视频观看| 麻豆精品视频入口| 国产福利一区二区在线精品| 精品区一区二区| 国产亚洲短视频| 欧美日韩中文字幕在线观看| 国产一区精品在线| 亚洲视频资源在线| 国产91一区| 热久久精品国产| 久久综合九色欧美综合狠狠| 精品无人国产偷自产在线| 天堂在线中文| 日韩中文字幕第一页| 欧美日韩一级视频| 欧美日韩三级一区| 欧美日韩在线第一页| 高清日韩中文字幕| 在线免费播放av| a天堂中文在线官网在线| 国产成人精品综合久久久| 欧美日韩精品免费看| 欧美一级免费观看| 久99久视频|