(译)V8引擎介绍
V8是什么?
V8是谷歌在德国研发中心开发的一个JavaScript引擎。开源并且用C++实现。可以用于运行于客户端和服务端的Javascript程序。
V8设计的初衷是为了提高浏览器上JavaScript脚本的执行效率。为了提高速度,V8把JavaScript代码转换成更有效率的机器代码执行,而不像以往是通过解释器执行。像现在大多数的JavaScript引擎一样,比如SpiderMonkey 或者 Rhino (Mozilla),V8实现了一个JIT (Just-In-Time) 编译器,可以在执行JavaScript代码的时候把代码编译成机器代码,但是V8的主要不同点在于它不回产生字节码或者任何的中间代码。
通过本文可以了解到V8为了编译出更优化的代码是如何工作的。如果你之前有问你自己”我是否应该担心JavaScript的效率?”那么我可以借用Daniel Clifford (V8团队的头)的话回答你:“V8不仅仅让你的程序运行的更快,也能做到一些以前没法做到的事情”。

隐藏类
JavaScript是一种基于protoptye的语言:运行的时候没有类和对象产生。同时JavaScript也是一种动态语言:类型和类型的信息是不明确的。因此如何有效的访问类型和属性是V8面临的一个重大挑战。对于以往大多数的JavaScript引擎而言,处理办法是通过一个类似于字典的数据结构来存储对象属性并通过动态的查询来确定属性的位置,但是V8不一样,V8在运行时创建了隐式类。
如下示例包含一个”Point”方法并且创建了两个”Point”对象:

如果布局是一样的,如上图这种情况,那么p 和 q 属于 v8 引擎创建的相同的隐藏类。这突出显示使用隐藏的类的另一个优点 ︰ 可以让V8把属性一样的对象聚集在一起。比如上图中的”p”和”q”对象会使用相同的优化代码。
现在假如要给”q”对象添加一个”z”属性,V8会怎么处理这种情况呢?实际上,每当忘函数里面新定义一个属性,V8都会创建一个新的隐藏类,并且会跟踪隐藏类的结构变化。

每当一个新的隐藏类被创建,前一个隐藏累就会被取代。
(译)V8引擎介绍的更多相关文章
- Chrome V8引擎系列随笔 (1):Math.Random()函数概览
先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分 ...
- [翻译] V8引擎的解析
原文:Parsing in V8 explained 本文档介绍了 V8 引擎是如何解析 JavaScript 源代码的,以及我们将改进它的计划. 动机 我们有个解析器和一个更快的预解析器(~2x), ...
- 浅谈Chrome V8引擎中的垃圾回收机制
垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带 ...
- V8引擎嵌入指南
如果已读过V8编程入门那你已经熟悉了如句柄(handle).作用域(scope)和上下文(context)之类的关键概念,以及如何将V8引擎作为一个独立的虚拟机来使用.本文将进一步讨论这些概念,并介绍 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- 精读《V8 引擎 Lazy Parsing》
1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...
- Javascript的V8引擎研究
1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面 ...
- V8引擎——详解
前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...
- 使用 D8 分析 javascript 如何被 V8 引擎优化的
在上一篇文章中我们讲了如何使用 GN 编译 V8 源码,文章最后编译完成的可执行文件并不是 V8,而是 D8.这篇我们讲一下如何使用 D8 调试 javascript 代码. 如果没有 d8,可以使用 ...
随机推荐
- SQL表值函数和标量值函数的区别
SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...
- c/c++指针总结[pointer summary]
[本文链接] http://www.cnblogs.com/hellogiser/p/pointer-summary.html 1.指针注意事项 (1). 指针类型字符串不容许修改 char *str ...
- Android 中SimpleDateFormat的使用注意
以前在程序中总这样使用 SimpleDateFormat sdf=new SimpleDateFormat("hh:mma"); date1=sdf.parse(alertT ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- Java for LeetCode 166 Fraction to Recurring Decimal
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- codeforces B. Semifinals 解题报告
题目链接:http://codeforces.com/problemset/problem/378/B 题目意思:有n个参赛者,他们都需要参加两场半决赛.第一场半决赛的成绩依次是a1, a2, ... ...
- JavaEE填空与判断
Java EE软件工程师认证考试 试题库- 填空题和选择题 一. 填空题 1. HTML网页文件的标记是__html__,网页文件的主体标记是_body__,标记页面标题的标记是__tit ...
- css3学习总结9--CSS3过渡
CSS3 过渡 通过 CSS3,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 过渡属性 属性 描述 CSS transiti ...
- python基础——使用dict和set
python基础——使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其它语言中也称为map(映射),使用键-值(key-value)存储,具 ...
- linux常见问题集锦-2
http://zhangge.net/1986.html 在此感谢作者分享 1.linux如何挂在windows下的共享目录 Shell 1 mount.cifs //192.168.1.3/serv ...