v8引擎編譯
㈠ 什麼是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未被使用。
㈢ Chrome的Javas Script中的V8引擎是什麼原理
V8引擎先將JavaScript代碼編譯成二進制的機器碼的,而非位元組碼或是直接解釋,然後再執行它,以此提升效能。
㈣ 為什麼用c++寫的v8引擎可以編譯js
v8本來就是js的解釋器啊, chrome的js就是運行在v8上面的。
㈤ 新手應該如何讀GoogleV8引擎源代碼
新手的不太建議讀v8源代碼。新手如果通過v8學c++,估計在成功編譯之前就放棄了。我記得某個v8的developer在wingolog一系列關於v8分析的文章(posts tagged "v8")的comment里,或者是Lars,曾經提到v8不是用來學的,因為它存在的目的就是為了最高性能,裡面用了大量的奇巧淫技,比如說small integer表示,比如說把浮點數轉化成字元串的Grisus3演算法(http://florian.loitsch.com/publications/dtoa-pldi2010.pdf?attredirects=0). 另外,處於速度考慮,v8和普通的編譯器/虛擬機不太一樣,沒有太多control flow analysis和data flow analysis(至少我看的時候是這樣)。
需要知道的是,Lars原來是做Hotspot VM的,裡面大量的思想來自大神Urs Hölzle。大名鼎鼎的on stack replacement,polymorphic inline cache等等完全可以在Urs Hölzle二十年前的博士論文里可以找的到,所以要看懂v8這些理論少不了; V8里的hydrogen指令更是用來自Hotspot的C1Visualizer可以看,所以我想如果要學習的話,還不如先看看wingolog的這一系列v8文章:posts tagged "v8",以及Urs Hölzle的博士論文和相關論文http://i.stanford.e/pub/cstr/reports/cs/tr/94/1520/CS-TR-94-1520.pdf,最後最好還要熟悉virtual machine的實現。比如各種GC演算法,不然看v8里的對象管理你就直接暈了。有了這些理論打底,熟悉一般的compiler和virtual machine implementation,而且還熟悉ecmascript spec,熟悉C++的話,倒是可以開始看了...但如果你這些都熟悉,那看v8幹嘛呢?給它做code review? 比較有意思的是這些理論都熟悉了,然後比較各種javascript的實現。比如在對象表示上mozilla就不是v8的smi tag,而是利用NaN boxing;比如是直接inteprete還是像v8那樣有highlevel IR和lowlevel IR;等等。
㈥ V8引擎是什麼意思
簡單的說V是氣缸的排列方式,8是氣缸的數量
汽車發動機常用缸數有3、4、5、6、8、10、12缸。排量1L以下的發動機常用3缸;(1~2.5)L一般為4缸發動機;3L左右的發動機一般為6缸;4L左右為8缸;5.5L以上用12缸發動機。一般來說,在同等缸徑下,缸數越多,排量越大,功率越高;在同等排量下,缸數越多,缸徑越小,轉速可以提高,從而獲得較大的提升功率。
氣缸的排列形式主要有直列、V形、W形等。 一般5缸以下發動機的氣缸多採用直列方式排列,少數6缸發動機也有直列方式的,過去也有過直列8缸發動機。直列發動機的氣缸體成一字排開,缸體、缸蓋和曲軸結構簡單,製造成本低,低速扭矩特性好,燃料消耗少,應用比較廣泛,缺點是功率較低。一般1L以下的汽油機多採用3缸直列,(1—2.5)L汽油機多採用直列4缸,有的四輪驅動汽車採用直列6缸,因為其寬度小,可以在旁邊布置增壓器等設施。直列6缸的動平衡較好,振動相對較小,所以也為一些中、高極轎車採用。(6—12)缸發動機一般採用V形排列,其中V10發動機主要裝在賽車上。V形發動機長度和高度尺寸小,布置起來非常方便,而且一般認為V形發動機是比較高級的發動機,也成為轎車級別的標志之一。V8發動機結構非常復雜,製造成本很高,所以使用得較少。V12發動機過大過重,只有極個別的高級轎車採用。目前最常見的發動機主要是直列4缸(L4)與V型6缸(V6)發動機。一般來說V6發動機的排量較L4的為高,V6機比L4運行平穩、安靜。L4主要裝在普通級轎車上,而v6機則裝在中高檔轎車上。
㈦ 如何在程序中嵌入google的V8 Javascript引擎
V8是一個由丹麥Google開發的開源JavaScript引擎,用於Google Chrome中。V8在執行之前將JavaScript編譯成了機器碼,而非位元組碼或是直譯它,以此提升效能。更進一步,使用了如內聯緩存(inline caching)。
下面是一個簡單的Demo,通過google的V8引擎的來實現這個功能。
Demo的JavaScript代碼如下:
function draw(dc)
{
drawer.drawLine(dc, 0xFF, 5, 100, 100, 200, 200);
drawer.drawLine(dc, 0xFF0000, 10, 50, 50, 300, 200);
drawer.drawFrame(dc, 0x00FF00, 2, 350, 200, 500, 400);
drawer.fillRect(dc, 0xFF00FF, 50, 400, 150, 500);
}
具體怎麼實現的可以參考上面源碼。
㈧ V8引擎示例中如下的編譯選項什麼意思
V8和V10指的是引擎里的氣缸數缸數汽車發動機常用缸數有3、4、5、6、8、10、12缸。排量1升以下的發動機常用三缸,1-2.5升一般為四缸發動機,3升左右的發動機一般為6缸,4升左右為8缸,5.5升以上用12缸發動機。一般來說,在同等缸徑下,缸數越多,排量越大,功率越高;在同等排量下,缸數越多,缸徑越小,轉速可以提高,從而獲得較大的提升功率。6-12缸發動機一般採用V型排列,其中V10發動機主要裝在賽車上。V型發動機長度和高度尺寸小,布置起來非常方便,而且一般認為V型發動機是比較高級的發動機,也成為轎車級別的標志之一。V8發動機結構非常復雜,製造成本很高,所以使用的較少,V12發動機過大過重,只有極個別的高級轎車採用。2006賽季F1賽車引擎由3.0升V10變為2.4升V8,目的是為了降低各車隊的引擎研發等開支,同時提高比賽安全性。此項規則改動將導致引擎輸出功率相比2005賽季(900馬力左右)降低約200馬力。對於無法在2006賽季開始時獲得新規則規定的V8引擎的車隊,也允許其在限制引擎轉速的情況下,使用符合2005賽季技術規則的V10引擎。
㈨ 誰能介紹一下 JavaScript V8引擎
oogle強調的新功能是一個叫做V8的JavaScript渲染引擎。該引擎的亮點在於更快速更強壯的JavaScript解析。V8是一個非常反傳統的JavaScript引擎,它能夠在後台動態的對JS的對象進行分類——一個在其他高級語言中很常見但JS本身不支持的特性。V8對JS的解析不是基於反復loop源代碼進行解釋而是直接將JS代碼編譯成機器碼運行。換句話說,V8引擎實際上可以看做是JS的擴展和編譯器——而傳統上類似於JS的解釋型語言恰恰是不需要編譯器的。最後,高級語言的內存管理效能一直是決定其運行效率的重要因素,而當前的JS虛擬機在這方面做的比較基本,對內存的回收也非常保守。V8使用的是非常強勢的內存管理策略,一切在運行堆棧里無用的數據都會被強行回收,從而可以大大提高JS代碼的運行效率。
㈩ 什麼是V8引擎
簡單的說V是氣缸的排列方式,8是氣缸的數量
汽車發動機常用缸數有3、4、5、6、8、10、12缸。排量1L以下的發動機常用3缸;(1~2.5)L一般為4缸發動機;3L左右的發動機一般為6缸;4L左右為8缸;5.5L以上用12缸發動機。一般來說,在同等缸徑下,缸數越多,排量越大,功率越高;在同等排量下,缸數越多,缸徑越小,轉速可以提高,從而獲得較大的提升功率。
氣缸的排列形式主要有直列、V形、W形等。
一般5缸以下發動機的氣缸多採用直列方式排列,少數6缸發動機也有直列方式的,過去也有過直列8缸發動機。直列發動機的氣缸體成一字排開,缸體、缸蓋和曲軸結構簡單,製造成本低,低速扭矩特性好,燃料消耗少,應用比較廣泛,缺點是功率較低。一般1L以下的汽油機多採用3缸直列,(1-2.5)L汽油機多採用直列4缸,有的四輪驅動汽車採用直列6缸,因為其寬度小,可以在旁邊布置增壓器等設施。直列6缸的動平衡較好,振動相對較小,所以也為一些中、高極轎車採用。(6-12)缸發動機一般採用V形排列,其中V10發動機主要裝在賽車上。V形發動機長度和高度尺寸小,布置起來非常方便,而且一般認為V形發動機是比較高級的發動機,也成為轎車級別的標志之一。V8發動機結構非常復雜,製造成本很高,所以使用得較少。V12發動機過大過重,只有極個別的高級轎車採用。目前最常見的發動機主要是直列4缸(L4)與V型6缸(V6)發動機。一般來說V6發動機的排量較L4的為高,V6機比L4運行平穩、安靜。L4主要裝在普通級轎車上,而v6機則裝在中高檔轎車上。