Führen Sie Java VM mit Web Assembly aus

Berühren wir Web Assembly, das in letzter Zeit immer besser wird. Ich möchte eine Umgebung erstellen, in der Java als Betreff ausgeführt werden kann. Ja, es ist ein Java-Interpreter (Java VM), der in einem Browser wie einem Java-Applet ausgeführt wird.

Zunächst möchte ich ablehnen. Obwohl es sich um einen Java-Interpreter handelt, der Java-Bytecode interpretiert, implementiert er minimalen Bytecode. Da es nur wenige Klassen unter Java / Lang implementiert, ist es praktisch nutzlos. Persönlich habe ich es für das Studium von Java-Interpreter gemacht. Es tut mir leid für diejenigen, die erwartet haben.

Wir werden wie folgt vorgehen.

Ich habe "waba" als den C-Sprach-Quellcode des Java-Interpreters bezeichnet. Ich habe viel gelernt. Vielen Dank.

wabasoft  http://wabasoft.com/

Ich habe "emscripten" für den WebAssembly-Compiler verwendet.  https://emscripten.org/index.html

Das Folgende ist die Fortsetzung. Ausführen von Java VM mit Web Assembly: Ergänzung

Installieren Sie emscripten

Ich habe es in der WSL-Umgebung von Windows 10 installiert. Also benutze ich Python 2.7, aber es wurde bereits installiert.

> python --version
Python 2.7.15rc1
> git clone https://github.com/juj/emsdk.git
> cd emsdk
> ./emsdk install latest
> ./emsdk activate latest

Sie haben jetzt den WebAssembly-Compiler "emcc" installiert. Wenn Sie es verwenden, müssen Sie es durchlaufen, gehen Sie also wie folgt vor:

> source ./emsdk_env.sh --build=Release

Projektordner erstellen

Erstellen Sie einen geeigneten Ordner und arbeiten Sie.

Legen Sie eine Reihe von Quelldateien in C-Sprache in denselben Ordner.

Ich habe es auf dem folgenden GitHub gepostet.

https://github.com/poruruba/javaemu

> git clone https://github.com/poruruba/javaemu.git
> cd javaemu

Kompilieren Sie den Java-Quellcode, um ihn in WebAssembly einzubetten

Kompilieren Sie den Java-Quellcode. Der Java-Quellcode wird in zwei Typen unterteilt und die Platzierungsmethode wird geändert. Die erste ist eine Java-Quelle, die in WebAssembly eingebettet ist, und die andere ist eine Java-Quelle, die nicht in WebAssembly eingebettet ist. Letzteres ist normaler, vom Benutzer geschriebener Java-Quellcode. Auf der anderen Seite werden Java / Lang usw. von normalen Benutzern verwendet, und die Java-Quelle des Systems, die sich nicht ändert, ist die erstere. Ersteres ist auch eine Java-Klasse mit nativen Funktionen, die nur in C-Sprache verarbeitet werden können und mit Interpreten funktionieren.

Es wird davon ausgegangen, dass der Quellcode im Ordner java_src erstellt wird. Erstellen Sie einen Ordner, um die kompilierten Klassendateien abzulegen. Sagen wir pre_classes.

> mkdir pre_classes

Die Zusammenstellung ist wie folgt.

>javac -encoding UTF8 -d pre_classes -sourcepath java_src java_src/base/framework/*.java java_src/java/lang/*.java java_src/test/*.java

Die Java-Quelldateien unter base / framework und java / lang sind die Java-Quellen für das System. java_src / test / *. java wird später zum Testen verwendet. Entfernen Sie es daher nach dem Testen. Jetzt haben Sie eine Java-Klassendatei im Ordner pre_classes.

Ich habe das Oracle JDK unter Windows verwendet. Im Fall von OpenJDK habe ich es mit der Klassendatei in der Ausführungsumgebung bekämpft und wusste nicht, wie ich es ausschließen sollte. .. ..

Kompilieren Sie den Quellcode der C-Sprache

Lassen Sie uns kompilieren

> emcc *.c -s WASM=1 -o javaemu.js -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'UTF8ArrayToString', 'stringToUTF8Array']" --preload-file pre_classes

(Referenz) Optionen zur Kompilierungszeit  https://emscripten.org/docs/tools_reference/emcc.html#emccdoc

-s WASM = 1 ist ein Zauber, der angibt, dass eine WASM-Datei generiert wird.

-o javaemu.js dient zum Generieren einer Datei (javaemu.data), die eine WASM-Datei (javaemu.wasm), ein Dienstprogramm Javascript (javaemu.js) und eine in WebAssembly einzubettende Java-Klassendatei kombiniert. Der Name Javaemu ist angemessen. Bitte verwenden Sie einen beliebigen Namen.

-s EXTRA_EXPORTED_RUNTIME_METHODS ist der Name der von javaemu.js bereitgestellten Funktion, die aus Javascript der im Web platzierten HTML-Seite aufgerufen werden darf. ccall ist erforderlich, aber die anderen beiden sind nützlich, also setze ich sie.

--preload-file gibt den Namen des Ordners an, in dem sich die in WebAssembly einzubettenden Dateien befinden. Die Dateien unter dem angegebenen Ordnernamen werden in einer Datei namens javaemu.data gruppiert.

Von den fertigen Dateien sind diejenigen, die im Web abgelegt werden sollen, "javaemu.wasm", "javaemu.js" und "javaemu.data". javaemu.wasm ist nur eine WebAssembly-Datei, die die C-Sprache kompiliert.

Von Javascript auf Webseiten aufgerufene Funktionen sind in main.c. definiert.

main.c


int EMSCRIPTEN_KEEPALIVE setInoutBuffer(const unsigned char *buffer, long bufferSize );
int EMSCRIPTEN_KEEPALIVE setRomImage(unsigned char *romImage, long romSize );
int EMSCRIPTEN_KEEPALIVE callStaticMain(char *className, char *param );

Überprüfen Sie die Funktionsweise von Java-Bytecode, der im Web platziert und in die Web Assembly eingebettet ist.

Laden Sie das HTML der von GitHub abgelegten Dateien auf den Webserver hoch. Wir haben auch eine Seite zur Überprüfung des Vorgangs vorbereitet. Platzieren Sie die drei gerade generierten Dateien ebenfalls im HTML-Ordner.

> cp javaemu.wasm javaemu.js javaemu.data html/

Oder

> cd html
> ln -s ../javaemu.wasm ../javaemu.js ../javaemu.data .
> cd ..

(Bitte legen Sie es im Stammordner von HTML ab, da sonst javaemu.js Wasm- und Datendateien nicht gut liest.)

Zum Glück hat emscripten eine einfache Webserver-Funktion, also werde ich diese verwenden. Die Portnummer lautet 8080.

emrun --serve_root html --no_browser --port 8080 .

Lassen Sie uns jetzt über den Browser darauf zugreifen. Als Browser habe ich versucht, es unter Chrome unter Windows auszuführen.

http://localhost:8080

image.png

Aus Gründen der Übersichtlichkeit drücke ich F12, um die Entwicklerkonsole aufzurufen.

Geben Sie den Namen der eingebetteten Java-Klasse zum Testen des Klassennamens ein. Es ist "test / TestFunc".

Der ursprüngliche Quellcode sieht wie folgt aus.

TestFunc.java


package test;

import base.framework.System;
import base.framework.Convert;
import base.framework.Util;

public class TestFunc{
  public static void main( String[] args ){
  	try
  	{
  		System.println("Hello test/TestFunc");

  		if( args.length >= 1 )
  			System.println("args[0]=" + args[0]);
  		
  		String[] input = System.getInput(-1);
  		for( int i = 0 ; i < input.length ; i++ )
	  		System.println("params[" + i + "]=" + input[i]);

  		System.setOutput(new String[]{ "World", "Guten Abend" });
  	}catch( Exception ex )
  	{
		System.print( ex.toString() );
  		ex.printStackTrace();
  	}
  }
}

Geben Sie eine entsprechende Zeichenfolge in Input Arg und Input Params ein. Drücken Sie sofort die Taste "Start war m".

Rufen Sie die in C-Sprache implementierte Funktion mit dem folgenden Gefühl auf. Das Laden und Ausführen der WebAssembly-Datei erfordert viel Arbeit, aber javaemu.js macht es gut.

start.js


            this.output_return = Module.ccall('callStaticMain', // name of C function 
                                    "number", // return type
                                    ["string", "string"], // argument types
                                    [this.class_name, this.input_arg]); // arguments

image.png

Während dann die chaotischen Debug-Zeichen in der Konsole des Browsers angezeigt wurden, wurde meiner Meinung nach die folgende Zeichenfolge angezeigt. Die Ausführung der Java-Klassendatei durch den Java-Interpreter ist abgeschlossen.

Hello test/TestFunc args[0]=ABCD params [] = Aiueo params [1] = Kakikukeko

Außerdem sollte auf der Seite Folgendes angezeigt werden.

Output Return 0 Ausgabeparameter ["Welt", "Guten Abend"]

Kompilieren Sie Java-Quellcode, der nicht in WebAssembly eingebettet war.

Lassen Sie uns nun verschiedene Java-Quellen erstellen und ausführen.

Ich werde es unter java_src erstellen. Dieses Mal erstellen wir es im Ordner test2.

Die Zusammenstellung ist wie folgt.

> mkdir classes
> javac -encoding UTF8 -d classes -sourcepath java_src -classpath pre_classes java_src/test2/*.java

Ich erstelle einen Ordner Klassen zum Speichern von Klassendateien. Da angenommen wird, dass pre_classes in die WebAssembly-Datei eingebettet ist, wird davon ausgegangen, dass es sich um eine vorhandene Klassendatei handelt, die kompiliert wurde.

Machen Sie als Nächstes die erstellte Klassendatei zu einer Jar-Datei.

> jar cvf classes.jar -C classes .

Die Dateien unter dem Klassenordner sind jetzt in der Datei classes.jar gruppiert. Andere Dateien als die Test2-Klassendatei wurden ebenfalls erstellt, sind jedoch harmlos und können ignoriert oder vom Jar-Dateiziel ausgeschlossen werden.

Klicken Sie auf die Schaltfläche "Datei auswählen" und geben Sie die zuvor erstellte "classes.jar" an. Darunter wird eine Liste der in der Jar-Datei enthaltenen Klassendateien angezeigt.

Ich habe unzip.min.js von zlib.js verwendet, um die Jar-Datei, dh die ZIP-Datei, zu extrahieren.

zlib.js  https://github.com/imaya/zlib.js

Führen Sie es jetzt erneut über den Browser aus.

image.png

Geben Sie als Klassennamen dieses Mal test2 / TestFunc an, das in der Jar-Datei enthalten ist, und klicken Sie zum Ausführen auf die Schaltfläche "Start war m".

Haben Sie Folgendes auf der Konsole gesehen? Es wird test2 / TestFunc und Sie können sehen, dass die entsprechende Quelle ausgeführt wird.

Hello test2/TestFunc args[0]=ABCD [] = Aiueo [1] = Kakikukeko

Ergänzung

Der Java-Interpreter wurde stark von waba angepasst und ist voller Fehler, daher möchte ich dies ablehnen. .. ..

Die Erklärung wird im nächsten Artikel sein. Zuerst bis hierher.

Das Folgende ist die Fortsetzung. Ausführen von Java VM mit Web Assembly: Ergänzung

das ist alles.

Recommended Posts

Führen Sie Java VM mit Web Assembly aus
Ausführen von JavaVM mit WebAssembly: Ergänzung
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Profilerstellung mit Java Visual VM ~ Grundlegende Verwendung ~
Java-Entwicklung mit Codenvy: Hello World! Run
Führen Sie Rust von Java mit JNA (Java Native Access) aus.
Erstellen Sie mit Gradle mit VSCode Java → Ausführen
Kommen Sie mit Java-Containern in Cloud Run zurecht
Installieren Sie Java mit Homebrew
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Führen Sie PostgreSQL unter Java aus
Bequemer Download mit JAVA
Schalten Sie Java mit direnv
Führen Sie Payara mit Docker aus
Java-Download mit Ansible
Lass uns mit Java kratzen! !!
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
[Tutorial] Eclipse herunterladen → Anwendung mit Java ausführen (Plejaden)
[Tutorial] Eclipse herunterladen → Webanwendung mit Java ausführen (Plejaden)
Serverloses Java EE beginnend mit Quarkus und Cloud Run
(Java) Einfache BDD mit Spektrum?
Verwenden Sie Lambda-Ebenen mit Java
Erstellen Sie mit Gradle ein Java-Multiprojekt
Erste Schritte mit Java Collection
Java-Konfiguration mit Spring MVC
Grundlegende Authentifizierung mit Java 11 HttpClient
Experimentieren wir mit der Java-Inline-Erweiterung
[Vorlage] MySQL-Verbindung mit Java
Schreiben Sie Java Try-Catch mit Optional neu
[Java] JSON-Kommunikation mit Jackson
Führen Sie TAO Core mit Docker aus
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
Aktivieren Sie Java EE mit NetBeans 9
[Java] JavaConfig mit statischer innerer Klasse
Versuchen Sie gRPC mit Java, Maven
Lassen Sie uns Excel mit Java betreiben! !!
Java-Versionsverwaltung mit SDKMAN
Führen Sie LIFF mit Spring Boot aus
RSA-Verschlüsselung / Entschlüsselung mit Java 8
Paging PDF mit Java + PDFBox.jar
Sortieren Sie Zeichenfolgen als charakteristische Funktion mit Java
Objektorientiert mit Strike Gundam (Java)
Führen Sie Rails immer im Docker aus
[Java] Inhaltserfassung mit HttpCliient
Java-Versionsverwaltung mit jenv
Fehlerbehebung mit Java Flight Recorder
Optimieren Sie Java-Tests mit Spock
Führen Sie das Java-Applet auf Ubuntu aus
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Fehler beim Spielen mit Java
Verwenden von Mapper mit Java (Spring)
Java Study Memo 2 mit Progate
Erste Schritte mit Java Basics
Saisonale Anzeige mit Java-Schalter
Verwenden Sie SpatiaLite mit Java / JDBC
Lernen von Java mit Progate Note 1