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 深度學習編譯器正式開源阿里深度學習編譯
- 【編譯openjdk學習筆記】編譯JDK筆記
- 學習Ant編譯指令碼編譯指令碼
- 笨辦法學C 練習1:啟用編譯器編譯
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- 編譯器的編譯基本過程編譯
- gcc 編譯器與 clang 編譯器GC編譯
- 編譯器背後的故事(入門練習)編譯
- 淺談彙編器、編譯器和直譯器編譯
- [譯]iOS編譯器iOS編譯
- ZYNQ學習筆記(一): uboot 編譯筆記boot編譯
- 編譯實踐學習 Part5編譯
- 編譯實踐學習 Part1編譯
- 編譯實踐學習 Part2編譯
- 程式設計師都應學習程式碼編譯器知識程式設計師編譯
- 編譯器的自展和自舉、交叉編譯編譯
- FreeBSD中的GNU C編譯器--編譯器GCC(轉)編譯GC
- 0909 關於編譯原理學習的想法編譯原理
- Kaldi學習手記(一):Kaldi的編譯安裝編譯
- WebRTC研究 (一) 編譯原始碼Web編譯原始碼
- Mangos 研究-編譯工作(二) 薦Go編譯
- GCC編譯器的使用GC編譯
- 一張圖解析 編譯器編譯流程圖解編譯
- 編譯、連結學習筆記(一)簡述編譯連結過程編譯筆記
- FFmpeg學習之一(FFmpeg原始碼編譯)原始碼編譯
- 高效學習Linux核心——核心模組編譯Linux編譯
- CUDAFORTRAN編譯器編譯
- vue編譯器Vue編譯
- 英特爾重磅開源nGraph:相容所有框架的深度學習系統編譯器框架深度學習編譯
- 程式碼線上編譯器(上)- 編輯及編譯編譯
- JAVA反編譯技術研究心得Java編譯
- Go編譯器簡介【譯】Go編譯
- CMM編譯器和C編譯器過程呼叫實現的比較編譯
- Swift iOS : 編譯器的智慧SwiftiOS編譯
- Phalanger—PHP的.NET編譯器PHP編譯