WebAssembly’s garbage collection extension makes it easier to run languages like Java on the front end. Could it be the start of a new era in web development? Credit: Aon Khanisorn JavaScript is the clear choice for front-end development today, but there is a longstanding push to be able to use Java on the front end. Among other things, Java brings a vast ecosystem of libraries, frameworks, and application code, which can be exposed via its APIs. Java and languages like it also offer performance optimizations that JavaScript can’t match. Historically, Java’s sophisticated garbage collection algorithm was an obstacle, but Google’s recent push to implement Java’s garbage collection support in Chrome suggests a path forward. The key to it all is WebAssembly’s garbage collection extension, WasmGC. Google Sheets and WasmGC One of the great advancements in software development is automatic memory management, otherwise known as garbage collection. In some programming scenarios, it makes sense for a developer to tinker directly with memory, but for safer applications and optimal performance, automating those processes is usually the way to go. Java’s garbage collection algorithm is one of the more sophisticated options available, which is why Google implemented Googe Sheets in Java. Now, Google wants to take things a step further, by embedding Java’s garbage collection support directly in Chrome, as detailed here. The evolution of Google Sheets is an interesting tale of web development history. It started as an online spreadsheet application competing with the likes of Excel, which was an ambitious undertaking. The application was built using a Java back end that did most of the heavy lifting. But after a time, Google modified that work to happen mainly in the browser, using JavaScript. The switch to JavaScript incurred significant performance losses, however, which led to the decision to re-implement Google Sheets in Java. But this time, the implementation is on the front end, using Wasm for native assembly. Garbage collection in the browser Wasm is a binary instruction format, a kind of generalized way to describe what a program does at the assembler-instruction level. Once a program is transformed into a Wasm binary, it can be run in a variety of host runtime environments. There are three basic types of host environments (described by the Wasm project as concrete embeddings): JavaScript, web, and WASI (WebAssembly System Interface), the standard system interface for WebAssembly programs. These embeddings map generally to running Wasm inside a JavaScript engine, inside the browser (not necessarily using JavaScript), and in other environments like servers. This is an oversimplification, but what matters for our purposes is that JavaScript already has a garbage collection engine. Implementing a garbage collector inside a platform that has one running raises all kinds of problems and eliminates the performance benefits. What we need is a specification for implementing garbage collection support directly in the browser, where it has access to as much native architecture as possible. This allows us to make optimizations while avoiding conflicts with JavaScript. And that’s where WasmGC comes in. The state of browser support for WasmGC The Google Sheets project is working with the Chrome browser, which is implementing the GC extension to Wasm. This is obviously a complex nexus of programming requirements. Garbage collection, although fairly well understood, remains inherently complex. Wasm’s universal binary format is also very complex. Joining the two is tricky, and the work is ongoing. Even with those caveats, it is exciting that Google Sheets is moving to implement major functionality into Chrome’s WasmGC extension. It suggests that developers may be able to use a language like Java, with its full-featured garbage collector, outside of JavaScript sometimes sooner rather than later. WasmGC and the emerging GC layer The Googe V8 team published a good deep dive on the effort to implement garbage collection in Wasm. The article shows that there are two approaches to incorporating garbage collection in Wasm. The first—the one we’ve usually done in the past—is to port the entire architecture over. In essence, this means you bring your garbage collection infrastructure with you when you implement your application. The approach being offered by the WasmGC extension is newer. The extension provides a generic garbage collection layer that your software can refer to; a kind of garbage collection layer built into WebAssembly. Wasm by itself doesn’t track references to variables and data structures, so the addition of garbage collection also implies introducing new “typed references” into the specification. This effort is happening gradually: recent implementations support garbage collection on “linear” reference types like integers, but complex types like objects and structs have also been added. I spoke with Thomas Steiner, developer advocate at Google Web, about the status of complex types in WasmGC. Steiner said the initial Wasm MVP implementation was only capable of dealing with numbers (meaning integers and floats) in linear memory. But with the reference types proposal being shipped, and the added struct and array heap types, Wasm can now hold on to external references. Steiner noted that now, each WasmGC object has a fixed type and structure, “which makes it easy for virtual machines to generate efficient code to access their fields without the risk of deoptimizations in dynamic languages like JavaScript.” The bottom line is that language compilers targeting Wasm can integrate with a garbage collector in the host VM, said Steiner. Developers porting a programming language to Wasm no longer need to include the language’s garbage collector as part of the port. Instead, they can just use the existing garbage collector provided by the WasmGC extension. While it is work in progress, the Wasm binary format could eventually include a generalized garbage collection framework that all the garbage collected languages (like Java, Python, Kotlin, C#, etc.) could rely on without bringing along their own garbage collection implementation. JavaScript, Wasm, and Java There are also practical considerations in adopting WebAssembly in general and garbage collection in particular. Wasm is loaded differently from JavaScript and requires different tooling. Everything points to Wasm expanding language support in web browsers. But it will only happen incrementally and with much care. It’s also worth noting that Wasm code runs alongside JavaScript, and exposes modules to it, so it’s not an either-or choice. In fact, the future of front-end development is likely to be JavaScript and, meaning that JavaScript remains the entrypoint for apps, even if much of the work is handed off to another language running on WebAssembly. Although the pioneering work is happening in the Google’s Sheets application and Chrome web browser (where WasmGC is now on by default), Mozilla Firefox and Microsoft Edge also support the extension, as do the Deno and Node runtimes. You can check for WasmGC support on Wasm’s support page. In general, it looks like WasmGC is coming of age and becoming a reliable feature for standard web platforms. Is WasmGC ready for production use? I asked Steiner about using the WasmGC extension in production apps and he noted that “WasmGC is a standardized proposal (Phase 5 in the process), with implementations in three browsers and the feature shipping in Chrome and in Firefox.” For Safari, he said, the extension has also been merged into WebKit, but “we don’t know yet in what version of Safari it will ultimately ship.” Furthermore, “support for WasmGC is feature-detectable, which means sites and apps like Google Sheets can use a progressive enhancement approach: On browsers that support WasmGC, the new version is loaded, and on other browsers without support, the existing legacy version will do.” The performance potential of languages like Java over JavaScript is a key motivation for WasmGC, but obviously there’s also the enormous range of available functionality and styles among garbage-collected platforms. The possibility for moving custom code into Wasm, and thereby making it universally deployable, including to the browser, is there. More broadly, one can’t help but wonder about the possibility of opening up the browser to other languages beyond JavaScript, which could spark a real sea-change to the software industry. It’s possible that loosening JavaScript’s monopoly on the browser will instigate a renaissance of creativity in programming languages. When I asked Steiner if we’d ever see pure-Java (no JavaScript) browser apps, he said, “That day, effectively, is already today. Solutions like CheerpJ allow developers to run entire Java apps in the browser, for example, this Swing demo (give it a bit of time to load). It’s thought more for porting legacy Java apps to the web, but, in theory, if someone wrote a Java program targeting CheerpJ today, they could run it in the browser. In the Google Sheets case, they used J2Wasm to port the calc worker from Java to WasmGC.“ Steiner mentioned further that other languages like Kotlin can use Kotlin/Wasm, and that “Likewise, the Flutter team at Google now makes use of WasmGC by compiling Dart to WasmGC, and similar solutions exist for SwiftWasm (which doesn’t yet target WasmGC, but regular Wasm).” Conclusion I am personally a huge fan of JavaScript. It’s a marvel of expressiveness and I don’t have many gripes about it. On the other hand, I’m always interested in how competition and cross-pollination spur innovation. Looking back some years from now, it could be that Wasm as a universal deployment layer creates a new phase in enterprise and web development. Quietly, with little fanfare, work is proceeding on making that universal layer more powerful and useful. WasmGC’s progress is a tantalizing milestone in the story. Of course, there is an enormous amount of work remaining and the path is not straightforward. Security, performance, tooling, and just simple inertia all present real obstacles. Still, the vision of the Wasm-empowered browser as a truly universal compute platform is here. Related content feature 14 great preprocessors for developers who love to code Sometimes it seems like the rules of programming are designed to make coding a chore. Here are 14 ways preprocessors can help make software development fun again. By Peter Wayner Nov 18, 2024 10 mins Development Tools Software Development feature Designing the APIs that accidentally power businesses Well-designed APIs, even those often-neglected internal APIs, make developers more productive and businesses more agile. By Jean Yang Nov 18, 2024 6 mins APIs Software Development news Spin 3.0 supports polyglot development using Wasm components Fermyon’s open source framework for building server-side WebAssembly apps allows developers to compose apps from components created with different languages. By Paul Krill Nov 18, 2024 2 mins Microservices Serverless Computing Development Libraries and Frameworks news Go language evolving for future hardware, AI workloads The Go team is working to adapt Go to large multicore systems, the latest hardware instructions, and the needs of developers of large-scale AI systems. By Paul Krill Nov 15, 2024 3 mins Google Go Generative AI Programming Languages Resources Videos