headmaster 2013

URL → https://github.com/ytomino/headmaster/wiki/Document
前回 → http://d.hatena.ne.jp/ytqwerty/20101025#p1

というわけで良いタイミングですので(?)、headmasterの現状を書いておきます。

headmasterと先達プロジェクト

headmasterは、C言語を滅ぼすことを目的としたCのヘッダファイルのトランスレータです。やっていることはCILの四番煎じです。ただ、CILが入力、出力ともにC言語をメインとしているのに対し、headmasterはCのライブラリを他言語から使うためのヘッダファイル変換をメインとしています。

SWIGとの違いとしては、完全なプリプロセス/構文解析/意味解析をしていますので、所謂interface fileが不要です。その辺の.hをそのまま入力として扱えます。また、特にラッパーの生成などは行わず、1対1対応の直訳を基本としています。このため、ターゲット言語はCの関数を直接呼べる言語に限ります。まあ、今のところ変換先はAdaしか実装してないわけですが……。

GNAT GPL-fdump-ada-specとの違いは……正直あんまりないです。マクロの扱いやプラットフォームの差を吸収するための#pragmaがある点では今のところ勝ってますが、相手はgccに組み込んであるだけに、未実装部分が無いのと、あと一番大きいC++対応という点では負けています。C++のパーサなんて書きたくありませんのでこの点では負けっぱなし確定。

windows.h

そんなheadmasterも、ついに当初の目標に掲げていたwindows.hの変換に成功しました。

出力例 → http://panathenaia.halfmoon.jp/alang/headmaster/demo/windows_h/

この時は、大多数と言っても良いぐらいのリツィート/ふぁぼりをいただきありがとうございます。

三年前の時点では

しかしどのプロジェクトも、windows.hで記述されている意味や内容をすべて把握するには至っていません。

http://d.hatena.ne.jp/h_sakurai/20101026/p1

だったのですが、ここに技術革新が起きました!……というのは嘘で、別にwindows.hぐらいは意味解析までならCILもgcc -fdump-ada-specもとっくの昔に解析できてました(特に後者はgccその物なので当然ですね。h_sakuraiさん、黙っててごめんなさい)。windows.hは量が膨大なだけに軽く対応とは行きませんが、特にトリックめいた書き方がなされてたりするわけではありませんので。後は出力の問題。

そんなわけでトランスレータとしては、細かい点(windef.hとwinnt.h間の循環参照etc)さえ捌ければ、後は問題ないんですよ。難易度ではlibxml2やLinuxのヘッダーのほうが遥かに酷いです。ただ、CILは他言語への変換を目的にしておらず、gcc -fdump-ada-specはそうした個々のヘッダーに構うような小細工がされてない、という程度の差しかないです。

windows.h以外にも各OSの主要ヘッダーは大体いけます。このへん参照。

展望

で、まあ、まだまだ未実装部分も多いのですが、ある程度できたからには使って欲しいのが常です。
理想としては、ある程度活発な言語をサポートして、いろいろ勝手に開発してもらって、その成果をAda側で何もせずに享受する(Ada部分のユーザーは私一人で好きなように弄れる)、という風に持って行ければ……(夢は寝て見ろボケ)

  • Adaコミュニティに売り込む
    • gcc -fdump-ada-specがある、終了
  • Dコミュニティに売り込む
    • SWIG for Dがある、加えて主要ヘッダーは手動でポーティング済み、終了
  • Fortranコミュニティに売り込む
    • Fortranがこういうのを必要とするイメージが全く沸かない(偏見)

あれ、実は需要無い……?
……そんな皮算用よりリファクタリングが先です。今のコードは動くところまで持っていった段階ですので、汚いったらありゃしないです。人に見せるコードじゃありません。