js代码怎么用

程序员编写的JaScript代码如何成为计算机可以理解的机器语言?本文将带您进入JaScript引擎寻找答案。

js代码怎么用作者|莉迪亚·哈利

译者|新月,编辑|屠敏

以下是翻译:

JaScript很酷(这个不用我说),但是机器究竟是怎么理解我们写的代码的呢?作为JaScript开发人员,我们通常不需要处理编译器的事情。但是,了解JaScript引擎的基础知识,了解它如何把人类能理解的JS代码变成机器能理解的东西,绝对是大有裨益的!

注:本文主要基于Node.js和基于Chrome的浏览器使用的V8引擎。

当HTML解析器遇到代码中的脚本标签时,它会从网络、缓存或安装的服务工作器中加载源代码。这一步的结果就是脚本内容,以字节流的形式返回,需要解码器进行处理!下载时,字节流解码器将对字节流进行解码。

字节流解码器从流中的字节数据创建令牌。比如0066解码成f,0075解码成u,006e解码成n,0063解码成c,0074解码成t,0069解码成I,006f解码成o,006e解码成n,然后是空网格。好像你写了一个函数!这是JaScript的保留关键字,所以会创建一个符号并发送给解析器(还有前置解析器,我的GIF图中没有提到,后面会解释)。字节流的其余部分将被类似地处理。

该引擎有两个解析器:一个是预解析器,另一个是解析器。预解析器只负责尽早检查符号,找出语法错误。这可以减少在代码中查找错误所需的时间。否则,这些错误会被解析器发现!

如果没有错误,解析器将根据从字节流解码器接收到的符号创建节点,然后使用这些节点创建抽象语法树,简称AST。

接下来是翻译!解释器将遍历整个AST,并根据AST的内容生成字节码。字节码生成完成后,AST将被删除以释放更多内存。所以你得到了机器可以运行的代码!

虽然字节码很快,但还可以更快。字节码在运行时生成信息。它可以检测哪些行为会更频繁地发生,哪些类型的数据会更频繁地使用。如果一个函数被多次调用,可以通过优化来加速!

字节码和生成的类型反馈一起被发送到优化编译器。优化编译器将处理字节码和类型反馈,然后生成高度优化的机器码。

JaScript是一种动态类型语言,这意味着数据类型经常变化。如果JaScript引擎每次都要检查值的类型,那会非常慢。

然而,JaScript引擎使用一种叫做内联缓存的方法。它会将代码缓存在内存中,并期望在将来以相同的行为返回相同的值!例如,一个函数被调用100次,到目前为止每次都返回相同的值。则引擎将假设该函数在第101次调用时仍将返回相同的值。

假设有一个函数sum,到目前为止,每个调用都使用两个值作为参数:

上面的调用将返回3!下一次调用它时,引擎将假定我们仍将使用两个值进行调用。

如果这个假设是正确的,那么就不需要动态搜索,直接使用内存中保存的值即可。否则,如果假设错误,就会进行反优化,将代码从优化后的机器码恢复到原来的字节码。

例如,假设下一个调用传递一个字符串而不是一个数值。由于JaScript是动态类型,所以不会出错!

这意味着数字2将被转换成一个字符串,然后函数将返回字符串“12”。所以引擎会执行字节码,然后更新类型反馈。

希望这篇文章对你有帮助!当然,引擎还有很多其他方面我没有讨论(比如JS堆,调用栈等。),而且可能我以后还会讨论!如果你对JaScript的内部原理感兴趣,我强烈建议你自己做一些研究。V8是开源的,关于其工作原理的文档也很不错!

原文:https://dev . to/lydiahallie/JaScript-visualized-the-JaScript-engine-4c df。

本文由CSDN翻译,请注明出处。

【结束】

【成就一亿技师】各位代码大佬,CSDN推出升级版原力计划。只要是原创,只要你开始,现在,每个人都有上头版的幸运可能。我们真心希望,这一代程序员,网络名人,就是你。详情请戳海报~ ~

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论