🐡
プログラミング言語Grainを試す
はじめに
そろそろWASI[1]も0.3が出そうだな~とインターネットを徘徊していたところ、WebAssemblyにコンパイルされるGrainという言語があることを知った。
WebAssemblyは基本的に機械語の命令セットなので、CとかRustからは(機能的な制約はあれども)コンパイルできるのだが、個人的にはWASIの概念をベースとするWASIファーストな言語[2]があるとよいなと思っていたところだったので、試してみる。
インストール
コンパイラはGitHubのリリースページでシングルバイナリとして提供されている。
対応しているOSはWindows/Mac/Linux。
個人的にはこういうコンパイラこそWASMで作ってくれよと思うのだが、一旦目をつむる。
Hello World
コンパイル手順
ソースコードは*.gr、中間ファイル(Grain object file)が*.gro、最終出力は*.wasmになる。
CLIの基本的な使い方としては以下の通り。
| cmd | 内容 |
|---|---|
| grain {source.gr} | grain compile {source.gr} + grain run {generated.wasm} |
| grain compile {source.gr} | *.gr から *.wasmを生成 |
| grain run {generated.wasm} | wasm実行 |
| grain doc {source.gr} | graindocという記法で書かれたコメントからドキュメントのmarkdownを生成 |
| grain format {source.gr} | フォーマット |
| grain lsp | GrainのLanguage Server。モダンで良いね! |
Hello World動作確認
Hello World書いてみる。
src/hello.gr
module Test // ファイルの先頭にはファイル全体を含むmoduleの宣言が必要
print("Hello, world!")

実行結果は以下の通り。
> grain .\src\hello.gr
Hello, world!

生成WASMの確認
wasmtimeで実行してみる
> wasmtime --version
wasmtime 36.0.1 (ebce5d453 2025-08-21)
> wasmtime .\src\hello.wasm
Hello, world!
wa2.devで見てみる
内部的にはWASI p2ではなくWASI p1を踏襲している模様。
つまり、wasi:cliではなく_start()を通じて実行されている。


-
WASI: WebAssembly System Interface, ブラウザとローカルPC上でのWebAssembly動作の標準化を目指し、WebAssemblyからシステムリソースへとアクセスするAPIの標準化を行っている団体/規格 ↩︎
-
WebAssemblyファーストという意味ではAssemblyScriptがあるが、AssemblyScriptは明確にWASIやComponent Modelに反発している。一応WASI対応を行うためのパッチは有志が公開しているようだが... ↩︎
Discussion