導航:首頁 > 源碼編譯 > v8handle源碼

v8handle源碼

發布時間:2022-07-20 02:31:41

『壹』 v8引擎是如何知道js數據類型的

V8是谷歌開源的一個高性能javaScript引擎,用 C++ 實現,並用在谷歌的開源瀏覽器Chrome里。有些C/C++開發者有些奇怪的觀念。他們認為使用面向對象和設計模式會降低程序的性能。但V8證明了這種觀念是錯誤的。V8的實現使用了許多設計模式,但依然非常高效。觀察者設計模式是將演算法和演算法處理的對象分開的一種方式。這種分離可以在不修改結構本身的情況下,將新的操作添加到已有的對象結構上。這是一條遵循open/closed准則的方式。

與工廠模式相似,訪問者模式也為實現添加了封裝層。這樣讓其代碼更加可讀且可維護。V8源碼中許多類都實現了訪問者模式。JavaScript是一種動態編程語言:可以在對象運行時為對象添加或刪除熟悉。這意味著很容易改變對象的屬性。JSFunction和JSValue的父類都是JSObject,JSFunction用來表示一個javascript函數,JSValue用來表示一個javascript值。但沒有繼承自JSObject的類,用以表示Function或Value這樣的Class。許多JavaScript引擎使用詞典類型的數據結構來存儲這些對象的熟悉,訪問每個屬性都需要動態查找並解析屬性在內存中的位置。這種方式導致JavaScript在訪問對象變數的屬性時,比在Java或Smalltalk中要慢。在這些語言中,實列變數分配的位置是固定的,即由編譯器根據對象的類定義中的布局,在該對象在內存中的位置加上固定的偏移位置。因此訪問這些屬性僅僅是內存上的讀取或存儲,而這種操作通常只需一條指令。V8使用隱藏類概念來降低訪問JavaScript屬性所消耗的時間。V8不使用動態查詢來訪問屬性,而是在幕後創建隱藏類。出於效率因素而不使用面向對象或設計模式,這是一個錯誤的觀念。這樣只會獲得數毫秒的優化,卻失去了代碼的可讀性和可維護性。

『貳』 下了chrome源碼還要下JSV8源碼么

您好,
雖然Chrome瀏 覽器沒有完全解決內存尺寸問題,但是,它通過減少碎片來控制這個問題。在傳統的瀏覽器中,瀏覽器為一個線程分配一套虛擬內存。當然,每一個標簽都佔用這個 總內存集中的一個內存塊。隨著你打開更多的標簽,系統將分配更多的內存。但是,在你關閉標簽的時候,內存沒有完全恢復,不足以運行未來的標簽。你最終將遇 到標準的內存碎片問題。
但是,在Chrome瀏覽器中,每一個標簽都有自己的線程。你沒有看錯,不是每一個Chrome的窗口,而是每一個標簽。Cogswell說,我做了20多年的開發工作。我從來沒有看到一個窗口能夠託管多個線程。但是,Chrome瀏覽器確實做到了。
Cogswell說,如果我目前的標簽上有一個網頁,我在地址欄輸入一個新的URL地址的時候,與那個網頁有關的chrome.exe命令請求就關閉了,並且開始一個新的chrome.exe命令請求。這樣做是很完美的:不用輸入命令清除分配給已經關閉的網頁的內 存,Chrome瀏覽器將完全消除整個線程,然後開始一個新的線程。這是Chrome瀏覽器阻止內存碎片以及保護和隔離每一個網頁的又一種方法。
更有趣的是在我裝載雅虎網站www.yahoo.com的時候發現了一個奇怪的現象。我看到啟動了兩個線程。但是,對於谷歌搜索引擎 www.google.com那種比較小的網頁,我僅看到了一個流程。當我查看命令行的時候我發現原來輸入命令行參數設置了一個插件。那是一個叫做插件路 徑的額外的參數,設置是c:/windows/system32/macromed/flash/npswf32.dll
那是Flash播放器。Chrome為嵌入在網頁的Flash播放器啟動了另一個線程。當我在Chrome瀏覽器 中保持雅虎網頁處於打開狀態並且關閉分配給Flash播放器的線程的時候,Chrome在雅虎網頁上面顯示一個提示並且用一個Flash標識取代了那個 Flash窗口,Flash標識上面有一個失望的面孔。

『叄』 如何編寫Node.js插件

現在我們要做的是定義一個與JavaScript Object.prototype.constructor運作效果相同的方法:

v8::Handle STDStringWrapper::New(const v8::Arguments& args) {

我們首先需要為其創建一個范圍:

v8::HandleScope scope;

在此之後,我們可以利用args對象的.IsConstructCall()方法來檢查該構造函數是否能夠利用new關鍵詞加以調用:

if (args.IsConstructCall()) {

如果可以,我們首先如下所示將參數傳遞至std::string處:

v8::String::Utf8Value str(args[0]->ToString()); std::string s(*str);

……這樣我們就能將它傳遞到我們封裝類的構造函數當中了:
STDStringWrapper* obj = new STDStringWrapper(s);

在此之後,我們可以利用之前創建的該對象的.Wrap()方法(繼承自node::ObjectWrap)來將它分配給this變數:

obj->Wrap(args.This());

最後,我們可以返回這個新創建的對象:
return args.This();

如果該函數無法利用new進行調用,我們也可以直接調用構造函數。接下來,我們要做的是為參數計數設置一個常數:

} else { const int argc = 1;

現在我們需要利用自己的參數創建一個數組:
v8::Local argv[argc] = { args[0] };

然後將constructor->NewInstance方法的結果傳遞至scope.Close,這樣該對象就能在隨後發揮作用(scope.Close基本上允許大家通過將對象處理句柄移動至更高范圍的方式對其加以維持——這也是函數的起效方式):

return scope.Close(constructor->NewInstance(argc, argv)); } }

『肆』 如何查看javascript的源碼

大名鼎鼎的Chrome瀏覽器的javascript引擎V8是開源的。你可以下載V8的源碼看。

『伍』 求通達信公式高手將指標源碼拆解成兩個通達信選股公式,重酬

1、粉色柱出現第一天選股買入股票:
V1:=(C*2+H+L)/4*10;
V2:=EMA(V1,13)-EMA(V1,34);
V3:=EMA(V2,5);
V4:=2*(V2-V3)*5.5;
主力進:=IF(V4>=0,V4,0),COLORFF00FF;
V11:=3*SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1)-2*SMA(SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1),3,1);
趨勢線:=EMA(V11,3);
XG:REF(主力進 AND 趨勢線<13,1)=0 AND 主力進 AND 趨勢線<13=1;

2、綠柱出現第一天預警賣出股票:
V8:=(INDEXC*2+INDEXH+INDEXL)/4;
V9:=EMA(V8,13)-EMA(V8,34);
VA:=EMA(V9,3);
VB:=(V9-VA)/2;
大盤資金撤走:=IF(VB<=0,VB,0),COLORGREEN;
V11:=3*SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1)-2*SMA(SMA((C-LLV(L,55))/(HHV(H,55)-LLV(L,55))*100,5,1),3,1);
趨勢線:=EMA(V11,3);
賣出:REF(大盤資金撤走 AND 趨勢線>90,1)=0 AND 大盤資金撤走 AND 趨勢線>90=1;

不為別的,為了你的高分,必須滴!不許食言啊!

『陸』 我的Handle V8更新時斷電了

按F8能用安全模式進入最好不過了,修復一次再去更新,如果安全模式無法進入,建議你重裝系統了,有可能斷電導致系統數據丟失!

『柒』 v8是什麼軟體

  1. Lars Bak是這個項目的組長,目前該JavaScript引擎已用於其它項目的開發。第一個版本隨著第一個版本的Chrome於2008年9月2日發布。

  2. V8使用C++開發,並在谷歌瀏覽器中使用。在運行JavaScript之前,相比其它的JavaScript的引擎轉換成位元組碼或解釋執行,V8將其編譯成原生機器碼(IA-32,x86-64,ARM, orMIPSCPUs),並且使用了如內聯緩存(inline caching)等方法來提高性能。有了這些功能,JavaScript程序在V8引擎下的運行速度媲美二進製程序。

  3. V8中實現的ECMAScript中指定 ECMA - 262 ,第3版 運行在Windows XP和Vista,Mac OS X的10.5(雪豹和Linux系統使用IA - 32或ARM處理器。

  4. V8可以獨立運行,也可以 嵌入 到任何C++應用程序。項目託管在Google Code上,基於BSD協議,任何組織或個人可以將其源碼用於自己的項目中。

『捌』 如何直接復制node

一、編寫Node.js原生擴展Node.js是一個強大的平台,理想狀態下一切都都可以用javascript寫成。然而,你可能還會用到許多遺留的庫和系統,這樣的話使用c++編寫Node.JS擴展會是一個不錯的注意。以下所有例子的源代碼可在node擴展示例中找到。編寫Node.jsC++擴展很大程度上就像是寫V8的擴展;Node.js增加了一些介面,但大部分時間你都是在使原始的V8數據類型和方法,為了理解以下的代碼,你必須首先閱讀V8引擎嵌入指南。Javascript版本的HelloWorld在講解C++版本的例子之前,先讓我們來看看在Node.js中用Javascript編寫的等價模塊是什麼樣子。這是一個最簡單的HelloWorld,也不是通過HTTP,但它展示了node模塊的結構,而其介面也和大多數C++擴展要提供的介面差不多:HelloWorldJs=function(){this.m_count=0;};HelloWorldJs.prototype.hello=function(){this.m_count++;return「HelloWorld」;};exports.HelloWorldJs=HelloWorldJs;正如你所看到的,它使用prototype為HelloWorldJs類創建了一個新的方法。請注意,上述代碼通過將HelloWorldJS添加到exports變數來暴露構造函數。要在其他地方使用該模塊,請使用如下代碼:varhelloworld=require(『helloworld_js』);varhi=newhelloworld.HelloWorldJs();console.log(hi.hello());//prints「HelloWorld」tostdoutC++版本的HelloWorld要開始編寫C++擴展,首先要能夠編譯Node.js(請注意,我們使用的是Node.js2.0版本)。本文所講內容應該兼容所有未來的0.2.x版本。一旦編譯安裝完node,編譯模塊就不在需要額外的東西了。完整的源代碼可以在這里找到。在使用Node.js或V8之前,我們需要包括相關的頭文件:#include#includeusingnamespacenode;usingnamespacev8;在本例子中我直接使用了V8和node的命名空間,使代碼更易於閱讀。雖然這種用法和谷歌的自己的C++編程風格指南相悖,但由於你需要不停的使用V8定義的類型,所以目前為止的大多數node的擴展仍然使用了V8的命名空間。接下來,聲明HelloWorld類。它繼承自node::ObjectWrap類,這個類提供了幾個如引用計數、在V8內部傳遞contex等的實用功能。一般來說,所有對象應該繼承ObjectWrap:classHelloWorld:ObjectWrap{private:intm_count;public:聲明類之後,我們定義了一個靜態成員函數,用來初始化對象並將其導入Node.js提供的target對象中。設個函數基本上是告訴Node.js和V8你的類是如何創建的,和它將包含什麼方法:staticPersistents_ct;staticvoidInit(Handletarget){HandleScopescope;Localt=FunctionTemplate::New(New);s_ct=Persistent::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++構造函數:staticHandleNew(constArguments&args){HandleScopescope;HelloWorld*hw=newHelloWorld();hw->Wrap(args.This());returnargs.This();}此段代碼相當於上面Javascript代碼中使用的構造函數。它調用newHelloWorld創造了一個普通的C++對象,然後調用從ObjectWrap繼承的Wrap方法,它將一個C++HelloWorld類的引用保存到args.This()的值中。在包裝完成後返回args.This(),整個函數的行為和javascript中的new運算符類似,返回this指向的對象。現在我們已經建立了對象,下面介紹在Init函數中被綁定到hello的函數:staticHandleHello(constArguments&args){HandleScopescope;HelloWorld*hw=ObjectWrap::Unwrap(args.This());hw->m_count++;Localresult=String::New(「HelloWorld」);returnscope.Close(result);}函數中首先使用ObjectWrap模板的方法提取出指向HelloWorld類的指針,然後和javascript版本的HelloWorld一樣遞增計數器。我們新建一個內容為「HelloWorld」的v8字元串對象,然後在關閉本地作用域的時候返回這個字元串。上面的代碼實際上只是針對v8的介面,最終我們還需要讓Node.js知道如何動態載入我們的代碼。為了使Node.js的擴展可以在執行時從動態鏈接庫載入,需要有一個dlsym函數可以識別的符號,所以執行編寫如下代碼:extern「C」{staticvoidinit(Handletarget){HelloWorld::Init(target);}NODE_MODULE(helloworld,init);}由於c++的符號命名規則,我們使用externC,以便該符號可以被dysym識別。init方法是Node.js載入模塊後第一個調用的函數,如果你有多個類型,請全部在這里初始化。NODE_MODULE宏用來填充一個用於存儲模塊信息的結構體,存儲的信息如模塊使用的API版本。這些信息可以用來防止未來因API不兼容導致的崩潰。到此,我們已經完成了一個可用的C++NodeJS擴展。Node.js也提供了一個用於構建模塊的簡單工具:node-waf首先編寫一個包含擴展編譯方法的wscript文件,然後執行node-wafconfigure&&node-wafbuild完成模塊的編譯和鏈接工作。對於這個helloworld的例子來說,wscript內容如下:defset_options(opt):opt.tool_options(「compiler_cxx」)defconfigure(conf):conf.check_tool(「compiler_cxx」)conf.check_tool(「node_addon」)defbuild(bld):obj=bld.new_task_gen(「cxx」,「shlib」,「node_addon」)obj.cxxflags=[「-g」,「-D_FILE_OFFSET_BITS=64」,「-D_LARGEFILE_SOURCE」,「-Wall」]obj.target=「helloworld」obj.source=「helloworld.cc」非同步IO的HelloWorld對於實際的應用來說,HelloWorld的示例太過簡單了一些,Node.js主要的優勢是提供非同步IO。Node.js內部通過libeio將會產生阻塞的操作全都放入線程池中執行。如果需要和遺留的c庫交互,通常需要使用非同步IO來為javascript代碼提供回調介面。通常的模式是提供一個回調,在非同步操作完成時被調用——你可以在整個Node.js的API中看到這種模式。Node.js的filesystem模塊提供了一個很好的例子,其中大多數的函數都在操作完成後通過調用回調函數來傳遞數據。和許多傳統的GUI框架一樣,Node.js只在主線程中執行JavaScript,因此主線程以外的任何操作都不應該直接和V8或Javascript交互。同樣helloworld_eio.cc源代碼在GitHub上。我只強調和原來HelloWorld之間的差異,其中大部分代碼保持不變,變化集中在Hello方法中:staticHandleHello(constArguments&args){HandleScopescope;REQ_FUN_ARG(0,cb);HelloWorldEio*hw=ObjectWrap::Unwrap(args.This());在Hello函數的入口處,我們使用宏從參數列表的第一個位置獲取回調函數,在下一節中將詳細介紹。然後,我們使用相同的Unwarp方法提取指向類對象的指針。hello_baton_t*baton=newhello_baton_t();baton->hw=hw;baton->increment_by=2;baton->sleep_for=1;baton->cb=Persistent::New(cb);這里我們創建一個baton結構,並將各種參數保存在裡面。請注意,我們為回調函數創建了一個永久引用,因為我們想要在超出當前函數作用域的地方使用它。如果不這么做,在本函數結束後將無法再調用回調函數。hw->Ref();eio_custom(EIO_Hello,EIO_PRI_DEFAULT,EIO_AfterHello,baton);ev_ref(EV_DEFAULT_UC);returnUndefined();}如下代碼是真正的重點。首先,我們增加HelloWorld對象的引用計數,這樣在其他線程執行的時候他就不會被回收。函數eio_custom接受兩個函數指針作為參數。EIO_Hello函數將在線程池中執行,然後EIO_AfterHello函數將回到在「主線程」中執行。我們的baton結構也被傳遞進各函數,這些函數可以使用baton結構中的數據完成相關的操作。同時,我們也增加eventloop的引用。這很重要,因為如果eventloop無事可做,Node.js就會退出。最終,函數返回Undefined,因為真正的工作將在其他線程中完成。staticintEIO_Hello(eio_req*req){hello_baton_t*baton=static_cast(req->data);sleep(baton->sleep_for);baton->hw->m_count+=baton->increment_by;return0;}這個回調函數將在libeio管理的線程中執行。首先,解析出baton結構,這樣可以訪問之前設置的各種參數。然後sheepbaton->sleep_for秒,這么做是安全的,因為這個函數運行在獨立的線程中並不會阻塞主線程中javascript的執行。然後我們的增計數器,在實際的系統中,這些操作通常需要使用Lock/Mutex進行同步。當上述方法返回後,libeio將會通知主線程它需要在主線成上執行代碼,此時EIO_AfterHello將會被調用。staticintEIO_AfterHello(eio_req*req){HandleScopescope;hello_baton_t*baton=static_cast(req->data);ev_unref(EV_DEFAULT_UC);baton->hw->Unref();進度此函數時,我們提取出baton結構,刪除事件循環的引用,並減少HelloWorld對象的引用。Localargv[1];argv[0]=String::New(「HelloWorld」);TryCatchtry_catch;baton->cb->Call(Context::GetCurrent()->Global(),1,argv);if(try_catch.HasCaught()){FatalException(try_catch);}新建要傳遞給回調函數的字元串參數,並放入字元串數組中。然後我們調用回調傳遞一個參數,並檢測可能拋出的異常。baton->cb.Dispose();deletebaton;return0;}在執行過回調之後,應該銷毀持久引用,然後刪除之前創建的baton結構。最後,你可以使用如下形式在Javascript中使用該模塊:varhelloeio=require(『./helloworld_eio』);hi=newhelloeio.HelloWorldEio();hi.hello(function(data){console.log(data);});參數傳遞與解析除了HelloWorld之外,你還需要理解最後一個問題:參數的處理。在helloWorldEIO例子中,我們使用一個REQ_FUN_ARG宏,然我們看看這個宏到底都做些什麼。#defineREQ_FUN_ARG(I,VAR)\if(args.Length()IsFunction())\returnThrowException(Exception::TypeError(\String::New(「Argument」#I」mustbeafunction」)));\LocalVAR=Local::Cast(args[I]);就像Javascript中的argument變數,v8使用數組傳遞所有的參數。由於沒有嚴格的類型限制,所以傳遞給函數的參數數目可能和期待的不同。為了對用戶友好,使用如下的宏檢測一下參數數組的長度並判斷參數是否是正確的類型。如果傳遞了錯誤的參數類型,該宏將會拋出TypeError異常。為簡化參數的解析,目前為止大多數的Node.js擴展都有一些本地作用域內的宏,用於特定類型參數的檢測。二、揭秘node.js事件要使用NodeJS,你需要知道一個重要的東西:事件(events)。Node中有很多對象都可以觸發事件,Node的文檔中有很多示例。但文檔也許並不能清晰的講解如何編寫自定義事件以及監聽函數。對於一些簡單的程序你可以不使用自定義事件,但這樣很難應對復雜的應用。那麼如何編寫自定義事件?首先需要了解的是在node.js中的』events』模塊。快速概覽要訪問此模塊,只需使用如下語句:require(『events』)requires(『events』).EventEmitter特別說明,node中所有能觸發事件的對象基本上都是後者的實例。讓我們創建一個簡單的演示程序Dummy:mmy.jsviewplaintoclipboardprint?//basicimportsvarevents=require(『events』);//forustodoarequirelatermole.exports=Dummy;functionDummy(){events.EventEmitter.call(this);}10.11.//inheritevents.EventEmitter12.Dummy.super_=events.EventEmitter;13.Dummy.prototype=Object.create(events.EventEmitter.prototype,{14.constructor:{15.value:Dummy,16.enumerable:false17.}18.});//basicimportsvarevents=require(『events』);//forustodoarequirelatermole.exports=Dummy;functionDummy(){events.EventEmitter.call(this);}//inheritevents.EventEmitterDummy.super_=events.EventEmitter;Dummy.prototype=Object.create(events.EventEmitter.prototype,{constructor:{value:Dummy,enumerable:false}});上述代碼中重點展示如何使用EventEmitter擴充對象,並從中繼承所有的原型對象,方法…等等。現在,我們假設Dummy有一個cooking()的方法,一旦把食物做熟之後它會觸發』cooked』事件,並調用一個名為』eat』的回調函數。mmy-cooking.jsviewplaintoclipboardprint?Dummy.prototype.cooking=function(chicken){varself=this;self.chicken=chicken;self.cook=cook();//assumemmyfunctionthat』lldothecookingself.cook(chicken,function(cooked_chicken){self.chicken=cooked_chicken;self.emit(『cooked』,self.chicken);});10.returnself;11.}Dummy.prototype.cooking=function(chicken){varself=this;self.chicken=chicken;self.cook=cook();//assumemmyfunctionthat』lldothecookingself.cook(chicken,function(cooked_chicken){self.chicken=cooked_chicken;self.emit(『cooked』,self.chicken);});returnself;}

『玖』 搜貓搜索引擎 V8.5 V9.0 的源碼,誰有,求好心人送我一套!求求各位了,草包站長用來建站的,拜託了各位了

雖然沒有,先板凳下

閱讀全文

與v8handle源碼相關的資料

熱點內容
linux內核根文件系統 瀏覽:233
3d的命令面板不見了 瀏覽:518
武漢理工大學伺服器ip地址 瀏覽:139
亞馬遜雲伺服器登錄 瀏覽:515
安卓手機如何進行文件處理 瀏覽:62
mysql執行系統命令 瀏覽:921
php支持curlhttps 瀏覽:134
新預演算法責任 瀏覽:435
伺服器如何處理5萬人同時在線 瀏覽:242
哈夫曼編碼數據壓縮 瀏覽:415
鎖定伺服器是什麼意思 瀏覽:376
場景檢測演算法 瀏覽:608
解壓手機軟體觸屏 瀏覽:339
方舟pv怎麼轉伺服器 瀏覽:100
數據挖掘中誤差值演算法函數 瀏覽:119
php開發套件 瀏覽:191
伺服器的spi板是什麼 瀏覽:897
解壓縮全能王中文密碼是什麼 瀏覽:81
javaftp伺服器上傳文件 瀏覽:104
演算法設計中文版pdf 瀏覽:82