7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CrystalAdvent Calendar 2022

Day 1

CrystalでWebAssemblyを出力する

Last updated at Posted at 2022-11-30

はじめに

本記事は、下記のノア・エバレットさん記事① 記事②のうちの記事①の一部に基づいています。ノア・エバレットさんはTwitpicの設立者で、現在新しいSNS、glueを立ち上げており、そのなかでCrystalが積極的に利用されているそうです。この記事の扱う内容はその前半の抜粋なので、よかったら元記事を参照してください。

wasmとは

wasmとは何か?については、(私は正しく説明できる自信がないので)他の記事に譲ります。

Crystalでwasmを出力する

CrystalはLLVMを利用しているので、wasmの出力なんか簡単だ、と思うじゃないですか。でも、

crystal build a.cr --target wasm32-wasi

とやるとエラーが出てしまいます。動作させるためには libclibrtlibpcre が必要です。そこで、これらのwasmのコンパイル済みライブラリを入手して静的にリンクするようにしましょう。

世の中にはちゃんと便利なツールを準備してくれている人がいます。上記のリリースから、コンパイル済みのwasmライブラリをダウンロードしましょう。この記事の作成時点では、0.0.2が最新です。

  • wasm32-wasi-libs.tar.gz

をダウンロードして展開します。
環境変数 CRYSTAL_LIBRARY_PATH$PWD/wasm32-wasi-libs をセットして、hello.cr をビルドしてみましょう。

export CRYSTAL_LIBRARY_PATH=$PWD/wasm32-wasi-libs
crystal build hello.cr -o hello.wasm --target wasm32-wasi

hello.wasm が出力されたと思います。

wasmはバイナリファイルですが、中身を覗いてみたい方はwabtというツールを使うと、wasmの内容を閲覧することができます。

wasm2wat hello.wasm

とはいえ、なかなか人間が読んでもわかるものではなさそうです。

実行してみよう

一般にwasmはブラウザで実行します。しかし、私はWeb技術に関する知識にうとく、ブラウザでwasmを実行することにはあまり興味がありません。それよりも、CPU/OSに依存せずに利用できるライブラリや、プラグインの基盤としてのwasmに興味があります。

ブラウザの外でwasmを動かすツールは、WasmerWasmtimeがあります。どちらを利用しても、hello.wasm を実行できると思います。

wasmer hello.wasm
wasmtime hello.wasm

いずれの場合も、hello が表示されたら成功です。

まとめ

この記事では、Crystalを使ってWebAssemblyを出力して実行しました。多少手間がかかるところもありますが、今後コミュニティの有志の力によって、ますます利用しやすいものになっていくでしょう。実際にこの手法も、Crystalコミュニティの中で生み出されたものです。WebAssemblyが出力できるようになるまでのやりとりを知りたい場合は、下記のフォーラムを読んでみてください。

来年もCrystalの利用シーンが少しずつ拡大し、Crystalコミュニティのメンバーに幸いがありますように。

この記事は以上です。

7
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?