程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> ChakraCore/JSRT使用問題匯總,chakracorejsrt

ChakraCore/JSRT使用問題匯總,chakracorejsrt

編輯:C++入門知識

ChakraCore/JSRT使用問題匯總,chakracorejsrt


ChakraCore是什麼?

一個微軟開源的,用於Windows IE/Edge內核的高效JS腳本引擎。

前不久微軟開源了ChakraCore,並且支持跨平台。在Github可以搜到。即使在開源之前,Windows SDK也支持你的程序去Hosting JS,只需要簡單的包含jsrt.h,鏈接jsrt.lib即可調用JSRT的API。只是舊版本的Windows系統所帶引擎性能沒有Windows10 Edge性能好.

關於Chakra與JSV8的性能比較

http://browserbench.org/JetStream/是一個浏覽器評分工具(越高越好),在我平板的得分Chrome54(JSV8)是126.59,Edge(Chakra)是152.06。在cnblog某個用戶的渲染評測中,Chrome54是83秒,Edge是110秒,越快越好。所以我也不好說哪個更快,就浏覽器日常使用,肯定是Edge更快,更節能。

JS腳本支持有哪些優勢?

在流行的腳本語言中,Lua的小巧高性能(性能指LuaJit的性能),Python的功能性一直受開發者青睐。有什麼理由使用JS腳本呢?

JS腳本有眾多的庫支持

JS腳本被用於HTML網頁開發,開發者眾多

JS有眾多大公司的支持

JS有優秀的即時編譯(JIT)性能

JS有無敵的開發工具Visual Studio的支持

JS語言特性更類似C/C++,相比Lua要舒服很多

Chakra的嵌入優勢:相比Lua的堆棧式API,Chakra的API更容易寫膠水代碼。

很多游戲使用Lua的原因是比Python性能好,沒有其他可選方案了。Chakra的開源,應該帶動開發者去使用JS腳本。Chakra對於大型Windows游戲開發者更大的好處在於系統支持,Lua需要去下載編譯,而Chakra只需要包含頭文件,鏈接lib。

如何在Windows嵌入Chakra?

請看我以前的文章。

如何在linux嵌入ChakraCore去實現一個JavaScript運行時容器?

如果你像Windows上一樣使用ChakraCore,用動態鏈接的方式,那肯定會產生JsErrorNoCurrentContext錯誤。

我詢問過微軟,這是因為在Windows下,系統加載DLL時會調用DLL的入口DllMain,而Linux沒有這個機制,而Linux下的Chakra卻有這樣的設計。

所以在Linux加載動態庫(libChakraCore.so)以後,應該顯式的調用DllMain。下面是我的實現,非官方。官方接受了我的意見,大概會在以後版本中改進linux版本的初始化方式。

2016年11月19日,我寫這段話時的兩天前,官方正則討論這方面的設計細則。Github鏈接

#ifdef __linux__
    typedef int (*DllMainPtr)(void* hmod, DWORD dwReason, void* pvReserved);
    DllMainPtr dllmain;
    void* handle = dlopen("libChakraCore.so", RTLD_LAZY);

    if (handle == nullptr)
        throw runtime_error("Failed load library libChakraCore.so");

    char* errstr = dlerror();
    if (errstr != nullptr)
        throw runtime_error(errstr);

    dllmain = (DllMainPtr)dlsym(handle, "DllMain");
    errstr = dlerror();
    if (errstr != nullptr)
    {
        dlclose(handle);
        throw runtime_error(errstr);
    }
    if (dllmain == nullptr)
    {
        dlclose(handle);
        throw runtime_error("find not DllMain");
    }

    //模擬WIN DLL加載
    dllmain(0, 1, 0);
    dllmain(0, 2, 0);

    dlclose(handle);
#endif // __linux__

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved