ChakraCore JSRT使用問題彙總

2022-02-16 06:09:10 字數 2537 閱讀 9355

乙個微軟開源的,用於windows ie/edge核心的高效js指令碼引擎。

前不久微軟開源了chakracore,並且支援跨平台。在github可以搜到。即使在開源之前,windows sdk也支援你的程式去hosting js,只需要簡單的包含jsrt.h,鏈結jsrt.lib即可呼叫jsrt的api。只是舊版本的windows系統所帶引擎效能沒有windows10 edge效能好.

是乙個瀏覽器評分工具(越高越好),在我平板的得分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更容易寫膠水**。

請看我以前的文章。

我詢問過微軟,這是因為在windows下,系統載入dll時會呼叫dll的入口dllmain,而linux沒有這個機制,而linux下的chakra卻有這樣的設計。

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

2023年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)

if (dllmain ==nullptr)

//模擬win dll載入

dllmain(0, 1, 0

); dllmain(

0, 2, 0

); dlclose(handle);

#endif

//__linux__

可以,除了intl,這是個特例

不可以,即使你為傳入native的函式引數修改值也是沒用的。

如果一定要用,那只能傳乙個引用型別的物件,在函式內部修改此物件的成員。var arr=;(function (v))(arr);//arr[1] == 1

支援,據我當前的研究,不同執行緒必須有各自的runtime物件,每個runtime可以有多個環境(context),同乙個runtime下的多個環境可以自由交換資料,但環境之間不共享資料。也就是說api級別可以把環境1的資料帶到環境2,但是指令碼裡,環境2是看不到環境1的資料的。

完全支援。

函式(function)也是物件(object),可以有自定義屬性,所以,在原生api級別操作chakra時,可以把需要閉包的變數放在函式的屬性裡。如果希望在指令碼中是唯讀的,那麼可以設定屬性描述。如果希望在指令碼中是隱藏的,那麼可以用符號屬性。

假設需要我們有乙個移動裝置類,手機類從它繼承,iphone從手機繼承,那麼應該這樣:

乙個jsobject(用jscreateobject),用來表示移動裝置,可以新增成員,另乙個jsobject用來表示手機,再有乙個externalobject(用jscreateexternalobject)用來表示乙個實際的原生物件例項(iphone)。

手機jsobject從移動裝置jsobject繼承(jssetprototype),iphone從手機繼承。

chakracore api的都在操作核心物件jsvalueref,chakra內部會把生成的物件放在堆上。用api生成乙個jsvalueref物件後,執行一段時間會垃圾**掉。所以如果在你的程式中長期使用jsvalueref,需要儲存它,那麼應該呼叫呼叫jsaddref為其新增引用計數。在不用時呼叫jsrelease減少引用計數。【2017/5/27】

附錄:1、js的符號 es6-symbol

VMware License Server使用經驗

近期在測試vmware server,在使用vmware license server的時候碰到一些問題,經過兩天的實驗,問題得以解決,現記錄如下,以供朋友們參考。1 複製license檔案 在安裝vmware virtualcenter的時候,會一同安裝license server伺服器。如果你在...

Django Rest framework使用例項

一 修改配置檔案 setting.py django.contrib.admin django.contrib.auth django.contrib.contenttypes django.contrib.sessions django.contrib.messages django.contri...

Android AlarmManager 使用指南

intent intent new intent intent.setaction updatemgr.check update action 如果你的flag 是flag one shot,那麼你就只能受到一次廣播。如果使用setrepeat,你設定的intervalmills 少於60s,那麼就...