摘要:歡迎來我的博客閱讀開發者所需要知道的一是一款擁有自動垃圾回收功能的編程語言。它隨著的第一版發布而發布以及開源。年月,基金宣布和合并,合并版本在未來發布。年月日,官方公布又一個新的名為的優化編譯器,主要提供的新語法,以及提高性能。
Motivation歡迎來我的博客閱讀:「JavaScript 開發者所需要知道的 V8(一):V8 In NodeJS」
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 直譯成機器碼,然后運行」
但這中間,往往是一個復雜的過程,它需要處理很多的難題,諸如:
編譯優化
內存管理
垃圾回收
我寫的這一系列文章,也是從這三個大點來出發,解讀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 進行動態編譯解析運行。
查看V8版本號NodeJS的進步與V8息息相關,關注每個NodeJS版本所對應的V8版本,可以加強該版本新功能的理解和由來。
在NodeJS中,通過process.versions可以查看NodeJS依賴模塊的版本號,V8就包含其中。
例如,我運行的 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 的第一個版本隨著 Chrome 的第一版本發布。
2009年5月,NodeJS 的第一個版本由 Ryan Dahl 在 GitHub 上發布。
2010年12月,官方公布 V8 的名為 Crankshaft 的優化編譯器,與原來的 Full Compiler 一起工作,聲稱較2008年版本提高50%性能。
2014年12月, io.js 從久久不更新的 NodeJS 分出來支,并且引入最新的 V8 ,這時候 NodeJS 處于0.12.17版本。
2015年2月,NodeJS基金宣布NodeJS(v0.12)和io.js(v3.3)合并,合并版本在未來發布。
2015年7月7日,官方公布又一個新的名為TurBoFan的優化編譯器,主要提供ES6的新語法,以及提高性能。并表明該編譯器最終目標是全部替代Crankshaft編譯器
2015年7月17日,官方發布集成TurboFan的V8版本(v4.5)
2015年9月08日,NodeJS緊跟著發布了與io.js的合并版本(V4.0),引入最新的V8,給開發者們帶來了最新的ES6語法,以及性能上的提高。
2015年8月28日,V8發布v4.6版本
2015年10月29日,NodeJS發布V5.0.0版本
2016年3月15日,V8發布v5.0版本
2016年4月26日,NodeJS發布V6.0.0版本
2016年7月18日,V8發布v5.3版本,新增名為Ignition的解析器(Interpreter),跟原有的優化編譯器(Crankshaft and TurboFan)進行串聯工作,提供了更加優化的內存使用方案,主要針對于低內存的Android設備,并稱在未來會普及到全平臺。
2016年10月25日,NodeJS發布v7.0.0版本
截止到今天(2016年11月),NodeJS版本v7.0.0,搭配了v5.4的v8,而官方發布的最新v8版本是v5.5。
回顧整個歷程,由于NodeJS是搭建在V8之上的,所以NodeJS很多「新增語言特性」和「提高性能」等更新都需要依賴V8的發布日程。
就像NodeJS和io.js宣布合并,和真正發布V4.0版本的中間,還隔了V8的生命歷程一個重大的更新(發布 TurboFan 編譯器,該編譯器引入了大量的ES6語法支持。)。這個更新直接提供了相當一部分的ES6語法,以及性能上的提高。
總結本篇主要描述了下面幾點:
我的寫作動機,理解NodeJS底層,給寫出高質量JavaScript代碼提供指導。
簡單描述V8的角色,以及主要職責:編譯優化、內存管理、垃圾回收。
通過NodeJS源碼目錄,以及NodeJS代碼加載過程,來認識V8在這之中的位置。
羅列NodeJS與V8的歷代迭代版本以及聯系,強調V8在NodeJS中的地位。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80907.html
對于了解Node的開發人員,我們都知道Node是基于Chrome V8引擎開發的能使JavaScript在服務器端運行的運行時環境(runtime environment)。一方面,它提供了多種可調用的API,如讀寫文件、網絡請求、系統信息等。另一方面,因為CPU執行的是機器碼,它還負責將JavaScript代碼解釋成機器指令序列執行,這部分工作是由V8引擎完成。 Motivation JavaS...
摘要:什么是在中什么時候需要是中的包管理器。允許我們為安裝各種模塊,這個包管理器為我們提供了安裝刪除等其它命令來管理模塊。 showImg(https://user-gold-cdn.xitu.io/2019/7/11/16bde5b2df52a924?w=4000&h=2667&f=jpeg&s=450648); 本文為您分享「Node.js 入門你需要知道的 10 個問題」這些問題可能也...
摘要:一前言的垃圾回收機制使用垃圾回收機制來自動管理內存。垃圾回收器只會針對新生代內存區老生代指針區以及老生代數據區進行垃圾回收。分別對新生代和老生代使用不同的垃圾回收算法來提升垃圾回收的效率。 V8 實現了準確式 GC,GC 算法采用了分代式垃圾回收機制。因此,V8 將內存(堆)分為新生代和老生代兩部分。 一、前言 V8的垃圾回收機制:JavaScript使用垃圾回收機制來自動管理內存。垃...
摘要:垃圾回收內存管理實踐先通過一個來看看在中進行垃圾回收的過程是怎樣的內存泄漏識別在環境里提供了方法用來查看當前進程內存使用情況,單位為字節中保存的進程占用的內存部分,包括代碼本身棧堆。 showImg(https://segmentfault.com/img/remote/1460000019894672?w=640&h=426);作者 | 五月君Node.js 技術棧 | https:...
摘要:單線程使用單線程來運行,而不是向之類的其它服務器,每個請求將生產一個線程,這種方法避免了上下文切換和內存中的大量執行堆棧,這也是和其它服務器為解決上一個年,著名的并發連接問題而采用的方法。 showImg(https://segmentfault.com/img/remote/1460000019968794?w=1080&h=675);當我們學習一項新的事物的時候,我們首先要知道它來...
閱讀 1802·2021-11-24 09:39
閱讀 2290·2021-09-30 09:47
閱讀 4144·2021-09-22 15:57
閱讀 1873·2019-08-29 18:36
閱讀 3577·2019-08-29 12:21
閱讀 590·2019-08-29 12:17
閱讀 1263·2019-08-29 11:25
閱讀 724·2019-08-28 18:26