[インデックス 10384] BBEdit Go言語サポートの拡張:error型とrune型のシンタックスハイライト対応
コミット
commit 23f541aa54a1835ba7c851e476f3bc040cd9c103
Author: Anthony Starks <ajstarks@gmail.com>
Date: Mon Nov 14 11:18:00 2011 -0800
misc/bbedit: error and rune support
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5369057
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/23f541aa54a1835ba7c851e476f3bc040cd9c103
元コミット内容
このコミットは、BBEditエディタのGo言語サポートファイル(misc/bbedit/Go.plist
)に2つの新しいキーワードを追加しました:
error
- 予約語リストに追加rune
- 予約語リストに追加
変更内容:
@@ -23,6 +23,7 @@
default,
defer,
else,
+ error,
fallthrough,
false,
float32,
@@ -54,6 +55,7 @@
real,
recover,
return,
+ rune,
select,
string,
struct,
変更の背景
2011年当時、Go言語は1.0リリースに向けて急速に発展しており、言語仕様が安定化されていく過程にありました。特に、エラーハンドリングの仕組みとUnicodeサポートの強化が重要な課題でした。
BBEditは当時(現在も)macOSで人気の高いテキストエディタでしたが、Go言語の新しい型システムに対応するため、シンタックスハイライトの更新が必要でした。コミット日(2011年11月)は、Go 1.0のリリース(2012年3月)の約4か月前であり、言語仕様の最終調整期でした。
前提知識の解説
BBEditとは
BBEditは、Bare Bones Softwareが開発したmacOS用のテキストエディタです。以下の特徴があります:
- シンタックスハイライト: 多数のプログラミング言語をサポート
- 言語モジュール: .plistファイルによる言語定義
- 開発者向け機能: 正規表現検索、コードナビゲーション、FTP/SFTP統合
- 拡張性: カスタム言語モジュールの作成が可能
Go言語における型システムの進化
2011年当時のGo言語は、以下の重要な変更を経験していました:
- エラーハンドリングの標準化:
os.Error
からerror
インターフェースへの移行 - Unicode対応の強化:
rune
型の明確化 - 型システムの整備: Go 1.0に向けた言語仕様の安定化
技術的詳細
error型の技術的背景
Go言語のerror
型は、以下のような進化を経ました:
// Go 1.0以前
type Error interface {
String() string
}
// Go 1.0以降
type error interface {
Error() string
}
この変更により:
- エラーハンドリングがより一貫性のあるものになった
os.Error
からerror
インターフェースへの移行が可能になった- 誤った
String()
メソッドによるエラーインターフェースの実装を防げるようになった
rune型の技術的背景
rune
型は、Unicodeサポートの核心となる型です:
// rune型の定義
type rune = int32 // Go 1.9以降の型エイリアス記法で表現すると
特徴:
- Unicode Code Point: 1つのUnicode文字を表現
- int32エイリアス: 32ビット符号付き整数として実装
- UTF-8対応: Go言語のUTF-8ベースの文字列処理をサポート
.plistファイルの構造
BBEditの言語定義ファイル(.plist)は、以下の構造を持ちます:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BBEditDocumentType</key>
<string>CodelessLanguageModule</string>
<key>BBLMLanguageDisplayName</key>
<string>Go</string>
<key>BBLMLanguageCode</key>
<string>go</string>
<key>BBLMKeywordList</key>
<array>
<string>break</string>
<string>case</string>
<!-- その他のキーワード -->
</array>
</dict>
</plist>
コアとなるコードの変更箇所
変更された箇所はmisc/bbedit/Go.plist
のBBLMKeywordList
配列内です:
変更箇所1: error型の追加
<!-- 変更前 -->
<string>else</string>
<string>fallthrough</string>
<!-- 変更後 -->
<string>else</string>
<string>error</string>
<string>fallthrough</string>
変更箇所2: rune型の追加
<!-- 変更前 -->
<string>return</string>
<string>select</string>
<!-- 変更後 -->
<string>return</string>
<string>rune</string>
<string>select</string>
コアとなるコードの解説
なぜこの変更が必要だったか
-
型の可視性向上:
error
とrune
を予約語としてハイライトすることで、開発者がこれらの重要な型を識別しやすくなります。 -
コード可読性の向上: シンタックスハイライトにより、Go言語の型システムの理解が促進されます。
-
開発効率の向上: エディタレベルでの適切な色分けにより、コードの構造が把握しやすくなります。
技術的な影響
この変更により、BBEditで以下のようなGo言語コードが適切にハイライトされるようになりました:
// errorの使用例
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("division by zero")
}
return a / b, nil
}
// runeの使用例
func processRunes(s string) {
for _, r := range s {
if r > 127 {
fmt.Printf("Non-ASCII rune: %c\n", r)
}
}
}
実装の詳細
BBEditの言語モジュールは、以下の処理を行います:
- トークン化: ソースコードをトークンに分割
- キーワード照合: 定義されたキーワードリストと照合
- スタイル適用: マッチしたキーワードに対してスタイルを適用
- レンダリング: エディタ上での色分け表示
この変更により、error
とrune
が他の予約語(if
, for
, func
など)と同様に扱われるようになりました。
関連リンク
- Go 1 Release Notes
- Strings, bytes, runes and characters in Go
- BBEdit Language Module Documentation
- Go Wiki: Editors and IDEs
- Go言語仕様書