Konvertieren Sie die C-Sprache mit Emscripten in JavaScript

Ich denke, C ist die stärkste plattformübergreifende Sprache. iOS kann in Objective-C auch die Sprache C verwenden. Android kann also auch C-Sprache mit NDK verwenden Ich dachte, wenn die gesamte Logik außer der Benutzeroberfläche in C-Sprache geschrieben wäre, könnte sie auf allen Plattformen verwendet werden. Mit FireFoxOS konnte ich dies jedoch nicht tun und ich konnte die C-Sprache nicht in Form des Aufrufs der grundlegenden JavaScript-API verwenden.

Ich war am Ende meiner Enttäuschung Emscripten war einer der Durchbrüche! !! !! !!

Was ist Emscripten

Emscripten ist ein Compiler, der LLVM aus der C / C ++ - Sprache generiert und in JavaScript konvertiert. Es unterstützt auch eine Standard-C-Sprachbibliothek und einen Teil von POSIX, und es scheint, dass OpenGL ES 2.0 auch verwendet werden kann. Emscripten selbst ist unten. https://github.com/kripken/emscripten

Vorbereitung (Mac OS X)

Aktiviert die Verwendung von emscripten.

Ich habe verschiedene Dinge ausprobiert, aber die Installation des SDK war am einfachsten.

Als Verfahren, http://kripken.github.io/emscripten-site/docs/building_from_source/building_emscripten_from_source_using_the_sdk.html#building-emscripten-from-source-using-the-sdk Sie können tun, wie in geschrieben.

Wenn Sie die Prozedur schreiben https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz Holen Sie sich den Quellcode von.

Weil ich CMake benutze

python


$ brew install cmake

Bitte. Nach dem Entpacken des Codes

python


$  cd emsdk_portable
$ ./emsdk install sdk-incoming-64bit
$ ./emsdk activate sdk-incoming-64bit

Du kannst es schaffen. Es scheint also Knoten und Python für die Ausführung zu verwenden

python


$ brew install node

Und Erstellen Sie anschließend einen symbolischen Link zu python2

python


$ sudo ln -s /usr/bin/python2.7 /usr/bin/python2

Lauf

python


$ emsdk_portable/emscripten/incoming/emcc first.c -o first.js

Dann können Sie es in JS konvertieren. (Es kann besser sein, es in PATH in emsdk_portable / emscripten / incoming / zu setzen.)

Zum Beispiel

first.c


#include <stdio.h>

int
main(void)
{
  printf("Hello, World!\n");
  return 0;
}

Wenn

python


$ emcc first.c -o first.js
$ node first.js
Hello, World!

Es wird sein.

Rufen Sie C-Funktionen aus JavaScript auf

Zum Beispiel

second.c


int
add(int x, int y) 
{
  return x + y;
}

Ich möchte die Funktion von außerhalb von JavaScript aufrufen. Zu diesem Zeitpunkt, wenn js konvertiert wird,

python


$ emcc second.c -s EXPORTED_FUCTIONS="['_add']" -o second.js

Geben Sie die Funktion an, die in EXPORTED_FUCTIONS veröffentlicht werden soll, und lösen Sie sie aus. Fügen Sie zuerst "_" zum Funktionsnamen hinzu. Danach ist es möglich, es mit ccall von js Seite aufzurufen. Es wird in Form von ccal verwendet (Funktionsname, Rückgabetyp, [Argumenttyp], [tatsächliches Argument]).

second.html


<html>
<body>
<div id="output"></div>
<script type="text/javascript" src="./second.js"></script>
<script type="text/javascript">
  var num = ccall("add", "number", ["number", "number"], [1, 2]);
  document.getElementById("output").innerHTML = num;
</script>
</body>
</html>

Dies gibt 3 an das div aus. Sie können auch Module.cwrap verwenden, um die Funktion abzurufen. Module.cwrap (Funktionsname, Rückgabetyp, [Argumenttyp]) Sie können die Funktion in Form von abrufen.

second2.html


 <html>
<body>
<div id="output"></div>
<script type="text/javascript" src="./second.js"></script>
<script type="text/javascript">
  //Extrahieren Sie eine Funktion namens add
  var add = Module.cwrap("add", "number", ["number", "number"]);
  //Verwenden Sie die extrahierte Funktion
  var num = add(1, 2);
  document.getElementById("output").innerHTML = num;
</script>
</body>
</html>

Wieder wird 3 an das div ausgegeben.

Rufen Sie JavaScript aus der Sprache C auf

Wenn Sie dagegen JS aus C-Code aufrufen,

python


mergeInto(LibraryManager.library, {
  //Definition der von C aufgerufenen Methode
});

Wird genutzt.

Zum Beispiel

thirdlib.js


mergeInto(LibraryManager.library, {
    jsPower: function(x) {
        return x * x;
    }
});

Mit einer JavaScript-Datei namens

third.c


#include <stdio.h>
#include <math.h>

int jsPower(int x); //JavaScript-Funktionen

int 
pythagorean(x, y)
{
  //Berechnen Sie mit der JavaScript-Funktion jsPower
  return  sqrt(jsPower(x) + jsPower(y));
}

int
main(void)
{
  printf("%d\n", pythagorean(3,4));
  return 0;
}

Bereiten Sie eine C-Sprachdatei mit dem Namen vor. Geben Sie daher den JS-Code mit der Option --js-library an, kompilieren Sie ihn und führen Sie ihn aus.

python


$ emcc third.c --js-library thirdlib.js -o third.js
$ node thired.js
5

Der JS-Code wird ordnungsgemäß aufgerufen und berechnet.

Rufen Sie C ++ - Funktionen über JavaScript auf

Von hier an, EMSCRIPTEN_BINDINGS kann in C ++ verwendet werden. Wenn Sie es hier registrieren, können Sie die Funktion mit Module.xxx aufrufen.

firstcpp.cpp


#include "emscripten/bind.h"

using namespace emscripten;
int
add(int x, int y)
{
  return x + y;
}

EMSCRIPTEN_BINDINGS(my_module) {
  function("add", &add);
}

Kompilieren Sie wie folgt (em ++, weil es C ++ ist)

python


$ em++ firstcpp.cpp -o firstcpp.js -std=c++0x --bind

Verwenden der Dateiausgabe als

firstcpp.html


<html>
<body>
<div id="output"></div>
<script type="text/javascript" src="./firstcpp.js"></script>
<script type="text/javascript">
  var num = Module.add(1, 2);
  document.getElementById("output").innerHTML = num;
</script>
</body>
</html>

In diesem Fall wird 3 ausgegeben.

Andere

Ich werde das auch tun.

Recommended Posts

Konvertieren Sie die C-Sprache mit Emscripten in JavaScript
Konvertieren Sie Markdown mit flexmark-java in HTML
Konvertieren Sie das 2D-Array von Swift in das 2D-Array von C.
So wechseln Sie Miniaturbilder mit JavaScript
So führen Sie Blazor (C #) mit Docker aus
Konvertieren Sie mit Ruby von JSON nach TSV und von TSV nach JSON
Konvertiert vom String-Zeiger der C-Sprache zum Swift-String-Typ
Konvertieren Sie eine Zeichenfolge mit swift in ein zeichenweises Array
Ich habe versucht, Hello World (+ α) in C-Sprache aus JavaScript [Web Assembly] zu verschieben.
NLP4J 100 Sprachverarbeitungsklopfen mit NLP4J # 34 Versuchen Sie, "A's B" intelligenter zu lösen (endgültige Ausgabe)
Einbetten von JavaScript-Variablen in HTML mit Thymeleaf
Generieren Sie JavaScript mit Thymeleaf
Port C-Code mit vielen Typecasts zu Swift
Zurück zum Anfang Button nur mit Javascript gemacht (Rails, Haml)
Schreiben Sie die Zuweisungen der Universität C mit Node.js neu
Konvertieren Sie ein zweidimensionales Array mit der Java 8 Stream-API in das CSV-Format