なぜ今コンパイラを作るのか?

シーナリコンパイラとは

1999/11月、Microsoft Flight Simulator 2000 (以下FS2000)が発売されました。 FS2000 のシーナリは従来のシーナリにくらべかなり拡張がなされており、 当然のことながら、シーナリファイルの形式である BGL 形式にも拡張が 加えられています。

シーナリを作成するには、シーナリコンパイラが必要です。 シーナリコンパイラは、シーナリの定義をテキストファイルとして書き、 それを BGL 形式のファイルに変換する、というツールです。

残念ながらシーナリコンパイラは Microsoft からはリリースされていません。 Microsoft は Flight Simulator 98(以下 FS98) の Scenery SDK を公開して おり、BGL の構造については公開しているものの、コンパイラは MASM を 使うようにという指示があるだけです。MASM を使ってシーナリを作成する のは非常に大変であり、そのうえ MASM はかなり高価です。 ちょっとシーナリを作成してみようか、という人に MASM を買えというのは 非現実的です。

幸い、シーナリコンパイラは第3者が作成したものがいくつかあり、 ほとんどが無料で使用できます。 このうち、もっとも有名なのは Manfred Moldenhauer 氏による SCASM です。

特に GUI のシーナリ作成ツールとして人気のある Airport や ASD といった ツールが SCASM を使用している、という理由もあり、 現状では SCASM が事実上の標準になっています。SCASM がなければ、 世界中のシーナリ作成のほとんどがストップしてしまう、といっても過言で はありません。


SCASM の問題点

SCASM はシーナリ作成の分野に大きな貢献をしてきました。しかし、 その一方で問題点も多々あります。

開発環境がクローズド

まず、SCASM は完全にクローズドな環境で開発されています。

開発は Manfred Moldenhauer 氏だけが行っているようです。 (多少の協力者がいるかもしれませんが、詳しいことはわかりません。)

Moldenhauer 氏は Airport や ASD などのツールに対して特注の SCASM を作成 しているため、同じ SCASM でも微妙な違いがあります(バージョンが異なる)。 さらに、特注の SCASM には隠し機能がいくつか付いていることがあります。 たとえば、AFD(Airport Facility Directory) 向けの SCASM には、 BGL のセクション 20 のコードを生成する機能がついていますが、 この機能は全く公開されていません。

また、こういった特注の SCASM は、それ用のツールに添付して配布される ようになっています。そのため、現在 SCASM は(古いバージョンを除いて) 単体では配布されていないのです。

このため、SCASM の最新バージョンを調べるのは非常に大変です。 総本山というものがないのです。

ソースが非公開

SCASM はソースが公開されていません。私はこれは SCASM の最大の欠点 であると思っています。

ソースが公開されていないということは、他人が機能を追加しようとして もできない、ということです。機能を追加するには直接 Moldenhauer 氏に かけあうしか方法がありません。

今まではソースが公開されていなくてもそれほど問題はなかったのですが、 FS2000 が公開されたいま、FS2000 用の魅力的なシーナリの機能をフルに使うには SCASM のバージョンアップを待たねばなりません。その SCASM は今や単体では配布されていないし、最新バージョンがどれかも わからない、というのでは困るのです。

制限事項

従来、SCASM は ASD に含まれているものを除き商用利用ができませんでした。 また、商用 BBS にアップロードすることができないなど、配布条件にも 制約がついています。

拡張性

SCASM の文法は拡張性があまり考慮されていません。

例えば、自分で新たなコマンドを追加することができません。 マクロ機能を使えば似たようなことはできますが、コマンドを追加する、 というのとはちょっと違います。

また、ラベルのオフセット計算機能がないため、ジャンプ命令をマクロで 定義することができません。このため、FS98 で追加された一部の機能 を実現することができません。実際、SCASM の生成した BGL コードを バイナリエディタで編集する、といった努力をしている人も現実にいます。

文法の不便さ/あいまいさ

C のプリプロセッサのような #define が使えないので、 たとえば 'RED' と書く代わりに '05 F0' と書かねばなりません。 これはかなり不便です。

include のネストができません。これは多少大規模なシーナリを 作成するときには不便です(GUI ツールでは関係ありませんが)。

困ったことに、コマンドのパラメータは文脈によって 10 進数であったり 16 進数であったりします。例えば、Building の 第1引数は 10進数ですが、 第7引数は 16 進数です。これは '10' と書いたものが場所によって、 10 進数の 10 であったり、16 進数の 0x10 であったりするということです。


問題の解決へ向けて

上に挙げた問題点は、GUI ツールを使ってシーナリを作成する人はあまり 感じることはないかもしれません。しかし、マクロを作成したり、 ちょっと高度なことをしようとすると問題が表面化します。

こういった問題を解決する最良の方法は、独自にコンパイラを作ることです。 これがこのプロジェクトの目的なのです。