nodejs與v8引擎

來源:互聯網
上載者:User

標籤:垃圾   目錄   lang   tps   bug   進位   實現   繼承   使用   

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 NodeJSNodeJS源碼小覽

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 進行動態編譯解析運行。

nodejs與v8引擎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.