一個微軟開源的,用於Windows IE/Edge內核的高效JS腳本引擎。
前不久微軟開源了ChakraCore,並且支持跨平台。在Github可以搜到。即使在開源之前,Windows SDK也支持你的程序去Hosting JS,只需要簡單的包含jsrt.h,鏈接jsrt.lib即可調用JSRT的API。只是舊版本的Windows系統所帶引擎性能沒有Windows10 Edge性能好.
http://browserbench.org/JetStream/是一個浏覽器評分工具(越高越好),在我平板的得分Chrome54(JSV8)是126.59,Edge(Chakra)是152.06。在cnblog某個用戶的渲染評測中,Chrome54是83秒,Edge是110秒,越快越好。所以我也不好說哪個更快,就浏覽器日常使用,肯定是Edge更快,更節能。
在流行的腳本語言中,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上一樣使用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__