博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs与v8
阅读量:6690 次
发布时间:2019-06-25

本文共 2224 字,大约阅读时间需要 7 分钟。

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的?

我们关注  目录:

.├── ...├── 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源码所在文件夹,你会发现里面的目录结构跟  十分相似。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 进行动态编译解析运行。

转载于:https://www.cnblogs.com/wanwanli/p/10858569.html

你可能感兴趣的文章
基于Ionic2的开源项目
查看>>
QEMU-KVM中的多线程压缩迁移技术
查看>>
Android下创建一个SQLite数据库
查看>>
软件产品与代码版本管理指南
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
sql如何分组选择显示最新的一条数据
查看>>
周锦民:腾讯在线教育视频互动直播间技术实践
查看>>
[perl] 正则表达式实现多模式匹配
查看>>
class左边nbu 2414 Please help the poor donkey!
查看>>
[转]UML类图、关系及其JAVA代码
查看>>
PhotoShop算法原理解析系列 - 像素化---》碎片。
查看>>
设计模式之责任链模式
查看>>
在 Windows 下安装 Oracle 11g XE (Express Edition)
查看>>
php多态设计
查看>>
oracel SQL多表查询优化
查看>>
Spring-Context的注解实现依赖注入功能
查看>>
CSS格式化 CSS代码压缩工具
查看>>
Android的TextView使用Html来处理图片显示、字体样式、超链接等
查看>>
mvc伪静态<三> IIS配置
查看>>
.NET设计模式(12):外观模式(Façade Pattern)(转)
查看>>