Jaka jest różnica między asm.js a WebAssembly?


101

Czytałem ostatnio o asm.js i WebAssembly:

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

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

Wciąż jestem zdezorientowany w kilku sprawach:

  1. Czy kod asm.js jest kompilowany na czas i działa? Skompilowane w co?
  2. Poza tym, że asm.js jest tekstem, a wasm (zestaw sieciowy) jest binarny, jakie są różnice między tymi dwoma?
  3. Co to oznacza dla innych języków skryptowych działających w przeglądarce? Weźmy na przykład Pythona, czy to będzie
    • kod Pythona skompilowany do wasm? lub
    • interpreter Pythona (Cpython) skompilowany w wasm i interpretuje pythona?

Odpowiedzi:


47

Czy kod asm.js jest kompilowany na czas i działa? Skompilowane w co?

asm.js jest zwykłym kodem javascript i jest jak zwykle kompilowany do kodu bajtowego przez interpreter JS. Jednak interpreter z obsługą ASM powinien wykonywać kompilację z wyprzedzeniem i prawdopodobnie generować bardziej wydajną reprezentację kodu ze względu na statyczne typowanie. Szczegółowe informacje można znaleźć pod adresem http://asmjs.org/ .

jakie są różnice między asm i wasm (inne niż tekst a binarny)?

Na razie brak. wasm ma być kompatybilny wstecz, kompilowalny do asm (który znowu jest wykonywalny jak zwykły JS). W przyszłości może on jednak zostać rozszerzony o więcej funkcji, w miarę wzrostu jego obsługi.

Co to oznacza dla innych języków skryptowych działających w przeglądarce?

Ten ostatni raczej, ponieważ Python wciąż wymaga interpretacji. Języki skryptowe, które nie wymagają interpretera, można oczywiście bezpośrednio skompilować do (w) asm, biorąc pod uwagę, że istnieje kompilator (łańcuch), który obsługuje go jako cel.


Kilka notatek. Pierwsza część Twojej odpowiedzi wydaje się nieco niejednoznaczna; wygląda na to, że mówisz, że asm.js skompilowałby AOT do „bardziej wydajnego kodu bajtowego”. W rzeczywistości implementacje nie muszą kierować się na kod bajtowy, aw rzeczywistości wiele z nich jest ukierunkowanych bezpośrednio na natywny ISA i AOT (o co właściwie chodzi). Mówisz również „kompilowalny do asm i js”. Możesz chcieć wyjaśnić, że chodziło Ci o określenie „natywny asembler” lub coś w tym rodzaju. A może miałeś na myśli „asm.js i js”, ale nie jest to zbyt pomocne, ponieważ jedno jest podzbiorem drugiego.
tne

1
@tne: Dziękuję za opinię, mam nadzieję, że uda mi się rozwiązać problemy - nie krępuj się samodzielnie (zasugeruj) edycję, byłbym wdzięczny. Racja, byłem trochę rozluźniony, jeśli chodzi o „bardziej wydajny kod bajtowy”, ponieważ nie byłem zaznajomiony z dokładną architekturą kompilacji, w końcu ISA to tylko kolejny „kod bajtowy”, który jest interpretowany przez procesor. Proszę wybaczyć niedokładną terminologię :-)
Bergi

53

asm.js jest podzbiorem JS z instrukcjami „wysoce optymalizowalnymi”. Zasadniczo możesz zadeklarować typ (int, float), a silnik js (w przeglądarkach, ale także node.js) będzie wykonywał instrukcje szybciej. Przynosi korzyści, jeśli Twoja aplikacja wykonuje wiele obliczeń lub grafiki, jeśli jest używana razem z WebGL.

web Assembly to format binarny dla JS, wszystkich JS, a nie tylko asm.js. To nie jest kod bajtowy, to binarne kodowanie AST, które oblicza parser. Ma 2 duże zalety:

  • silnik JS może pominąć krok analizy
  • jest znacznie bardziej zwarty niż oryginalne źródło JS

Już możemy pisać kod dla przeglądarek innych niż JS: EMSCripten potrafi skompilować kod C ++ w kodzie JS. Inne transkompilatory są już dostępne do kompilacji kodu do JS. Używając asm.js, kod może działać szybciej, gdy wykonuje obliczenia. Używając web assemblera ten kod będzie bardziej zwarty, a przeglądarka będzie mogła go szybciej przetworzyć (ponieważ będzie mogła pominąć parsowanie). Nie będziesz mieć nowej wtyczki do załadowania, takiej jak DirectX, JavaApplets, Flash lub Silverlight, ponieważ wszystko będzie działać w piaskownicy JS.


5
Pominąć analizowanie? Zwolnij, proszę. Wsparcie sprzętowe jest poza mapą w dającej się przewidzieć przyszłości. Masz na myśli to, że parsowanie stało się wąskim gardłem w asm.js, a wasm rozwiązuje to za pomocą wydajnego formatu binarnego. Twoje uzasadnienie dla asm.js / wasm wydaje się nieco minimalistyczne, ale to w porządku. Rekwizyty za wskazanie kodu bajtowego! = AST.
tne

4
@Cristian, WASM nie jest formatem binarnym dla JS. Będzie korzystać z tych samych interfejsów API sieci Web co JS, ale jest znacznie bardziej przenośny i uogólniony niż JS. Jedynymi formatami binarnymi dla JS, czyli kodami bajtowymi, są te zaimplementowane w przeglądarkach, jak Firefox tutaj: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/ ...
LearningFast

20

Czy kod asm.js jest kompilowany na czas i działa? Skompilowane w co?

Różne przeglądarki kompilują kod asm.js na różne sposoby. Od sierpnia 2015 r .:

  • Firefox kompiluje asm.js do kodu maszynowego (i buforuje kod maszynowy dla przyszłych ładowań tego samego asm.js) [ 1 ].
  • W systemie Windows 10 jako flaga eksperymentalna Edge przeprowadzi również walidację z wyprzedzeniem i kompilację asm.js [ 2 ].
  • Chrome specjalnie rozpoznaje dyrektywę „use asm” na początku pliku asm.js, aby analizować i analizować kod chętniej oraz poprawiać heurystykę kompilacji.
  • Safari nie przetwarza pliku asm.js.

Poza tym, że asm.js jest tekstem, a wasm (zestaw sieciowy) jest binarny, jakie są różnice między tymi dwoma?

asm.js to po prostu JavaScript i dlatego musi działać dokładnie zgodnie ze specyfikacją JavaScript. Jako nowy standard, WebAssembly jest w stanie naprawić niektóre narożne przypadki, w których zachowanie JavaScript nie jest idealne (z punktu widzenia wydajności lub kompilacji) [ 3 ]. W przyszłości [ 4 ], WebAssembly będzie w stanie dodawać funkcje, które w innym przypadku byłyby trudne do wyrażenia w JavaScript.

Co to oznacza dla innych języków skryptowych działających w przeglądarce? Weźmy na przykład Pythona, czy to będzie

  • kod Pythona skompilowany do wasm? lub
  • interpreter Pythona (Cpython) skompilowany w wasm i interpretuje pythona?

Jak powiedziałeś, najprostszym sposobem uruchomienia Pythona w przeglądarce w wersji v.1 będzie skompilowanie interpretera Pythona do programu wasm. Oznacza to, że np. Python GC działa w kodzie wasm i ręcznie zarządza pamięcią liniową wasm. Były już eksperymentalne projekty dodawania zaplecza asm.js do PyPy [ 5 ] (co może działać równie dobrze dla wasm). Obecnie napotyka na ograniczenia asm.js, które mogą być rozwiązane przez przyszłą funkcję dynamicznego łączenia w wasm. Idąc dalej, wasm stara się zapewnić obsługę zarówno integracji GC, jak i kompilacji JIT, co umożliwiłoby bardziej wydajną i naturalną integrację z platformą internetową.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.