射影編集
2008年1月14日
ソース編集の代替案として、システムのコア定義をモデルに保持し、射影を通して編集するという考え方があります。
このスタイルの環境について話すために、システムの複数の表現という観点から考えると便利です。
- 編集可能な表現:システムを変更するために編集するものです。
- ストレージ表現:システムの定義の永続的な記録です。
- 実行可能な表現:システムを実行するために実行されるもの、つまり実行ファイルです。
- 抽象表現:システム定義を操作および推論するために使用されます。
- 視覚化表現:システム定義の編集不可能なビューです。
ソースコードは、編集可能な表現とストレージ表現を組み合わせたものです。ソースは、1つの可視ステップ(解釈)またはコンパイラを介した複数のステップで実行可能な表現に変換することで実行されます。これを行うために、通常はソースを中間ステップとして抽象表現に変換しますが、この抽象表現は一時的なものであり、コンパイル中にのみ存在します。ソースは、システムのコア定義と見なされます。

射影編集では、抽象表現がシステムのコア定義となります。ツールは抽象表現を操作し、プログラマーがシステムの定義を変更するための複数の編集可能な表現を射影します。ツールは抽象表現をストレージ表現に永続化しますが、これはツールが射影する編集可能な表現とは完全に分離されています。実行可能な表現との関係はほぼ同じです。実行可能ファイルは、抽象表現からの変換の連続によって生成されます。

ソース編集環境と射影編集環境の重要な違いは、永続ストレージと編集の間の分割です。射影編集システムは、選択した任意の永続化メカニズムを選択できますが、ソースシステムにはいくつかのユニバーサルストレージメカニズムが必要です。そのため、ほぼ常にテキストファイルになります。
抽象表現は複数の射影を通して編集できます。各射影は、抽象表現の実際の構造に結びついていない、限られた量の情報を表示できます。したがって、射影編集では、テキスト形式だけでなく、グラフィカル構造や表形式構造を含む、より幅広い編集環境が表示されるのが一般的です。
高度なソースベースのIDEも、複数の射影を表示します。たとえば、クラスのメソッドのリストを表示するサイドペインと、それらのアクセス修飾子を示すグラフィカルなアノテーションがあります。ただし、これらの射影は通常、ソースエディターに対して非常に二次的であり、多くの場合、射影を直接編集することはできません。ソースを変更して射影の更新を確認する必要があります。
そのようなPostIntelliJ IDEは、ソースファイルをロードするときに抽象表現を作成することでこれを行います(そのため、起動に時間がかかる場合があります)。また、抽象表現を使用して、コンテキストに応じたコード補完やリファクタリングなど、他の多くのコード支援機能も実行します。
射影編集における重要な実用的な問題は、ストレージ表現の一般的に受け入れられている形式がないことです。プログラマーが読めるテキストがソースファイルの普遍的な選択であるという事実は、エディター、ソースコード管理、差分ビジュアライザーなど、それらを処理するための多くのツールを構築できることを意味します。射影システムはこれらすべてを自分で行う必要があり、そのため、これらのものが欠けていることがよくあります。特に、多くの射影環境は、適切な構成管理システムがないために非常に苦労しており、複数の人が同じシステム定義で共同作業することが非常に困難になっています。これは、このタスクを実行するためのソースコード管理システムが豊富なソース環境とは対照的です。
射影ベースのシステムはモデル駆動型ソフトウェア開発と密接に関連していますが、2つは完全に同義ではないと思います。MDSDの文脈では、抽象表現は通常、モデルと呼ばれます。確かに、ほぼすべてのMDSDツールはリポジトリベースですが、Microsoft Accessなど、すべてのリポジトリベースのツールがMDSDと見なされるわけではありません。
(この環境の捉え方を初めて探求したのは、言語ワークベンチに関するエッセイでした。ここでは、射影環境の概念が言語ワークベンチの場合よりも広いと考えているため、説明しました。)