AssemblyScript

Last updated

AssemblyScript
AssemblyScript logo 2020.svg
Paradigm Multi-paradigm: functional, generic, imperative, object-oriented
Family JavaScript, TypeScript
Designed by Daniel Wirtz, [1] Max Graey [2]
Developer The AssemblyScript Project [1]
First appeared2017;7 years ago (2017) [3]
Stable release
0.27.24 [4]   OOjs UI icon edit-ltr-progressive.svg / 31 January 2024;31 days ago (31 January 2024)
Typing discipline Static
Scope Lexical
License Apache License 2.0 [5]
Filename extensions .ts
File formats Text, Unicode (source)
.wasm binary format (object)
Website www.assemblyscript.org
Major implementations
asc (AssemblyScript compiler)
Influenced by
JavaScript, TypeScript, WebAssembly

AssemblyScript is a TypeScript-based programming language that is optimized for, and statically compiled to, WebAssembly (currently using asc, the reference AssemblyScript compiler). Resembling ECMAScript and JavaScript, but with static types, the language is developed by the AssemblyScript Project [6] with contributions from the AssemblyScript community.

Contents

Overview

In 2017, the availability of support for WebAssembly, a standard definition for a low-level bytecode and an associated virtual machine, became widespread among major web browsers, providing web developers a lower-level and potentially higher-performance compilation target for client-side programs and applications to execute within web browsers, in addition to the interpreted (and in practice dynamically compiled) JavaScript web scripting language. [7] WebAssembly allows programs and code to be statically compiled ahead of time in order to run at potentially native-level or "bare-metal" performance within web browsers, without the overhead of interpretation or the initial latency of dynamic compilation. [8]

With the adoption of WebAssembly in major web browsers, Alon Zakai, creator of Emscripten, an LLVM/Clang-based C and C++ compiler that targeted a subset of JavaScript called asm.js, added support for WebAssembly as a compilation target in Emscripten, allowing C and/or C++ programs and code to be compiled directly to WebAssembly. [9]

While Emscripten and similar compilers allow web developers to write new code, or port existing code, written in a high-level language such as C, C++, Go, and Rust to WebAssembly to achieve potentially higher, native-level execution performance in web browsers, this forces web developers accustomed to developing client-side web scripts and applications in ECMAScript/JavaScript (the de facto client-side programming language in web browsers) to use a different language for targeting WebAssembly than JavaScript. AssemblyScript, as a variant of TypeScript that is syntactically similar to JavaScript, allows developers accustomed to JavaScript to use a familiar language for targeting WebAssembly, potentially reducing the learning curve of a separate language that can be compiled to WebAssembly. Furthermore, because AssemblyScript was designed to be an optimal source language for WebAssembly, the language's type system closely reflects that of WebAssembly, [10] and the language provides standard low-level functions (typically implemented as macros) that map directly to WebAssembly instructions that mirror instructions available on modern processors such as SIMD and vector instructions and more specialized instructions such as clz (count leading zero bits), ctz (count trailing zero bits), and popcnt (population count), used in applications such as encryption and cryptographic libraries. [11]

asc, the reference AssemblyScript compiler, is based on Binaryen, a back-end compiler toolchain developed by Alon Zakai that compiles to WebAssembly and is a component of Emscripten (which Zakai also developed). The asc compiler and other tooling are available via the npm package manager.

While WebAssembly was originally designed for execution within web browsers, the development of WASI (WebAssembly System Interface), a community specification for a standard API that allows WebAssembly programs access to system calls and other operating system functions, [12] has led to the development of WebAssembly runtime environments from projects such as Wasmtime   [13] and Wasmer   [14] that allow WebAssembly, and code written in languages such as AssemblyScript that can compile to it, to run in non-web environments as well.

Compatibility with JavaScript

AssemblyScript is compiled to WebAssembly modules, which can then be instantiated into client-side Web pages using standard JavaScript methods such as WebAssembly.compileStreaming and WebAssembly.instantiateStreaming just like standard WebAssembly binaries. [15] Data passing between JavaScript and the compiled WebAssembly modules, as well as function calls between JavaScript and WebAssembly, are then the same as for any WebAssembly module. [16]

Because the AssemblyScript language is largely a subset of TypeScript, it is theoretically possible to write an AssemblyScript program using this subset and compile it to both plain JavaScript and WebAssembly, using the TypeScript compiler and AssemblyScript compiler, respectively. This potentially allows for portable code that can be deployed in either JavaScript or WebAssembly run-time environments.

Usage

As of July 2022, more than 12,000 projects hosted on GitHub are written, either wholly or partially, in AssemblyScript, [17] with roughly 18,000 downloads of the AssemblyScript compiler per week via npm. [18] [19]

In 2021, Webpack started using AssemblyScript to speed up the calculation of hash functions such as xxhash and md4 sources. This also made it possible to get rid of native dependencies.

Reception

Lead Emscripten developer Alon Zakai has characterized AssemblyScript as being "designed with WebAssembly and code size in mind. It's not an existing language that we are using for a new purpose, but it's a language designed for WebAssembly. It has great wasm-opt integration—in fact, it's built with it—and it's very easy to get good code size." [20]

Norwegian musician Peter Salomonsen, in a 2020 WebAssembly Summit talk titled, "WebAssembly Music," demonstrated the use of AssemblyScript for real-time compilation to WebAssembly in live electronic music synthesis, saying, "I chose AssemblyScript because it has high-level readability and low-level control; it's like a high-level language, but you get that low-level feeling, and you can even write direct WebAssembly intrinsics if you want to." [21]

Aaron Turner, a senior engineer at Fastly, a cloud computing services provider that uses WebAssembly for the company's Compute@Edge serverless compute environment, in a review of AssemblyScript wrote: [22]

While AssemblyScript requires stricter typing than TypeScript does, it sticks as close as possible to TypeScript syntax and semantics—which means that most JavaScript developers will find AssemblyScript comfortable to use—and it enables great support for the modern JavaScript ecosystem. For instance, the AssemblyScript compiler is available on npm, as well as common AssemblyScript tools and libraries like as-pect. AssemblyScript files also use TypeScript's ‘.ts’ file extension, and it includes proper typings for allowing AssemblyScript to piggy-back on TypeScript tooling, such as the TypeScript linter. With the right small tweaks, AssemblyScript can even be used with the TypeScript compiler.

This is very exciting, as AssemblyScript offers a low-overhead entry-point for JavaScript developers to pick up a language to output WebAssembly—both in terms of learning to read and write AssemblyScript, as well as using a lot of the pre-existing tooling that may already be in a JavaScript developer's workflow. AssemblyScript is often referred to in the WebAssembly community as a great gateway to picking up WebAssembly. It offers a large group of developers who already write applications for the web a path to pick up and learn WebAssembly. Even if you are starting from scratch and are not particularly familiar with JavaScript or TypeScript, AssemblyScript is a solid choice when picking a language to start outputting WebAssembly.

However, Turner went on to cite the language's relative newness and thus its lack of some features available in larger, more complex and established programming languages as potential but temporary shortcomings of the language.

See also

Related Research Articles

<span class="mw-page-title-main">JavaScript</span> High-level programming language

JavaScript, often abbreviated as JS, is a programming language and core technology of the World Wide Web, alongside HTML and CSS. As of 2024, 98.8% of websites use JavaScript on the client side for webpage behavior, often incorporating third-party libraries. All major web browsers have a dedicated JavaScript engine to execute the code on users' devices.

<span class="mw-page-title-main">SpiderMonkey</span> JavaScript and WebAssembly engine maintained by the Mozilla Foundation

SpiderMonkey is an open-source JavaScript and WebAssembly engine by the Mozilla Foundation.

<span class="mw-page-title-main">Google Web Toolkit</span> Free Java library

Google Web Toolkit, or GWT Web Toolkit, is an open-source set of tools that allows web developers to create and maintain JavaScript front-end applications in Java. It is licensed under Apache License 2.0.

Svelte is a free and open-source component-based front-end software framework, and language created by Rich Harris and maintained by the Svelte core team members.

Google Native Client (NaCl) is a discontinued sandboxing technology for running either a subset of Intel x86, ARM, or MIPS native code, or a portable executable, in a sandbox. It allows safely running native code from a web browser, independent of the user operating system, allowing web apps to run at near-native speeds, which aligns with Google's plans for ChromeOS. It may also be used for securing browser plugins, and parts of other applications or full applications such as ZeroVM.

<span class="mw-page-title-main">Google Closure Tools</span> JavaScript developer toolkit

Google Closure Tools is a set of tools to help developers build rich web applications with JavaScript. It was developed by Google for use in their web applications such as Gmail, Google Docs and Google Maps. As of 2023, the project had over 230K LOCs not counting the embedded Mozilla Rhino compiler.

<span class="mw-page-title-main">Node.js</span> JavaScript runtime environment

Node.js is a cross-platform, open-source JavaScript runtime environment that can run on Windows, Linux, Unix, macOS, and more. Node.js runs on the V8 JavaScript engine, and executes JavaScript code outside a web browser.

npm JavaScript package manager

npm is a package manager for the JavaScript programming language maintained by npm, Inc. npm is the default package manager for the JavaScript runtime environment Node.js and is included as a recommended feature in the Node.js installer.

Dart is a programming language designed by Lars Bak and Kasper Lund and developed by Google. It can be used to develop web and mobile apps as well as server and desktop applications.

<span class="mw-page-title-main">Amber Smalltalk</span>

Amber Smalltalk, formerly named Jtalk, is an implementation of the programming language Smalltalk-80, that runs on the JavaScript runtime of a web browser. It is designed to enable client-side development using Smalltalk. The programming environment in Amber is named Helios.

Content Security Policy (CSP) is a computer security standard introduced to prevent cross-site scripting (XSS), clickjacking and other code injection attacks resulting from execution of malicious content in the trusted web page context. It is a Candidate Recommendation of the W3C working group on Web Application Security, widely supported by modern web browsers. CSP provides a standard method for website owners to declare approved origins of content that browsers should be allowed to load on that website—covered types are JavaScript, CSS, HTML frames, web workers, fonts, images, embeddable objects such as Java applets, ActiveX, audio and video files, and other HTML5 features.

Emscripten is an LLVM/Clang-based compiler that compiles C and C++ source code to WebAssembly, primarily for execution in web browsers.

<span class="mw-page-title-main">Socket.IO</span> Library for realtime web applications

Socket.IO is an event-driven library for real-time web applications. It enables real-time, bi-directional communication between web clients and servers. It consists of two components: a client, and a server. Both components have a nearly identical API.

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.

<span class="mw-page-title-main">WebAssembly</span> Cross-platform assembly language and bytecode designed for execution in web browsers

WebAssembly defines a portable binary-code format and a corresponding text format for executable programs as well as software interfaces for facilitating interactions between such programs and their host environment.

NativeScript is an open-source framework to develop mobile apps on the iOS and Android platforms. It was originally conceived and developed by Progress. At the end of 2019 responsibility for the NativeScript project was taken over by long-time Progress partner, nStudio. In December 2020 nStudio also oversaw the induction of NativeScript into OpenJS Foundation as an Incubating Project. NativeScript apps are built using JavaScript, or by using any programming language that transpiles to JavaScript, such as TypeScript. NativeScript supports the Angular and Vue JavaScript frameworks. Mobile applications built with NativeScript result in fully native apps, which use the same APIs as if they were developed in Xcode or Android Studio. Additionally, software developers can re-purpose third-party libraries from CocoaPods, Maven, and npm.js in their mobile applications without the need for wrappers.

gulp is an open-source JavaScript toolkit, used as a streaming build system in front-end web development.

<span class="mw-page-title-main">Babel (transcompiler)</span> Backwards compatible JavaScript compiler

Babel is a free and open-source JavaScript transcompiler that is mainly used to convert ECMAScript 2015+ (ES6+) code into backwards-compatible JavaScript code that can be run by older JavaScript engines. It allows web developers to take advantage of the newest features of the language.

<span class="mw-page-title-main">Deno (software)</span> Secure JavaScript and TypeScript runtime

Deno is a runtime for JavaScript, TypeScript, and WebAssembly that is based on the V8 JavaScript engine and the Rust programming language. Deno was co-created by Ryan Dahl, who also created Node.js.

Cranelift is an optimizing compiler backend that converts a target-independent intermediate representation into executable machine code. It is written in Rust. The project started in 2016 and is currently developed by Bytecode Alliance. Unlike compiler backends such as LLVM that focus more on ahead-of-time compilation, Cranelift instead focuses on just-in-time compilation with short compile time being an explicit goal of the project.

References

  1. 1 2 The AssemblyScript Project (April 24, 2020). "AssemblyScript Working Group". GitHub.com. AssemblyScript Project. Retrieved February 10, 2021. Daniel Wirtz (@dcodeIO) - Author of AssemblyScript
  2. Aaron Turner (March 28, 2019). "WebAssembly for Javascript Developers". YouTube.com. WebAssembly SF. Retrieved February 10, 2021. @dcodeIO [Daniel Wirtz] and @MaxGraey [Max Graey]—they're the main two developers of AssemblyScript
  3. The AssemblyScript Project (2017). "assemblyscript 0.1.0". npmjs.com. AssemblyScript Project. Retrieved February 10, 2021.
  4. "Release 0.27.24". January 31, 2024. Retrieved February 24, 2024.
  5. The AssemblyScript Project (September 29, 2017). "LICENSE". GitHub.com. The AssemblyScript Project. Retrieved February 10, 2021. AssemblyScript/assemblyscript is licensed under the Apache License 2.0
  6. The AssemblyScript Project. "The AssemblyScript Project". GitHub.com. The AssemblyScript Project. Retrieved February 10, 2021.
  7. WebAssembly Community Group (November 2017). "Roadmap". WebAssembly.org. WebAssembly Community Group. Retrieved February 10, 2021.
  8. WebAssembly Working Group. "WebAssembly". WebAssembly.org. WebAssembly Working Group. Retrieved February 10, 2021.
  9. Alon Zakai and Emscripten Contributors. "Emscripten". Emscripten.org. Emscripten project. Retrieved February 10, 2021.{{cite web}}: |author= has generic name (help)
  10. The AssemblyScript Project. "Types". AssemblyScript.org. The AssemblyScript Project. Retrieved February 10, 2021.
  11. The AssemblyScript Project. "Environment". AssemblyScript.org. The AssemblyScript Project. Retrieved February 10, 2012.
  12. The Wasmtime Project. "WASI: The WebAssembly System Interface". WASI.dev. The Wasmtime Project. Retrieved February 10, 2021.
  13. The Wasmtime Project. "Wasmtime: A small and efficient runtime for WebAssembly & WASI". Wasmtime.dev. The Wasmtime Project. Retrieved February 10, 2021.
  14. Wasmer, Inc. "Wasmer: The Universal WebAssembly Runtime". Wasmer.io. Wasmer, Inc. Retrieved February 10, 2021.
  15. Mozilla Developer Network. "Loading and running WebAssembly code". developer.mozilla.org. Mozilla Developer Network. Retrieved February 10, 2021.
  16. Mozilla Developer Network. "Using the WebAssembly JavaScript API". developer.mozilla.org. Mozilla Developer Network. Retrieved February 10, 2021.
  17. GitHub. "AssemblyScript/assemblyscript Dependency graph". GitHub.com. GitHub . Retrieved June 24, 2022.
  18. npmjs. "assemblyscript Weekly Downloads". npmjs.com. npmjs.com. Retrieved June 24, 2022.
  19. "Resolve Error In Typescript". June 3, 2022. Saturday, 7 May 2022
  20. Alon Zakai (February 19, 2020). "Shipping Tiny WebAssembly Builds". YouTube.com. WebAssembly-Summit.org. Retrieved February 10, 2021.
  21. Peter Salomonsen (February 19, 2020). "WebAssembly Music". YouTube.com. WebAssembly-Summit.org. Retrieved February 10, 2021.
  22. Aaron Turner (October 29, 2020). "Meet AssemblyScript: your next computing language". Fastly.com. Fastly . Retrieved February 10, 2021.