単純化

よりコンパクトかつ効率よくプロトコルが記述できるように、抽象化レベルを進めて、通常のC言語プログラマなら違和感なくプログラムが書けるように工夫する必要がある。
確かに現状のmiraiは死ぬほどプログラムが書きづらいという欠点があるので、思い切ってかなり単純化した。

外部データ構造と配列

外部データ構造を取り扱う専用の構文を用意する。

*[TCP header] : [stdseq][BEbit](length [Data Offset] [dword])
        [Source Port] : [word]
        [Destination Port] : [word]
        [Sequence Number] : [dword]
        [Acknowledgement Number] : [dword]
        [Data Offset] : [4 bits]
        [Reserved] : [padding](eq 0)
        [Code Bit] : [6 bits]
        [Window] : [word]
        [Checksum] : [word]
        [Urgent Pointer] : [word]
        @ : [dword align]
        [TCP Options]
--

これは従来のmiraiと同様で、順序付き辞書(seq)を用いて定義できる。イベントチャンネルから[TCP header]イベントを受け取るようなコードを書いた場合に、これらのデータは全て提供される。niji/miraiのシンボルは伝統的に空白を許す(Wikiでの記述を効率的にするため)。
式の表現方法はS式に変更された。
抽象シンボルのサポートが拡充された。つまり、[N bits]にマッチするシンボルは全て存在する物として扱われ、正常にデータ抽出ルーチンが出力される。ただし、抽象シンボルを定義する構文は準備されない。すべての抽象シンボルテンプレートは組み込みとなる。

[12 words] (* 16bit 符号無し整数 12個 *)
[byte:99] (* 8bit 符号無し整数の99 *)

配列も抽象シンボルと統合された。

[Packet]@[Sequence] (* Sequence番目のPacket *)

のように、シンボルを結合して表現する。これは[Packet]@[Sequence]で一つのシンボルとして取り扱われる。withを明示的に使うことで@による結合は省略できる。

正規表現

Preccsのように正規表現をサポートする。従来は組み込みの正規表現は存在しなかった。

[ASCIIZ String] : '[bytes]* [byte:0]'

この正規表現は試験的な物で*1、将来的にはPerl6 Rulesの適用を検討している。
また、これはテキストプロトコルの実装を想定している。たとえばTLVやメッセージ等の構造は正規表現のマッチや選択などによって実装されるよりも、組み込みの語彙を用いることが望ましい。もちろん、上記の例のような単純な利用は問題ない。

未定

  • 高階関数と関数の再帰のサポート
  • 文法の多くの部分。現在は通常の人間には理解しづらい構文が多い。
  • 名前のlookupの定式化(現在は同一シンボルが存在しないのが前提)

実装

今回から、シンタックスシュガーとそうでない部分を明確に分離し(た方が良いというアドバイスを頂いたので素直にそうし)て、だんだん言語の抽象度を下げていくマルチパスなコンパイラとして作ることに。
また、バイトコードではなくC言語ソースを出力して*2バックエンドにはgccを用いる。他のコンパイラとの差し替え可能なインターフェースも検討中。

*1:まだ選択さえ実装されていない

*2:従来でも外部データ構造の取り扱いだけはC言語ソースを出力していたが、イベントループなどは単純に一つのテンプレートを多くのアプリケーションで流用しており、パフォーマンスが低かった