CEF3開發者系列之JS與C++交互之一

轉載:https://www.cnblogs.com/guolixiucai/category/732385.htmlhtml

JS與Native交互是相對於比較困難的技術,在學習這門技術以前,咱們先了解下瀏覽器內核中的JS引擎與chromium內核的V8引擎相關知識。在瀏覽器應用中,JS與本地代碼互相調用,得益於瀏覽器內核對JS的支持。每個瀏覽器內核都有JS引擎,當咱們在瀏覽器上操做時,瀏覽器把偵聽到的事件進行分發,若是與JS相關,瀏覽器事件觸發線程會爲咱們把指定的事件處理程序添加到js引擎當中。各大瀏覽器的JS引擎以下:git

主要的網頁瀏覽器JavaScript引擎:github

1) Mozillachrome

  • SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications時編寫,用於Mozilla Firefox 1.0~3.0版本。
  • JägerMonkey,(JägerMonkey,也有人拼寫成JagerMonkey)德文Jäger原意爲獵人,結合追蹤 和組合碼技術大幅提升效能,部分技術借鑑了V八、JavaScriptCore,用於Mozilla Firefox 4.0以上版本。

2)Google瀏覽器

  • V8,開放源代碼,由Google丹麥開發,是Google Chrome的一部分。

3)微軟安全

  • Chakra,中文譯名爲查克拉,用於Internet Explorer 9。
  • JScript 是由微軟公司開發的活動腳本語言,是微軟對ECMAScript規範的實現.IE 3.0-IE8.0使用的JS引擎

4)其它數據結構

  •  KJS,KDE的 ECMAScript/JavaScript引擎,最初由Harri Porten開發,用於KDE項目的

     JavaScript自己是一個解釋性腳本語言,其在本地執行須要解釋器進行處理。通常的JS解釋器就是將源代碼轉變成抽象語法樹,而後將抽象語法樹轉成中間表示(也就是字節碼),而後經過JIT技術轉成本地代碼。ide

因此一個JavaScript引擎不外乎包括如下部分:函數

第一,編譯器。主要工做是將源代碼編譯成抽象語法樹,而後在某些引擎中還包含將抽象語法樹轉換成字節碼。工具

第二,解釋器。在某些引擎中,解釋器主要是接受字節碼,解釋執行這個字節碼,而後也依賴來及回收機制等。

第三,JIT工具。一個可以可以JIT的工具,將字節碼或者抽象語法樹轉換成本地代碼,固然它也須要依賴牢記

第四,垃圾回收器和分析工具(profiler)。它們負責垃圾回收和收集引擎中的信息,幫助改善引擎的性能和功效。

 

 

  CEF3是基於chromium內核,其所使用的JS引擎是V8。谷歌爲了性能,直接省去了轉換字節碼這一步,它甚至採用直接將JavaScript編譯成本地代碼的方式。v8 API不只提供了編譯和運行JavaScript代碼的功能,還提供了其餘與C++交互的功能,包括函數和數據結構的註冊,錯誤處理,安全檢查等。C++應用程序能夠將v8看成一個普通類庫使用,只需引用v8.h便可。

  v8的上下文(Context)是獨立的JavaScript執行環境,經過使用上下文容許JavaScript應用程序跑在不一樣的v8實例上。執行一段JavaScript代碼必須顯示指定上下文。這是由於JavaScript提供了一系列內置輔助函數和全局對象,它們能夠被JavaScript代碼調用和修改。若是兩段不相關的JavaScript代碼同時修改全局對象,可能會致使用戶不但願看到的結果。根據v8的規範,執行JavaScript函數必須在Context以內,因此調用ExecuteFunction的前咱們必須進入Context,執行完畢後必須退出Context。 這個功能是由CefV8Context提供的,最重要的成員有Enter、Exist、Eval等。

下邊兩篇我將分別介紹CEF3和Trident內核應用中,JS與本地C++如何進行交互。其中CEF3中JS與C++交互主要是翻譯一篇CEF3的wiki。

參考資料:

理解WebKit和Chromium: JavaScript引擎簡介

http://blog.csdn.net/milado_nju/article/details/22101681

Chromium/content v8::Extension

https://github.com/fanfeilong/cefutil/blob/master/doc/content_register_v8_extension.md

相關文章
相關標籤/搜索