Talks

An mruby for WebAssembly

RubyKaigi 2024

00:00:08.639 Hi, good afternoon! Are you enjoying Okinawa?
00:00:14.040 Today, I'm going to introduce my product, an mruby for WebAssembly.
00:00:22.920 First, let me introduce myself. I am Uchio Kondo from a company in Japan.
00:00:28.199 I work as an infrastructure engineer, and my company is one of the largest live streaming and gaming apps in Japan.
00:00:43.640 Additionally, I am a translator for the book "Learning eBPF." It's now available in Japan, so please let me know if you get a chance to read it.
00:00:59.320 So today, I'm going to talk about Ruby and WebAssembly.
00:01:06.030 I will provide several examples in various programming languages. I changed the background for convenience, and this side is multilingual, so please be mindful.
00:01:27.000 Regarding Ruby for WebAssembly, I think you already know that Ruby is a language that can be compiled into a binary format. You know that C is language-based, and you can compile it into a format that runs in browsers.
00:02:01.119 But I am going to show you another approach. This is mruby, which is specialized for WebAssembly use cases. This system consists of two components: the mruby compiler and the mrb command. You can install mruby using the cargo command.
00:02:41.680 You may understand this function, which you might refer to as the f number calculus. You must prepare an RBS file for this function.
00:03:06.879 If you have these two files, you can compile them into one WebAssembly file.
00:03:17.960 This WASM file exports a function named 'fib,' which you can check using 'wasm object dump' command. You can run this using various runtimes, like VM H.
00:03:44.159 The calculated Fibonacci number may be correct. Now, you may wonder whether this WebAssembly file can run in a browser. The answer is yes.
00:04:13.599 You need to prepare an HTML file that includes the necessary JavaScript code. This HTML will invoke the Fibonacci function and compute its value.
00:04:55.880 Using mruby for WebAssembly, you can work both server-side and browser-side, producing one binary. This allows you to export specific functions. Additionally, we can specify functions to import for the Ruby program.
00:05:28.039 To understand this system, we need to grasp two technologies: WebAssembly and mruby. Let's begin with WebAssembly.
00:06:01.600 First, how many of you know about WebAssembly? I believe you might think of it as something magical that allows languages like Ruby or Python to run in the browser.
00:06:24.880 You might have heard that Google uses WebAssembly, especially for image and video encoding.
00:06:54.680 WebAssembly is widely utilized across technology stacks. It is essentially a stack-based virtual machine that executes its instructions on browsers, servers, and other environments.
00:07:25.960 For instance, it can be incorporated into load balancers, log analyzers, and even containers.
00:08:11.560 In fact, in cloud-native environments, WebAssembly can be used for configuration management. Man, it is almost everywhere!
00:08:54.520 Now you know about the export and import functionalities available in WebAssembly. Next, let’s look into how this works with Ruby.
00:09:15.279 Here, I will show you a Ruby Answer method that internally specifies what functions to export and their signatures. You will also specify import signatures.
00:09:38.399 By compiling a Ruby file, you can leverage inversor as input. The result from a simple addition such as 21 + 42 will display as 63.
00:10:04.920 This showcases the basic functionality of WebAssembly, but let's dive a step deeper.
00:10:37.680 WebAssembly is essentially a binary format that contains a magic number, version information, and various sections.
00:10:57.960 Now, the sections consist of multiple types such as function declarations, memory declarations, globals, exports, and more. You can inspect these sections and confirm function signatures with tools that analyze WASM objects.
00:11:54.640 Import and export functionality is crucial. The interface allows functionality for system aspects like file access, networking, randomness, and threading.
00:12:57.199 For example, functions like 'random get' can serve similar purposes to system calls you may know.
00:13:36.480 WebAssembly, therefore, gives developers a great array of input functions. This means that you can generate code to work seamlessly across different runtimes.
00:14:27.559 This brings me to mbh, which is the project’s implementation for managing code for both the mruby VM and WebAssembly.
00:14:49.919 The goal is to offer a reliable runtime for mruby that is efficient in size. For instance, mruby with its dependencies can take up 18MB while the output using mruby for WebAssembly can be just 8MB.
00:15:33.120 But if I create an example Fibonacci function using mbh, it is only 174KB, showcasing its capacity to handle the basic functionalities of mruby.
00:16:34.600 Furthermore, compiling Ruby with this system allows for the efficient calculation of Fibonacci numbers while being lightweight.
00:17:15.640 Many developers have expressed interest in the potential for growth and performance improvements of these runtimes.
00:18:07.920 Now, let’s summarize the connection between mruby, WebAssembly, and their integration for development.
00:18:39.680 Overall, the integration is still actively developed and has great potential to enhance your Ruby code on the web by building compact and efficient binaries.
00:19:53.400 Thank you for your attention and I hope you're looking forward to experimenting with these technologies.