Che cos'è ASM.js e cosa significa per tutti?


27

Sto iniziando a sentire brontolii su questo progetto chiamato ASM.js . Attualmente il loro sito web è terribile e confuso. Ecco cosa so dalle mie ricerche sul web.

  • È un sottoinsieme di JavaScript che può essere altamente ottimizzato. Immagino perché evita le parti più dinamiche della lingua.
  • Le prestazioni del codice compilato per ASM.js vengono eseguite a circa la metà della velocità di C (non leggera).
  • L'intenzione è per i compilatori di rendere la loro lingua di destinazione ASM.js.
  • Firefox verrà distribuito con l'ottimizzazione ASM.js integrata.
  • I team Mozilla e Unreal hanno portato l' Unreal Engine sul Web con esso e il suo funzionamento in una build di Firefox a velocità quasi native.

Non sembra esserci alcuna informazione concreta sul web su cosa sia realmente o sull'utilità o sullo scopo finale. È in grado di compilare le mie basi di codice lato server altrimenti e farlo funzionare nel browser a velocità vicine al nativo? Quali sono le conseguenze per gli sviluppatori?

Risposte:


21

Hai già descritto di cosa si tratta . L'uso è che è un linguaggio di basso livello che funziona su tutti i browser, è abbastanza veloce nella maggior parte e molto veloce in alcuni. Quello che ne pensi è aperto come quello che fai con qualsiasi altro linguaggio di programmazione.

Il caso d'uso che Mozilla sembra più interessato è questo: esistono già modi per compilare linguaggi con backend LLVM (soprattutto C e C ++) in JavaScript, tramite Emscripten. asm.js è molto vicino a ciò che Emscripten emette già, quindi questo consente al codice Emscripten (che è già incredibilmente veloce sui compilatori JIT JavaScript di oggi) di diventare ancora più veloce, promuovendo l'obiettivo di trasferire basi di codice esistenti sul web. Ancora una volta, per cosa usi esattamente questo è la tua decisione. Il porting dei giochi è un caso d'uso (in cui Mozilla è apparentemente coinvolto attivamente), ma ci sono innumerevoli cose scritte in C e C ++, alcune delle quali potrebbero tornare utili per il sito Web di qualcuno. Alcuni che ho visto lanciati in giro (oltre ad alcuni dei miei progetti), senza alcuna garanzia per quanto riguarda la fattibilità:

  • Porting di algoritmi generici (ad es. Zlib, libjpeg, openssl, implementazioni FFT) per consentire a JavaScript / siti Web di fare di più, senza dover creare un nuovo standard web e dipendere dai singoli browser per implementarlo.
  • Interpreti di porting, in modo che nel browser possano essere eseguite lingue diverse da JavaScript, con un sovraccarico minore e un minimo sforzo di porting.
  • Utilizzo di asm.js come backend per più compilatori, in particolare quelli che non mappano bene su JavaScript e non hanno bisogno della maggior parte delle sue funzionalità e sovraccarico. Un esempio potrebbe essere un linguaggio progettato per un lavoro numerico veloce senza allocazione di memoria.
  • Utilizzo di asm.js per creare un JIT in JavaScript. Può implementare qualsiasi linguaggio, ad esempio ActionScript .
  • Allo stesso modo, il porting dei compilatori JIT esistenti viene eseguito nel browser (cfr. Porting degli interpreti, con un overhead praticamente nullo su JS). Ciò è probabilmente possibile solo quando i compilatori JIT vengono generati automaticamente, come con PyPy.


1
Ecco una prova di concetto per il porting di un JIT su asm.js. È un punto di vendita unico, la maggior parte delle piattaforme emergenti non sono compatibili con JIT.
Tobu,

C'è una spiegazione da qualche parte su come asm.js supporta la compilazione JIT? Non riesco a trovare alcuna informazione al riguardo. Più interessato a come vengono gestite le implicazioni di sicurezza.
Roman Starkov,

@romkyns Compilazione JIT di asm.js su codice macchina tramite browser o compilazione JIT su asm.js (tramite un programma JavaScript)? Per il primo, almeno in Firefox, vengono riutilizzate le funzionalità di generazione del codice macchina dei compilatori JIT pure-JS. Poiché asm.js può solo chiamare in JS, eseguire aritmetica e leggere / scrivere un array di heap con controlli index-in-range, la sicurezza è pari a quella dell'esecuzione di JS. Per quest'ultimo, devi solo generare il codice sorgente asm.js e lasciare che il browser lo esegua, e non ci sono ulteriori implicazioni sulla sicurezza oltre a quanto ho detto prima.

(Intendevo quest'ultimo) Ooh ovviamente; in qualche modo ho immaginato compilatori JIT che emettevano codice macchina nativo. Grazie per il chiarimento!
Roman Starkov,

4

Immagina ASM.js come un grande ArrayBuffer binario chiamato heap e un insieme di moduli JavaScript, che iniziano con una direttiva prologo: "use asm";ed eseguono veloci operazioni di basso livello su dati binari grezzi, simili ai linguaggi di assembly. Questi moduli potrebbero essere scritti a mano o meglio compilati dal codice LLVM con script come Emscripten. Le loro prestazioni potrebbero essere potenziate grazie al motore Mozilla OdinMonkey, ma sono retrocompatibili con la maggior parte dei moderni interpreti ECMAScript.

ASM.js non si limita ai giochi, puoi anche eseguire intere app Qt nel tuo browser, come queste !

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.