[JAVA] J'ai aussi essayé Web Assembly avec Nim et C

http://qiita.com/akira_/items/55cf1f5911b14e265c6f Inspiré par cet article, j'ai écrit la version Nim et la version C.

Premier résultat

Le résultat de fibonacci (45)

environnement

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

Veuillez noter que les résultats ne sont collés qu'une seule fois et que les résultats changeront en fonction de l'environnement d'exécution et de chaque exécution.

Code source

# 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;
}

procédure

Dans l'article ci-dessus, il semble qu'il a été construit à l'aide de l'image Docker, mais j'ai utilisé celui installé sur Xubuntu sur la machine virtuelle en utilisant emsdk comme environnement de construction.

J'omettrai l'installation de compilateurs pour divers langages tels que Rust et Nim.

Installez Emscripten

http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html Téléchargez emsdk depuis, décompressez-le et mettez-le dans votre PATH.

Après avoir traversé le CHEMIN

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

Vous pouvez installer et activer Emscripten lui-même avec.

** Addenda ** Après ça

$ source emsdk-portable/emsdk_env.sh

J'ai oublié d'écrire ce dont j'ai besoin, je vais donc l'ajouter. Je pense qu'il est bon de l'écrire dans ~ / .profile etc. ** Addendum ici **

Concernant Emscripten, s'il s'agit de sdk-incoming-64bit, l'indicateur de version de WebAssembly semble être 1.0 correctement. (Au 14 mars 2017)

La mise en garde ici est que non seulement les builds Emscripten mais aussi LLVM et Clang s'exécutent, ce qui prend du temps et consomme beaucoup de mémoire. En ce qui concerne la mémoire, traitons-y en préparant un swap ou en préparant une grande quantité en premier lieu. (Je l'ai traité en allouant 10 Go de mémoire à la VM)

Tout ce que vous avez à faire est d'exécuter le compilateur pour votre langage.

# 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

Pour Nim, placez le nim.cfg suivant dans le même répertoire que la source.

@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

Impressions

Résumé

J'ai comparé quatre langages: JavaScript, C, Rust et Nim, mais cet article est peut-être quelque chose que j'ai écrit pour intéresser Nim. Actuellement, il semble que le seul langage que WebAssembly puisse faire est C / C ++ / Rust, mais j'apprécierais que vous sachiez que Nim peut également le faire. (Je ne sais pas si GC fonctionne correctement ...) Même avec Nim, vous pouvez manipuler le DOM en utilisant jsbind.

En particulier, Nim a GC, donc je pense que c'est plus facile à écrire que C / C ++ / Rust, donc j'aimerais que ce soit une option en tant que langage qui peut être facilement accéléré avec WebAssembly.

finalement

Nous avons créé un site sur lequel vous pouvez comparer WebAssembly afin que vous puissiez facilement l'essayer avec votre navigateur.

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

C'est une construction approximative, mais j'espère que vous pouvez ressentir l'atmosphère en la déplaçant pour le moment.

En guise de mise en garde, je fais une analyse comparative du point de vue de Wasm parce que c'est une construction grossière, et à cause de cela, si N est petit, il est plus lent que JavaScript. Nous recommandons environ «40 <= N <= 46».


Je suis une personne qui tombe malade chaque fois que j'écris du JavaScript, alors j'espère que le jour viendra où il deviendra courant que différentes langues fonctionnent sur le Web.

Recommended Posts

J'ai aussi essayé Web Assembly avec Nim et C
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'implémenter Ruby avec Ruby (et C) (j'ai joué avec intégré)
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de mâcher C # (lire et écrire des fichiers)
J'ai essayé DI avec Ruby
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé l'analyse morphologique avec MeCab
Hello World avec Docker et langage C
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé GraphQL avec Spring Boot
J'ai essayé Flyway avec Spring Boot
J'ai essayé d'utiliser WebAssembly Stadio (version 2018/4/17)
C # (polymorphisme: polymorphisme)
J'ai essayé de personnaliser Slim avec Scaffold
Crypter avec Java et décrypter avec C #
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 3/3 (contrôle Spring MVC)
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 2/3 (création de modèle de formulaire)
Lier le code Java et C ++ avec SWIG
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra (édition Variables)
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra Edition (édition d'image)
J'ai essayé de convertir Java Bean et XML avec le formateur XML de Jackson à cette époque
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé de lier grafana et postgres [docker-compose]
[Android] J'ai quitté SQLite et essayé d'utiliser Realm
C # (base de l'encapsulation)
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai essayé Eclipse MicroProfile OpenAPI avec WildFly Swarm
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de démarrer avec Gradle sur Heroku
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
J'ai essayé d'appeler une vidéo YouTube de DB avec haml et de l'afficher intégrée
J'ai essayé Spring.
J'ai essayé de mettre Tomcat
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé ce que je voulais essayer avec Stream doucement.
Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC