我试图了解 v8 是如何工作的,但我无法找到代码中的位置,它实际上获取输入原始 js 脚本来解析它并将其编译为 C++。
\n我看过 api.cc 并尝试在编译器函数中设置断点,但没有运气(我使用 chromium 来这样做),它永远不会命中这个函数。
\nMaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,\n Source* source,\n CompileOptions options,\n NoCacheReason no_cache_reason)\n\nRun Code Online (Sandbox Code Playgroud)\n***** 更新 ****
\n在 @jmrk 回复之后,我一直在试图弄清楚 JS 实际上是从哪里开始进来的,我真正感兴趣的是了解网站如何呈现,然后将脚本传递到 V8 中进行编译。\n我发现有关该主题的大量信息,但我仍然无法理解整个情况:
\n结果第一步不是解析器而是扫描器,它获取 UTF-16 流作为输入。
\n\n\n源代码首先被分成块;每个块可能与不同的编码相关联。然后,流将所有块统一为 UTF-16 编码。
\n在解析之前,扫描器会将 UTF-16 流分解为令牌。标记是具有语义的脚本的最小单元。标记有多种类别,包括空格\n(用于自动分号插入)、标识符、关键字和代理对(仅当该对不被识别为其他内容时才组合起来形成标识符)。然后,这些标记首先被馈送到预解析器,然后再馈送到解析器。
\n
https://blog.logrocket.com/how-javascript-works-optimizing-for-parsing-efficiency/
\n我还发现它确实从 Blink 获取了这个流:
\n\n\n\n\nUTF16CharacterStream 提供了 V8 从 Chrome 接收的底层 Latin1、UTF-8 或 UTF-16 编码的(可能是缓冲的)UTF-16 视图,而 Chrome 又从网络接收这些编码。除了支持多种编码之外,扫描仪和字符流之间的分离允许 V8 透明地扫描,就好像整个源都可用一样,即使到目前为止我们可能只通过网络收到了一部分数据。
\n
扫描仪似乎也将标记提供给解析器:
\n\nV8\xe2\x80\x99s …