2015-07-19 13 views
57

Ho letto su asm.js e assemblaggio web di recente:Qual è la differenza tra asm.js e web assembly?

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

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

io sono ancora confusi su un paio di cose:

  1. è il codice compilato asm.js nel tempo e correre? Compilato in cosa?
  2. Altro che asm.js essendo testo e wasm (web assembly) sono binari, quali sono le differenze tra il 2?
  3. Cosa significa questo per altri linguaggi di script, in esecuzione nel browser? Prendi python per esempio, sarà
    • codice python compilato per wasm? oppure
    • interprete python (Cpython) compilato in wasm e interpreta python?

risposta

25

È asm.js codice compilato nel tempo e correre? Compilato in cosa?

asm.js è codice javascript regolare, e viene compilato in bytecode dall'interprete JS come sempre. Tuttavia, un interprete con supporto asm dovrebbe eseguire la compilazione in anticipo e, eventualmente, generare una rappresentazione del codice più efficiente a causa della tipizzazione 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, compilable to asm (che di nuovo è eseguibile come normale JS). Potrebbe tuttavia essere esteso con more features in futuro, man mano che aumenta il supporto.

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

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

+0

Note di coppia. La prima parte della tua risposta sembra un po 'ambigua; sembra che tu stia dicendo che asm.js avrebbe compilato AOT in un "bytecode più efficiente". In realtà, le implementazioni non devono mirare a un bytecode, e in effetti molti indirizzano il nativo [ISA] (https://en.wikipedia.org/wiki/Instruction_set) direttamente e AOT (che è una specie di punto, in realtà) . Dici anche "compilabile su asm e js". Potresti voler chiarire che intendevi dire "assemblea nativa" o qualcosa del genere. O forse intendevi "asm.js e js", ma non è molto utile dato che uno è un sottoinsieme dell'altro. – tne

+0

@tne: Grazie per il feedback, spero di poter risolvere i problemi - sentiti libero di (suggerire un) di modificare te stesso, lo apprezzerei. Giusto, ero un po 'trascurato sul "bytecode più efficiente" perché non avevo familiarità con l'esatta architettura di compilazione, dopotutto l'ISA è solo un altro "codice byte" interpretato dal processore. Per favore perdona terminologia imprecisa :-) – Bergi

17

Il codice asm.js è compilato nel tempo ed è in esecuzione? Compilato in cosa?

Diversi browser 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 i carichi futuri degli stessi asm.js) [1].
  • In Windows 10 come flag sperimentale, Edge eseguirà anche alcune convalide e compilation Ahead-of-Time di asm.js [2].
  • Chrome riconosce in modo particolare la direttiva "use asm" all'inizio di asm.js per analizzarlo e analizzarlo con più entusiasmo e ottimizzare l'euristica di compilazione.
  • Safari non esegue un'elaborazione speciale di asm.js.

Oltre asm.js essere testo e wasm (assemblaggio web) essendo binario, quali sono le differenze tra il 2?

asm.js è solo JavaScript e, pertanto, deve comportarsi esattamente in base alle specifiche JavaScript. Come nuovo standard, WebAssembly è in grado di correggere 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à altrimenti difficili da esprimere in JavaScript.

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

  • codice python compilato per wasm? oppure
  • interprete python (Cpython) compilato in wasm e interpreta python?

Nel v.1, il modo più semplice per eseguire Python in un browser sarà quello di compilare un interprete Python per wasm, come hai detto. Ciò significa, ad esempio, che il GC Python è in esecuzione in codice wasm e gestisce manualmente la memoria lineare wasm. Ci sono già stati progetti sperimentali per aggiungere un backend asm.js a PyPy [5] (che potrebbe funzionare altrettanto bene per wasm). Attualmente si trova in limiti di asm.js che potrebbero essere risolti dallo dynamic linking future feature di wasm. Andando oltre, wasm cerca di fornire sia GC integration e JIT compilation support che entrambi consentono un'integrazione più efficiente e naturale con la piattaforma Web.

33

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 node.js uno) eseguirà le istruzioni più velocemente. Ha benefici se la tua app esegue molti calcoli o grafici se usata 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. Dispone di 2 grandi vantaggi:

  • il motore JS può saltare il passaggio di analisi
  • è molto più compatta rispetto alla fonte originale JS

Siamo già possibile scrivere codice per i browser che non è JS : EMSCripten può compilare codice C++ nel codice JS. Altri transcompiler sono già disponibili per compilare il tuo codice in JS. Utilizzando asm.js, il codice può essere eseguito più velocemente quando fa matematica. Utilizzando 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 è necessario caricare un nuovo plug-in come DirectX, JavaApplets, Flash o Silverlight perché tutto verrà eseguito nella sandbox JS.

+1

Skip parsing? Rallenta, ecco. Il supporto hardware è fuori mappa per il prossimo futuro. Quello che intendi è che l'analisi è diventato il collo di bottiglia di asm.js e che wasm risolve questo con un efficiente formato binario. Il tuo razionale per asm.js/wasm sembra un po 'minimalista, ma va bene. Puntelli per indicare il bytecode! = AST. – tne

Problemi correlati