🐡

プログラミング言語Grainを試す

に公開

はじめに

そろそろWASI[1]も0.3が出そうだな~とインターネットを徘徊していたところ、WebAssemblyにコンパイルされるGrainという言語があることを知った。

https://grain-lang.org/

WebAssemblyは基本的に機械語の命令セットなので、CとかRustからは(機能的な制約はあれども)コンパイルできるのだが、個人的にはWASIの概念をベースとするWASIファーストな言語[2]があるとよいなと思っていたところだったので、試してみる。

インストール

コンパイラはGitHubのリリースページでシングルバイナリとして提供されている。
対応しているOSはWindows/Mac/Linux。
個人的にはこういうコンパイラこそWASMで作ってくれよと思うのだが、一旦目をつむる。

https://github.com/grain-lang/grain/releases

Hello World

https://grain-lang.org/docs/guide/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!")

src/hello.gr

実行結果は以下の通り。

> 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で見てみる

https://wa2.dev/

内部的にはWASI p2ではなくWASI p1を踏襲している模様。
つまり、wasi:cliではなく_start()を通じて実行されている。

imports
exports

脚注
  1. WASI: WebAssembly System Interface, ブラウザとローカルPC上でのWebAssembly動作の標準化を目指し、WebAssemblyからシステムリソースへとアクセスするAPIの標準化を行っている団体/規格 ↩︎

  2. WebAssemblyファーストという意味ではAssemblyScriptがあるが、AssemblyScriptは明確にWASIやComponent Modelに反発している。一応WASI対応を行うためのパッチは有志が公開しているようだが... ↩︎

Discussion