在不使用node的情況下,開發者怎樣在js里調用一個自己實現的c/c++函數?


在.NET目錄一個陰暗的角落裡,躺著一個jsc.exe("C:Windowshttp://Microsoft.NETFrameworkv4.0.30319jsc.exe")

那是JScript編譯器,可以把js文件編譯成.NET平台支持的dll或exe


這和語言沒有關係,而是運行環境的問題

如果拋開node,能運行js的環境就只剩下browser了,於是問題變成了你在browser裡面如何調用c/c++函數的問題。

顯然,除了黑科技,這個基本上不是一個可以完成的任務。

恩,很久以前,ie是支持activeX控制項的。

而activeX可以用vc++和vb去寫。

貌似這樣也算完成了任務?。。。


各引擎實現一般都有與 JavaScript 環境交互的方式。在應用中內嵌 JS 腳本的時候一般直接向全局 context 注入變數供腳本調用。

以 V8 為例,如果你想在使用 C++ 調用 V8 運行 JS 腳本的時候在 JavaScript 中調用 C++ 函數,只需要先定義接受 V8 Arguments 作為參數並返回 V8 Handle 的函數

Handle& fuck(const Arguments args){
//return something
}

然後調用 V8 global 實例的 Set 方法將其注入腳本上下文中

global-&>Set(String::New("fuck"), FunctionTemplate::New(fuck));

就可以在腳本中調用 fuck 函數了。

這種注入的方式都是取決於引擎實現層面,和 JS 語言規範關係不大。


用 json rpc 之類的來調用?只要能讀寫 socket 或者能支持 http 通訊就行。


Windows Script Host中的JS可以創建並調用ActiveX==

但總感覺是好幾個世紀前的事了


C++端起一個HTTP server,然後JavaScript端發起Ajax請求。

年輕時候做大作業這麼搞過,從瀏覽器里調C++。

誰說「調用」必須通過寄存器和棧來傳值了,通過套接字不是一樣?(逃


v8提供了API可以被你的程序調用。你自己的程序就相當於nodejs. 具體文檔看v8的幫助文檔 有詳細的說明怎樣調用。


跟你使用的scripting host有關。win下可以通過com/activex實現


試試曲線救國。

https://github.com/kripken/emscripten


你可以:

  • 使用js引擎的相關C/C++介面,將C/C++函數放到js的運行環境中
    • 實際上這就是node的實現原理
  • 把C/C++編譯成WASM放在瀏覽器里執行
    • 需要瀏覽器做相關支持
  • 直接把C/C++編譯成JS
    • 這麼做的人一定只是寫著玩的


用thrift


我只說js調c++

這個我做過類似的,我當時用的是一套開源的框架FireBreath,這個框架就是開發瀏覽器插件用的,Firebreath構建的插件的工作原理是NPAPI和ActiveX(僅Windows平台)。 當然最新的chrome已經不支持NPAPI協議了。

github地址

firebreath/FireBreath

如何搭建這個工程

FireBreath環境配置(windows) - 請原諒我這一生放蕩不羈愛吃肉 - 博客頻道 - CSDN.NET

windows平台最簡單的方法就是使用系統自帶的activex介面了。linux沒弄過


QT的QtWebChannel?


其實就是個foreign function interface的問題吧,首先為了安全,大部分瀏覽器是不會支持這麼做的。其次,如果單獨抽出一個引擎來做其他用,比方說做手游的嵌入式腳本之類的話,SpiderMonkey 1.8.5 這裡提供了js-ctypes 這個東西。v8的api你可以自己找一下。


[emscripten](kripken/emscripten )

編譯C/C++到js


推薦閱讀:

新手應該如何讀Google V8引擎源代碼?
js中為什麼沒有自乘自除?只有自加自減,為什麼?
如何評價Microsoft的開源項目napajs?
HSimulate這條Hydrogen里的instruction到底是什麼意思?

TAG:JavaScript | V8 | NitroJavaScriptEngine | SpiderMonkey | ChakraJavaScript引擎 |