うひょー(ブログ)スマートフォン用の表示で見るうひょー(ブログ)うひょーこの広告は、90日以上更新していないブログに表示しています。2017-10-22例のアレをWebAssemblyで動かした概要min-caml向けのWebAssemblyバックエンドを実装し、レイトレをWebAssemblyにコンパイルして動かしました。uhyohyo.net背景min-camlは、OCamlのサブセット向けの小さなコンパイラです。ほどよい小ささとソースコードの分かりやすさ*1から、筆者の学科では教育用に用いられています。github.comCPU実験という授業でコンパイラを担当する人(コンパイラ係)は、このmin-camlを改造し(一からコンパイラを実装する選択肢もありますが)、最適化を追加したり、独自のアーキテクチャ向けのバックエンドを実装したりします。今年度はコンパイラ実験のTAをやっているのでmin-camlのソースコードを読む機会が多くなり、2年前にコンパイラ実験を受講したときのことが懐かしくなったためmin-camlをいじってみることにしました。WebAssemblyは近年注目されている技術で、その名の通り、ウェブ用の低レベルなプログラミング言語です(詳しくは後述)。同じウェブ用の言語としては言わずとしれたJavaScriptが存在しますが、WebAssemblyはJavaScriptを置き換えるものではなく今後共存していくものであるとされています。アセンブリというと速そうですが実際はJavaScriptに比べて実行速度が速いわけではないというのが定説です。その代わり、パースにかかる時間がJavaScriptに比べて大きく短縮されるのが強みであるとされています。最近のWebAssemblyの隆盛を見て、自分もWebAssemblyを勉強したいと思っていましたが、使う機会が無く困っていました。そこで、min-caml用のWebAssemblyバックエンドを作ればmin-camlをいじれるしWebAssemblyの勉強になるので一石二鳥になるということで今回実装するに至りました。何だかんだでWebAssemblyの仕様がそこそこ分かりました。CPU実験ではレイトレーシングのプログラムが与えられます。それをコンパイルして正しく動作させることがコンパイラ係の目標となります。上の画像は、レイトレーシングのプログラムによって生成されるもので、CPU実験を知っている人の間では有名なようです。そこで、今回もWebAssemblyでレイトレプログラムを動かし、この画像を出力するところまで行いました。結果できたものはGitHubの↓このブランチにあります。github.com結論としては、WebAssemblyのバックエンドを作るのは(とりあえず作るだけなら)比較的簡単です。min-camlにおいてバックエンドを実装するというのはClosure.tから先の変換を実装することを指しますが、実はWebAssemblyというのは関数呼び出しとかローカル変数とかいう概念があり、なんとローカル変数は任意の数使用することができます。レジスタ割り当て、レジスタの退避・PCの管理といった一般の機械語との間にあるようなギャップがありません。実装したらできました。(バグ取りはすこし苦労しましたが。)ただし、オリジナルのmin-camlにWebAssemblyバックエンドを追加しても、レイトレプログラムを動かすにはまだ小さくないギャップがあります。そこで、ここは少しずるをして、2年前に独自アーキテクチャ向けに改造したmin-camlのバックエンドを今回の実装で置き換えました。上でも掲載しましたが、実際にブラウザ上でWebAssemblyが実行されるデモを用意しました。uhyohyo.net*1:関数名を除けば。████に入社します迷惑行為通報記録(So-net編)例のアレをWebAssemblyで動かした月別アーカイブはてなブログをはじめよう!uhyouhyo314さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。