成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 開發(fā)者所需要知道的 V8(一):V8 In NodeJS

Lemon_95 / 678人閱讀

摘要:歡迎來我的博客閱讀開發(fā)者所需要知道的一是一款擁有自動(dòng)垃圾回收功能的編程語言。它隨著的第一版發(fā)布而發(fā)布以及開源。年月,基金宣布和合并,合并版本在未來發(fā)布。年月日,官方公布又一個(gè)新的名為的優(yōu)化編譯器,主要提供的新語法,以及提高性能。

歡迎來我的博客閱讀:「JavaScript 開發(fā)者所需要知道的 V8(一):V8 In NodeJS」

Motivation

JavaScript 是一款擁有「自動(dòng)垃圾回收」功能的編程語言。
市面上具有這樣功能的語言,一般都是擁有相對(duì)應(yīng)的虛擬機(jī)的,像 Java的JVM ,C#的CLR ,PHP的Zend。
虛擬機(jī)一般實(shí)現(xiàn)了代碼解析,內(nèi)存的管理、布局、垃圾回收等功能。
不像C/C++這種沒有虛擬機(jī)的語言,它們需要手動(dòng)管理內(nèi)存。
C/C++語言編譯后的文件,是可以直接運(yùn)行的。

我認(rèn)為學(xué)習(xí)一門開發(fā)語言,除了知道一些語法上的使用,各種API的調(diào)用以外。學(xué)習(xí)相應(yīng)的虛擬機(jī)也是很有必要的。而 JavaScript 由于其特殊的歷史原因,并不是只有 V8 一個(gè)引擎。但是目前 V8 它是業(yè)界最優(yōu)秀的 JavaScript 引擎,也就成為了一個(gè)學(xué)習(xí)樣本。

如今的 JavaScript 不僅僅是用在瀏覽器端了,也因?yàn)?NodeJS 的關(guān)系得以在服務(wù)器端運(yùn)行。和瀏覽器端不同的地方在于服務(wù)器端對(duì)資源的敏感性是很高的。當(dāng)業(yè)務(wù)規(guī)模大了,并發(fā)量上來了,一些很細(xì)小的問題會(huì)放大。這時(shí)候一些小小的內(nèi)存泄漏,都會(huì)釀造災(zāi)難。

所以作為一個(gè) JavaScript 開發(fā)者,搞清楚從敲入 console.log("hello world"),直到后面交由CPU執(zhí)行的中間過程是很重要的。
這也對(duì)如何用 JavaScript 這門松散的語言編寫出高質(zhì)量的代碼是具有指導(dǎo)作用的。

想真正做到 JavaScript 全棧,路漫漫其修遠(yuǎn)兮。

V8 概述

V8 作為一個(gè) JavaScript 引擎,最初是服役于 Google Chrome 瀏覽器的。它隨著 Chrome 的第一版發(fā)布而發(fā)布以及開源?,F(xiàn)在它除了 Chrome 瀏覽器,已經(jīng)有很多其他的使用者了。諸如 NodeJS、MongoDB、CouchDB 等。

JavaScript 作為 Prototype-Based Language , 基于它使用 Prototype 繼承的特征,V8 使用了直譯的方式,即把 JavaScript 代碼直接編譯成機(jī)器碼( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件執(zhí)行。
與傳統(tǒng)的「編譯-解析-執(zhí)行」的流程不同,V8 處理 JavaScript,并沒有二進(jìn)制碼或其他的中間碼。

簡(jiǎn)單來說,V8主要工作就是:「把 JavaScript 直譯成機(jī)器碼,然后運(yùn)行」
但這中間,往往是一個(gè)復(fù)雜的過程,它需要處理很多的難題,諸如:

編譯優(yōu)化

內(nèi)存管理

垃圾回收

我寫的這一系列文章,也是從這三個(gè)大點(diǎn)來出發(fā),解讀V8針對(duì)這些內(nèi)容的處理。

V8 In NodeJS NodeJS源碼小覽

NodeJS,是怎么引入V8的?
我們關(guān)注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
│?? ├── ...
├── 
...

需要關(guān)注的幾個(gè)目錄和文件:

/deps/v8:這里是V8源碼所在文件夾,你會(huì)發(fā)現(xiàn)里面的目錄結(jié)構(gòu)跟V8源碼十分相似。NodeJS除了移植V8源碼,還在增添了一些內(nèi)容。

/src:由C/C++編寫的核心模塊所在文件夾,由C/C++編寫的這部分模塊被稱為「Builtin Module」

/lib:由JavaScript編寫的核心模塊所在文件夾,這部分被稱為「Native Code」,在編譯Node源碼的時(shí)候,會(huì)采用V8附帶的js2c.py工具,把所有內(nèi)置的JavaScript代碼轉(zhuǎn)換成C++里面的數(shù)組,生成out/Release/obj/gen/node_natives.h文件。有些 Native Module 需要借助于 Builtin Module 實(shí)現(xiàn)背后的功能。

/out:該目錄是Node源碼編譯(命令行運(yùn)行make)后生成的目錄,里面包含了Node的可執(zhí)行文件。當(dāng)在命令行中鍵入node xxx.js,實(shí)際就是運(yùn)行了out/Release/node文件。

來張圖說明一下V8在Node運(yùn)行時(shí)的整體過程。

Node在啟動(dòng)的時(shí)候,就已經(jīng)把 Native Module,Builtin Module 加載到內(nèi)存里面了。后來的 JavaScript 代碼,就需要通過 V8 進(jìn)行動(dòng)態(tài)編譯解析運(yùn)行。

查看V8版本號(hào)

NodeJS的進(jìn)步與V8息息相關(guān),關(guān)注每個(gè)NodeJS版本所對(duì)應(yīng)的V8版本,可以加強(qiáng)該版本新功能的理解和由來。

在NodeJS中,通過process.versions可以查看NodeJS依賴模塊的版本號(hào),V8就包含其中。

例如,我運(yùn)行的 v7.0.0的NodeJS:

$ node
> process.versions
{ http_parser: "2.7.0",
  node: "8.0.0-pre",
  v8: "5.4.500.36",
  uv: "1.10.0",
  zlib: "1.2.8",
  ares: "1.10.1-DEV",
  modules: "51",
  openssl: "1.0.2j",
  icu: "58.1",
  unicode: "9.0",
  cldr: "30.0.2",
  tz: "2016g" }
NodeJS與V8的纏綿

2008年9月,V8 的第一個(gè)版本隨著 Chrome 的第一版本發(fā)布。

2009年5月,NodeJS 的第一個(gè)版本由 Ryan Dahl 在 GitHub 上發(fā)布。

2010年12月,官方公布 V8 的名為 Crankshaft 的優(yōu)化編譯器,與原來的 Full Compiler 一起工作,聲稱較2008年版本提高50%性能。

2014年12月, io.js 從久久不更新的 NodeJS 分出來支,并且引入最新的 V8 ,這時(shí)候 NodeJS 處于0.12.17版本。

2015年2月,NodeJS基金宣布NodeJS(v0.12)和io.js(v3.3)合并,合并版本在未來發(fā)布。

2015年7月7日,官方公布又一個(gè)新的名為TurBoFan的優(yōu)化編譯器,主要提供ES6的新語法,以及提高性能。并表明該編譯器最終目標(biāo)是全部替代Crankshaft編譯器

2015年7月17日,官方發(fā)布集成TurboFan的V8版本(v4.5)

2015年9月08日,NodeJS緊跟著發(fā)布了與io.js的合并版本(V4.0),引入最新的V8,給開發(fā)者們帶來了最新的ES6語法,以及性能上的提高。

2015年8月28日,V8發(fā)布v4.6版本

2015年10月29日,NodeJS發(fā)布V5.0.0版本

2016年3月15日,V8發(fā)布v5.0版本

2016年4月26日,NodeJS發(fā)布V6.0.0版本

2016年7月18日,V8發(fā)布v5.3版本,新增名為Ignition的解析器(Interpreter),跟原有的優(yōu)化編譯器(Crankshaft and TurboFan)進(jìn)行串聯(lián)工作,提供了更加優(yōu)化的內(nèi)存使用方案,主要針對(duì)于低內(nèi)存的Android設(shè)備,并稱在未來會(huì)普及到全平臺(tái)。

2016年10月25日,NodeJS發(fā)布v7.0.0版本

截止到今天(2016年11月),NodeJS版本v7.0.0,搭配了v5.4的v8,而官方發(fā)布的最新v8版本是v5.5。

回顧整個(gè)歷程,由于NodeJS是搭建在V8之上的,所以NodeJS很多「新增語言特性」和「提高性能」等更新都需要依賴V8的發(fā)布日程。

就像NodeJS和io.js宣布合并,和真正發(fā)布V4.0版本的中間,還隔了V8的生命歷程一個(gè)重大的更新(發(fā)布 TurboFan 編譯器,該編譯器引入了大量的ES6語法支持。)。這個(gè)更新直接提供了相當(dāng)一部分的ES6語法,以及性能上的提高。

總結(jié)

本篇主要描述了下面幾點(diǎn):

我的寫作動(dòng)機(jī),理解NodeJS底層,給寫出高質(zhì)量JavaScript代碼提供指導(dǎo)。

簡(jiǎn)單描述V8的角色,以及主要職責(zé):編譯優(yōu)化、內(nèi)存管理、垃圾回收。

通過NodeJS源碼目錄,以及NodeJS代碼加載過程,來認(rèn)識(shí)V8在這之中的位置。

羅列NodeJS與V8的歷代迭代版本以及聯(lián)系,強(qiáng)調(diào)V8在NodeJS中的地位。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80907.html

相關(guān)文章

  • JavaScript、Node.js與V8關(guān)系

    對(duì)于了解Node的開發(fā)人員,我們都知道Node是基于Chrome V8引擎開發(fā)的能使JavaScript在服務(wù)器端運(yùn)行的運(yùn)行時(shí)環(huán)境(runtime environment)。一方面,它提供了多種可調(diào)用的API,如讀寫文件、網(wǎng)絡(luò)請(qǐng)求、系統(tǒng)信息等。另一方面,因?yàn)镃PU執(zhí)行的是機(jī)器碼,它還負(fù)責(zé)將JavaScript代碼解釋成機(jī)器指令序列執(zhí)行,這部分工作是由V8引擎完成。 Motivation JavaS...

    Cciradih 評(píng)論0 收藏0
  • Node.js 入門你需要知道 10 個(gè)問題

    摘要:什么是在中什么時(shí)候需要是中的包管理器。允許我們?yōu)榘惭b各種模塊,這個(gè)包管理器為我們提供了安裝刪除等其它命令來管理模塊。 showImg(https://user-gold-cdn.xitu.io/2019/7/11/16bde5b2df52a924?w=4000&h=2667&f=jpeg&s=450648); 本文為您分享「Node.js 入門你需要知道的 10 個(gè)問題」這些問題可能也...

    szysky 評(píng)論0 收藏0
  • V8引擎】淺析Chrome V8引擎中垃圾回收機(jī)制和內(nèi)存泄露優(yōu)化策略

    摘要:一前言的垃圾回收機(jī)制使用垃圾回收機(jī)制來自動(dòng)管理內(nèi)存。垃圾回收器只會(huì)針對(duì)新生代內(nèi)存區(qū)老生代指針區(qū)以及老生代數(shù)據(jù)區(qū)進(jìn)行垃圾回收。分別對(duì)新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實(shí)現(xiàn)了準(zhǔn)確式 GC,GC 算法采用了分代式垃圾回收機(jī)制。因此,V8 將內(nèi)存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機(jī)制:JavaScript使用垃圾回收機(jī)制來自動(dòng)管理內(nèi)存。垃...

    qingshanli1988 評(píng)論0 收藏0
  • Node.js內(nèi)存管理和V8垃圾回收機(jī)制

    摘要:垃圾回收內(nèi)存管理實(shí)踐先通過一個(gè)來看看在中進(jìn)行垃圾回收的過程是怎樣的內(nèi)存泄漏識(shí)別在環(huán)境里提供了方法用來查看當(dāng)前進(jìn)程內(nèi)存使用情況,單位為字節(jié)中保存的進(jìn)程占用的內(nèi)存部分,包括代碼本身?xiàng)6选? showImg(https://segmentfault.com/img/remote/1460000019894672?w=640&h=426);作者 | 五月君Node.js 技術(shù)棧 | https:...

    JowayYoung 評(píng)論0 收藏0
  • Node.js 是什么?我為什么選擇它?

    摘要:?jiǎn)尉€程使用單線程來運(yùn)行,而不是向之類的其它服務(wù)器,每個(gè)請(qǐng)求將生產(chǎn)一個(gè)線程,這種方法避免了上下文切換和內(nèi)存中的大量執(zhí)行堆棧,這也是和其它服務(wù)器為解決上一個(gè)年,著名的并發(fā)連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當(dāng)我們學(xué)習(xí)一項(xiàng)新的事物的時(shí)候,我們首先要知道它來...

    Joyven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<