編譯安裝v8引擎
『壹』 nodejs windows下安裝模塊報錯沒有node-waf命令
Nodejs使用Google的V8javascript引擎來驅動,因此你需要安裝V8引擎。
『貳』 如何在Windows下開發NodeJS的C/C++原生擴展
一、編寫Node.js原生擴展
Node.js是一個強大的平台,理想狀態下一切都都可以用javascript寫成。然而,你可能還會用到許多遺留的庫和系統,這樣的話使用c++編寫Node.JS擴展會是一個不錯的注意。
以下所有例子的源代碼可在node擴展示例中找到 。
編寫Node.js C + +擴展很大程度上就像是寫V8的擴展; Node.js增加了一些介面,但大部分時間你都是在使原始的V8數據類型和方法,為了理解以下的代碼,你必須首先閱讀V8引擎嵌入指南。
Javascript版本的Hello World
在講解C++版本的例子之前,先讓我們來看看在Node.js中用Javascript編寫的等價模塊是什麼樣子。這是一個最簡單的Hello World,也不是通過HTTP,但它展示了node模塊的結構,而其介面也和大多數C++擴展要提供的介面差不多:
HelloWorldJs = function() {
this.m_count = 0;
};
HelloWorldJs.prototype.hello = function()
{
this.m_count++;
return 「Hello World」;
};
exports.HelloWorldJs = HelloWorldJs;
正如你所看到的,它使用prototype為HelloWorldJs類創建了一個新的方法。請注意,上述代碼通過將HelloWorldJS添加到exports變數來暴露構造函數。
要在其他地方使用該模塊,請使用如下代碼:
var helloworld = require(『helloworld_js』);
var hi = new helloworld.HelloWorldJs();
console.log(hi.hello()); // prints 「Hello World」 to stdout
C++版本的Hello World
要開始編寫C++擴展,首先要能夠編譯Node.js(請注意,我們使用的是Node.js 2.0版本)。本文所講內容應該兼容所有未來的0.2.x版本。一旦編譯安裝完node,編譯模塊就不在需要額外的東西了。
完整的源代碼可以在這里找到 。在使用Node.js或V8之前,我們需要包括相關的頭文件:
#include <v8.h>
#include <node.h>
using namespace node;
using namespace v8;
在本例子中我直接使用了V8和node的命名空間,使代碼更易於閱讀。雖然這種用法和谷歌的自己的C++編程風格指南相悖,但由於你需要不停的使用V8定義的類型,所以目前為止的大多數node的擴展仍然使用了V8的命名空間。
接下來,聲明HelloWorld類。它繼承自node::ObjectWrap類 ,這個類提供了幾個如引用計數、在V8內部傳遞contex等的實用功能。一般來說,所有對象應該繼承ObjectWrap:
class HelloWorld: ObjectWrap
{
private:
int m_count;
public:
聲明類之後,我們定義了一個靜態成員函數,用來初始化對象並將其導入Node.js提供的target對象中。設個函數基本上是告訴Node.js和V8你的類是如何創建的,和它將包含什麼方法:
static Persistent<FunctionTemplate> s_ct;
static void Init(Handle<Object> target)
{
HandleScope scope;
Local<FunctionTemplate> t = FunctionTemplate::New(New);
s_ct = Persistent<FunctionTemplate>::New(t);
s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol(「HelloWorld」));
NODE_SET_PROTOTYPE_METHOD(s_ct, 「hello」, Hello);
target->Set(String::NewSymbol(「HelloWorld」),
s_ct->GetFunction());
}
在上面這個函數中target參數將是模塊對象,即你的擴展將要載入的地方。(譯著:這個函數將你的對象及其方法連接到
這個模塊對象,以便外界可以訪問)首先我們為New方法創建一個FunctionTemplate,將於稍後解釋。我們還為該對象添加一個內部欄位,並命
名為HelloWorld。然後使用NODE_SET_PROTOTYPE_METHOD宏將hello方法綁定到該對象。最後,一旦我們建立好這個函數模板後,將他分配給target對象的HelloWorld屬性,將類暴露給用戶。
接下來的部分是一個標準的C++構造函數:
HelloWorld() :
m_count(0)
{
}
~HelloWorld()
{
}
接下來,在::New 方法中V8引擎將調用這個簡單的C++構造函數:
static Handle<Value> New(const Arguments& args)
{
HandleScope scope;
HelloWorld* hw = new HelloWorld();
hw->Wrap(args.This());
return args.This();
}
此段代碼相當於上面Javascript代碼中使用的構造函數。它調用new HelloWorld
創造了一個普通的C++對象,然後調用從ObjectWrap繼承的Wrap方法,
它將一個C++HelloWorld類的引用保存到args.This()的值中。在包裝完成後返回args.This(),整個函數的行為和
javascript中的new運算符類似,返回this指向的對象。
現在我們已經建立了對象,下面介紹在Init函數中被綁定到hello的函數:
static Handle<Value> Hello(const Arguments& args)
『叄』 什麼是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]。
『肆』 V8編譯生成的機器碼究竟是什麼
實際上V8的JIT編譯器是直接在內存中生成機器碼的,並不會先生成文本形式的匯編然後再使用匯編器去轉換為機器碼。「動態生成機器碼」聽起來可能有點玄乎,其實根本沒啥,就是往內存里寫位元組,這些位元組正好是某些機器碼的意思,然後把這塊內存當作函數去調用就是了。由於代碼自身就是動態生成的,在生成的代碼里直接嵌入resolve好的各種值其實就相當於傳統編譯流程里的「動態鏈接」的效果。順手放倆我以前博客的傳送門:V8實際上自帶一個用C++實現的「匯編器庫」用來動態生成機器碼。它並不把文本形式的匯編轉換為機器碼,而是提供一組C++ API,調用這個API的函數就可以在內存里生成機器碼來。有興趣的同學可能會知道,V8的MacroAssembler庫源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前輩。V8 Design Elements文檔里所描述的是最初期的V8的狀態。當時的V8隻有一個JIT編譯器,一個JavaScript函數通常只會被JIT編譯一次。這個JIT編譯器做的優化也不是很多。後來V8演化為擁有兩個JIT編譯器,一個初級編譯器(baseline compiler,名字叫做Full Code Generator,簡稱FullCodeGen),和一個優化編譯器(optimizing compiler,名字叫做Crankshaft),兩個編譯器結合在一次構成雙層編譯。JavaScript函數通常會先被FullCodeGen編譯,然後如果還繼續執行很多次的話則會再被Crankshaft重新編譯一遍,生成更優化的代碼。在這個架構中,FullCodeGen里生成的代碼還是跟V8 Design Elements的相似,會通過inline cache來實現property access;而這些inline cache不但用於實現fast property access,更重要的是它們會被用於收集profile,然後等到Crankshaft編譯的時候,它就可以看先前收集的profile來做profile-guided optimization。以這個 function foo(p) { return p.x } 為例,參數p沒有任何特別的地方,所以JavaScript引擎也無法知道p到底可能有怎樣的值。但通過FullCodeGen生成的代碼所收集到的profile信息,Crankshaft再去編譯 foo() 的時候就可以知道p之前通常指向一個Map(hidden class)為0x2c97ccb179d1的類型的對象。這個類型的constructor為Point、[[Prototype]] 為Point.prototype、對象里有足夠空間容納10個內嵌的欄位(in-object property),並且其中2個slot被用於存儲Smi類型,剩餘的8個slot未被使用。
『伍』 v8引擎可以調用http嗎
v8引擎只是個js解釋器(當然也有預編譯),調用http是具體mole乾的事兒,跟V8好像沒啥關系。
『陸』 nodejs v8 新特性——利用N-API編寫c++ node擴展
相信為nodejs寫過 c++擴展的人,都有過nodejs版本升級之後c++需要重新編譯的慘痛經歷。nodejs v8.0之後node官方推出了N-API 大大的解決了這一問題。
N-API 是獨立於v8引擎之外的模塊。用來向c++擴展程序提供介面,從而達到了c++擴展程序和v8引擎的隔離。因此在當nodejs版本變化之後c++擴展程序無需重新編譯也能運行。
下面我們來看如何利用N-API為nodejs寫一個簡單的擴展:
我們的例子只從nodejs方面講起。nodejs版本為8.x 。
首先安裝 node-gyp 用來編譯我們的擴展程序
『柒』 Vue/React 項目運行或者打包出現內存溢出解決方案
因為項目過大運行打包項目的時候報錯FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed
failed - JavaScript heap out of memory JavaScript堆內存不足,這里說的 JavaScript 其實就是 Node,我們都知道 Node 是基於V8引擎,在一般的後端開發語言中,在基本的內存使用上沒有什麼限制,在 Node 中通過 JavaScript 使用內存時只能使用部分內存(64位系統下約為1.4 GB,32位系統下約為0.7 GB),這就是我們編譯項目時為什麼會出現內存泄露了,因為前端項目如果非常的龐大,webpack 編譯時就會佔用很多的系統資源,如果超出了V8對 Node 默認的內存限制大小就會出現剛剛我截圖的那個錯誤了,那怎麼解決呢?V8依然提供了選項讓我們使用更多的內存。Node 在啟動時可以傳遞 --max-old-space-size 或 --max-new-space-size 來調整內存大小的使用限制。
React
一般情況如果用過第一種方案成功可以不使用第二種,我是遇到第一種配置內存還不起作用的時候用第二種方案生效。
全局安裝increase-memory-limit
命令行cmd窗口運行:npm install -g increase-memory-limit,
進入項目文件夾,運行:increase-memory-limit(只需要執行一次即可)
『捌』 請教java程序中如何使用webkit的js引擎
1、設置JS_ENGINE變數。有兩個值:jsc,v8。這是最方便的方式
2、如果JS_ENGINE變數沒有設置,或者設置的值不是jsc,v8其中的一個的話,這個makefile會選擇一個默認的引擎進行編譯。
對於默認引擎的選擇,主要取決於兩個變數ARCH_ARM_HAVE_VFP(是否支持VFP)和USE_ALT_JS_ENGINE(與安裝buildbot有關,這里不考慮,略過)。如果ARCH_ARM_HAVE_VFP為true的話,系統默認JS引擎選擇v8,否則選擇jsc
引擎確定後,接下來把JS引擎編譯為.a靜態庫libv8.a(使用v8引擎)或libjs.a(使用jsc引擎)
最後,編譯libwebcore.so
v8引擎位於/external/v8下面,編譯libwebcore.so時需要libv8.a。所以,如果是在/external/webkit下面使用mm的話,一定要確保v8已經被編譯過了
『玖』 node_moles中.gitattributes是什麼文件
node_moles中.gitattributes是node模塊文件。
node模塊的安裝分為全局模式和本地模式。
Node選擇了一種既能提高性能,又能減低開發復雜度的架構。這是一個非常重要的特性。並發編程通常很復雜且布滿地雷。Node繞過了這些,但仍提供很好的性能。
主要功能:
V8引擎本身使用了一些最新的編譯技術。這使得用Javascript這類腳本語言編寫出來的代碼運行速度獲得了極大提升,又節省了開發成本。對性能的苛求是Node的一個關鍵因素。 Javascript是一個事件驅動語言,Node利用了這個優點,編寫出可擴展性高的伺服器。
Node採用了一個稱為「事件循環(event loop)」的架構,使得編寫可擴展性高的伺服器變得既容易又安全。提高伺服器性能的技巧有多種多樣。
『拾』 關於V8引擎 350Z改裝
350Z是用來改的 而不是用來換大排量引擎的 shotgun808和yuma_asamis說的都十分有道理 你的這輛350Z要怎麼改首先要看你要用它來做什麼 而不要盲目的去改 其實日產VQ35DE是日產的當家名機 改裝套件也是很多的 只要稍加改動 達成四五百匹應該不成問題 如果您真的是發燒級玩家 那建議換上RB26DETT引擎 此引擎就是著名的GTR R34上用的引擎 改裝潛力十分巨大 經歷很多年直到今天仍然是改裝玩家們追捧的對象 RB26DETT引擎如果你有需要你可以把它改到1000匹 前提是你有足夠的錢
前面我提到改車的目的 如果練習漂移 則動力不是第一位的 有500匹左右就已經夠用 漂移看的是整車的平衡性 如調校發動機輸出特性 底盤 懸架 輪胎 整車重量 以及前後配重的等等 漂移基本上是用不到NOS 可以說完全沒那個必要
而如果要是用於直線加速或都市疾走那麼大馬力就非常必要 即使加裝 NOS也無可厚非 其實改裝最重要的就在乎平衡二字 原廠的車可以說是最平衡的 如果對其任何一個地方進行改動 就會打破這種平衡 而打破這種平衡之後 就要想方設法的讓車子再回到平衡的狀態 所以說一個好的改裝廠至關重要 不然如果改裝不當 那麼潛在的危險將無處不在 不過350Z的改裝套件已經相當成熟 到正規改裝店改裝可靠性還是很高的
最後和你說一說日系性能車 和 歐美性能車的區別 眾所周知的法拉利 蘭博基尼 道奇 雪弗蘭交叉火力 布加迪 邁凱輪SLR等等等等 這些車都動輒8缸 12缸 16缸 排量5.0至8.0不等 馬力基本都在450P往上百公里加速都是5妙俱樂部成員 極速更在280以上 而日系性能車呢 斯巴魯STI 三菱EVO 尼桑GTR(老款 因為新款已經和歐美性能車不差上下了)本田NSX
豐田SUPER 馬自達RX7等 這些日系性能車 最多也就是搭載六缸引擎 馬里都不超過300匹 這與日本以前的法律有關 但也顯示出了一種日本的用車文化 那就是不像歐美性能車那樣追求大排量多汽缸 而是注重於少汽缸配合渦輪 而在必要時便出現了改裝車 可以很負責任的告訴你 一輛改裝後七八百匹的GTR 蘭博基尼只有連剎車燈都看不到的份
所以說350Z裝V8是不現實的 另外碳纖維引擎蓋只要是真貨 就會有減輕車重的作用 剪刀門的改裝則不是一般改裝廠能勝任了得 改不好會破壞車的剛性 還會增加危險性 不建議改裝
最後祝你早日改好自己的350Z