为了提高性能,JavaScript引擎有时仅在实际调用函数时完全解析函数 .
例如,从Spidermonkey源代码:
检查函数的语法比完全解析/发出快几倍,而且当页面包含大量从不执行的代码(经常发生)时,延迟解析会显着提高性能和内存使用率 .
解析器在能够验证语法的同时跳过哪些步骤?
似乎在Spidermonkey中,一些节省来自不发送字节码,就像完全解析后一样 . 完整解析例如V8还包括生成机器代码?
为了提高性能,JavaScript引擎有时仅在实际调用函数时完全解析函数 .
例如,从Spidermonkey源代码:
检查函数的语法比完全解析/发出快几倍,而且当页面包含大量从不执行的代码(经常发生)时,延迟解析会显着提高性能和内存使用率 .
解析器在能够验证语法的同时跳过哪些步骤?
似乎在Spidermonkey中,一些节省来自不发送字节码,就像完全解析后一样 . 完整解析例如V8还包括生成机器代码?
1 回答
首先澄清一下:这两个步骤称为“预解析”和“完全解析” . “懒惰解析”描述了首先执行前者的策略,然后在需要时执行后者 .
预解析更快的两个主要原因是:
它不构建AST(抽象语法树),它通常是解析器的输出
它没有为变量做范围解析 .
解析器在准备代码生成时还有一些其他内部步骤,仅在检查错误时不需要,但上述两个是主要要点 .
(完整)解析和代码生成是单独的步骤 .