nodejs与v8引擎

Motivation

JavaScript 是一款拥有「自动垃圾回收」功能的编程语言。

市面上具有这样功能的语言,一般都是拥有相对应的虚拟机的,像 Java的JVM ,C#的CLR ,PHP的Zend。

虚拟机一般实现了代码解析,内存的管理、布局、垃圾回收等功能。

不像C/C++这种没有虚拟机的语言,它们需要手动管理内存。

C/C++语言编译后的文件,是可以直接运行的。

我认为学习一门开发语言,除了知道一些语法上的使用,各种API的调用以外。学习相应的虚拟机也是很有必要的。而 JavaScript 由于其特殊的历史原因,并不是只有 V8 一个引擎。但是目前 V8 它是业界最优秀的 JavaScript 引擎,也就成为了一个学习样本。

如今的 JavaScript 不仅仅是用在浏览器端了,也因为 NodeJS 的关系得以在服务器端运行。和浏览器端不同的地方在于服务器端对资源的敏感性是很高的。当业务规模大了,并发量上来了,一些很细小的问题会放大。这时候一些小小的内存泄漏,都会酿造灾难。

所以作为一个 JavaScript 开发者,搞清楚从敲入 console.log(‘hello world‘) ,直到后面交由CPU执行的中间过程是很重要的。

这也对如何用 JavaScript 这门松散的语言编写出高质量的代码是具有指导作用的。

想真正做到 JavaScript 全栈,路漫漫其修远兮。

V8 概述

V8 作为一个 JavaScript 引擎,最初是服役于 Google Chrome 浏览器的。它随着 Chrome 的第一版发布而发布以及开源。现在它除了 Chrome 浏览器,已经有很多其他的使用者了。诸如 NodeJS、MongoDB、CouchDB 等。

JavaScript 作为 Prototype-Based Language , 基于它使用 Prototype 继承的特征,V8 使用了直译的方式,即把 JavaScript 代码直接编译成机器码( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件执行。

与传统的「编译-解析-执行」的流程不同,V8 处理 JavaScript,并没有二进制码或其他的中间码。

简单来说,V8主要工作就是:「把 JavaScript 直译成机器码,然后运行」

但这中间,往往是一个复杂的过程,它需要处理很多的难题,诸如:

  1. 编译优化
  2. 内存管理
  3. 垃圾回收

我写的这一系列文章,也是从这三个大点来出发,解读V8针对这些内容的处理。

V8 In NodeJS

NodeJS源码小览

NodeJS,是怎么引入V8的?

我们关注 Node的源码 目录:

.
├── ...
├── deps
│   ├── ...
│   ├── v8
│   ├── ...
├── ...
├── lib
│   ├── ...
│   ├── buffer.js
│   ├── child_process.js
│   ├── console.js
│   ├── ...
├── node -> out/Release/node
├── ...
├── out
│   ├── ...
│   ├── Release
|         ├── node
|         ├── node.d
|         ├── obj
|             └── gen
|                 ├── ...
|                 ├── node_natives.h
|                 ├── ...
│   ├── ...
├── src
│   ├── ...
│   ├── debug-agent.cc
│   ├── debug-agent.h
│   ├── env-inl.h
│   ├── env.cc
│   ├── ...
├──
...

需要关注的几个目录和文件:

/deps/v8 :这里是V8源码所在文件夹,你会发现里面的目录结构跟 V8源码 十分相似。NodeJS除了移植V8源码,还在增添了一些内容。

/src :由C/C++编写的核心模块所在文件夹,由C/C++编写的这部分模块被称为「Builtin Module」

/lib :由JavaScript编写的核心模块所在文件夹,这部分被称为「Native Code」,在编译Node源码的时候,会采用V8附带的 js2c.py 工具,把所有内置的JavaScript代码转换成C++里面的数组,生成 out/Release/obj/gen/node_natives.h 文件。有些 Native Module 需要借助于 Builtin Module 实现背后的功能。

/out :该目录是Node源码编译(命令行运行 make )后生成的目录,里面包含了Node的可执行文件。当在命令行中键入 node xxx.js ,实际就是运行了 out/Release/node 文件。

来张图说明一下V8在Node运行时的整体过程。

Node在启动的时候,就已经把 Native Module,Builtin Module 加载到内存里面了。后来的 JavaScript 代码,就需要通过 V8 进行动态编译解析运行。

时间: 2024-10-15 19:21:17

nodejs与v8引擎的相关文章

V8引擎介绍

V8是什么? V8是谷歌在德国研发中心开发的一个JavaScript引擎.开源并且用C++实现.可以用于运行于客户端和服务端的Javascript程序. V8设计的初衷是为了提高浏览器上JavaScript脚本的执行效率.为了提高速度,V8把JavaScript代码转换成更有效率的机器代码执行,而不像以往是通过解释器执行.像现在大多数的JavaScript引擎一样,比如SpiderMonkey 或者 Rhino (Mozilla),V8实现了一个JIT (Just-In-Time) 编译器,可以

V8引擎——详解

前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进行完全编译,而解释型语言一边编译一边执行,很明显解释型语言的执行速度是慢于编译型语言的,而JavaScript就是一种解释型脚本语言,支持动态类型.弱类型.基于原型的语言,内置支持类型.鉴于JavaScript都是在前端执行,而且需要及时响应用户,这就要求JavaScript可以快速的解析及执行.

Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略[转]

V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带来的内存泄露问题. 但使用了垃圾回收即意味着程序员将无法掌控内存.ECMAScript没有暴露任何垃圾回收器的接口.我们无法强迫其进 行垃圾回收,更无法干预内存管理 内存管理问题:在浏览器中,Chrom

Chrome V8引擎系列随笔 (1):Math.Random()函数概览

先让大家来看一幅图,这幅图是V8引擎4.7版本和4.9版本Math.Random()函数的值的分布图,我可以这么理解 .从下图中,也许你会认为这是个二维码?其实这幅图告诉我们一个道理,第二张图的点的分布更加的密集,也就是说Math.Random()函数能表示的数字更多了,大家在.NET中肯定也用过GUID吧,至于GUID为什么会永不重复,大家有没有想过呢? 还是让我们先来看看官方怎么解释Math.Random()吧,它是返回了一个正数,这个正数介于0~1之间,以伪随机的方式在这个范围内波动.Ma

Node.js背后的V8引擎优化技术

Node.js的执行速度远超Ruby.Python等脚本语言,这背后都是V8引擎的功劳.本文将介绍如何编写高性能Node.js代码.V8是Chrome背后的JavaScript引擎,因此本文的相关优化经验也适用于基于Chrome浏览器的JavaScript引擎. V8优化技术概述 V8引擎在虚拟机与语言性能优化上做了很多工作.不过按照Lars Bak的说法,所有这些优化技术都不是他们创造的,只是在前人的基础上做的改进. 隐藏类(Hidden Class) 为了减少JavaScript中访问属性所

JavaScript工作机制:V8 引擎内部机制及如何编写优化代码的5个诀窍

概述 JavaScript引擎是一个执行JavaScript代码的程序或解释器.JavaScript引擎可以被实现为标准解释器,或者实现为以某种形式将JavaScript编译为字节码的即时编译器. 下面是实现了JavaScript引擎的一个热门项目列表: V8- 开源,由Google开发,用C++编写的 Rhino - 由Mozilla基金所管理,开源,完全用Java开发 SpiderMonkey-第一个JavaScript引擎,最早用在Netscape Navigator上,现在用在Firef

Javascript的V8引擎研究

1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面.chrome浏览器每个process只有一个V8引擎实例,浏览器中的每个窗口.iframe都对应一个上下文. ‍ V8启动时(在执行client js前),需要对全局上下文(第一个context)初始化,读取和解析自实现的内置JS代码(另一种技术,第2点),建立起function.array.st

浅谈Chrome V8引擎中的垃圾回收机制

垃圾回收器 JavaScript的垃圾回收器 JavaScript使用垃圾回收机制来自动管理内存.垃圾回收是一把双刃剑,其好处是可以大幅简化程序的内存管理代码,降低程序员的负担,减少因 长时间运转而带来的内存泄露问题.但使用了垃圾回收即意味着程序员将无法掌控内存.ECMAScript没有暴露任何垃圾回收器的接口.我们无法强迫其进 行垃圾回收,更无法干预内存管理 内存管理问题 在浏览器中,Chrome V8引擎实例的生命周期不会很长(谁没事一个页面开着几天几个月不关),而且运行在用户的机器上.如果

JavaScript V8引擎

一.浏览器内核-渲染引擎 渲染,就是根据描述或者定义构建数学模型,生成图像的过程. 浏览器内核主要的作用是将页面转变成可视化/可听化的多媒体结果,通常也被称为渲染引擎.将HTML/CSS/JavaScript文本及其他相应的媒体类型资源文件转换成网页. 上图中实线框内模块是所有移植的共有部分,虚线框内不同的厂商可以自己实现.下面进行介绍: WebCore 是各个浏览器使用的共享部分,包括HTML解析器.CSS解析器.DOM和SVG等. JavaScriptCore是WebKit的默认引擎,在谷歌