WebAssemblyのname section

去年WebAssemblyのインタプリタを作って、最近はbinary formatに対応したものを作ろうとしている。特に明確な目標があるわけではない。

前回は最小限で形になる範囲しか対象にしなかったので、仕様書の一部を読めていなかった。具体的には、verificationがその一つである。そこ以外は目を通していたつもりでいたのだが、実は密かに(?)追加された部分を先日見つけて、今回はその話である。

WebAssemblyが扱う単位はモジュールと呼ばれ、その中は複数のセクションに分かれている(図を参照)。

f:id:ironoir:20210113083750p:plain
セクション一覧

このうち、特別なのがcustom sectionで、その名の通り、具体的な内容は決まっておらず、また、仕様上唯一、他のセクションの間のうち、どこでも好きな場所に配置することができる。WebAssemblyのセマンティクスには影響せず、実装に無視されるかもしれないとも書いてある。以前であればその使い道は「デバッグ用など」と簡単に書いてあるだけだったのだが、仕様書に具体的な使い道の例が追加されていることに気がついた(以前からあったのならごめんなさい)。それがname sectionである。

name sectionは、セクション名がnameであるセクションのことで(ややこしいな)、そのモジュールの中で一回だけ、かつdata sectionの直後にだけ出現する。

The purpose of this section is to attach printable names to definitions in a module, which e.g. can be used by a debugger or when parts of the module are to be rendered in text form.

とのことで、name sectionの名の通り、モジュールの中で使用されている名前を持っておくセクションで、やはりデバッグ用途を想定しているらしい。そしてその中はさらに細かくサブセクションに分かれており、モジュール名、関数名、ローカル変数名のどれかが入るとのこと(コンパイルすると消えてしまう情報ということですね)。

こういう情報は仕様書に含まれている含まれていない、どちらにせよ実装側としては何らかの形でほしいものなので、こういった形でしっかり仕様書に定義を書いてくれている方がやりやすいというか、ありがたい。今作っている実装にも付け足せたらいいな。