沒辦法了,開坑吧,接下來的幾篇會講述JavaScript字符串源碼在v8中轉換成AST(抽象語法樹)的過程。html
JS代碼在V8的解析只有簡單的幾步,其中第一步就是將源字符串轉換爲抽象語法樹,很是相似於vue中將html轉換爲VNODE的過程。該過程涉及的類並很少,均位於/src/parsing文件夾中,包括parsing、parser、scanner、token等等,先簡單介紹一下各種的做用。vue
這些全部的類經過互相合做,最後產出一個類型爲FunctionLiteral的結果,將其傳入asm模塊,生成底層代碼。spa
類型的繼承關係樹以下。code
其實發現這個過程仍是挺痛苦的,由於從Compile一路看下來,發現直接就進了asm變成了彙編語言,能夠說一切來的那麼忽然,我根本找不到突破點。固然,若是去掉一些無關的配置和CHECK,能夠找到編譯核心屬性,好比說最後的AsmJs部分是這樣調用的。htm
MaybeHandle<SharedFunctionInfo> GenerateUnoptimizedCodeForToplevel( Isolate* isolate, ParseInfo* parse_info, AccountingAllocator* allocator, IsCompiledScope* is_compiled_scope) { // ... std::vector<FunctionLiteral*> functions_to_compile; functions_to_compile.push_back(parse_info->literal()); while (!functions_to_compile.empty()) { FunctionLiteral* literal = functions_to_compile.back(); functions_to_compile.pop_back(); Handle<SharedFunctionInfo> shared_info = Compiler::GetSharedFunctionInfo(literal, script, isolate); if (shared_info->is_compiled()) continue; if (UseAsmWasm(literal, parse_info->is_asm_wasm_broken())) { std::unique_ptr<UnoptimizedCompilationJob> asm_job( AsmJs::NewCompilationJob(parse_info, literal, allocator)); if (asm_job->ExecuteJob() == CompilationJob::SUCCEEDED && FinalizeUnoptimizedCompilationJob(asm_job.get(), shared_info, isolate) == CompilationJob::SUCCEEDED) { continue; } } // ... } // ... return top_level; }
鬼同樣的代碼,只看最後返回的話,能夠看出全部的調用都涉及那個literal。blog
而這個literal是parse_info的一個屬性,初始化時是NULL,在compile的某一步必定進行處理了,因而回頭去翻了一遍整個編譯過程。繼承
最後終於在CompileTopLevel找到了關鍵的一行代碼。token
if (parse_info->literal() == nullptr && !parsing::ParseProgram(parse_info, isolate)) { return MaybeHandle<SharedFunctionInfo>(); }
而這裏,就是解析源代碼成抽象語法樹的地方,後面會從這裏入手,邊看邊寫吧。ip