Why V8
While the software ecosystem of RISC-V has evolved rapidly in the last decade, an important domain of applications, web applications, is still missing from the scene. At the heart of the web technology stack are web browsers, and every major web browser today uses JavaScript (JS) engines with Just-in-time (JIT) compilers. The lack of a mature JS engine that supports RISC-V is a major roadblock to enabling the web stack on RISC-V.
Today, every major web browser employs its own JavaScript engine, such as V8 for Chromium-based browsers (e.g. Chrome, Brave), TraceMonkey for Firefox, and JavaScriptCore for Safari. According to Wikipedia, Chromium-based browsers account for two thirds of browser usage shares (in terms of percentage of web sites visited by a particular web browser) in 2020. In addition, Node.js, the dominant server-side JavaScript runtime framework, brings JavaScript beyond browsers and onto the cloud and edge devices as web backends and serverless function platforms.
Both Chromium-based browsers and Node.js are powered by V8, the open-source JavaScript engine developed by Google in 2008. As such, V8 is considered the most widely used JS Engine for both client-side and server-side JavaScript.
V8-RISCV Open-Sourced
V8 is a mature, cross-platform JS engine that supports multiple backends including x86, ARM, MIPS and PowerPC. V8 employs the TurboFan compiler to compile JavaScript to machine codes for each target platform. To minimize startup time and memory consumption, JS codes are initially executed in the V8 interpreter, the Ignition Engine. The Ignition engine relies on the Turbofan compiler to generate target-specific bytecode handlers ahead-of-time. This unique design results in a much faster interpreter, but also implies that the porting of the V8 interpreter still requires extending the TurboFan compiler to support a new backend.
With a joint effort between Futurewei Technologies and the RIOS lab, v8-riscv, a RISC-V 64-bit backend for V8 was open-sourced in July. V8-riscv enables the complete functionality of V8 (including the Turbofan compiler, the Ignition Engine and the WebAssembly compiler) for any RISC-V ISA that supports RV64I, M, A, F, D and Zifencei extensions. The functional completeness of a V8 port is measured by the coverage of the extensive set of V8 test cases. Currently, v8-riscv passes over 15,000 standard v8 test cases as well as standard benchmarks such as Sunspider and Kraken on HiFive Unleashed running Fedora Developer Rawhide.
The open-sourcing of v8-riscv pushes our porting effort to a new phase of community participation. There is still plenty of work ahead in bringing a high-performing V8 engine that leverages the full capability of a highly customizable RISC-V ISA. For the next few months, we would like to focus on upstreaming to V8, improving the performance of the 64-bit backend, and supporting or experimenting with additional RISC-V extensions such as C, V, and the upcoming J extensions. Please refer to our project roadmap and workgroups for more details.
We invite any community members who would like to contribute to V8 on RISC-V to join our effort. We already have a good story to share: within the first week of open-sourcing v8-riscv, the PLCT lab of Chinese Academy of Sciences, who has worked on another independent port of V8 for RISC-V, decided to consolidate the porting effort and join v8-riscv.
Beyond V8 and Javascript
With the enablement of V8, porting Node.js to RISC-V is a natural next step. We have some promising early results of bringing up a simple Node-based web server using v8-riscv. The enablement of client-side JavaScript, on the other hand, requires a considerable porting effort on the Chromium browser itself. In addition, along with the RIOS lab PicoRio project, we are exploring hardware support for improving Javascript VM efficiency. As part of the PicoRio project, we look forward to working with the community to bringing Chromium browsers and the full Chromium OS onto RISC-V.
With v8-riscv, we bring not one but two languages to RISC-V. The second language is WebAssembly. In 2019, the W3C announced WebAssembly as the fourth official language of the web (among HTML, CSS, and JavaScript) that has support from all W3C-compatible browsers. WebAssembly is a portable, compact and secure Intermediate Representation (IR) designed to bring native applications written in C/C++ or Rust onto the web. Today, WebAssembly is expanding beyond the web and serves as a promising IR for lightweight isolation and trusted execution. With v8-riscv, the young but growing ecosystem of WebAssembly is further unlocked to the RISC-V modular ISA architecture.
Conclusions
Extending a compiler to support a new Instruction Set Architecture (ISA) is a major undertaking. While the RISC-V language toolchains support most popular statically compiled languages (e.g., C, C++, Rust and Go) as well as interpreter-based languages (e.g., Python), support for languages that require JIT compilers (e.g., Java, JS, Hack, Dart) are still largely lacking. By enabling JavaScript on RISC-V, v8-riscv not only removes a critical roadblock to enabling the web technology stack on RISC-V, but also unlocks several mature and fledging ecosystems such as JavaScript, NodeJS and WebAssembly to further enrich the software ecosystem of RISC-V.