(转)(译)V8 Javascript 引擎设计理念

NodeJS 简介:V8发动机 |V8 引擎 Javascript Chrome V8或 V8 是由 Google 开发的开源 Javascript 和 WebAssembly 引擎,用 C++ 编写。V8 引擎最初是为基于 Chromium 的浏览器和 Chrome 浏览器构建的,以提高 javascript 执行的性能,但最新版本可以在浏览器内部或外部执行 javascript 代码,从而实现服务器端脚本。如今,V8 引擎是Node.jsMongoDB等各种技术以及Electron等桌面应用程序的基础。 阅读详情

V8 Javascript 引擎设计理念

本文翻译自 Google 的开源 Javascript 引擎 V8 的在线文档 。其实我都没有真正翻译过什么东西,本来我的英文就比较一般,中文语言组织也很弱。而且许多文档(比如这篇)基本上如果是对此感兴趣的人,直接阅读英文原文文档肯定都是没有问题的。不过既然突然心血来潮,就试一试吧,能力总是要锻炼才会有的。我自己对 Language VM 比较感兴趣,V8 其实并不是一个 VM ,因为它是直接编译为本地机器码执行的,但是也有不少相通的地方。废话少说,下面是译文。

Netscape Navigator 在 90 在年代中期对 JavaScript 进行了集成,这让网页开发人员对 HTML 页面中诸如 form 、frame 和 image 之类的元素的访问变得非常容易。由此 JavaScript 很快成为了用于定制控件和添加动画的工具,到 90 年代后期的时候,大部分的 JavaScript 脚本仅仅完成像“根据用户的鼠标动作把一幅图换成另一幅图”这样简单的功能。

随着最近 AJAX 技术的兴起,JavaScript 现在已经变成了实现基于 web 的应用程序(例如我们自己的 Gmail)的核心技术。JavaScript 程序从聊聊几行变成数百 KB 的代码。JavaScript 被设计于完成一些特定的任务,虽然 JavaScript 在做这些事情的时候通常都很高效,但是性能已经逐渐成为进一步用 JavaScript 开发复杂的基于 web 的应用程序的瓶颈。

V8 是一个全新的 JavaScript 引擎,它在设计之初就以高效地执行大型的 JavaScript 应用程序为目的。在一些性能测试 中,V8 比 Internet Explorer 的 JScript 、Firefox 中的 SpiderMonkey 以及 Safari 中的 JavaScriptCore 要快上数倍。如果你的 web 程序的瓶颈在于 JavaScript 的运行效率,用 V8 代替你现在的 JavaScript 引擎很可能可以提升你的程序的运行效率。具体会有多大的性能提升依赖于程序执行了多少 JavaScript 代码以及这些代码本身的性质。比如,如果你的程序中的函数会被反复执行很多遍的话,性能提升通常会比较大,反过来,如果代码中有很多不同的函数并且都只会被调用一次左右,那么性能提升就不会那么明显了。其中的原因在你读过这份文档余下的部分之后就会明白了。

V8 的性能提升主要来自三个关键部分:

快速属性访问

JavaScript 是一门动态语言,属性可以在运行时添加到或从对象中删除。这意味着对象的属性经常会发生变化。大部分 JavaScript 引擎都使用一个类似于字典的数据结构来存储对象的属性,这样每次访问对象的属性都需要进行一次动态的字典查找来获取属性在内存中的位置。这种实现方式让 JavaScript 中属性的访问比诸如 Java 和 Smalltalk 这样的语言中的成员变量的访问慢了许多。成员变量在内存中的位置离对象的地址的距离是固定的,这个偏移量由编译器在编译的时候根据对象的类的定义决定下来。因此对成员变量的访问只是一个简单的内存读取或写入的操作,通常只需要一条指令即可。

为了减少 JavaScript 中访问属性所花的时间,V8 采用了和动态查找完全不同的技术来实现属性的访问:动态地为对象创建隐藏类。这并不是什么新的想法,基于原型的编程语言 Self 就用 map 来实现了类似的功能(参见  An Efficient Implementation of Self, a Dynamically-Typed Object-Oriented Language Based on Prototypes   )。在 V8 里,当一个新的属性被添加到对象中时,对象所对应的隐藏类会随之改变。

下面我们用一个简单的 JavaScript 函数来加以说明:

function
 Point(
x,
 y)
 {

this .x = x;
this .y = y;
}

当  new Point(x, y)   执行的时候,一个新的  Point   对象会被创建出来。如果这是  Point   对象第一次被创建,V8 会为它初始化一个隐藏类,不妨称作  C0 。因为这个对象还没有定义任何属性,所以这个初始类是一个空类。到这个时候为止,对象  Point   的隐藏类是  C0 。

map_trans_a

执行函数  Point   中的第一条语句(this.x = x; )会为对象  Point   创建一个新的属性  x 。此时,V8 会:

  • 在  C0   的基础上创建另一个隐藏类  C1 ,并将属性  x   的信息添加到  C1   中:这个属性的值会被存储在距  Point   对象的偏移量为 0 的地方。
  • 在  C0   中添加适当的类转移信息,使得当有另外的以其为隐藏类的对象在添加了属性  x   之后能够找到  C1   作为新的隐藏类。此时对象  Point   的隐藏类被更新为  C1 。

map_trans_b

执行函数  Point   中的第二条语句(this.y = y; )会添加一个新的属性  y   到对象  Point   中。同理,此时 V8 会:

  • 在  C1   的基础上创建另一个隐藏类  C2 ,并在  C2   中添加关于属性  y   的信息:这个属性将被存储在内存中离  Point   对象的偏移量为 1 的地方。
  • 在  C1   中添加适当的类转移信息,使得当有另外的以其为隐藏类的对象在添加了属性  y   之后能够找到  C2   作为新的隐藏类。此时对象  Point   的隐藏类被更新为  C2 。

map_trans_c

咋一看似乎每次添加一个属性都创建一个新的隐藏类非常低效。实际上,利用类转移信息,隐藏类可以被重用。下次创建一个  Point   对象的时候,就可以直接共享由最初那个  Point   对象所创建出来的隐藏类。例如,如果又一个  Point   对象被创建出来了:

  • 一开始  Point   对象没有任何属性,它的隐藏类将会被设置为  C0 。
  • 当属性  x   被添加到对象中的时候,V8 通过  C0   到  C1   的类转移信息将对象的隐藏类更新为  C1   ,并直接将  x   的属性值写入到由  C1   所指定的位置(偏移量 0)。
  • 当属性  y   被添加到对象中的时候,V8 又通过  C1   到  C2   的类转移信息将对象的隐藏类更新为  C2 ,并直接将  y   的属性值写入到由  C2   所指定的位置(偏移量 1)。

尽管 JavaScript 比通常的面向对象的编程语言都要更加动态一些,然而大部分的 JavaScript 程序都会表现出像上述描述的那样的运行时高度结构重用的行为特征来。使用隐藏类主要有两个好处:属性访问不再需要动态字典查找了;为 V8 使用经典的基于类的优化和内联缓存技术创造了条件。关于内联缓存的更多信息可以参考  Efficient Implementation of the Smalltalk-80 System   这篇论文。

动态机器码生成

V8 在第一次执行 JavaScript 代码的时候会将其直接编译为本地机器码,而不是使用中间字节码的形式,因此也没有解释器的存在。属性访问由内联缓存代码来完成,这些代码通常会在运行时由 V8 修改为合适的机器指令。

在第一次执行到访问某个对象的属性的代码时,V8 会找出对象当前的隐藏类。同时,V8 会假设在相同代码段里的其他所有对象的属性访问都由这个隐藏类进行描述,并修改相应的内联代码让他们直接使用这个隐藏类。当 V8 预测正确的时候,属性值的存取仅需一条指令即可完成。如果预测失败了,V8 会再次修改内联代码并移除刚才加入的内联优化。

例如,访问一个  Point   对象的  x   属性的代码如下:

point.x

在 V8 中,对应生成的机器码如下:

; ebx = the point object

cmp [ ebx , <hidden class offset >] , <cached hidden class>
jne <inline cache miss>
mov eax , [ ebx , <cached x offset >]

如果对象的隐藏类和缓存的隐藏类不一样,执行会跳转到 V8 运行系统中处理内联缓存预测失败的地方,在那里原来的内联代码会被修改以移除相应的内联缓存优化。如果预测成功了,属性  x   的值会被直接读出来。

当有许多对象共享同一个隐藏类的时候,这样的实现方式下属性的访问速度可以接近大多数动态语言。使用内联缓存代码和隐藏类实现属性访问的方式和动态代码生成和优化的方式结合起来,让大部分 JavaScript 代码的运行效率得以大幅提升。

高效的垃圾收集

V8 会自动回收不再被对象使用的内存,这个过程通常被称为“垃圾收集(Garbage Collection)”。为了保证快速的对象分配和缩短由垃圾收集造成的停顿,并杜绝内存碎片,V8 使用了一个 stop-the-world, generational, accurate 的垃圾收集器,换句话说,V8 的垃圾收集器:

  • 在执行垃圾回收的时候会中断程序的执行。
  • 大部分情况下,每个垃圾收集周期只处理整个对象堆的一部分,这让程序中断造成的影响得以减轻。
  • 总是知道内存中所有的对象和指针所在的位置,这避免了非 accurate 的垃圾收集器中普遍存在的由于错误地把对象当作指针而造成的内存溢出的情况。

在 V8 中,对象堆被分成两部分:用于为新创建的对象分配空间的部分和用于存放在垃圾收集周期中生存下来的那些老的对象的部分。如果一个对象在垃圾收集的过程中被移动了,V8 会更新所有指向这个对象的指针到新的地址。

WHAT - V8 引擎和 JavaScript 编译原理 在浏览器上,V8 引擎主要用于执行 JavaScript 代码。作为浏览器中的 JavaScript 引擎,V8 负责解释和执行 JavaScript 代码,并将其转换为计算机可以理解和执行的指令。以下是 V8 在浏览器中的主要应用:执行网页中的 JavaScript 代码、提供高性能的 JavaScript 执行环境(JIT和优化技术)、支持最新的 JavaScript 特性和标准、提供浏览器开发者工具。 阅读详情

相关推荐

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 436

V8引擎嵌入指南

转自:http://www.grati.org/?p=344 译自:http://code.google.com/apis/v8/embed.html,转载请注明译文链接。如果已读过V8编程入门那你已经熟悉了如句柄(handle)、作用域(scope)和上下文(context)之类的关键概念,以及如何将V8引擎作为一个独立的虚拟机来使用。本文将进一步讨论这些概念,并介绍其他有关V8引擎嵌入C++...

weixin_34014555的博客 324

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。Google登录界面也会出现如下提示这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这个提示,但本质的问题没有解决,无法登录Google账号。

胡同老道的博客 2万+

浅谈js的设计模式与设计理念

js设计模式(基于coder的肤浅的设计模式探究): 单例模式,单体模式,工厂模式,策略模式,模版模式,观察-订阅者模式,外观模式 理解js的设计模式,你会发现一些比较深层次的东西,会体会到js发明者的用心良苦和循序渐进,一门语言在刚出来的时候难免会有一些比较明显的反人类的设计,但是在不断的实践中,这些设计反而越来越受人们推崇,这就是计算机语言的魅力所在,我们在项目中的每走一步都会无形中用...

牛老大啊的博客 2202

从Live2D到Unreal Engine:2D与3D虚拟数字人核心技术实现路径解析

本文深入解析了从Live2D到Unreal Engine的2D与3D虚拟数字人核心技术实现路径,涵盖技术选型、制作流程与优化技巧。通过对比2D骨骼动画与3D建模渲染的差异,结合实战案例,帮助开发者根据项目需求选择合适方案,提升虚拟数字人的交互体验与视觉效果。

weixin_30379531的博客 149

30天入门Python(办公篇)——第34天:pandas - 数据处理与分析利器

摘要 本文介绍了Python数据分析库pandas的核心功能,包括数据结构和基本操作。主要内容涵盖:1) Series和DataFrame两种核心数据结构的创建与使用;2) 多种文件格式的读写方法;3) 数据查看、筛选和清洗技巧;4) 基础统计分析功能;5) 数据透视表和交叉表制作;6) 数据排序与合并等变换操作。文章通过大量代码示例演示了pandas在数据处理各环节的应用,适合作为pandas入门的实践指南,帮助读者快速掌握这一强大工具的基本使用方法。

weixin_42636075的博客 305

准备:新V8即将到来,Node.js的性能正在改变

V8的Turbofan的性能特点将如何对我们优化的方式产生影响   审阅:来自V8团队的Franziska Hinkelmann和Benedikt Meurer.   **更新:Node.js 8.3.0已经发布了V8 6.0和Turbofan.   Node.js依靠V8 JavaScript引擎来运行代码,其语言本身也是我们熟悉和喜爱的。V8 JavaScript引擎是Go...

ddjq1044的博客 290

VSCode + QMT 量化交易完整解决方案!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1331

V8 引擎使用心得

<br /><br />在公司一直负责一个界面引擎的模块的设计开发工作,主要使用XML和JavaScript两种技术。<br />最初我们使用的是MS的JS引擎(由IActiveScript及一些相关接口组成,下称MS-JS),后来由于一些问题,将MS-JS替换成Google才推出不久的JS引擎V8(下称V8-JS)。<br />MS-JS不知道多久没更新了,不过也还好用,文档写得也清楚。<br />V8-JS是Google的Chrome浏览器中的一个亮点,刚推出不久,还在不断更新中,性能据说比MS的高过不

king_road的专栏 1999

7.91版本unidbg调用方式

【代码】xhs最新7.91版本unidbg调用方式。

Codeooo 博客 1107

遇到问题--OpenClaw--API rate limit reached. Please try again later429 您的账户已达到速率限制,请您控制请求频率

OpenClaw调用glm-4.7-flash模型时触发智谱AI平台429速率限制错误。分析发现当前重试策略采用固定间隔(7-11秒)导致连续失败,且未记录关键响应头信息。解决方案分三步:1)开启响应头日志获取配额详情;2)将重试策略改为带抖动的指数退避(初始1秒,最大60秒);3)在网关层实现令牌桶限流主动控制请求频率。需特别注意令牌配额(TPM)可能比请求次数(RPM)更早触达限制。

直到世界的尽头 2629

Chrome V8引擎介绍

随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScript脚本。V8引擎就是为解决这一问题而生,在node中也是采用该引擎来解析JavaScript。V8是如何使得JavaScript性能有大幅提升的呢?通过对一些书籍和文章的学习,梳理了V8的相关内容,本文将带你认识 V8。   1.渲染引擎及网页渲染

heyeqingquan的博客 3万+

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 619

【Node.js】深入理解 V8 JavaScript 引擎

V8 是由 Google 开发的开源 JavaScript 引擎,用 C++ 编写,最初用于 Chrome 浏览器,现在广泛用于其他项目,包括 Node.js 和 Deno。核心特点高性能:通过即时编译 (JIT) 和优化技术提升 JavaScript 执行效率。跨平台支持:运行在 Linux、Windows 和 macOS 等多个平台。多语言支持:支持 JavaScript 和 WebAssembly。

佚名程序员 2808

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Javascript引擎——v8引擎

本文详细解析了现代JavaScript引擎(以V8为例)的工作机制。引擎采用两阶段设计:首先将源码解析为AST并生成字节码,实现快速启动;然后通过解释器执行字节码并收集运行时信息,JIT编译器对热点代码进行分层优化。关键点包括:1)字节码平衡启动速度与执行效率;2)解释器收集类型信息为优化提供依据;3)JIT基于类型反馈进行激进优化;4)投机优化与去优化机制确保正确性。这种架构使JavaScript兼具开发灵活性和接近原生的执行性能。

不会后端的前端不是一个好全栈 1682

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

(转)(译)V8 JavaScript 引擎 – 嵌入者指南

(译)V8 JavaScript 引擎 – 嵌入者指南<br />译自:http://code.google.com/apis/v8/embed.html<br />如果你已经读过入门指导 ,你会已经熟悉把v8作为一个独立的虚拟机来使用,并且有了一些关于v8的概念,比如 handles, scopes, 和 contexts。这个文档将进一步的讨论这些概念,并介绍其他一些在嵌入v8到你的C++程序时需要了解的概念。<br />V8 的API提供了编译并执行脚本、访问 C++ 方法和数据结构、错误处理和安全

ffr225的专栏 1595

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【V8引擎】 V8引擎如何运行JS的

V8 是一个由 Google 开发的开源 JavaScript引擎,目前用在 Chrome 浏览器和 Node.js中,其核心功能是执行和解析我们编写的JavaScript代码。

xh1506101064的博客 1623

什么是V8 JavaScript引擎?

V8 是由 Google 开发的高性能开源 JavaScript 和 WebAssembly 引擎。它最早于 2008 年发布,旨在提升 Chrome 浏览器的性能。V8 连接 JavaScript 代码与底层硬件,它将 JavaScript 代码编译成机器码,从而大幅提升执行速度。此外,V8 还支持 WebAssembly,这使得应用开发者能够在 Web 上高效运行复杂的应用程序。

有我更精彩的博客 2843

什么是 V8 JavaScript 引擎

基本概念与作用说明V8 的工作原理主要特性完整且丰富的代码示例示例一:在 Node.js 中使用 V8 引擎示例二:性能测试示例三:内存管理示例四:调试信息示例五:异步执行不同角度的功能使用思路性能优化内存管理并发执行调试和性能分析实际工作开发中的使用技巧V8 JavaScript 引擎是Google开发的一款高性能JavaScript引擎,最初设计用于Chrome浏览器,但现在已经广泛应用于其他领域,如Node.js服务器环境。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1584

V8 javascript 引擎

V8是一个由丹麦Google开发的开源java script引擎,用于Google Chrome中。[2]Lars Bak是这个项目的组长。[3] V8在执行之前将java script编译成了机器码的,而非字节码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,java script程序与V8引擎的速度媲美二进制编译。[4] V8组译器是基于Strongtalk组译器。[5] V8是Goo

男神的专栏 1737

【JS】V8 引擎原理

文章目录认识JS引擎V8引擎原理在这里插入图片描述 **流程图分析:**V8引擎架构 认识JS引擎 为什么需要 JS 引擎? 1. `高级编程语言`都有转化成`最终的机械指令`来执行的 2. 我们平时编写的js,无论你交给`浏览器或Node`执行,最后都是需要被CPU执行的 3. 但CPU只认识自己的指令集,实际上是机械语言,才能被CPU所执行 4. 所以我们需要JS引擎将JS代码翻译成CPU指令来执行 常见的 JS 引擎有: 5. SpiderMonkey:第一款JS引擎,由Brendar Ei

qq_45677671的博客 3019

推荐项目:V8 JavaScript 引擎 PHP 扩展 - V8JS

V8JS 是一个开源的 PHP 扩展,它允许在 PHP 环境中使用 Google 的 V8 JavaScript 引擎执行 JavaScript 代码。通过 V8JS,您可以将 JavaScript 用于后端服务、脚本任务或与 PHP 应用程序集成。 ## V8JS 可以用来做什么? 1. 在服务器端运行 JavaScript 代码 2. 在 PHP 中调用 JavaScript 函数库 3....

gitblog_00020的博客 1552

【V8引擎】JavaScript变量提升

JavaScript使用var关键字声明变量为什么会存在变量提升?JavaScript函数为什么可以提前调用?JavaScript代码,在浏览器中又是如何被执行的?我们可以通过了解V8引擎的运行机制了解JS代码在浏览器中的编译过程,来解释为什么存在声明提升的情况。

m0_68324632的博客 1750

ios上js引擎的使用,javascriptcore和v8

如上篇文章所述ios折线图绘制,公司开发需要要用到一些字符串转公式的需求。自己实在有点惧自己写语法书啥的听公司大牛说可以使用js引擎试试,于是就抱着试试的态度调研了一把,感觉还不错。         这次试用了两个js引擎,一个是javascriptcore,这个比较方便可以直接引入便使用,另一个是google的v8引擎,这个有点麻烦要先编译通过才行,搞了好一阵才派上用场~倒是学到了好多新知识,

6403

JavaScript 与 V8 引擎的关系(一文讲透)

ECMAScript 标准:规定语法与语义(比如let/const、原型链、Promise 等)。引擎实现V8(Chrome、Node.js、Deno、Electron 等)(Firefox)(Safari)Chakra(老版 Edge)不同引擎都在努力“正确且更快”地执行同一门语言。

AngelCryToo的专栏 1643

V8 JS引擎

一.  Google开发V8Google (丹麦)研发小组在 2006 年开始研发 V8 ,部分的原因是 Google 对既有 JavaScript 引擎的执行速度不满意, 在2008年推出chrome, 巨大的速度优势, 迅速占领市场. 2017年chrome的市场占有达到59%. 二.  常见JS引擎JScript(IE6,IE7, IE8)Chakra(IE9,IE10, IE11, IE ...

小松鼠举栗子 1万+
上一篇: (转)(译)V8 JavaScript 引擎 – 嵌入者指南
ffr225
博客等级 码龄19年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值