js編譯為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]。
Ⅱ 請教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已經被編譯過了
Ⅲ 什麼叫中間語言
中間語言MSIT
在.Net框架中,公共語言基礎結構使用公共語言規范來綁定不同的語言。通過要求不同的語言至少要實現公共類型系統(CTS)包含在公共語言規范中的部分,公共語言基礎結構允許不同的語言使用.Net框架。因此在.Net框架中,所有的語言(C#,VB.Net,Effil.Net等)最後都被轉換為了一種通用語言:微軟中間語言(MSIL)。
MSIL是將.Net代碼轉化為機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一個.Net程序時,編譯器將源代碼翻譯成一組可以有效地轉換為本機代碼且獨立於CPU 的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼。由於公共語言運行庫支持多種實時編譯器,因此同一段MSIL代碼可以被不同的編譯器實時編譯並運行在不同的結構上。從理論上來說,MSIL將消除多年以來業界中不同語言之間的紛爭。在.Net的世界中可能出現下面的情況:一部分代碼可以用Effil實現,另一部分代碼使用C#或VB完成的,但是最後這些代碼都將被轉換為中間語言。這給程序員提供了極大的靈活性,程序員可以選擇自己熟悉的語言,並且再也不用為學習不斷推出的新語言而煩惱了。
解密微軟中間語言的系列文章將通過一些簡單易懂的方式來揭示中間語言的復雜原理。這些原理通過詳細的例子來闡述。在一些例子中同時給出了源代碼和中間代碼,通過比較源代碼和中間代碼,我們可以更好地理解編譯器的局限性,指導我們編寫出更好更快的代碼。
微軟中間語言概述 1.用中間語言編寫的一個簡單程序
讓我們從經典的Hello World例子開始。首先在一個文本編輯器中輸入以下的代碼,並保存為HelloWorld.il:
.assembly HelloWorldIL {}
.method static void HelloWorld() {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
在一個中間語言程序中,如果某一行以「.」開始,則代表這是一個傳輸給匯編工具的指令,該指令要求匯編工具執行某些操作,例如生成一個函數或類。而沒有以「.」開始的行是中間語言的代碼。在中間語言中方法通過匯編命令method來定義,匯編命令後跟方法的返回值、名稱和參數。方法體被包含在{}中。例子中的ret代表該方法的結束。
一個中間語言文件可以包含很多函數,匯編工具沒有辦法分辨應該首先執行哪一個方法。在諸如C#或VB這一類高級語言中,程序的入口方法通常都有特定的名稱,例如在C#中的public static void Main()。這就是上面的匯編工具發出錯誤提示的原因。在中間語言中,第一個被執行的方法被稱為入口函數(EntryPoint Function)。為了告訴匯編工具HelloWorld是入口函數,我們需要在代碼中增加一條匯編命令entrypoint,該命令可以放在方法體中的任何位置。需要注意的是在一個程序集中只能有一個入口函數。
中間語言代碼通常被編譯成一個模塊,該模塊隸屬於一個程序集。在.Net中模塊和程序集的概念非常重要,因此開發人員需要很清楚地了解它們。在後面的文章中我們將詳細討論.Net程序的結構。通過在代碼中加入assembly命令,可以告訴匯編工具中間代碼隸屬於那個程序集。assembly命令的格式如下:
.assembly <程序集名稱> {}
需要注意在method命令後加入了static關鍵字,這是因為每個入口函數必須是靜態的,例如在C#中我們將Main方法定義為public static void Main()。
接下來我們需要調用WriteLine方法將HelloWorld字元串輸出到屏幕。通過使用call指令(Instruction)我們可以達到這個目的。指令的格式如下:
call <return type> <namespace>.<class name>::<method name>
這里我們可以看到當調用一個方法時,中間語言和其他的編程語言有很大的區別。在中間語言中,如果需要調用一個方法,需要指定方法的全名,包括他的名稱域(namespace)、類名、返回值類型和參數的數據類型。這樣就保證了匯編工具能夠找到正確的方法。
在調用WriteLine方法時需要一個字元串參數。所有傳遞給方法或函數的參數都被保存在內存的堆棧中。在中間語言中有一個指令ldstr可以從堆棧中載入一個字元串。(堆棧是內存中的一塊區域,它被用於將參數傳輸給方法,在後面我們會詳細討論堆棧的問題)。所有的方法都從堆棧中獲取它們的參數,因此ldstr指令是必不可少的。ldstr指令的格式如下所示:
ldstr <parameter string>
我們可以用ILAsm.exe來編譯這個程序。在運行ILAsm.exe之前,首先需要確認一下該程序已經包含在了Windows操作系統的Path環境變數中。ILAsm.exe 可在下面的路徑中找到:
%windir%\Microsoft.NET\Framework\v1.0.xxxx
其中xxxx是正在使用的.NET框架的內部版本號。例如我使用的版本號是3705,則應該如下設置Path環境變數:
Set Path = %Path%;c:\Windows\Microsoft.NET\Framework\v1.0.3705
然後運行cmd.exe(開始->運行->輸入cmd->按下確認鍵)。在彈出的命令窗口中輸入:
J:\Testcode>ilasm HelloWorld.il
匯編代碼後運行程序就可以看到Hello World.的輸出。
通過上面的例子,我們了解了中間語言的程序結構,一些命令和指令。同時需要提醒大家的是中間語言是區分大小寫的。
2.改進的HelloWorld例子
在.Net中的所有語言都是面向對象的語言,但是上面的HelloWorld例子是一個結構化的例子。下面讓我們來看一下如何將它轉化為面向對象的代碼。在面向對象的編程中,我們將操作定義在類中。為了將上面的HelloWorld例子轉化為面向對象的代碼,可以使用class命令:
.class HelloWorld { }
class命令後緊跟的是類的名稱。類的名稱在中間語言中是可選的。同時我們還需要為該指令添加一些屬性,例如存取控制類在內存中的布局和互用性等。這樣代碼就變成了:
.assembly HelloWorldIL {}
.class public auto ansi HelloWorld extends [mscorlib]System.Object {
.method public hidebysig static void HelloWorld() cil managed {
.entrypoint
ldstr "Hello World."
call void [mscorlib]System.Console::WriteLine(class System.String)
ret
}
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed {
ldarg.0
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
在代碼中用到了三個屬性:
· public:public是訪問控制屬性,它表明了對於訪問該類的成員沒有限制。
· auto:auto屬性表明了當類被載入到內存中時,在內存中的布局是由公共運行庫而不是程序決定的。
· ansi:指定ansi屬性是為了在沒有被管理和被管理的代碼之間實現無縫的轉化。在.Net中,那些不可直接應用在公共語言基礎設施之上的代碼被稱為沒有被管理的代碼,例如C、C++和VB6的代碼。我們需要一個屬性來處理被管理的代碼和沒有被管理的代碼之間的互用性。在被管理的代碼中,字元串用雙位元組的Unicode字元表示,而在被管理的代碼中,字元串有可能用單位元組的ANSI字元表示。指定了ansi屬性就可以在不同的代碼間轉化字元串了。
我們知道在.Net框架中,所有的類都直接或間接地繼承了System.Object類。在代碼中我們明確指定了HelloWorld繼承了System.Object。
在HelloWorld方法中加入了public、hidebysig、cil managed屬性,下面是對這些屬性的解釋:
· public:在C#或VB.Net中,當我們定義一個方法時,需要指定方法的訪問修飾符。訪問修飾符可以是public、protected、internal或private 。
· hidebysig:一個類可以繼承其他的類,hidebysig屬性保證當前類中的方法在作為父類時不會被子類繼承。例如如果HelloWorldChild類繼承了HelloWorld類,在HelloWorldChild中不會看到HelloWorld方法。
· cil managed:該屬性將在後面討論。
在高級語言中(C#,VB.Net等),每個類必須有構造函數,而且構造函數的第一行需要調用基類的構造函數。如果類中沒有構造函數,基類的構造函數將被自動調用。通常這是由編譯器自動完成的,現在我們要在的代碼中加入構造函數,該構造函數通過.ctor命令調用基類的構造函數。
小結
本文我們從經典的Hello World例子開始,通過實例了解了微軟中間語言的基本語法規則以及中間語言與其他開發語言的關系。在下一篇文章中,我們將在此基礎上,運用實常式序講述.net應用程序的格式和結構等內容。
Ⅳ js怎麼編譯成JSC
l5是一個用JS來開發游戲的框架,通過javascript Binding的方式可以將游戲編譯到手機上。這對前端開發人員來說非常方便,開發效率也比使用c++開發要快的多。
jsb模式下是通過打包spidermonkey來運行JS代碼的。由於JS是一個解釋型的語言,所以是把js當作assets直接拷貝進去的。帶來的問題就是將apk包解壓後就可以直接拿到js的源代碼。
幸好官方出了一個cocos2d-console的工具,通過該工具可以將js編譯為位元組碼。該工具在官方發布包的tools目錄下。
那如何在發布的時候自動
Ⅳ JavaScript引擎虛擬機運行時環境是一回事兒嗎
js引擎通常被稱作一種虛擬機(可能是js並沒有明確的VM的概念吧),是專門用來解釋和執行js腳本的。js虛擬機是一種進程虛擬機,就是能運行一個進程或程序。每個js引擎都實現了ECMAScript規范(當然,有的實現並不全或者未能實現最新規范)ActionScript也支持這種規范。早期的js腳本只包含很簡單的邏輯,所以處理js腳本的引擎性能自然也好不到哪裡去,非常早期的「Mocha」引擎只包含位元組碼解釋器、引用計數方式的自動內存管理方式。js引擎從原始的遍歷語法樹,到位元組碼方式到引入JIT編譯方式(即時編譯),性能得到了質的飛躍 。現如今一些比較知名的js引擎有:SpiderMonkey, Mozilla的JavaScript 引擎,使用C/C++編寫;V8(第一個用上JIT技術的虛擬機),chrome的js引擎,使用C++/匯編 編寫,使用初級編譯器 + 優化編譯器。還有Safari的JavaScriptCore引擎,IE/Edge的Chakra引擎。當然,Node.js/IO.js也是使用V8引擎(虛擬機)。參考:game-server-development/node.js-V8引擎相關的性能優化.md at master · xiecc/game-server-development · GitHub runtime 翻譯過來就是「運行時」,或者運行時環境,是說一個程序正在執行的狀態,js runtime就是運行js的環境,也就是虛擬機(engine)。runtime它的底層可能是一些標准庫函數。js引擎和虛擬機存在相似之處,但有足夠的差異,因為JavaScript的動態特性。
Ⅵ 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未被使用。

Ⅶ node.js與v8是什麼關系
V8是一個由美國Google開發的開源JavaScript引擎,用於Google Chrome中。
V8在執行之前將JavaScript編譯成了機器碼,而非位元組碼或是解釋執行它,以此提升效能。更進一步,使用了如內聯緩存(inline caching)等方法來提高性能。有了這些功能,JavaScript程序與V8引擎的速度媲美二進制編譯。
Node.js是一個基於Chrome V8 引擎的JavaScript 運行時。
Ⅷ 如何js文件保存為utf-8編碼
js文件保存為 utf-8 可以這樣操作,
1、如果是 用Eclipse、MyEclipse或者是Jboss等編譯工具的話,右擊js文件選擇屬性 在 「text file encoding」 區域 就可以設置編碼為UTF-8了。
2、可以先復制一個 utf-8 編碼的js 文件。然後把這個 js中的內容復制過去。
Ⅸ 試述JavaScript和Java的區別
程序員和用戶經常在Java和JavaScript之間感到困惑。認為Java和JavaScript相同。如果從表面看,它們可能看起來一樣。 由於Java和JavaScript均指相同的OOP語言,並且共享相同的控制結構和運算符。但是,當您單獨學習它們時,您將了解它們彼此完全不同。盡管有這些相似之處,但它們在各個方面都有所不同。
Java
Java是James Gosling發明並由Sun Microsystems開發的一種流行的計算機軟體編程語言。它是1995年創建的通用高級編程語言。Java是一種面向對象的語言,旨在為您提供C ++的感覺。但是,它比C ++更簡單易用。 Java最初被命名為OAK,但後來又更改為Java。藉助其虛擬機平台,它允許您創建可在幾乎所有平台上運行的編譯程序。
JavaScript
JavaScript是HTML和Web的輕量級編程語言,用於使網頁具有交互性。作為一種多範式語言,它支持事件驅動,功能,命令和編程樣式。 JavaScript網頁實現允許客戶端腳本與用戶交互並創建動態頁面。它最初被稱為LiveScript,但後來Netscape將其名稱更改為JavaScript。
Java和JavaScript之間的差異
認為Java和JavaScript相同是一種非常普遍的看法。但事實是,除了Java之外,它們之間沒有其他共同之處。兩者是完全不同的,彼此無關。它們的工作,功能和功能都非常不同。
這是Java和JavaScript作為編程語言之間的主要區別的列表。 由於Java具有許多重要功能,因此它是最常用的編程語言。另一方面,JavaScript具有Java缺少的某些功能。JavaScript不需要任何編譯器或編輯器,它被認為是最容易學習的語言。
JavaScript 的基本語法和對象體系,是模仿 Java 而設計的。但是,JavaScript 沒有採用 Java 的靜態類型。正是因為 JavaScript 與 Java 有很大的相似性,所以這門語言才從一開始的 LiveScript 改名為 JavaScript。基本上,JavaScript 這個名字的原意是「很像Java的腳本語言」。
JavaScript 語言的函數是一種獨立的數據類型,以及採用基於原型對象(prototype)的繼承鏈。這是它與 Java 語法最大的兩點區別。JavaScript 語法要比 Java 自由得多。
另外,Java 語言需要編譯,而 JavaScript 語言則是運行時由解釋器直接執行。
總之,JavaScript 的原始設計目標是一種小型的、簡單的動態語言,與 Java 有足夠的相似性,使得使用者(尤其是 Java 程序員)可以快速上手。
這就是這兩者的區別與聯系,希望回答對你有多幫助
Ⅹ js中 /[\r]/g 是什麼意思為什麼是"[]"、"/"
/[ ]/g在js中是正則表達式對象,在兩個「/」之間的部分是表達式的主體,表示要匹配的字元串;「g」表示在整個字元串中搜索。所以這段代碼中要匹配的字元串是「[ ]」所代表的字元串,其中「[]」表示字元的可選范圍。
//g是全局匹配
//中間的內容表示:匹配以=開關,後面是0或多個空格,然後是雙引號括起來的任意字元,比如:
= "any symble"
s:匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ f v]。
:將下一個字元標記為一個特殊字元、或一個原義字元、或一個 向後引用、或一個八進制轉義符。例如,'n' 匹配字元 "n"。' ' 匹配一個換行符。序列 '\' 匹配 "" 而 "(" 則匹配 "("。
匹配除 " " 之外的任何單個字元。要匹配包括 ' ' 在內的任何字元,請使用象 '[. ]' 的模式。

(10)js編譯為v8位元組碼擴展閱讀:
Javascript被歸類為直譯語言,因為主流的引擎都是每次運行時載入代碼並解譯。V8是將所有代碼解譯後再開始運行,其他引擎則是逐行解譯(SpiderMonkey會將解譯過的指令暫存,以提高性能,稱為實時編譯),但由於V8的核心部分多數用Javascript撰寫(而SpiderMonkey是用C++),因此在不同的測試上,兩者性能互有優劣。
與其相對應的是編譯語言,例如C語言,以編譯語言編寫的程序在運行之前,必須經過編譯,將代碼編譯為機器碼,再加以運行。
