Qual è la differenza tra asm.js e WebAssembly?


101

Recentemente ho letto di asm.js e WebAssembly:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Sono ancora confuso su alcune cose:

  1. Il codice asm.js viene compilato in tempo ed eseguito? Compilato in cosa?
  2. A parte che asm.js è text e wasm (web assembly) è binario, quali sono le differenze tra i 2?
  3. Cosa significa questo per altri linguaggi di scripting, in esecuzione nel browser? Prendi python per esempio, lo sarà
    • codice Python compilato in wasm? o
    • interprete python (Cpython) compilato in wasm e interpreta python?

Risposte:


47

Il codice asm.js viene compilato in tempo ed eseguito? Compilato in cosa?

asm.js è un normale codice javascript, ed è compilato in bytecode dall'interprete JS come sempre. Tuttavia, un interprete con supporto asm dovrebbe eseguire la compilazione anticipata e possibilmente generare una rappresentazione del codice più efficiente a causa della digitazione statica. Vedi http://asmjs.org/ per i dettagli.

quali sono le differenze tra asm e wasm (diverso da testo vs binario)?

Nessuno, per ora. wasm dovrebbe essere compatibile con le versioni precedenti, compilabile in asm (che di nuovo è eseguibile come normale JS). Potrebbe tuttavia essere esteso con più funzionalità in futuro man mano che il supporto cresce.

Cosa significa questo per altri linguaggi di scripting, in esecuzione nel browser?

Quest'ultimo, piuttosto, come Python deve ancora essere interpretato. I linguaggi di scripting che non necessitano di un interprete possono ovviamente essere compilati direttamente in (w) asm, dato che esiste un compilatore (catena) che lo supporta come target.


Note di coppia. La prima parte della tua risposta sembra un po 'ambigua; sembra che tu stia dicendo che asm.js compilerebbe AOT in un "bytecode più efficiente". In realtà, le implementazioni non devono mirare a un bytecode, e in effetti molte prendono di mira direttamente l' ISA nativo e AOT (che è un po 'il punto, davvero). Dici anche "compilabile in asm e js". Potresti voler chiarire che intendevi dire "assembly nativo" o qualcosa del genere. O forse intendevi "asm.js e js", ma non è molto utile poiché uno è un sottoinsieme dell'altro.
TNE

1
@tne: Grazie per il feedback, spero di poter risolvere i problemi - sentiti libero di (suggerire una) modifica da solo, lo apprezzerei. Esatto, ero un po 'lassista sul "bytecode più efficiente" poiché non conoscevo l'esatta architettura di compilazione, dopotutto ISA è solo un altro "byte code" interpretato dal processore. Per favore perdona la terminologia imprecisa :-)
Bergi

53

asm.js è un sottoinsieme di JS con istruzioni "altamente ottimizzabili". Fondamentalmente puoi dichiarare il tipo (int, float) e il motore js (nei browser ma anche quello node.js) eseguirà le istruzioni più velocemente. Ha dei vantaggi se la tua app esegue molti calcoli o grafici se utilizzata insieme a WebGL.

web assembly è un formato binario per JS, tutto JS, non solo asm.js. Non è un bytecode, è una codifica binaria dell'AST che calcola il parser. Ha 2 grandi vantaggi:

  • il motore JS può saltare la fase di analisi
  • è molto più compatto dell'originale JS

Possiamo già scrivere codice per browser che non sia JS: EMSCripten può compilare codice c ++ nel codice JS. Sono già disponibili altri transcompilatori per compilare il codice in JS. Usando asm.js quel codice può essere eseguito più velocemente quando fa matematica. Usando il web assembly quel codice sarà più compatto e il browser sarà in grado di elaborarlo più velocemente (perché sarà in grado di saltare l'analisi). Non avrai un nuovo plugin da caricare come DirectX, JavaApplets, Flash o Silverlight perché tutto verrà eseguito nella sandbox JS.


5
Saltare l'analisi? Rallenta, lì. Il supporto hardware è fuori mappa per il prossimo futuro. Quello che vuoi dire è che l'analisi è diventata il collo di bottiglia con asm.js e wasm lo risolve con un formato binario efficiente. La tua logica per asm.js / wasm sembra un po 'minimalista, ma va bene. Props per sottolineare bytecode! = AST.
TNE

4
@Cristian, WASM non è un formato binario per JS. Utilizzerà le stesse API Web di JS, ma è molto più portabile e generalizzato di JS. Gli unici formati binari per JS, o bytecode, sono quelli implementati nei browser, come Firefox qui: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast

20

Il codice asm.js viene compilato in tempo ed eseguito? Compilato in cosa?

Browser diversi compilano il codice asm.js in modi diversi. A partire da agosto 2015:

  • Firefox compila asm.js in codice macchina (e memorizza nella cache il codice macchina per caricamenti futuri dello stesso asm.js) [ 1 ].
  • In Windows 10 come flag sperimentale, Edge eseguirà anche alcune convalide anticipate e compilazioni di asm.js [ 2 ].
  • Chrome riconosce in modo speciale la direttiva "use asm" all'inizio di asm.js per analizzarlo e analizzarlo più avidamente e modificare l'euristica di compilazione.
  • Safari non esegue alcuna elaborazione speciale di asm.js.

A parte che asm.js è text e wasm (web assembly) è binario, quali sono le differenze tra i 2?

asm.js è solo JavaScript e quindi deve comportarsi esattamente secondo le specifiche JavaScript. Come nuovo standard, WebAssembly è in grado di risolvere alcuni casi d'angolo in cui il comportamento di JavaScript non è l'ideale (dal punto di vista delle prestazioni o della compilazione) [ 3 ]. In futuro [ 4 ], WebAssembly sarà in grado di aggiungere funzionalità che altrimenti sarebbero difficili da esprimere in JavaScript.

Cosa significa questo per altri linguaggi di scripting, in esecuzione nel browser? Prendi python per esempio, lo sarà

  • codice Python compilato in wasm? o
  • interprete python (Cpython) compilato in wasm e interpreta python?

Nella v.1, il modo più semplice per eseguire Python in un browser sarà compilare un interprete Python in wasm, come hai detto. Ciò significa, ad esempio, che il GC Python viene eseguito in codice wasm e gestisce manualmente la memoria lineare wasm. C'è già stato un progetto sperimentale per aggiungere un backend asm.js a PyPy [ 5 ] (che potrebbe funzionare altrettanto bene per wasm). Attualmente incorre in limitazioni di asm.js che potrebbero essere risolte dalla futura funzionalità di collegamento dinamico di wasm. Andando oltre, wasm cerca di fornire sia l' integrazione GC che il supporto per la compilazione JIT, entrambi i quali consentirebbero un'integrazione più efficiente e naturale con la piattaforma Web.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.