Emscripten ist eine vollständige Open Source Compiler-Toolchain für WebAssembly. Mit Emscripten können Sie:
C- und C++-Code oder jede andere Sprache, die LLVM verwendet, in WebAssembly kompilieren und im Web, in Node.js oder anderen Wasm-Runtimes ausführen.
Die C/C++-Laufzeitumgebungen anderer Sprachen in WebAssembly kompilieren und dann Code in diesen Sprachen auf indirekte Weise ausführen (dies wurde beispielsweise für Python und Lua umgesetzt).
Praktisch jede portable C- oder C++-Codebasis kann mit Emscripten in WebAssembly kompiliert werden, angefangen von Hochleistungs-Spielen, die Grafiken rendern, Töne abspielen sowie Dateien laden und verarbeiten müssen, bis hin zu Anwendungs-Frameworks wie Qt. Emscripten wurde bereits verwendet, um eine sehr lange Liste realer Codebasen nach WebAssembly zu konvertieren, einschließlich kommerzieller Projekte wie die Unreal Engine 4 und die Unity-Engine. Beispiele und Demos finden Sie in der von der Community gepflegten Liste im Wiki.
Emscripten erzeugt kleinen und schnellen Code! Das Standard-Ausgabeformat ist WebAssembly, ein hochgradig optimierbares ausführbares Format, das fast so schnell wie nativer Code läuft und dabei portabel und sicher ist. Emscripten nimmt Ihnen durch die sorgfältige Integration von LLVM, Binaryen, Closure Compiler und anderen Tools viel Optimierungsarbeit automatisch ab.
Ein Überblick über die Emscripten-Toolchain ist unten dargestellt. Das Hauptwerkzeug ist das Emscripten Compiler Frontend (emcc). Dies ist ein direkter Ersatz für einen Standard-Compiler wie gcc oder clang.
Emcc verwendet Clang und LLVM, um nach WebAssembly zu kompilieren. Emcc gibt auch JavaScript aus, das API-Unterstützung für den kompilierten Code bietet. Dieses JavaScript kann von Node.js oder innerhalb von HTML in einem Browser ausgeführt werden.
Das Emscripten SDK wird verwendet, um die gesamte Toolchain einschließlich emcc, LLVM usw. zu installieren. Das Emscripten SDK (emsdk) kann unter Linux, Windows oder MacOS verwendet werden.
Die Unterstützung von Emscripten für portablen C/C++-Code ist sehr umfangreich. Die Unterstützung für die C-Standardbibliothek, die C++-Standardbibliothek, C++-Exceptions usw. ist sehr gut, ebenso wie für SDL2 und andere APIs. Die OpenGL-Unterstützung in Emscripten ist exzellent für Code vom Typ OpenGL ES 2.0 und akzeptabel für andere Typen.
Es gibt Unterschiede zwischen der nativen Umgebung und der Emscripten-Laufzeitumgebung, was bedeutet, dass normalerweise einige Änderungen am nativen Code vorgenommen werden müssen. Dennoch müssen viele Anwendungen lediglich die Art und Weise ändern, wie sie ihre Hauptschleife (Main Loop) definieren, und ihre Dateiverarbeitung an die Einschränkungen des Browsers/JavaScripts anpassen.
Es gibt auch Einschränkungen, die das Portieren von Code erleichtern können – lesen Sie die Portabilitäts-Richtlinien, um festzustellen, wo Sie eventuell mehr Aufwand investieren müssen.