java 中使用v8引擎_JavaScript是如何工作的:深入V8引擎&编写优化代码的5个技巧

为了保证的可读性,本文采用意译而非直译。

本系列的 第一篇文章 主要介绍引擎、运行时和调用堆栈。第二篇文章将深入谷歌 V8 的JavaScript引擎的内部。

想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你!

概述

JavaScript引擎是执行 JavaScript 代码的程序或解释器。JavaScript引擎可以实现为标准解释器,或者以某种形式将JavaScript编译为字节码的即时编译器。

以为实现JavaScript引擎的流行项目的列表:

为什么要创建V8引擎?

由谷歌构建的V8引擎是开源的,使用c++编写。这个引擎是在谷歌Chrome中使用的,但是,与其他引擎不同的是 V8 也用于流行的 node.js。

java 中使用v8引擎_JavaScript是如何工作的:深入V8引擎&编写优化代码的5个技巧_第1张图片

V8最初被设计用来提高web浏览器中JavaScript执行的性能。为了获得速度,V8 将 JavaScript 代码转换成更高效的机器码,而不是使用解释器。它通过实现 JIT (Just-In-Time) 编译器将 JavaScript 代码编译为执行时的机器码,就像许多现代 JavaScript 引擎(如SpiderMonkey或Rhino (Mozilla)) 所做的那样。这里的主要区别是 V8 不生成字节码或任何中间代码。

V8 曾有两个编译器

在 V8 的 5.9 版本出来之前,V8 引擎使用了两个编译器:

full-codegen — 一个简单和非常快的编译器,产生简单和相对较慢的机器码。

Crankshaft — 一种更复杂(Just-In-Time)的优化编译器,生成高度优化的代码。

V8 引擎也在内部使用多个线程:

主线程执行你所期望的操作:获取代码、编译代码并执行它

还有一个单独的线程用于编译,因此主线程可以在前者优化代码的同时继续执行

一个 Profiler 线程,它会告诉运行时我们花了很多时间,让 Crankshaft 可以优化它们

一些线程处理垃圾收集器

当第一次执行 JavaScript 代码时,V8 利用 full-codegen 编译器,直接将解析的 JavaScript 翻译成机器代码而不进行任何转换。这使得它可以非常快速地开始执行机器代码。请注意,V8 不使用中间字节码,从而不需要解释器。

当代码已经运行一段时间后,分析线程已经收集了足够的数据来判断应该优化哪个方法。

接下来,Crankshaft 

你可能感兴趣的:(java,中使用v8引擎)