← チャプター一覧
第5章 · テキストエディタの仕組み
📝 エディタの中身は何でできている?
VS Code や Vim でコードを書くとき、エディタの中では何が起きているの?文字を挿入・削除するだけでも実は巧妙なデータ構造が使われている。Undoの秘密も解き明かそう!🔍
👇 書いてみよう(この後、仕組みを解説!)
def hello():
print("Hello! 🎉")
第5章 · Step 1/4
💾 Step 1:単純配列 vs Gap Buffer
文字を単純な配列で持つと、文章の途中に挿入するとき後ろの文字を全部ずらす必要がある。Gap Bufferは「カーソル位置に空白(ギャップ)を作る」ことで解決する!
😰 単純配列の問題(「X」を先頭に挿入)
✅ Gap Bufferの解決策!
💡 Emacs発祥のGap Bufferは現在も多くのエディタで使われている。
VS CodeはPiece Treeというさらに高度な構造を採用!
第5章 · Step 2/4
↩️ Step 2:「元に戻す」はスタックで実装
編集操作はスタック(積み上げ式のデータ構造)に積まれる。Undoは「最後の操作を取り出して逆にする」だけ!シンプルで確実。
📚 Undoスタック(↑が最新)
スタックが空 = これ以上戻れない
💡 Redoは「戻した操作を再スタック」するだけ。
VSCodeは木構造で複数の分岐を保持する!
第5章 · Step 3/4
🎨 Step 3:コードが色分けされる仕組み
コードに色がつくのは字句解析(トークン化)という処理のおかげ。コードを左から読んで「これはキーワード」「これは文字列」と分類し、色を付ける!
ソースコード(解析前)
def hello(name):
print("Hello, " + name)
トークン列
ハイライト後
第5章 · Step 4/4
🎯 Step 4:カーソルはどこにあるかをどう管理する?
カーソルは「何行目の何文字目」という行・列の座標で管理される。クリックや矢印キーで移動するたびに座標が更新される!
👇 クリックまたは入力してカーソル情報を確認!
Hello, World!
これはサンプルテキストです。
エディタの仕組みを学ぼう!
💡 多くのエディタは「オフセット(先頭から何文字目)」で内部管理し、表示時に行・列に変換する。
日本語・絵文字は複数バイトなので扱いが複雑!🈳
第5章 · クイズ
📝 理解度チェック!
Q1. Gap Bufferがテキストの中間挿入を速くする秘訣は? 🤔
文字を圧縮して保存する
カーソル位置に「空き領域」を作っておく
SSDに直接書き込む
並列処理で挿入する
Q2. Undoに使われるデータ構造は? ↩️
キュー(先入れ先出し)
スタック(後入れ先出し)
ハッシュテーブル
二分探索木
🎉
第5章クリア!
テキストエディタの内部を支える
巧妙なデータ構造を学んだ!
📚 今日学んだこと
- 単純配列での挿入はO(n)のコストがかかる
- Gap Bufferはギャップで挿入をO(1)に
- UndoはスタックLIFOで操作履歴を管理
- シンタックスハイライトは字句解析で実現
- カーソルは行・列またはオフセットで管理