1.1 關於emscripten

關於Emscripten

Emscripten是一個面向JavaScripten的開源LLVM編譯器。(LLVM是構架編譯器的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間<compile-time>、鏈接時間<link-time>、運行時間<run-time>以及空閒時間<idle-time>,對開發者保持開放,併兼容已有腳本)。

  • 將C和C++代碼編譯爲JavaScripten。
  • 將任意能被轉化爲LLVM中間代碼的代碼編譯爲JavaScripten。
  • 將其他語言的C/C++運行時編譯爲JavaScripten,然後以一種間接的方式運行這些其他語言的代碼(Python和Lua已經這樣做了)。
Tip
Emscripten 使本地代碼在Web上立即可用:這是一個標準化的平臺,擁有許多兼容且獨立的實現,可以運行在PC或者ipad等任何地方。
使用Emscripten,C/C++開發者不用話費高成本將代碼手動移植到JavaScript,也根本不需要學習JavaScript。Web開發者也會受益,因爲他們可以在自己的站點中使用成千上萬的已經存在於本地的實用程序和庫。

實際上,任何可移植的C或者C++代碼庫都可以使用Emscripten編譯成JavaScripten,包括需要渲染圖形、播放聲音、加載和處理文件的高性能遊戲,以及Qt之類的應用程序框架。Emscripten 已經被用於將非常多的本地代碼庫轉化爲JavaScript,包括大型項目如CPython,Poppler和Bullet Physics Engine,以及商業項目如Unreal Engine 4和Unity Engine。
Emscripten生成的代碼執行速度極快!它默認輸出格式是asm.js,這是一個高度優化的JavaScript子集,在多數情況下可以以接近原生代碼的速度執行。在都用gzip壓縮時,優化的Emscripten代碼和原生代碼的有效大小也相似。

Emscripten工具鏈

下面給出的是Emscripten工具鏈的高級視圖。這裏面最主要的工具是Emscripten前端編譯器<Emscripten Compiler Frontend(emcc)>。這是對標準編譯器(如gcc)的一個完全替代。
在這裏插入圖片描述
Emcc使用Clang或者LLVM來將代碼編譯爲wasm或者asm.js。Emscripten編譯得到的JavaScript代碼可以運行編譯後的代碼並提供必要的運行時支持。這樣的JavaScript代碼可以被node.js執行或者在瀏覽器中從HTML執行。
Emscripten SDK(emsdk)用來管理多個SDK和工具,並制定當前用於編譯的特定工具的SDK(活動工具/SDK)。它甚至可以從GitHub"安裝"(下載並構建)最新的工具鏈!
Emsdk將“活動”配置寫入Emscripten編譯器配置文件中(.emscripten)。這個文件被emcc用來獲得對於當前編譯來說,用於構建的正確的工具鏈。
還有許多其他工具沒有展示——例如:emcc可以選擇性使用Java來運行閉包編譯器,這可以進一步減小代碼大小。
整個工具鏈由Emscripten SDK提供,並且可以被用於Linux,Windows或者macOS平臺。

移植代碼以使用Emscripten

Emscripten對可移植的C/C++代碼支持相當全面。對C標準庫,C++標準庫,C++異常等的支持非常好。對SDL支持足夠運行大量代碼。OpenGL的支持方面,Emscripten對OpenGL ES 2.0類型的代碼支持非常優秀,對於其他類型的支持也是可以接受的。
本機運行時環境和Emscripten運行時環境存在一些差異,這意味着通常需要對本機代碼進行一些更改。也就是說,許多應用將只需要改變它們定義主循環的方式,並修改它們文件處理就能適應瀏覽器或JavaScript的限制。
還有一些限制可以使某些代碼更容易移植——閱讀移植指導來確定你可能需要在哪些地方花費更多精力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章