JavascriptAST編譯器的研究學習
Javascript AST 編譯器的研究學習
Source:
`use strict`;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _IceInteractContainer = require(`./InteractContainer`);
var _IceInteractContainer2 = _interopRequireDefault(_IceInteractContainer);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
if (location.host === "xxxx.taobao.com") {
lib.x = 10
}
exports.default = _IceInteractContainer2.default;
module.exports = exports[`default`];
AST:
初步觀察
可以得到一些明確的資訊:
- 整個檔案代表著一個Program
- JavaScript的程式碼過程被解釋成一個陣列,並在body屬性裡
還有很多未知的資訊,我就暫時先忽略了。
Body
可以看到,裡面有ExpressionStatement、VariableDeclaration、FunctionDeclaration、IfStatement這些例項。
我們對應到原始碼中就不難理解了:
`use strict`; // AST:ExpressionStatement
Object.defineProperty(exports, "__esModule", { // AST:ExpressionStatement
value: true
});
var _IceInteractContainer = require(`./InteractContainer`); // AST:VariableDeclaration
var _IceInteractContainer2 = _interopRequireDefault(_IceInteractContainer); // AST:VariableDeclaration
// AST:FunctionDeclaration
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
if (location.host === "xxxx.taobao.com") { // AST:IfStatement
lib.x = 10
}
exports.default = _IceInteractContainer2.default; // AST:ExpressionStatement
module.exports = exports[`default`]; // AST:ExpressionStatement
看來是將JS進行了歸納,表示式語句、變數描述、函式描述、IF語句等等。
因此不難想象,應該還有While語句等等吧。
ExpressionStatement
Literal
`use strict`; // AST:ExpressionStatement
展開ExpressionStatement,可以看到有個 expression
屬性,這條表示式主要的資訊也就在這了。
值得注意的是 expression
指向的是一個 Literal
例項.
- type:文字
- value:值”use strict”
rawValue 和 raw 又有啥區別?(未知)
看起來很簡單,一個字串文字執行語句。
那再繼續看看一個函式呼叫的語句將會變成什麼樣。
CallExpression
Object.defineProperty(exports, "__esModule", { // AST:ExpressionStatement
value: true
});
可以看到 CallExpression
例項有個 callee
和 arguments
,代表著誰在呼叫和引數是誰。
callee : MemberExpression
這時候我們看到一個新的例項 MemberExpression
這是一個成員表示式,其實我們經歷過這些探究之後,不難想象有什麼能夠編譯成 MemberExpression
,比如:
alert(hello.word
)裡面的hello.word就會編譯成MemberExpression
MemberExpression
從上圖可以看到,MemberExpression
例項有兩個關鍵的屬性,Object
和property
,粗暴的理解就是,`.`(點)前面的就是Object
,後面的就是property
。
但是,hello[0] 的情況呢?
這個就有點意思了,hello[0] 也會被編譯成 MemberExpression
的例項。
這個可以自己嘗試和對比下看看。
然後可以看到Object.defineProperty
被拆分成了兩個Identifier
例項,分別放在了Object
和property
屬性裡面.
Identifier
這個識別符號類,關鍵的就是 name
屬性了。
總結下其實可以得出什麼東西會別編譯成Identifier
, 例如:
var a = new Function;
a; // AST:Identifier
arguments
值得一說的是,我這裡說的是引數是誰
,也就意味著,他可以是任何其他的例項,可能是一個 Literal
,可能還是一個CallExpression
,又或者是MemberExpression
, 但它應該不會是 VariableDeclaration
,IfStatement
,嗯,從語法層面來看,是不可能的。
嗯。現在看來這個 ObjectExpression
是沒有出現和分析過的,不過按照筆者的思路,也可以嘗試去看看這個例項了。~
相關文章
- 阿里 BladeDISC 深度學習編譯器正式開源阿里深度學習編譯
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- 【編譯openjdk學習筆記】編譯JDK筆記
- 笨辦法學C 練習1:啟用編譯器編譯
- 編譯器背後的故事(入門練習)編譯
- 編譯器的自展和自舉、交叉編譯編譯
- 淺談彙編器、編譯器和直譯器編譯
- 編譯實踐學習 Part1編譯
- 編譯實踐學習 Part2編譯
- 編譯實踐學習 Part5編譯
- 英特爾重磅開源nGraph:相容所有框架的深度學習系統編譯器框架深度學習編譯
- WebRTC研究 (一) 編譯原始碼Web編譯原始碼
- vue編譯器Vue編譯
- CUDAFORTRAN編譯器編譯
- [譯] 給人類的機器學習指南??機器學習
- FFmpeg學習之一(FFmpeg原始碼編譯)原始碼編譯
- 高效學習Linux核心——核心模組編譯Linux編譯
- Go編譯器簡介【譯】Go編譯
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- 機器學習不是研究因果邏輯的 - yudapearl機器學習
- [譯] 通過整合學習提高機器學習結果機器學習
- 如何學習 PHP 原始碼 – 從編譯開始PHP原始碼編譯
- 前端學習(2366):條件編譯跨端相容前端編譯跨端
- JS學習系列 01 - 編譯原理和作用域JS編譯原理
- 編譯原理第二章學習總結編譯原理
- CSS預編譯器CSS編譯
- [譯] iOS 11:機器學習人人有份iOS機器學習
- [譯] 機器學習專案清單機器學習
- GCC編譯器背後的故事GC編譯
- 編譯器的符號表管理編譯符號
- C++學習第一天--編譯命令C++編譯
- Google Protocol buffer 學習筆記.下篇-動態編譯GoProtocol筆記編譯
- 源語言、目標語言、翻譯器、編譯器、直譯器編譯
- [譯] 理解編譯器 —— 從人類的角度(版本 2)編譯
- Netty 框架學習 —— 編解碼器框架Netty框架
- 深度學習研究的新變化:教計算機如何編碼深度學習計算機
- 關於深度學習編譯器,這些知識你需要了解一下深度學習編譯
- 說說 方舟編譯器編譯