Co to jest ASM.js i co to oznacza dla wszystkich?

27

Zaczynam słyszeć pomruki o tym projekcie o nazwie ASM.js . Obecnie ich strona internetowa jest okropna i myląca. Oto, co wiem z moich badań w Internecie.

  • Jest to podzbiór JavaScript, który można wysoce zoptymalizować. Zgaduję, ponieważ unika bardziej dynamicznych części języka.
  • Wydajność kodu skompilowanego do ASM.js działa przy około połowie prędkości C (nie lekkiej).
  • Celem kompilatorów jest stworzenie języka docelowego ASM.js.
  • Firefox będzie dostarczany z optymalizacją ASM.js.
  • Zespoły Mozilla i Unreal przeniosły silnik Unreal Engine do sieci wraz z jego uruchomieniem w wersji Firefox z niemal natywną prędkością.

Wydaje się, że w Internecie nie ma konkretnych informacji na temat tego, co to naprawdę jest, ani na temat przydatności lub ostatecznego celu. Czy to możliwe, że mogę skompilować moje podstawy kodu po stronie serwera i uruchomić go w przeglądarce z prędkością zbliżoną do natywnej? Jakie są konsekwencje dla programistów?

Jarrod Pokrzywy
źródło

Odpowiedzi:

21

Już opisałeś, co to jest . Wykorzystuje się to, że jest to język niskiego poziomu, który działa we wszystkich przeglądarkach, jest szybki w większości i bardzo szybki w niektórych. To, co robisz, jest tak otwarte, jak to, co robisz z każdym innym językiem programowania.

Przypadek użycia Mozilli wydaje się najbardziej interesujący: istnieją już sposoby kompilowania języków z backendami LLVM (głównie C i C ++) do JavaScript, za pomocą Emscripten. asm.js jest bardzo zbliżony do tego, co Emscripten już emituje, dzięki czemu kod Emscripten (który jest już imponująco szybki w dzisiejszych kompilatorach JavaScriptu) może stać się jeszcze szybszy, przyczyniając się do przeniesienia istniejących baz kodu do sieci. Ponownie, do czego dokładnie tego używasz, to twoja decyzja. Przenoszenie gier to jeden z przypadków użycia (w którym Mozilla jest najwyraźniej aktywnie zaangażowany), ale istnieje niezliczona ilość rzeczy napisanych w C i C ++, z których kilka może się przydać na czyjejś stronie internetowej. Niektóre, które widziałem, rzuciły się wokół (plus niektóre z moich własnych pomysłów), bez gwarancji wykonalności:

  • Przenoszenie algorytmów ogólnego zastosowania (np. Implementacje zlib, libjpeg, openssl, FFT) w celu umożliwienia JavaScript / stron internetowych do zrobienia więcej, bez konieczności tworzenia nowego standardu internetowego i jego implementacji w zależności od przeglądarki.
  • Przenoszenie interpreterów, aby języki inne niż JavaScript mogły działać w przeglądarce, przy mniejszym nakładzie pracy i minimalnym wysiłku związanym z przenoszeniem.
  • Wykorzystanie asm.js jako backendu dla większej liczby kompilatorów, szczególnie tych, które nie mapują się dobrze w JavaScript i nie potrzebują większości jego funkcji i kosztów ogólnych. Przykładem może być język zaprojektowany do szybkiej pracy numerycznej bez alokacji pamięci.
  • Użycie asm.js do utworzenia JIT w JavaScript. Może w ogóle implementować dowolny język - na przykład ActionScript .
  • Podobnie portowanie istniejących kompilatorów JIT do działania w przeglądarce (por. Portowanie interpreterów z efektywnym zerowym obciążeniem JS). Jest to prawdopodobnie możliwe tylko wtedy, gdy kompilatory JIT są generowane automatycznie, tak jak w przypadku PyPy.

źródło
2
Oto inne dobre wyjaśnienie: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles
1
Oto dowód koncepcji przeniesienia JIT do asm.js. To wyjątkowa zaleta: większość nowych platform nie jest przyjazna dla JIT.
Tobu
Czy jest jakieś wyjaśnienie, w jaki sposób asm.js obsługuje kompilację JIT? Nie mogę znaleźć żadnych informacji na ten temat. Najbardziej zainteresowani tym, jak obsługiwane są implikacje dla bezpieczeństwa.
Roman Starkov,
@romkyns Kompilacja JIT asm.js do kodu maszynowego przez przeglądarki, czy kompilacja JIT do asm.js (przez program JavaScript)? W przypadku tych pierwszych, przynajmniej w Firefoksie, ponownie wykorzystywane są funkcje generowania kodu maszynowego kompilatorów JS typu JS. Ponieważ asm.js może tylko wywoływać JS, wykonywać arytmetykę oraz odczytywać / zapisywać tablicę sterty z sprawdzeniami indeksu w zakresie, bezpieczeństwo jest tak samo dobre jak bezpieczeństwo wykonywania JS. W tym drugim przypadku wystarczy wygenerować kod źródłowy asm.js i zezwolić przeglądarce na wykonanie go, i nie ma żadnych dodatkowych konsekwencji dla bezpieczeństwa poza tym, o czym wspomniałem wcześniej.
(Miałem na myśli to drugie) Ooh oczywiście; jakoś wyobrażałem sobie kompilatory JIT emitujące natywny kod maszynowy. Dziękuję za wyjaśnienie!
Roman Starkov
4

Wyobraź sobie ASM.js jako duży binarny ArrayBuffer zwany stertą i zestawem modułów JavaScript, które zaczynają się od dyrektywy prologue: "use asm";i wykonuj szybkie operacje niskiego poziomu na surowych danych binarnych, podobnych do języków asemblera. Moduły te można pisać ręcznie lub lepiej skompilować z kodu LLVM za pomocą skryptów takich jak Emscripten. Ich wydajność można zwiększyć dzięki silnikowi Mozilla OdinMonkey, ale są one kompatybilne wstecz z większością współczesnych interpreterów ECMAScript.

ASM.js nie ogranicza się do gier, możesz nawet uruchamiać w przeglądarce całe aplikacje Qt, takie jak te !

niutech
źródło