Maison  >  Article  >  interface Web  >  Rust -> asm.js & webassembly - Calcul haute performance pour WEB

Rust -> asm.js & webassembly - Calcul haute performance pour WEB

php中世界最好的语言
php中世界最好的语言original
2017-11-18 15:18:502857parcourir

Nous l'avons déjà dit pour javascript, le monde front-end est en constante évolution. Dans les articles précédents, je vous ai dit d'utiliser Emscripten pour compiler le langage C puis d'utiliser asm.js et WebAssembly. Cette méthode peut grandement améliorer la vitesse d'exécution du code front-end, mais en raison du projet lui-même. Le langage C manque de nombreuses fonctionnalités avancées, et de nombreuses fonctions ne peuvent pas être implémentées, ce qui n'est pas propice au développement de projets à grande échelle, et le C++ est trop complexe, j'ai donc finalement choisi d'utiliser Rust.

Au début, je ne savais pas si je devais utiliser Go, Rust ou Swift, mais plus tard, j'ai découvert que Go ne prend actuellement pas en charge la compilation vers WebAssembly. Swift devrait pouvoir le prendre en charge, car ce sont tous des compilateurs créés avec. LLVM, mais je n'ai trouvé aucune bonne information. Il semble que je doive compiler LLVM moi-même pour prendre en charge https://stackoverflow.com/questions/46572144/compile-. assemblage rapide vers le Web. De plus, j'aime beaucoup certaines fonctionnalités de Rust. J'ai entendu dire que Rust est très compliqué et ressemble plus à Scala et Haskell. Cependant, je connais assez bien Scala et j'ai appris quelques mots de Haskell, j'ai donc décidé d'essayer Rust.

https://github.com/ChristianMurphy/compile-to-web Ici vous pouvez voir les langages qui peuvent actuellement être compilés dans WebAssembly.

PS, asm.js et Rust sont tous deux créés par Mozilla.

Installer l'outil de gestion Rust rustup

rustup est utilisé pour installer et gérer les outils liés à Rust, notamment le compilateur rustc, l'outil de gestion de packages cargo, etc., et prend en charge l'installation de différentes versions comme stable, bêta, nocturne, etc. En plus de basculer entre différentes versions, similaire à nvm.

curl https://sh.rustup.rs -sSf | sh

Installer le compilateur Emscripten Rust

Utilisez rustup pour installer la dernière version d'essai (version nocturne) :

rustup toolchain add nightly
rustup target add wasm32-unknown-emscripten --toolchain nightly

Installez cmake

Selon à la plateforme Choisissez par vous-même :

brew install cmake                  # MacOS, brew
sudo port install cmake             # MacOS, MacPorts
sudo apt-get install cmake          # Debian Linux

Installer Emscripten

Référez-vous à l'article précédent, ou exécutez directement la commande suivante :

wget https://s3.amazonaws.com/mozilla-games/emscripten/releases/emsdk-portable.tar.gz
tar -xvf emsdk-portable.tar.gz
cd emsdk-portable
./emsdk update
./emsdk install sdk-incoming-64bit

Cette étape prend un longtemps, on dit que cela prend plus de 2 heures. Je suis sorti manger avec des amis après avoir exécuté la commande, donc je ne connais pas l'heure précise.

Ajoutez le chemin suivant à PATH :

~/emsdk-portable
~/emsdk-portable/clang/fastcomp/build_incoming_64/bin
~/emsdk-portable/emscripten/incoming

Exécutez emcc -v sur le terminal pour vérifier si l'installation a réussi.

Exécutez Rust avec Webpack

Créez un nouveau projet hybride Rust/Javascript :

cargo new webasm --bin --vcs none
cd webasm
npm init
rustup override set nightly

Installez Webpack, webpack-dev-server, rust-wasm-loader,

npm i -D webpack webpack-dev-server rust-wasm-loader

Ajouter un script package.json :

{
  "name": "webasm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "compile": "webpack --progress",
    "serve": "http-server",
    "start": "webpack-dev-server --content-base ./build"
  },
  "author": "magicly",
  "license": "ISC",
  "devDependencies": {
    "http-server": "^0.10.0",
    "rust-wasm-loader": "^0.1.2",
    "webpack": "^3.6.0",
    "webpack-dev-server": "^2.8.2"
  }
}

Créer un nouveau fichier index.html dans le répertoire de build :

<!DOCTYE html>
<html>
 
<head>
  <title>Hello WebAssembly</title>
</head>
 
<body>
< div id="container"></div>
  <script src="/bundle.js"></script>
</body>
 
</html>

Configurer webpack.config.js :

module.exports = {
  entry: &#39;./src/index.js&#39;,
  output: {
    filename: &#39;bundle.js&#39;,
    path: dirname + &#39;/build&#39;,
  },
  module: {
    rules: [
      {
        test: /\.rs$/,
        use: {
          loader: &#39;rust-wasm-loader&#39;,
          options: {
            <span>// The path to the webpack output relative to the project root</span>
            path: &#39;&#39;,
            release: true <span>// 没有的话性能巨差,差不多只有1/10</span>
          }
        }
      }
    ]
  },
  <span>// The .wasm &#39;glue&#39; code generated by Emscripten requires these node builtins,</span>
  <span>// but won&#39;t actually use them in a web environment. We tell Webpack to not resolve those</span>
  <span>// require statements since we know we won&#39;t need them.</span>
  externals: {
    &#39;fs&#39;: true,
    &#39;path&#39;: true,
  }
}

Créez un nouveau fichier src/main.rs et ajoutez les fonctions que nous voulons appeler depuis js :

fn main() {
    println!("Hello, world!");
}
 
<span>// Functions that you wish to access from Javascript</span>
<span>// must be marked as no_mangle</span>
#[no_mangle]
pub fn add(a: i32, b: i32) -> i32 {
    return a + b
}

Créez un nouveau src/index.js et écrivez du code pour charger le module WebAssembly :

const wasm = require(&#39;./main.rs&#39;)
 
wasm.initialize({ noExitRuntime: true }).then(module => {
  <span>// Create a Javascript wrapper around our Rust function</span>
  const add = module.cwrap(&#39;add&#39;, &#39;number&#39;, [&#39;number&#39;, &#39;number&#39;])
  
  console.log(&#39;Calling rust functions from javascript!&#39;)
  console.log(add(1, 2))
})

Ensuite, exécutez npm start et visitez http://localhost:8080/ pour voir l'effet de l'appel du code rust. Il prend également en charge les mises à jour à chaud. Vous pouvez directement modifier le code rust, l'enregistrer et voir le dernier effet sur la page.

Rust -> asm.js & webassembly - Calcul haute performance pour WEB

J'ai testé le code dans l'article précédent. Il ne faut que plus de 300 ms pour exécuter directement le code optimisé pour la rouille. Code C, mais avec Il faut en fait environ 2,7 secondes pour exécuter wasm. Je ne sais pas s'il n'est pas configuré correctement, ou si c'est parce que Rust compilé dans wasm n'est pas optimisé correctement. Le support de Rust pour WebAssembly n'est pas encore particulièrement mature. Vous pouvez suivre https://github.com/rust-lang/rust/issues/38804 pour suivre.

De plus, Rust a un package https://crates.io/crates/webplatform, qui peut être utilisé pour faire fonctionner DOM, mais je ne peux pas l'utiliser actuellement (ça semble inutile)

L'article ci-dessus est J'espère que ma compréhension du calcul haute performance dans le WEB pourra aider les amis dans le besoin. J'ai déjà publié deux articles "asm.js & webassembly-Le calcul haute performance du WEB" et "asm.js & webassembly". -Le calcul haute performance du WEB". 》, les amis dans le besoin peuvent y jeter un œil.

Lecture recommandée :

WebWorkers - Calcul haute performance sur le front-end


informatique haute performance asm.js & webassembly-WEB


Partage de trois méthodes de vérification du formulaire de soumission JavaScript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn