什么是Google V8 JavaScript引擎

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是Google V8 JavaScript引擎相关的知识,希望对你有一定的参考价值。

V8是一个由丹麦Google开发的开源javascript引擎,用於Google Chrome中。[2]Lars Bak是这个项目的组长。[3]
V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。[4]
传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,透过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为执行中的物件建立一个属性字典,新的属性都要透过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。
为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。[5]在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。V8组译器是基於Strongtalk组译器。[6]。
参考技术A V8是一个由丹麦Google开发的开源JavaScript引擎,用於Google Chrome中。[2]Lars Bak是这个项目的组长。[3]
V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。[4]
传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,透过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为执行中的物件建立一个属性字典,新的属性都要透过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。
为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。[5]在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。V8组译器是基於Strongtalk组译器。[6]

参考:维 基
参考技术B 想要精准解释百科上有。我就按我觉得有用的说:
V8就是chrome浏览器用的js解释引擎,主要是C编写的,js是优秀web应用必不可少的前端脚本语言,而浏览器除了要展示你看到的这些网页内容外还需要保证页面能按开发者希望的方式和用户交互,因此还需要解释并执行js的一种东西,而js引擎就是这个东西,V8呢只是一种代号(名称)而已,比如firefox的js引擎有过tracemonkey、jaegermonkey、spidermonkey等。(javascript->js)

初识NodeJS

1.NodeJS是什么?

官网给出的解释是:基于Chrome V8引擎构建的javascript运行环境。

 

计算机只能识别机器代码(machine code或者native code)。C/C++作为低级语言,可以直接被机器识别。

但是javascript作为一种高级语言,是不能直接被识别的,需要一个东西将它转为机器语言,这个东西就是google公司提供的v8引擎。

v8引擎执行javascript代码非常快,性能非常好。

因为它使用JIT编译器(Just-In-Time Compiler),就是直接js->AST(抽象语法树)->机器码。

没有其他诸如JAVA等语言,有一个中间层转换。所以它很快。

原来只有chrome浏览器使用了v8引擎,所以javascript代码要在浏览器环境下才能运行。

v8引擎是通过C++语言的。

nodeJS也是通过C++语言编写的,它嵌入了更适合服务器代码开发的优化过的v8引擎,所以它可以运行javascript代码。

另外nodeJS内置了libuv库, 提供了很多API,诸如读写文件,网络请求,系统信息等。

 

通俗的解释可以是: 是javascript可以脱离浏览器环境运行的一个javascript运行环境。

2.NodeJS 的作用和优点

主要的作用是:可以让前端人员使用javascript语言开发服务端功能。并运行在服务器上。

应用: 

  1. 开发工具--webpack
  2. 做中间层---可以解决跨域
  3. 服务端渲染--react,vue都是js,nodejs可以直接解析js;还可以连接mongo,redis,mysql数据库

优点:

  • 可以创建多线程(子线程),用pm2管理线程
  • 异步非阻塞I/o操作,采用事件环驱动

PS: 异步/同步针对被调用者的描述;阻塞/非阻塞是针对调用者(调用的方法)的描述。

3.NodeJS 基础内容

nodeJs中的全局对象是global。查看所有属性console.dir(global, { showHidden: true });

nodeJS中直接打印this,不是global, 是{}

// 启动运行代码的时候,为了实现模块化,代码最外层自动包裹一层函数,this指向被改变。
console.log(this); // {} --module.exports

// 自执行函数的this指向全局对象
(function() {
    console.log(this); // global
})()

global常见的可遍历属性有:

1.process

常用的参数有: 

  • argv 命令行参数
node app.js  --config 1.config.js --port 3000
console.log(process.argv);
// [ ‘/usr/local/bin/node‘,
//   ‘/Users/lyralee/Desktop/MyStudy/Event/server/app.js‘,
//   ‘--config‘,
//   ‘1.config.js‘,
//   ‘--port‘,
//   ‘3000‘ ]

取到的参数是一个数组,可以将其转化成一个对象,使用tj/commander工具。

具体用法如下:

技术图片
// npm install commander 
const program = require(‘commander‘);
// 1.设定版本号;
// .parse(process.argv)必须有!!
program.version(‘1.0.0‘);
program.parse(process.argv); // 这一行代码必须有!!!
// node app.js -V
// 输出1.0.0
// 2.添加进程参数可选项
program.version(‘1.0.0‘)
    .option(‘-p, --pepper‘, ‘add pepper‘)
    .option(‘-a --add‘, ‘add sth‘)
    .option(‘-p|--pepper‘, ‘add pepper‘)
program.parse(process.argv); // 这一行代码必须有
/* --help
Options:
  -V, --version  output the version number
  -p, --pepper   add pepper
  -a --add       add sth
  -p|--pepper    add pepper
  -h, --help     output usage information
*/
// 使用的时候node app.js -a 20
// console.log(program);
/*
    {
         ...
        add: true,
        args: [20]
    }
*/
3. 添加参数并要求赋值
program.version(‘1.0.0‘)
    .option(‘-a -add <value>‘, ‘add sth‘)
program.parse(process.argv);
// node app.js -a 20
console.log(program);
/**
 * {
 *      ...,
 *      config: 20,
 *      args: []
 * }
 */
4. 将命令绑定操作
program
    .command(‘rm <dir>‘)
    .option(‘-r, --recursive‘, ‘remove sth‘)
    .action(function(dir, cmd) {
        console.log(‘remove ‘ + dir + (cmd.recursive ? ‘recursively‘ : ‘‘));
        //  remove XXXX
    })
program.parse(process.argv); // 注意parse一定不能在action后面连写
5. 丰富打印日志
program.on(‘--help‘, function() {
    console.log(‘‘);
    console.log(‘Example:‘);
    console.log(‘   ${custom-help} --help‘); // 每个空格都有确实占一个空位
    console.log(‘   ${custom-help} -h‘);
})
program.parse(process.argv); // 注意parse一定不能在action后面连写
/*
Example:
   ${custom-help} --help
   ${custom-help} -h
*/
View Code
  • env

可以设置环境当前变量。

其中在Mac中使用export

// 在命令行窗口中输入以下命令
export NODE_ENV=production
node app.js
//  或者
export NODE_ENV=production && node app.js
// 在app.js中查看下面的值
console.dir(process.env.NODE_ENV); // “production”

在window中,使用set命令。用法如上。

也可以安装cross-env命令,可以兼容Mac和Windows

  • chdir
// 对于右键直接runcode, 默认其当前目录cwd()是文件所在跟文件夹
console.log(process.cwd());// /Users/lyralee/Desktop/MyStudy/Event
process.chdir(‘./server‘); // 目标文件夹名称
console.log(process.cwd()); // /Users/lyralee/Desktop/MyStudy/Event/server
  • nextTick

2.Buffer(16进制)

3.计时器/定时器类

setTimeout/ clearTimeout

setInterval/ clearInterval

setImmediate/ clearImmediate

4.node模块

模块通过在一个文件中使用自执行函数,函数内部返回内容。

// moduleA
(   
    function sum() {
    }
    module.exports = sum;
    return module.exports; 
)()
// app.js

const a = require(‘./moduleA.js); // 同步读取文件
// a = (...)();===sum

有三个核心模块:fs, path, vm

1.fs模块

const fs = require(‘fs‘);
try {
    fs.accessSync(‘/.XXXX.xx‘); // 判断一个文件是否存在
} catch(err) {
    // 文件不存在抛出异常;原来的exists因为回调中不是异常参数,被废弃
}

2. path模块

  • path.join(),path.resolve()--拼接路径
// 1)path.join(), path.resolvec
path.join(‘a‘,‘b‘); // a/b
path.resolve(‘a‘, ‘b‘); // 默认在path.pwd()的后面添加路径
// /Users/lyralee/Desktop/MyStudy/Event/a/b

// __dirname表示离当前文件最近的文件夹目录
// 如果是找文件的绝对路径
path.join(__dirname,‘a‘,‘b‘,‘/‘); // /Users/.../Event/server/a/b/
path.resolve(__dirname, ‘a‘, ‘b‘);// /Users/.../Event/server/a/b
path.resolve(__dirname, ‘a‘, ‘b‘, ‘/‘); // /
// 从上面的示例可以看出,当路径最后有/时,不能使用path.resolve
  • path.dirname(dir)--取父路径
path.dirname(__dirname); // /Users/lyralee/Desktop/MyStudy/Event
  • path.extname(fullname)--文件扩展名
console.log(path.extname(‘1.min.js‘)); // .js
  • path.basename(fullname[, extname])---基础文件名
// 如果指定了扩展名,会返回除扩展名以外的文件名
console.log(path.basename(‘1.min.js‘)); // 1.min.js
console.log(path.basename(‘1.min.js‘, ‘.js‘)); //1.min

3.vm模块--虚拟机--运行字符串代码

提供一个沙箱--纯净的执行环境;不受外面变量的影响。

const vm = require(‘vm‘);
var hello = ‘morning‘;
vm.runInThisContext(`console.log(hello)`); // hello is not defined
eval(`console.log(hello)`); // morning eval()会受向上层作用域查找

5.nodejs代码调试方法

  • 用浏览器调试:
1)node --inspect-brk app.js
// 其中brk表示从第一行就打断点
2) 在浏览器地址栏中输入chrome://inspect,单击inspect
  • 用vsCode调试
1)// 打开vsCode的debugger工具,点击设置,进行路径设置
2)// 点运行进行调试

 

以上是关于什么是Google V8 JavaScript引擎的主要内容,如果未能解决你的问题,请参考以下文章

图解Google V8,搞懂 JavaScript 执行逻辑

V8 JavaScript引擎研究简介

nodejs优缺点及安装步骤

Node.js入门教程 第一篇 (环境配置及概念原理)

补齐v8基础知识v8与JavaScript简介

是什么阻止了Ruby和Python获得Javascript V8那样的速度?