Skip to content

Commit

Permalink
chore: translate to english
Browse files Browse the repository at this point in the history
  • Loading branch information
skanehira committed Apr 27, 2024
1 parent 6178947 commit d11c6a2
Show file tree
Hide file tree
Showing 17 changed files with 939 additions and 1,196 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,7 @@
# Writing A Wasm Runtime In Rust

https://skanehira.github.io/writing-a-wasm-runtime-in-rust

> [!NOTE]
> This book was translated from [Japanese version](https://zenn.dev/skanehira/books/writing-wasm-runtime-in-rust) using ChatGPT.
> If you find any strange expressions, please feel free to PR :)
81 changes: 41 additions & 40 deletions src/01_intro.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,62 @@
# はじめに
# Introduction {/examples/}

WasmWebAssembly)は現代の主要ブラウザで実行できる[仮想命令セット](https://en.wikipedia.org/wiki/Instruction_set_architecture)である。
Wasm (WebAssembly) is a [virtual instruction set](https://en.wikipedia.org/wiki/Instruction_set_architecture) that can be executed in modern major browsers.

主に次の特徴がある。
It has the following main features:

- 主要ブラウザで実行できる
- OS・CPUに依存しない
- 安全なサンドボックス環境で実行される
- ネイティブに近いパフォーマンス[^1]
- 複数の言語(Rust、Go、Cなど)からコンパイルできる
- Can be executed in major browsers
- Not dependent on OS or CPU
- Runs in a secure sandbox environment
- Provides performance close to native[^1]
- Can be compiled from multiple languages (Rust, Go, C, etc.)

Runtime(実行環境)があればWasmバイナリを実行できるので、ブラウザに限らずサーバーサイドでも実行できる。
たとえば、アプリケーションのプラグインシステムにWasmを採用したり、サーバーレスアプリケーション構築でWasmを利用できたりする。
With a Runtime environment, Wasm binaries can be executed not only in browsers but also on the server-side. For example, Wasm can be adopted in an application's plugin system or utilized in serverless application development.

今後ますます盛り上がりを見せていくであろうWasm、その動作原理について興味がある人も多いと思う。
本書ではWasmの紹介と利用シーンについて解説したあと、Rustを使って`Hello World`を出力できる小さなRuntimeをゼロから実装していくことで、動作原理を理解することを目指していく。
The interest in Wasm, which is expected to continue to grow, is likely shared by many who are curious about its operation principles. In this document, after introducing Wasm and explaining its use cases, we aim to understand the operational principles by implementing a small Runtime from scratch using Rust to output `Hello World`.

小さなRuntimeといっても次のようなことを理解する必要があるので、すこし大変かもしれないが、1つずつ解説していくので焦らずに一緒にやっていこう。
Even though understanding a small Runtime may require some effort, we will explain each aspect step by step, so let's proceed together without rushing.

- Wasmバイナリのデータ構造の理解
- 使用するWasmの命令セットの理解
- 命令処理の仕組みの理解
- Wasmバイナリのデコードの実装
- 命令の処理の実装
Things you need to understand for the small Runtime include:

ちなみに、実装するRuntimeはバージョン1の[仕様書](https://www.w3.org/TR/wasm-core-1/)に準拠している。
仕様書は非常に読解が難しいが、興味ある人はぜひ本書が解説した内容をベースに続きを実装してみてほしい。
- Understanding the data structure of Wasm binaries
- Understanding the instruction set of Wasm used
- Understanding the mechanism of instruction processing
- Implementing Wasm binary decoding
- Implementing instruction processing

## 対象の読者
By the way, the Runtime to be implemented adheres to the specifications of version 1 ([specification](https://www.w3.org/TR/wasm-core-1/)). The specification may be challenging to read, but for those interested, we encourage you to continue implementing based on the explanations provided in this document.

本書の対象者は次のとおり。
## Target Audience {/examples/}

- Rustの基礎をわかっていて、読み書きができる人
- Wasmに興味がある人
- Wasmが実行される仕組みを知りたい人
The target audience of this document is as follows:

## 用語
- Those who understand the basics of Rust and can read and write in it
- Those interested in Wasm
- Those who want to understand how Wasm is executed

本書で使用する用語は次のとおり。
## Glossary {/examples/}

The terms used in this document are as follows:

- Wasm
WebAssemblyの略
エコシステム全体のことを指す
- Wasmバイナリ
`*.wasm`ファイルを指す
中身はバイトコード
Abbreviation for WebAssembly
Refers to the entire ecosystem
- Wasm binary
Refers to `*.wasm` files
Contains bytecode
- Wasm Runtime
Wasmを実行できる環境、インタプリタとも呼ぶ
本書は`*.wasm`ファイルを読み取り、実行できるRuntimeを実装していく
Environment that can execute Wasm, also known as an interpreter
This document will implement a Runtime that can read and execute `*.wasm` files
- Wasm Spec
Wasmの仕様のこと
本書では[バージョン1](https://www.w3.org/TR/wasm-core-1/)の仕様に準拠している
Refers to the specifications of Wasm
This document adheres to the specifications of [version 1](https://www.w3.org/TR/wasm-core-1/)

## About This Document {/examples/}

The manuscript of this document is available in this [repository](https://github.com/skanehira/writing-a-wasm-runtime-in-rust), so if you find any confusing parts or strange explanations, please submit a pull request.

## 本書について
本書の原稿はこちらの[リポジトリ](https://github.com/skanehira/writing-a-wasm-runtime-in-rust)にあるので、分かりづらい部分や変な説明があったらぜひPRを出してほしい。
## About the Author {/examples/}

## 筆者について
[skanehira](https://github.com/skanehira)

[^1]: 厳密にはRuntimeの実装に依存する
[^1]: Strictly depends on the implementation of the Runtime
161 changes: 80 additions & 81 deletions src/02_about_wasm.md
Original file line number Diff line number Diff line change
@@ -1,97 +1,96 @@
# Wasmの概要
# Overview of Wasm

本章ではWasmの概要について、主に次の内容を解説していく。
In this chapter, we will mainly explain the following about Wasm:

- Wasm Runtimeの概要
- Wasmのメリット・デメリット
- Wasmの利用シーン
- Overview of Wasm Runtime
- Pros and Cons of Wasm
- Use cases of Wasm

## Wasm Runtimeの概要
前章で書いたとおり、Wasmは仮想命令セットである。
その仮想命令を読み取って実行するWasm Runtimeはいわば仮想マシンそのものである。
## Overview of Wasm Runtime
As mentioned in the previous chapter, Wasm is a virtual instruction set.
The Wasm Runtime, which reads and executes these virtual instructions, is essentially a virtual machine itself.

仮想マシンといえばJava VMやRubyVMなどがあるが、Wasm Runtimeも同類である。
JavaやRubyはソースコードをコンパイルしバイトコードを生成して、そのバイトコードを仮想マシンが実行するといった流れだが、Wasmもほぼ同様である。
When we talk about virtual machines, we can think of Java VM or RubyVM, and Wasm Runtime falls into the same category.
Java and Ruby compile source code to generate bytecode, which is then executed by the virtual machine. Similarly, Wasm follows a similar process.

ただ、図1で示しているように、WasmはC、Go、Rustといった多数の言語からコンパイルできるのが特徴となっている。
However, as shown in Figure 1, a notable feature of Wasm is its ability to be compiled from various languages such as C, Go, and Rust.

![](./images/about_wasm_runtime.png)
*図1*

本書はいわばJava VMやRubyVMのような仮想マシンを実装していくことになるが、
Wasm Runtime自体はそれほど複雑ではなく、できることは数値の計算とWasm Runtime自身がもつメモリ操作のみである。

では標準出力などの処理はできないのか?と疑問に感じる人も居るだろう。
実はリソース(ファイルやネットワークなど)の操作はWasm Specに含まれておらず、[WASI(WebAssembly System Interface)](https://wasi.dev)という仕様に含まれている。
WASIはPOSIXライクなシステムコール関数の集まりとなっていて、それらの関数を呼ぶことでリソースを操作できるようになる。

ちなみに今回は`Hello World`を出力するために、WASIの`fd_write`という関数を実装していく。

## Wasmのメリット・デメリット

筆者が考えるWasmのメリット・デメリットは次のとおり。

### メリット
- **セキュアな実行**
Wasm RuntimeはWASIを使わない場合は基本的にRuntime外に影響を及ぼすことはない[^1]ので、ある種のサンドボックス環境となっている
たとえば環境変数から機密情報を抜き取る、といったようなことはできないためセキュアである
- **ポータビリティ**
WasmはOS・CPUに依存せず、Runtimeがあればどこでも実行できる
Google ChromeやFirefox、Microsoft Edgeといった主要なブラウザで実行できる
主要のブラウザ以外にも、[Wasmtime](https://wasmtime.dev)[wazero](https://wazero.io)といったサーバーサイドで実行できるRuntimeもある
- **言語の多様性**
Wasmは複数の言語からコンパイルできるので各言語の財産を利用できる
また、他のWasmバイナリをimportできるため、言語の壁を超えて各言語の財産を共有できる

### デメリット
- **古いブラウザのサポートをしていない**
基本的にないと思うが、古いブラウザではWasmをサポートしていないため、Wasmバイナリを実行できないことがある
その場合は[polywasm](https://github.com/evanw/polywasm)というライブラリを使えばWasmを動かせる
- **発展途上の技術である**
Wasmは比較的に新しい技術で、WASIとともに現在も仕様の拡張が行われている
そのためエコシステムもまだ成熟しておらず、Wasmだけで本格的なアプリケーションを構築するのはまだ難しい
- **パフォーマンスはRuntimeに依存する**
Runtimeの実装によってはパフォーマンスの差異が発生する
たとえば、ChromeとWasmtimeでの実行はそもそもRuntimeが異なるため、ベンチマークの比較はその部分を考慮する必要がある
Wasmバイナリの実行速度を比較するのであれば同じRuntimeで計測する必要があり、Runtimeの速度を計測する場合は同じWasmバイナリで計測する必要がある

## Wasmの利用シーン
Wasmが利用されているシーンについて、いくつか例を紹介していく。

### プラグインシステム
Wasmは複数の言語からコンパイルできることから、プラグイン機構を構築する際にWasmを採用されることがよくある。
たとえば、[zellij](https://github.com/zellij-org/zellij)というターミナルマルチプレクサではWasmを採用している。詳細は[こちら](https://zellij.dev/news/new-plugin-system/)を参照してほしい。

他にも[Evnoy Proxy](https://www.envoyproxy.io)というプロキシサーバーではWasmを使って機能拡張できる仕組みも用意されている。

### サーバーレスアプリケーション
[spin](https://developer.fermyon.com/spin)というフレームワークを使うと、Wasmでサーバレスアプリケーションを構築できる。
spin以外には[wasmCloud](https://wasmcloud.com)[Wasmer Edge](https://wasmer.io/products/edge)などがある。

### コンテナ
`Docker``Kubernetes`でもLinuxコンテナの代わりにWasmを使うことができる。
`Docker``Kubernetes`がどのようにLinuxコンテナとWasmを動かしているのかについて、図2をもとに概要を説明する。
*Figure 1*

This book will essentially implement a virtual machine similar to Java VM or RubyVM.
The Wasm Runtime itself is not very complex, capable of performing numerical calculations and memory operations that it possesses.

One might wonder if tasks like standard output are possible. In fact, resource operations (such as file or network operations) are not included in the Wasm Spec but are part of the [WebAssembly System Interface (WASI)](https://wasi.dev) specification.
WASI consists of a collection of POSIX-like system call functions, allowing resource operations by calling these functions.

For this instance, we will implement the `fd_write` function of WASI to output `Hello World`.

## Pros and Cons of Wasm

The author's perspective on the pros and cons of Wasm are as follows.

### Pros
- **Secure Execution**
Without using WASI, Wasm Runtime generally does not have an impact outside the runtime, making it a kind of sandbox environment.
For example, it is secure as it cannot extract confidential information from environment variables.
- **Portability**
Wasm is independent of the OS and CPU, allowing execution anywhere with a runtime.
It can be executed in major browsers like Google Chrome, Firefox, and Microsoft Edge.
Besides major browsers, there are runtimes like [Wasmtime](https://wasmtime.dev) and [wazero](https://wazero.io) for server-side execution.
- **Language Diversity**
Wasm can be compiled from multiple languages, enabling the utilization of assets from various languages.
Additionally, it can import other Wasm binaries, facilitating the sharing of language assets across language barriers.

### Cons
- **Lack of Support in Older Browsers**
Although rare, older browsers may not support Wasm, leading to the inability to execute Wasm binaries.
In such cases, using a library like [polywasm](https://github.com/evanw/polywasm) can enable running Wasm.
- **Evolving Technology**
Wasm is a relatively new technology, with ongoing specification extensions alongside WASI.
As a result, the ecosystem is still maturing, making it challenging to build full-fledged applications solely with Wasm.
- **Performance Depends on Runtime**
Performance differences can arise based on the implementation of the runtime.
For instance, executing in Chrome and Wasmtime involves different runtimes, necessitating consideration of this aspect in benchmark comparisons.
When comparing the execution speed of Wasm binaries, measurements should be done with the same runtime, and when measuring runtime speed, it should be done with the same Wasm binary.

## Use Cases of Wasm
We will introduce several examples of scenarios where Wasm is being utilized.

### Plugin Systems
Due to Wasm's ability to be compiled from multiple languages, it is often adopted in building plugin mechanisms.
For example, the terminal multiplexer called [zellij](https://github.com/zellij-org/zellij) utilizes Wasm. For more details, refer to [this link](https://zellij.dev/news/new-plugin-system/).

In addition, the Envoy Proxy server also provides a mechanism for extending functionality using Wasm.

### Serverless Applications
By using the spin framework, you can build serverless applications with Wasm.
In addition to spin, there are other options such as wasmCloud and Wasmer Edge.

### Containers
In addition to Linux containers in Docker and Kubernetes, you can also use Wasm.
To explain how Docker and Kubernetes run Linux containers and Wasm, an overview is provided based on Figure 2.

![](./images/containerd_shim.png)
*図2*
*Figure 2*

- `containerd`
- コンテナイメージの管理(取得や削除など)やコンテナの操作(作成や開始など)をキックするなど
- 高レベルコンテナランタイムとも呼ばれる
- Manages container images (such as retrieval and deletion) and operations on containers (such as creation and start)
- Also known as a high-level container runtime
- `runc`
- 実際にLinuxコンテナの作成と起動をする
- 低レベルコンテナランタイムとも呼ばれる
- Actually creates and starts Linux containers
- Also known as a low-level container runtime
- `containerd-shim`
- `containerd``runc`を繋げてくれる
- 実体はただの実行バイナリ
- Bridges `containerd` and `runc`
- Essentially just an execution binary
- `containerd-shim-*`
- `containerd``Wasm Runtime`を繋げてくれる
- 実体はただの実行バイナリ
- `containerd-shim-wasmtime``containerd-shim-wasmedge`といった実行バイナリがある
- Rustで`containerd-shim-*`を実装するときは[runwasi](https://github.com/containerd/runwasi)を使う
- Bridges `containerd` and `Wasm Runtime`
- Essentially just an execution binary
- There are execution binaries like `containerd-shim-wasmtime` and `containerd-shim-wasmedge`
- When implementing `containerd-shim-*` in Rust, use [runwasi](https://github.com/containerd/runwasi)

## まとめ
本章はWasm RuntimeやWasmを使ったエコシステムについてざっくりと紹介したので、
次章では実際にWasmtimeを使ってWasmを実際に使ってみる。
## Summary
This chapter provides a brief introduction to the Wasm Runtime and the ecosystem using Wasm.
In the next chapter, we will actually use Wasm with Wasmtime.

[^1]: Runtimeの実装に脆弱性がないことを前提とする
[^1]: Assumes that the Runtime implementation is free of vulnerabilities.
Loading

0 comments on commit d11c6a2

Please sign in to comment.