v8学习笔记(五) 编译过程
v8編譯過程(parser.cc文件)
1.創建編譯環境MakeAST()
???????? 解析器AstBuildingParser parser->掃描器Scanner scanner_
?????????????????????????????????????????????????????????????????????????? ? 掃描器結構: (1)TokenDesc ?current_
?????????????????????????????????????????????????????????????????????????????????????????????????????? ?(2)TokenDesc ?next_
?????????????????????????????????????????????????????????????????????????????????????????????????????? ?(3)緩沖 source_
?
2.語法分析(包含詞法分析),創建抽象語法樹(AST)FunctionLiteral-----(語句,聲明,)
MakeAST()->ParseProgram()->ParseSourceElements():
???????? 進入while循環,每次解析一個JS語句
???????? While(peek()!=end_token)
???????? {
?????????????????? Statement* stat = ParseStatement(NULL, CHECK_OK);//解析一個語句
??? ???? if (stat == NULL || stat->IsEmpty()) continue;//函數聲明語句不放入FunctionLiteral
?? ????? ……
??? ???? processor->Add(stat);//放入最外層FunctionLiteral的ZoneList
???????? }
ParseStatement():解析一個語句
?(1)根據下一個Token判斷語句類型,并進入相應的語句解析函數
switch (peek()) //取下一個Token
{
???????? case Token::LBRACE:
????? ?? return ParseBlock(labels, ok);????????????????????????? //{}Block語句
??? case Token::CONST:?
??? case Token::VAR:
????? ?? stmt = ParseVariableStatement(ok);????????????????????? //變量聲明語句
????? ?? break;
??? case Token::SEMICOLON:
????? ?? Next();
???? ??? ?return factory()->EmptyStatement();??????????????????? //空語句
??? case Token::IF:
????? ?? stmt = ParseIfStatement(labels, ok);??????????????????? //If語句
????? ?? break;
??? case Token::DO:
????? ?? stmt = ParseDoWhileStatement(labels, ok);?????????????? //Do循環語句
????? ?? break;
??? case Token::WHILE:
????? ?? stmt = ParseWhileStatement(labels, ok);???????????????? //While循環語句
????? ?? break;
??? case Token::FOR:
????? ?? stmt = ParseForStatement(labels, ok);?????????????????? //For循環語句
????? ?? break;
??? case Token::CONTINUE:
????? ?? stmt = ParseContinueStatement(ok);????????????????????? //Continue語句
????? ?? break;
??? case Token::BREAK:
????? ?? stmt = ParseBreakStatement(labels, ok);???????????????? //Break語句
????? ?? break;
??? case Token::RETURN:
????? ?? stmt = ParseReturnStatement(ok);??????????????????????? //返回語句
????? ?? break;
??? case Token::WITH:
????? ?? stmt = ParseWithStatement(labels, ok);????????????????? //With語句??
????? ?? break;
??? case Token::SWITCH:
????? ?? stmt = ParseSwitchStatement(labels, ok);??????????????? //Switch語句
????? ?? break;
??? case Token::THROW:
????? ?? stmt = ParseThrowStatement(ok);???????????????????????? //Throw語句
????? ?? break;
case Token::TRY:
????? {……}????????????????????????????????????????????????? //Try語句
??? case Token::FUNCTION:
????? ?? return ParseFunctionDeclaration(ok);??????????????????? //函數聲明語句
??? case Token::NATIVE:
????? ?? return ParseNativeDeclaration(ok);
??? case Token::DEBUGGER:
????? ?? stmt = ParseDebuggerStatement(ok);????????????????????? //Debugger語句
????? ?? break;
default: stmt = ParseExpressionOrLabelledStatement(labels, ok);//其他語句(表達式/標號)
}
(2)解析語句
???????? 首先,調用掃描器Scanner(對JS源碼進行詞法分析):每次掃描Scan()得到當前Token和下一個Token,把Token描述信息分別放入TokenDesc current_和 TokenDesc next_中,把Token的值放入緩沖source_中.
???????? 其次,根據JS的語法語義進行相應(編譯時)處理
???????? 最后,
-1-一般(非聲明)語句:創建Statement對象,放入FunctionLiteral對象中ZoneList<Statement*>.
-2-變量聲明語句:創建Declaration對象放入當前抽象語法樹FunctionLiteral的Scope的decls_,
???????? ?????????????????? ?? 再由CallRuntime語句創建ExpressionStatement對象,放入body_ (JS語句???????????????????????????????????????????? ?????????????????? ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? 數組)
-3-函數聲明語句:根據函數體創建新的抽象語法樹FunctionLiteral,放入新創建的
???????? ??????????????????????????? Declaration對象,再放入當前抽象語法樹FunctionLiteral的Scope的???????????????????????????????????????????? decls_.
?
解析完所有語句后,得到抽象語法樹FunctionLiteral。
????????
?
?
?
附:
抽象語法樹4種結點:Statement(語句),Expression(表達式),Declaration(聲明)和TargetCollector
---------------------------------------------------------------------------------------------------------------------------------
抽象語法樹FunctionLiteral結構
1.ZoneList<Statement*> body_????? JS語句數組
2.Scope* scope_?????
???????? (1)ZoneList<Declaration*> decls_ 變量、函數聲明數組(Declaration對象數組)
???????? (2)……….
3.……
---------------------------------------------------------------------------------------------------------------------------------
抽象語法樹FunctionLiteral結點的繼承層次
ZoneObject?????
|?????? AstNode
|?????? |?????? Statement
|?????? |?????? |?????? BreakableStatement
|?????? |?????? |?????? |?????? Block
|?????? |?????? |?????? |?????? IterationStatement
|?????? |?????? |?????? |?????? |?????? DoWhileStatement
|?????? |?????? |?????? |?????? |?????? WhileStatement
|?????? |?????? |?????? |?????? |?????? ForStatement
|?????? |?????? |?????? |?????? |?????? ForInstatement
|?????? |?????? |?????? |?????? SwitchStatement
|?????? |?????? |?????? ExpressionStatement
|?????? |?????? |?????? ContinueStatement
|?????? |?????? |?????? BreakStatement
|?????? |?????? |?????? ReturnStatement
|?????? |?????? |?????? WithEnterStatement
|?????? |?????? |?????? WithExitStatement
|?????? |?????? |?????? IfStatement
|?????? |?????? |?????? TryStatement
|?????? |?????? |?????? |?????? TryCatchStatement
|?????? |?????? |?????? |?????? TryFinallyStatement
|?????? |?????? |?????? DebuggerStatement
|?????? |?????? |?????? EmptyStatement
|?????? |?????? Expression (會被轉化為ExpressionStatement)
|?????? |?????? |?????? ValidLeftHandSideSentinel
|?????? |?????? |?????? Literal
|?????? |?????? |?????? MaterializedLiteral
|?????? |?????? |?????? |?????? ObjectLiteral
|?????? |?????? |?????? |?????? RegExpLiteral
|?????? |?????? |?????? |?????? ArrayLiteral
|?????? |?????? |?????? CatchExtensionObject
|?????? |?????? |?????? VariableProxy
|?????? |?????? |?????? |?????? VariableProxySentinel
|?????? |?????? |?????? Slot
|?????? |?????? |?????? Property
|?????? |?????? |?????? Call
|?????? |?????? |?????? CallNew
|?????? |?????? |?????? CallRuntime
|?????? |?????? |?????? UnaryOperation
|?????? |?????? |?????? BinaryOperation
|?????? |?????? |?????? CountOperation
|?????? |?????? |?????? CompareOperation
|?????? |?????? |?????? Conditional
|?????? |?????? |?????? Assignment
|?????? |?????? |?????? Throw
|?????? |?????? |?????? FunctionLiteral
|?????? |?????? |?????? ShareFunctionInfoLiteral
|?????? |?????? |?????? ThisFunction
|?????? |?????? Declaration
|?????? |?????? TargetCollector
|?????? CaseClause
總結
以上是生活随笔為你收集整理的v8学习笔记(五) 编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v8学习笔记(四) 对象机制
- 下一篇: v8学习笔记(六) 汇编过程