エディタの作り方をどう教えるか

たしかに通常の人生はエディタを作ることが無いのでなかなか難しい。

まず、編集対象に対する『行為』を細分化する必要がある。例えば、viであれば行内部の編集機能と行の並び替え機能、あとは検索や置換ということになる。viは状態変化という形で目に見えるのでこのような分割が比較的見えやすいが、世間のエディタは基本的に非常に小さいエディタコンポーネントの集合で出来ている。
エディタ全体をナイーブに作ると効率が悪い。

バイナリエディタでテキストファイルを開くと解るように、通常、ファイルは隙間無く行が詰まっている。これをこのまま編集しようとすると、行を挿入しようとしたときに全体をずらさないといけない。5MBのテキストファイルの先頭に何か書くなら5MBのメモリ転送が必要になる。近年のコンピュータなら一瞬だが、あまり望ましいデザインとは言えない。
普通は図の右のような構造を考えれば、あとはmalloc等を駆使してエディタを作ることが出来る。右の構造では、行を編集したら新たな行バッファを確保して繋ぎ直すという処理をする。古い行バッファは捨てずに取っておけばUNDO機能にもなる。

問題点

  • このような図を生成するインフラがない

dddのようなエディタはデータ構造の接続図を描けるが、説明に使えるほど洗練された物ではない。
レイアウトを記述するための良い方法論と、そもそも、そのレイアウトからプログラムを生成するためのインフラが必要と言える。どちらもそれなりの研究は有る。

  • 近代的なエディタの問題を入れる余地がない

エディタといっても、何もテキストエディタだけじゃなくて、お絵かきソフトだって表計算ソフトだってエディタの一種なわけで。

  • コンピュータは十分に早くて大規模なデータも扱える

僕が初めてテキストエディタを作ったときは、行バッファが固定長だったのでファイルを開くだけで数十MBのメモリを消費していた。それでもある程度は実用的に使える物だったので、今となっては頑張ってエディタを作っても直接的な利点が見えづらいかも知れない。
言い換えれば、人間はコンピュータに比べて動作が遅いので、エディタの制作よりもプロトコルの実装やレイトレーシング等の方が(複雑なデータ構造をわざわざ実装する程度の)興味をひくと考えられる。