fbpx
Wikipedia

asm.js

asm.js is a subset of JavaScript designed to allow computer software written in languages such as C to be run as web applications while maintaining performance characteristics considerably better than standard JavaScript, which is the typical language used for such applications.

asm.js
Designed byMozilla
First appeared21 March 2013; 11 years ago (2013-03-21)[1]
OSPlatform independent
Websiteasmjs.org
Influenced by
JavaScript
Influenced
WebAssembly

asm.js consists of a strict subset of JavaScript, to which code written in statically typed languages with manual memory management (such as C) is translated by a source-to-source compiler such as Emscripten (based on LLVM).[2] Performance is improved by limiting language features to those amenable to ahead-of-time optimization and other performance improvements.

Mozilla Firefox was the first web browser to implement asm.js-specific optimizations, starting with version 22.[3]

asm.js is superseded by WebAssembly. See § Deprecation below.

Design edit

asm.js enables significant performance improvements for web applications, but does not aim to improve the performance of hand-written JavaScript code, nor does it enable anything other than enhanced performance.

It is intended to have performance characteristics closer to that of native code than standard JavaScript by limiting language features to those amenable to ahead-of-time optimization and other performance improvements.[4] By using a subset of JavaScript, asm.js is largely supported by all major web browsers,[5] unlike alternative approaches such as Google Native Client.

Code generation edit

asm.js is not typically written directly: instead, as an intermediate language, it is generated through the use of a compiler that takes source code in a language such as C++ and outputs asm.js.

For example, given the following C code:

int f(int i) {  return i + 1; } 

Emscripten would output the following JS code:

function f(i) {  i = i|0;  return (i + 1)|0; } 

Note the addition of |0 and the lack of type specifiers. In JavaScript, bitwise operators convert their operands to 32-bit signed integers and give integer results. This means that a bitwise OR with zero converts a value to an integer (a very simple "conceptual" presentation of bitwise operators may not deal with type conversion at all, but every programming language defines operators for its own convenience, as Javascript does here). By doing this for each parameter, this ensures that if the function is called from outside code, the value will be converted to the correct type. This is also used on the return value, in this case to ensure that the result of adding 1 to i will be an integer (as otherwise it could become too large), and to mark the return type of the function. These conversions are required by asm.js, so that an optimising compiler can produce highly efficient native code ahead-of-time. In such an optimising compiler, no conversions are performed when asm.js code calls other asm.js code, as the required type specifiers mean it is guaranteed that values will already have the correct type. Furthermore, rather than performing a floating-point addition and converting to an integer, it can simply do a native integer operation. Together, this leads to significant performance benefits.

Here is another example to calculate the length of a string:

size_t strlen(char *ptr) {  char *curr = ptr;  while (*curr != 0) {  curr++;  }  return (curr - ptr); } 

This would result in the following asm.js code:

function strlen(ptr) {  ptr = ptr|0;  var curr = 0;  curr = ptr;  while ((MEM8[curr>>0]|0) != 0) {  curr = (curr + 1)|0;  }  return (curr - ptr)|0; } 

In the generated code, the variable MEM8 is actually a byte-by-byte "view" of a typed buffer, which serves as the "heap" of the asm.js code.

Performance edit

Since asm.js runs in a browser, the performance heavily depends on both the browser and hardware. Preliminary benchmarks of C programs compiled to asm.js are usually within a factor of 2 slower than native compilation with Clang.[6]

Much of this performance gain over normal JavaScript is due to 100% type consistency and virtually no garbage collection (memory is manually managed in a large typed array). This simpler model with no dynamic behavior, no memory allocation or deallocation, just a narrow set of well-defined integer and floating point operations enables much greater performance and potential for optimization.[citation needed]

Mozilla's benchmark from December 2013 showed significant improvements: "Firefox with float32 optimizations can run all those benchmarks at around 1.5× slower than native, or better."[7] Mozilla points out that the performance of natively compiled code is not a single measure but rather a range, with different native compilers (in this case Clang and GCC) delivering code of differing performance. "In fact, on some benchmarks, like Box2D, FASTA and copy, asm.js is as close or closer to Clang than Clang is to GCC. In one case, asm.js even beats Clang by a slight amount on Box2D."[7]

Implementations edit

The Emscripten project provides tools that can be used to compile C and C++ codebases (or any other languages that can be converted to LLVM IR) into asm.js.[2]

All browsers with support for ECMAScript 6 should be able to run asm.js code, as it is a subset of that specification. However, since features were added in that edition to enable full asm.js support (Math.fround()), older browsers lacking those features may encounter problems.

Some browser implementations are especially optimised for asm.js:

  • Mozilla Firefox was the first web browser to implement asm.js-specific optimizations, starting with Firefox 22.[3] OdinMonkey, Mozilla's asm.js ahead-of-time compiler used in Firefox, is a component of IonMonkey, the JIT compiler of SpiderMonkey.
  • Microsoft was implementing support for asm.js in Chakra, the JavaScript engine used by Microsoft Edge Legacy, performing validation to produce highly optimised JIT code.[8]
  • The optimizations of Google Chrome's V8 JavaScript engine in Chrome 28 made asm.js benchmarks more than twice as fast as prior versions of Chrome,[9] although Chrome's V8 does not use ahead-of-time compilation.

Adoption edit

Almost all of the current applications based on asm.js are C/C++ applications compiled to asm.js using Emscripten or Mandreel. With that in mind, the kind of applications that are going to target asm.js in the near future are those that will benefit from the portability of running in a browser but which have a level of complexity for which a direct port to JavaScript would be infeasible.

So far, a number of programming languages, application frameworks, programs, libraries, games, game engines and other software have already been ported.[10] Some of them are given below.

Programming languages edit

Application frameworks edit

  • pepper.js: Ports of miscellaneous PNaCl apps (earth, voronoi, bullet, etc.)[14]
  • Qt: ports of various Qt demos, plus KDE apps, such as Kate[15]

Programs and libraries edit

Game engines edit

Games edit

Emulators edit

  • EM-DOSBox: an Emscripten port of DOSBox[35]
  • Start9.io: a web emulation platform targeting multiple gaming architectures
  • JSMESS: a port of the MESS emulator for many game consoles and computer systems[36]

Mathematics edit

Deprecation edit

asm.js is mostly rendered obsolete with the introduction of WebAssembly (wasm), which has a bytecode format that is faster to parse.[38] Efforts to extend JavaScript with more low-level features like SIMD.js has also been suspended since 2017.[39]

asm.js remains useful primarily as a "fallback" for wasm, through a program written by the WebAssembly organization that converts wasm to asm.js. There is no dedicated converter from asm.js to wasm, but TypeScript-to-wasm compilers can be partially used.[40] The reference WebAssembly emitter binaryen used to contain an asm2wasm module, but it was removed after Emscripten stopped using it.[41]

See also edit

References edit

  1. ^ "asm.js in Firefox Nightly". Luke Wagner's blog. 21 Mar 2013. Retrieved 13 Nov 2014.
  2. ^ a b "kripken/emscripten · GitHub". Github.com. Retrieved 2015-03-05.
  3. ^ a b "Firefox 22.0 release notes". Mozilla. Retrieved July 4, 2013.
  4. ^ "Asm.js". Asm.js. Retrieved 2015-03-05.
  5. ^ "asm.js — frequently asked questions". Asmjs.org. July 26, 2014.
  6. ^ "asm.js". Asm.js. Retrieved 2015-03-05.
  7. ^ a b Alon Zakai; Robert Nyman (20 December 2013). "Gap between asm.js and native performance gets even narrower with float32 optimizations". Retrieved 11 April 2014.
  8. ^ "Bringing Asm.js to Chakra and Microsoft Edge". Microsoft. May 7, 2015. Retrieved May 7, 2015.
  9. ^ "Chrome 28 Beta: A more immersive web, everywhere". Google. Retrieved 2013-07-06.
  10. ^ "Home — Demos — Games and Game Engines".
  11. ^ . Themucker.github.io. Archived from the original on 2013-08-03. Retrieved 2015-03-05.
  12. ^ "repl.it — Python". Repl.it. Retrieved 2015-03-05.
  13. ^ "repl.it — Ruby". Repl.it. Retrieved 2015-03-05.
  14. ^ . Trypepperjs.appspot.com. Archived from the original on 2020-02-14. Retrieved 2015-03-05.
  15. ^ . Vps.etotheipiplusone.com. Archived from the original on 2015-02-13. Retrieved 2015-03-05.
  16. ^ "About Emscripten".
  17. ^ "Vim.js — JavaScript port of Vim". Coolwanglu.github.io. Retrieved 2015-03-05.
  18. ^ . Archived from the original on 2012-10-12.
  19. ^ "Port of SQLite to Javascript". Github.com. Retrieved 2015-03-05.
  20. ^ "GnuPG.js". Manuuels.github.io. Retrieved 2015-03-05.
  21. ^ "ctags in the browser". Github.com. Retrieved 2015-03-05.
  22. ^ . Gnuplot.respawned.com. Archived from the original on 2015-02-22. Retrieved 2015-03-05.
  23. ^ "A hack to put GraphViz on the web". Github.com. Retrieved 2015-03-05.
  24. ^ "JavaScript port of ZLib DEFLATE for the browser". Github.com. Retrieved 2015-03-05.
  25. ^ . UnrealEngine.com (Press release). May 2, 2013. Archived from the original on November 30, 2016. Retrieved October 24, 2014.
  26. ^ "Unreal Engine 3 ported to JavaScript and WebGL, works in any modern browser". ExtremeTech. Ziff Davis. Retrieved 2015-03-05.
  27. ^ "On the future of Web publishing in Unity". Blogs.unity3d.com. April 29, 2014.
  28. ^ . Clb.demon.fi. Archived from the original on 2015-03-06. Retrieved 2015-03-05.
  29. ^ "Compiling for the Web". godotengine.org. November 10, 2016.
  30. ^ "Emscripten-Generated Code". Kripken.github.io. Retrieved 2015-03-05.
  31. ^ "Emscripten-Generated Code". Forandom.github.io. Retrieved 2015-03-05.
  32. ^ Guryanov Aleksander. "Dune 2 - Online (browser version)". Epicport. Retrieved 2015-03-05.
  33. ^ "Mozilla Banana Bread Demo". Developer.mozilla.org. Retrieved 2015-03-05.
  34. ^ "Humble Mozilla Bundle pushes WebGL-powered browser gaming". Ars Technica. 15 Oct 2014. Retrieved 15 Oct 2014.
  35. ^ "EM-Dosbox on Github". Retrieved 2015-04-09.
  36. ^ "Page Redirection". Jsmess.textfiles.com. Retrieved 2015-03-05.
  37. ^ . Danielsadvernture.info. Archived from the original on 2015-02-22. Retrieved 2015-03-05.
  38. ^ "FAQ". WebAssembly.
  39. ^ "TC39 proposal for SIMD.js". Ecma TC39. 23 June 2020.
  40. ^ "WebAssembly/binaryen". GitHub. WebAssembly. 25 June 2020. AssemblyScript which compiles TypeScript to Binaryen IR; wasm2js which compiles WebAssembly to JS
  41. ^ "Binaryen Changelog". GitHub. v97: Remove asm2wasm, which supported Emscripten's fastcomp backend, after fastcomp was removed. (See also the PR#3042.)

External links edit

  • Official website  

subset, javascript, designed, allow, computer, software, written, languages, such, applications, while, maintaining, performance, characteristics, considerably, better, than, standard, javascript, which, typical, language, used, such, applications, designed, b. asm js is a subset of JavaScript designed to allow computer software written in languages such as C to be run as web applications while maintaining performance characteristics considerably better than standard JavaScript which is the typical language used for such applications asm jsDesigned byMozillaFirst appeared21 March 2013 11 years ago 2013 03 21 1 OSPlatform independentWebsiteasmjs wbr orgInfluenced byJavaScriptInfluencedWebAssembly asm js consists of a strict subset of JavaScript to which code written in statically typed languages with manual memory management such as C is translated by a source to source compiler such as Emscripten based on LLVM 2 Performance is improved by limiting language features to those amenable to ahead of time optimization and other performance improvements Mozilla Firefox was the first web browser to implement asm js specific optimizations starting with version 22 3 asm js is superseded by WebAssembly See Deprecation below Contents 1 Design 2 Code generation 3 Performance 4 Implementations 5 Adoption 5 1 Programming languages 5 2 Application frameworks 5 3 Programs and libraries 5 4 Game engines 5 5 Games 5 6 Emulators 5 7 Mathematics 6 Deprecation 7 See also 8 References 9 External linksDesign editasm js enables significant performance improvements for web applications but does not aim to improve the performance of hand written JavaScript code nor does it enable anything other than enhanced performance It is intended to have performance characteristics closer to that of native code than standard JavaScript by limiting language features to those amenable to ahead of time optimization and other performance improvements 4 By using a subset of JavaScript asm js is largely supported by all major web browsers 5 unlike alternative approaches such as Google Native Client Code generation editThis section does not cite any sources Please help improve this section by adding citations to reliable sources Unsourced material may be challenged and removed March 2015 Learn how and when to remove this message asm js is not typically written directly instead as an intermediate language it is generated through the use of a compiler that takes source code in a language such as C and outputs asm js For example given the following C code int f int i return i 1 Emscripten would output the following JS code function f i i i 0 return i 1 0 Note the addition of 0 and the lack of type specifiers In JavaScript bitwise operators convert their operands to 32 bit signed integers and give integer results This means that a bitwise OR with zero converts a value to an integer a very simple conceptual presentation of bitwise operators may not deal with type conversion at all but every programming language defines operators for its own convenience as Javascript does here By doing this for each parameter this ensures that if the function is called from outside code the value will be converted to the correct type This is also used on the return value in this case to ensure that the result of adding 1 to i will be an integer as otherwise it could become too large and to mark the return type of the function These conversions are required by asm js so that an optimising compiler can produce highly efficient native code ahead of time In such an optimising compiler no conversions are performed when asm js code calls other asm js code as the required type specifiers mean it is guaranteed that values will already have the correct type Furthermore rather than performing a floating point addition and converting to an integer it can simply do a native integer operation Together this leads to significant performance benefits Here is another example to calculate the length of a string size t strlen char ptr char curr ptr while curr 0 curr return curr ptr This would result in the following asm js code function strlen ptr ptr ptr 0 var curr 0 curr ptr while MEM8 curr gt gt 0 0 0 curr curr 1 0 return curr ptr 0 In the generated code the variable MEM8 is actually a byte by byte view of a typed buffer which serves as the heap of the asm js code Performance editSince asm js runs in a browser the performance heavily depends on both the browser and hardware Preliminary benchmarks of C programs compiled to asm js are usually within a factor of 2 slower than native compilation with Clang 6 Much of this performance gain over normal JavaScript is due to 100 type consistency and virtually no garbage collection memory is manually managed in a large typed array This simpler model with no dynamic behavior no memory allocation or deallocation just a narrow set of well defined integer and floating point operations enables much greater performance and potential for optimization citation needed Mozilla s benchmark from December 2013 showed significant improvements Firefox with float32 optimizations can run all those benchmarks at around 1 5 slower than native or better 7 Mozilla points out that the performance of natively compiled code is not a single measure but rather a range with different native compilers in this case Clang and GCC delivering code of differing performance In fact on some benchmarks like Box2D FASTA and copy asm js is as close or closer to Clang than Clang is to GCC In one case asm js even beats Clang by a slight amount on Box2D 7 Implementations editThe Emscripten project provides tools that can be used to compile C and C codebases or any other languages that can be converted to LLVM IR into asm js 2 All browsers with support for ECMAScript 6 should be able to run asm js code as it is a subset of that specification However since features were added in that edition to enable full asm js support Math fround older browsers lacking those features may encounter problems Some browser implementations are especially optimised for asm js Mozilla Firefox was the first web browser to implement asm js specific optimizations starting with Firefox 22 3 OdinMonkey Mozilla s asm js ahead of time compiler used in Firefox is a component of IonMonkey the JIT compiler of SpiderMonkey Microsoft was implementing support for asm js in Chakra the JavaScript engine used by Microsoft Edge Legacy performing validation to produce highly optimised JIT code 8 The optimizations of Google Chrome s V8 JavaScript engine in Chrome 28 made asm js benchmarks more than twice as fast as prior versions of Chrome 9 although Chrome s V8 does not use ahead of time compilation Adoption editThis section relies excessively on references to primary sources Please improve this section by adding secondary or tertiary sources Find sources Asm js news newspapers books scholar JSTOR March 2015 Learn how and when to remove this message Almost all of the current applications based on asm js are C C applications compiled to asm js using Emscripten or Mandreel With that in mind the kind of applications that are going to target asm js in the near future are those that will benefit from the portability of running in a browser but which have a level of complexity for which a direct port to JavaScript would be infeasible So far a number of programming languages application frameworks programs libraries games game engines and other software have already been ported 10 Some of them are given below Programming languages edit C C Clang and LLVM Rust targets Emscripten Perl port of micro perl 5 16 3 11 Python port of CPython 12 Ruby port of Ruby 13 Application frameworks edit pepper js Ports of miscellaneous PNaCl apps earth voronoi bullet etc 14 Qt ports of various Qt demos plus KDE apps such as Kate 15 Programs and libraries edit OpenGL SDL and SDL2 16 Vim Vi IMproved 17 FreeType TrueType font rendering in JavaScript using FreeType 18 SQLite 19 GNU Privacy Guard 20 ctags 21 gnuplot 22 Graphviz 23 zlib 24 Game engines edit Unreal Engine 3 was ported in 4 days 25 26 Unreal Engine 4 Unity 27 ScummVM which supports numerous classic adventure games 28 Godot 29 Games edit Doom the open source Freedoom game assets running on PrBoom which is based on the open source Doom code 30 SuperTux 31 Dune II via OpenDune 32 BananaBread based on Cube 2 33 Every game in the Humble Mozilla Bundle 34 Super Hexagon AaAaAA for the Awesome Osmos Zen Bound 2 Dustforce DX Voxatron FTL Advanced Edition and Democracy 3 Emulators edit EM DOSBox an Emscripten port of DOSBox 35 Start9 io a web emulation platform targeting multiple gaming architectures JSMESS a port of the MESS emulator for many game consoles and computer systems 36 Mathematics edit HTML5 Fractal Playground 37 draws iterating function generated fractals such as the Mandelbrot set Deprecation editasm js is mostly rendered obsolete with the introduction of WebAssembly wasm which has a bytecode format that is faster to parse 38 Efforts to extend JavaScript with more low level features like SIMD js has also been suspended since 2017 39 asm js remains useful primarily as a fallback for wasm through a program written by the WebAssembly organization that converts wasm to asm js There is no dedicated converter from asm js to wasm but TypeScript to wasm compilers can be partially used 40 The reference WebAssembly emitter binaryen used to contain an asm2wasm module but it was removed after Emscripten stopped using it 41 See also edit nbsp Free and open source software portal CrossBridge RPython AssemblyScriptReferences edit asm js in Firefox Nightly Luke Wagner s blog 21 Mar 2013 Retrieved 13 Nov 2014 a b kripken emscripten GitHub Github com Retrieved 2015 03 05 a b Firefox 22 0 release notes Mozilla Retrieved July 4 2013 Asm js Asm js Retrieved 2015 03 05 asm js frequently asked questions Asmjs org July 26 2014 asm js Asm js Retrieved 2015 03 05 a b Alon Zakai Robert Nyman 20 December 2013 Gap between asm js and native performance gets even narrower with float32 optimizations Retrieved 11 April 2014 Bringing Asm js to Chakra and Microsoft Edge Microsoft May 7 2015 Retrieved May 7 2015 Chrome 28 Beta A more immersive web everywhere Google Retrieved 2013 07 06 Home Demos Games and Game Engines plu Themucker github io Archived from the original on 2013 08 03 Retrieved 2015 03 05 repl it Python Repl it Retrieved 2015 03 05 repl it Ruby Repl it Retrieved 2015 03 05 pepper js Examples Trypepperjs appspot com Archived from the original on 2020 02 14 Retrieved 2015 03 05 emscripten qt Demos Vps etotheipiplusone com Archived from the original on 2015 02 13 Retrieved 2015 03 05 About Emscripten Vim js JavaScript port of Vim Coolwanglu github io Retrieved 2015 03 05 TrueType Fonts in JavaScript Archived from the original on 2012 10 12 Port of SQLite to Javascript Github com Retrieved 2015 03 05 GnuPG js Manuuels github io Retrieved 2015 03 05 ctags in the browser Github com Retrieved 2015 03 05 Gnuplot online Gnuplot respawned com Archived from the original on 2015 02 22 Retrieved 2015 03 05 A hack to put GraphViz on the web Github com Retrieved 2015 03 05 JavaScript port of ZLib DEFLATE for the browser Github com Retrieved 2015 03 05 Epic Games Releases Epic Citadel on the Web UnrealEngine com Press release May 2 2013 Archived from the original on November 30 2016 Retrieved October 24 2014 Unreal Engine 3 ported to JavaScript and WebGL works in any modern browser ExtremeTech Ziff Davis Retrieved 2015 03 05 On the future of Web publishing in Unity Blogs unity3d com April 29 2014 HTML5 Clb demon fi Archived from the original on 2015 03 06 Retrieved 2015 03 05 Compiling for the Web godotengine org November 10 2016 Emscripten Generated Code Kripken github io Retrieved 2015 03 05 Emscripten Generated Code Forandom github io Retrieved 2015 03 05 Guryanov Aleksander Dune 2 Online browser version Epicport Retrieved 2015 03 05 Mozilla Banana Bread Demo Developer mozilla org Retrieved 2015 03 05 Humble Mozilla Bundle pushes WebGL powered browser gaming Ars Technica 15 Oct 2014 Retrieved 15 Oct 2014 EM Dosbox on Github Retrieved 2015 04 09 Page Redirection Jsmess textfiles com Retrieved 2015 03 05 HTML5 Fractal Playground Danielsadvernture info Archived from the original on 2015 02 22 Retrieved 2015 03 05 FAQ WebAssembly TC39 proposal for SIMD js Ecma TC39 23 June 2020 WebAssembly binaryen GitHub WebAssembly 25 June 2020 AssemblyScript which compiles TypeScript to Binaryen IR wasm2js which compiles WebAssembly to JS Binaryen Changelog GitHub v97 Remove asm2wasm which supported Emscripten s fastcomp backend after fastcomp was removed See also the PR 3042 External links editOfficial website nbsp Retrieved from https en wikipedia org w index php title Asm js amp oldid 1211372848, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.