🐉

D言語でコンパイル時に Common Workflow Language パーサーを生成したい!(野望編)

2021/12/27に公開

この記事は D言語 Advent Calendar 2021 の9日目および Common Workflow Language (CWL) Advent Calendar 2021 の3日目の記事です。

この記事は以下の二部三部構成になっています。

  • (この記事) ワークフロー記述言語 Common Workflow Language (CWL) とその文法定義形式 Semantic Annotations for Linked Avro Data (SALAD)、最近は教育用のプログラミング言語としてもその頭角を表しつつあるD言語の概要を示し、D言語でコンパイル時 SALAD パーサージェネレータを書いたら最強なのでは?という野望について語ります。
  • (次の記事) D言語でコンパイル時 SALAD パーサージェネレータを書く方針と、SALAD 定義に対応したD言語でのデータ構造を定義する話をします。
  • (最後の記事) D言語のつよつよメタプログラミングによりパーサーの大部分が自動生成できることを示し、最終的にコンパイラとカリカリチューニングされたコードの CTFEability という壁に阻まれ、コンパイル時 SALAD パーサージェネレーターを書くことに失敗した話をします(つらい)。

注意: この記事ではコードはほとんど出てきません。

Common Workflow Language とは

Common Workflow Language (CWL) は複数のコマンドラインツールを組み合わせて解析を行うワークフローを記述するための言語で、バイオインフォや天文、機械学習などの様々な領域で活用されています。また文法等の仕様は公開されているため、クラウドやスパコン上で動作する処理系(ワークフローエンジン)や GUI での可視化・編集ツールなども活発に提案・開発が行われています。

CWL の文法およびそのパーサーについて

さて、CWL は YAML ベースの文法を持っていて、その文法は Semantic Annotations for Linked Avro Data (SALAD) により形式的に定義されています。また SALAD の文法自身も SALAD 形式で定義されています。

CWL のリファレンス実装である cwltool を始め、多くの CWL 対応ワークフローエンジンは、SALAD 用のパーサージェネレーター schema-salad-tool が生成した CWL パーサーを利用しています。

例えば以下のコマンドで、Python で書かれた CWL パーサーのソースコードを生成します。各エンジンはこれを組み込んで使うわけです。

$ schema-salad-tool --codegen python /path/to/schema/of/CommonWorkflowLanguage.yml > python_parser.py

D言語とは

D言語幅広く利用されている汎用プログラミング言語で、その特徴は以下のツイートに端的に現れています。

D言語はコンパイルが爆速で組み込みからパーサーまで対応できてメタプログラミングが特に強力でD言語で書いた大抵のコードはコンパイル時にも動く

D言語で書いた大抵のコードはコンパイル時にも動くschema-salad-tool でソースコードをいちいち吐き出さなくても、SALAD で書かれた文法定義を読み込んで CWL パーサーをコンパイル時に生成するプログラムをD言語で書けばいいのでは!?例えばこんな感じで書ければ最強なのでは!!!

// CWL パーサーを文法定義から生成 (コンパイル時)
alias CWLParser = SALADParserGenerator!"path/to/schema/of/CommonWorkflowLanguage.yml";
  
// CWL ワークフローの読み込み (実行時)
auto cwl_obj = CWLParser.parse("/path/to/workflow.cwl");

D言語製のコンパイル時パーサジェネレーターには標準ライブラリの std.regex の ctRegex (与えられた正規表現のパーサーをコンパイル時に生成する)などが広く使われており、実績も十分あります。いける!

次回

乱れ飛ぶ User-Defined Attributesstatic foreach、コミットを重ねるごとに減っていく文字列 mixin、「どうせコンパイル時に動かないならソースコード吐き出しちゃいなよ」とささやくschema-salad-tool
コンパイル時 SALAD パーサージェネレーターとして開発を開始した schema-salad-d はどうなるのか!

次の記事に続く。

Discussion