亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript、Node.js與V8的關系

Cciradih / 2003人閱讀

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

Motivation

JavaScript 是一款擁有「自動垃圾回收」功能的編程語言。

市面上具有這樣功能的語言,一般都是擁有相對應的虛擬機的,像 JavaJVM ,C#CLRPHPZend。

虛擬機一般實現(xiàn)了代碼解析,內存的管理、布局、垃圾回收等功能。

不像C/C++這種沒有虛擬機的語言,它們需要手動管理內存。

C/C++語言編譯后的文件,是可以直接運行的。

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

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

所以作為一個 JavaScript 開發(fā)者,搞清楚從敲入 console.log("hello world") ,直到后面交由CPU執(zhí)行的中間過程是很重要的。

這也對如何用 JavaScript 這門松散的語言編寫出高質量的代碼是具有指導作用的。

想真正做到 JavaScript 全棧,路漫漫其修遠兮。

NodeJS 概述

根據(jù)百度百科解釋,Node.js是一套用來編寫高性能網(wǎng)絡服務器的JavaScript工具包。Node.js是一個可以快速構建網(wǎng)絡服務及應用的平臺,該平臺的構建是基于Chrome"s JavaScript runtime,也就是說,實際上它是對GoogleV8引擎(應用于Google Chrome瀏覽器)進行了封裝。V8引 擎執(zhí)行Javascript的速度非常快,性能非常好。

NodeJS并不是提供簡單的封裝,然后提供API調用,如果是這樣的話那么它就不會有現(xiàn)在這么火了。Node對一些特殊用例進行了優(yōu)化,提供了替代的API,使得V8在非瀏覽器環(huán)境下運行得更好。例如,在服務器環(huán)境中,處理二進制數(shù)據(jù)通常是必不可少的,但Javascript對此支持不足,因此,V8.Node增加了Buffer類,方便并且高效地 處理二進制數(shù)據(jù)。因此,Node不僅僅簡單的使用了V8,還對其進行了優(yōu)化,使其在各環(huán)境下更加給力。

即時編譯JIT 概述

V8采用即時編譯技術(JIT),直接將JavaScript代碼編譯成本地平臺的機器碼。宏觀上看,其步驟為JavaScript源碼—>抽象語法樹—>本地機器碼,并且后一個步驟只依賴前一個步驟。這與其他解釋器不同,例如Java語言需要先將源碼編譯成字節(jié)碼,然后給JVM解釋執(zhí)行,JVM根據(jù)優(yōu)化策略,運行過程中有選擇地將一部分字節(jié)碼編譯成本地機器碼。V8不生成中間代碼,一步到位,編譯成機器碼,CPU就開始執(zhí)行了。比起生成中間碼解釋執(zhí)行的方式,V8的策略省去了一個步驟,程序會更早地開始運行。并且執(zhí)行編譯好的機器指令,也比解釋執(zhí)行中間碼的速度更快。不足的是,缺少字節(jié)碼這個中間表示,使得代碼優(yōu)化變得更困難。

V8 概述

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

JavaScript 作為 Prototype-Based Language , 基于它使用 Prototype 繼承的特征,V8 使用了直譯的方式,即把 JavaScript 代碼直接編譯成機器碼( Machine Code, 有些地方也叫 Native Code ),然后直接交由硬件執(zhí)行。

與傳統(tǒng)的「編譯-解析-執(zhí)行」的流程不同,V8 處理 JavaScript,并沒有二進制碼或其他的中間碼。

簡單來說,V8主要工作就是:「把 JavaScript 直譯成機器碼,然后運行」

但這中間,往往是一個復雜的過程,它需要處理很多的難題,諸如:

編譯優(yōu)化

內存管理

垃圾回收

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源碼所在文件夾,你會發(fā)現(xiàn)里面的目錄結構跟 V8源碼 十分相似。NodeJS除了移植V8源碼,還在增添了一些內容。

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

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

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

來張圖說明一下V8在Node運行時的整體過程。

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

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

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/107769.html

相關文章

  • Node.js內存管理和V8垃圾回收機制

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

    JowayYoung 評論0 收藏0
  • JavaScript 堆內存分析新工具 OneHeap

    摘要:關注于運行中的內存信息的展示,用可視化的方式還原了,有助于理解內存管理。背景運行過程中的大部分數(shù)據(jù)都保存在堆中,所以性能分析另一個比較重要的方面是內存,也就是堆的分析。上周發(fā)布了工具,可以用來動態(tài)地展示的結果,分析各種函數(shù)的調用關系。 OneHeap 關注于運行中的 JavaScript 內存信息的展示,用可視化的方式還原了 HeapGraph,有助于理解 v8 內存管理。 ...

    zilu 評論0 收藏0
  • 最近學到前后端分離知識

    摘要:文本已收錄至我的倉庫,歡迎前后端分離這個詞相信大家都聽過,不知道大家是怎么理解的呢。流下不學無術的淚水目前我了解到的前后端分離,首先部署是分離的至少不會跟綁定在一起部署接口只返回數(shù)據(jù)關于前端這幾大框架這幾個我都是沒有寫過的,所以也就不多了。 前言 只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y ...

    MoAir 評論0 收藏0
  • javascript作用域和閉包之我見

    摘要:查詢是在作用域鏈中,一級級的往上查找該變量的引用。作用域和作用域鏈作用域的概念,應該兩張圖幾句話就能解釋吧。這個建筑代表程序中的嵌套作用域鏈。一層嵌一層的作用域形成了作用域鏈,變量在作用域鏈中的函數(shù)內得到了自己的定義。 javascript作用域和閉包之我見 看了《你不知道的JavaScript(上卷)》的第一部分——作用域和閉包,感受頗深,遂寫一篇讀書筆記加深印象。路過的大牛歡迎指點...

    SoapEye 評論0 收藏0
  • Node.js 入門你需要知道 10 個問題

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

    szysky 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<