## Q1 Wasmは複数のプログラミング言語からコンパイルして生成することができます。そのようなプログラミング言語の中から1つを選んで、Hello worldを出力するプログラムを書き、Wasmにビルドしてください。そして何か1つWasm ランタイムをインストールし、Wasm バイナリを実行してください。回答にはどの言語を用いたか、どのWasmランタイムを用いたかを記述してください。 ## Q2 Q1でビルドしたWasmはWasm Coreの仕様(https://webassembly.github.io/spec/core/) に従ったフォーマットとなっています。Wasmのディスアセンブラをインストールし、Q1でビルドしたWasmを観察してみてください。仕様と実際のWasmバイナリを参考に、どのようなSectionがあるか、それぞれのSectionの役割は何か、実際にどのような値が格納されていたか、各セクション数行程度で簡単にまとめてください。(仕様は初見では読みにくいので、解説しているweb pageなどを参考にすると良いかと思います) また、Q1とは異なるプログラミング言語で同様にHello worldの動作を行うプログラムを書き、Wasmにビルドしてください。2つのWasmバイナリを観察し、気がついた共通点や相違点を記述してください。 ## Q3 この課題はプログラミング課題です。講義中で行うWasmランタイムの開発から、最初に行う実装を切り出しています。回答にはソースコードを提出してください。使用する言語は何でも構いません。インクリメンタルに課題を提示していますが、最後まで実装しなくても問題ありません。 (1) Wasmバイナリを上から順に読んでいき、各Sectionのサイズを読み取り出力するプログラムを書いてください。 (2) Code Sectionでは関数の実態が定義されています。Code Sectionの中身をパースして、各関数のサイズを出力する機能を追加してください。 (3) Code Section中の各関数の命令列をパースして、i64.const命令を検出する機能を追加してください。 (4) WAT(WebAssembly Text Format)というWasmのテキスト形式で、_start関数が定義されたadd.watを作成してください。_start関数では、2つのi64の定数を定義し、それらを加算、その結果をdropしてください。また、_start関数はexportする修飾子を与えてください。作成したadd.watが有効な形式であるか、Wasmバイナリに変換するツールであるwat2wasmなどを使って確認してください。 (5) Code Section内で、add.watの記述で用いた命令の検出を実装してください。動作確認として、(3)で作成したWasmバイナリをパースしてください。 (6) ここまではWasmバイナリをパースするプログラムを作成しました。次に、Wasmバイナリを_start関数から実行してみましょう。 Wasmはスタックマシンです。スタックを用意して、今までに検出した命令において、スタックに対する操作を実装してください。動作確認として、(4)で作成したWasmバイナリを実行してください。小さなWasmランタイムの完成です。 (7) add.watを改良して(4)-(6)を行ってください。他の算術命令やコントロール命令に対応するも良し、Wasmが持つメモリ空間であるLinear Memoryを導入しメモリ命令に対応するも良し、テストの機構を導入するも良し、などなど何でも構いません。 ## Q4 Wasmはさまざまな既存のシステムに組み込まれようとしています。Wasmの応用例を調べてみて、興味を持ったものを紹介してください。そしてなぜそのシステムにおいてWasmが適切だったのか、自分なりの考えをまとめてみてください。 ## Q5 過去に開発したものや、どのようなことに興味を持っているかなどを自由に記述してください。その際、なぜそれを開発したのか、なぜその技術に注目しているのかを教えてください。