はじめに
本記事は、下記のノア・エバレットさん記事① 記事②のうちの記事①の一部に基づいています。ノア・エバレットさんはTwitpicの設立者で、現在新しいSNS、glueを立ち上げており、そのなかでCrystalが積極的に利用されているそうです。この記事の扱う内容はその前半の抜粋なので、よかったら元記事を参照してください。
wasmとは
wasmとは何か?については、(私は正しく説明できる自信がないので)他の記事に譲ります。
Crystalでwasmを出力する
CrystalはLLVMを利用しているので、wasmの出力なんか簡単だ、と思うじゃないですか。でも、
crystal build a.cr --target wasm32-wasi
とやるとエラーが出てしまいます。動作させるためには libc
、librt
、libpcre
が必要です。そこで、これらの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を動かすツールは、WasmerやWasmtimeがあります。どちらを利用しても、hello.wasm
を実行できると思います。
wasmer hello.wasm
wasmtime hello.wasm
いずれの場合も、hello
が表示されたら成功です。
まとめ
この記事では、Crystalを使ってWebAssemblyを出力して実行しました。多少手間がかかるところもありますが、今後コミュニティの有志の力によって、ますます利用しやすいものになっていくでしょう。実際にこの手法も、Crystalコミュニティの中で生み出されたものです。WebAssemblyが出力できるようになるまでのやりとりを知りたい場合は、下記のフォーラムを読んでみてください。
来年もCrystalの利用シーンが少しずつ拡大し、Crystalコミュニティのメンバーに幸いがありますように。
この記事は以上です。