[JAVA] Ich habe auch Web Assembly mit Nim und C ausprobiert

http://qiita.com/akira_/items/55cf1f5911b14e265c6f Inspiriert von diesem Artikel habe ich die Nim-Version und die C-Version geschrieben.

Erstes Ergebnis

Das Ergebnis von "Fibonacci (45)"

Umgebung

CPU: Intel Core i7-6700
RAM: 8GB x2
WebBrowser: Google Chrome 57.0.2987.98 (64-bit)
Language Elapsed
JavaScript 19.176
C Wasm 4.357
Rust Wasm 4.354
Nim Wasm 4.359

Bitte beachten Sie, dass die Ergebnisse nur einmal eingefügt werden und sich die Ergebnisse abhängig von der Ausführungsumgebung und jeder Ausführung ändern.

Quellcode

# Nim
import os
import times
import strutils

proc fibonacci*(n: int64): int64 =
  if n <= 1'i64:
    1'i64
  else:
    fibonacci(n - 1'i64) + fibonacci(n - 2'i64)

proc main() =
  let args = commandLineparams()
  let n = args[0].parseInt()
  echo "fibonacci($#) = $#" % [$n, $fibonacci(n.int64)]

main()
// C
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

int64_t fibonacci(int64_t n) {
    if (n <= 1) {
        return 1;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

int main(int argc, char** argv) {
    int n = atoi(argv[1]);
    printf("fibonacci(%d) = %" PRId64 "\n", n, fibonacci(n));
    return 0;
}

Verfahren

Im obigen Artikel scheint es, dass es mit dem Docker-Image erstellt wurde, aber ich habe das auf Xubuntu auf der VM installierte mit emsdk als Build-Umgebung verwendet.

Ich werde die Installation von Compilern für verschiedene Sprachen wie Rust und Nim weglassen.

Installieren Sie Emscripten

http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html Laden Sie emsdk von herunter, entpacken Sie es und fügen Sie es in Ihren PFAD ein.

Nach dem Durchgang durch den Pfad

$ emsdk update
$ emsdk install sdk-incoming-64bit
$ emsdk activate sdk-incoming-64bit

Sie können Emscripten selbst mit installieren und aktivieren.

** Nachtrag ** Danach

$ source emsdk-portable/emsdk_env.sh

Ich habe vergessen zu schreiben, was ich brauche, also werde ich es hinzufügen. Ich denke, es ist gut, es in ~ / .profile usw. zu schreiben. ** Nachtrag zu hier **

In Bezug auf Emscripten scheint das Versionsflag von WebAssembly, wenn es "sdk-incoming-64bit" ist, korrekt 1.0 zu sein. (Stand 14. März 2017)

Die Einschränkung hierbei ist, dass nicht nur Emscripten-, sondern auch LLVM- und Clang-Builds ausgeführt werden, was zeitaufwändig ist und viel Speicher verbraucht. In Bezug auf das Gedächtnis wollen wir uns damit befassen, indem wir zunächst einen Tausch oder eine große Menge vorbereiten. (Ich habe 10 GB Speicher der VM zugewiesen)

Sie müssen lediglich den Compiler für Ihre Sprache ausführen.

# C
$ emcc -O3 -s WASM=1 -o fib-c.js fibonacci.c
# Rust
$ rustc -O --target=wasm32-unknown-emscripten -o fib-rust.js fibonacci.rs
# Nim
$ nim c -d:release -d:emscripten -o:fib-nim.js fibonacci.nim

Platzieren Sie für Nim die folgende Datei nim.cfg im selben Verzeichnis wie die Quelle.

@if emscripten:
  cc = clang
  clang.exe = "emcc"
  clang.linkerexe = "emcc"
  clang.options.linker = ""
  cpu = "i386"
  warning[GcMem]= off
  passC = "-s WASM=1"
  passL = "-s WASM=1"
@end

Impressionen

Zusammenfassung

Ich habe vier Sprachen verglichen: JavaScript, C, Rust und Nim, aber dieser Artikel könnte etwas sein, das ich geschrieben habe, um Nim zu interessieren. Derzeit scheint die einzige Sprache, die WebAssembly kann, C / C ++ / Rust zu sein, aber ich würde es begrüßen, wenn Sie wissen könnten, dass Nim dies auch kann. (Ich bin nicht sicher, ob GC richtig funktioniert ...) Selbst mit Nim können Sie das DOM mit jsbind bearbeiten.

Insbesondere hat Nim GC, daher denke ich, dass es einfacher zu schreiben ist als C / C ++ / Rust. Daher möchte ich, dass es eine Option als Sprache ist, die mit WebAssembly leicht beschleunigt werden kann.

Schließlich

Wir haben eine Website erstellt, auf der Sie WebAssembly vergleichen können, damit Sie es einfach mit Ihrem Browser ausprobieren können.

https://snowlt23.github.io/wasm-bench-site/

Es ist eine grobe Konstruktion, aber ich hoffe, Sie können die Atmosphäre spüren, indem Sie sie vorerst bewegen.

Als Einschränkung, ich vergleiche aus Wasms Sicht, weil es eine grobe Konstruktion ist, und aus diesem Grund ist N, wenn es klein ist, langsamer als JavaScript. Wir empfehlen etwa 40 <= N <= 46.


Ich bin eine Person, die jedes Mal krank wird, wenn ich JavaScript schreibe. Ich hoffe, dass der Tag kommt, an dem es für verschiedene Sprachen zur Gewohnheit wird, im Web zu arbeiten.

Recommended Posts

Ich habe auch Web Assembly mit Nim und C ausprobiert
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, Ruby mit Ruby (und C) zu implementieren (ich habe mit Builtin gespielt)
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, C # zu kauen (Dateien lesen und schreiben)
Ich habe DI mit Ruby versucht
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Hallo Welt mit Docker und C Sprache
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe GraphQL mit Spring Boot ausprobiert
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, WebAssembly Stadio (Version 2018/4/17) zu verwenden.
C # (Polymorphismus: Polymorphismus)
Ich habe versucht, Slim mit Scaffold anzupassen
Mit Java verschlüsseln und mit C # entschlüsseln
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports 3/3 (Spring MVC-Steuerung) zu drucken.
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports 2/3 (Formularvorlagenerstellung) zu drucken.
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports Extra Edition (Variables Edition) zu drucken.
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports Extra Edition (Bildausgabe) zu drucken.
In dieser Zeit habe ich versucht, Java Bean und XML mit dem Jackson-Formatierer XML zu konvertieren
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe versucht, grafana und postgres [docker-compose] zu verknüpfen
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
C # (Grund der Kapselung)
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe Eclipse MicroProfile OpenAPI mit WildFly Swarm ausprobiert
Ich habe versucht, JavaFX und Spring Framework zu verknüpfen.
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Gradle auf Heroku zu beginnen
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Ich habe versucht, YouTube-Video von DB mit haml aufzurufen und es eingebettet anzuzeigen
Ich habe es mit Spring versucht.
Ich habe versucht, Tomcat zu setzen
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Versuchte Mastodons Toot- und Streaming-API in Java
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren