Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10385] Notepad++用Go言語シンタックス定義にerrorとrune型を追加

コミット

コミットハッシュ: 3811a441035b10c07fd186fe2ba51bc02cff8ec4 作成者: Anthony Starks ajstarks@gmail.com 日付: 2011年11月14日 11:19:08 (PST) コミットメッセージ: misc/notepadplus: error and rune support

このコミットは、Notepad++テキストエディタ用のGo言語シンタックスハイライト定義ファイルに、新しく導入されたerrorrune型のサポートを追加しました。

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/3811a441035b10c07fd186fe2ba51bc02cff8ec4

元コミット内容

このコミットでは、以下の2つのファイルが変更されました:

  1. misc/notepadplus/go.xml - Notepad++のAPI定義ファイル
  2. misc/notepadplus/userDefineLang.xml - ユーザー定義言語ファイル

変更内容の詳細

misc/notepadplus/go.xml

# 追加された行
<KeyWord name="error" />
<KeyWord name="rune" />

misc/notepadplus/userDefineLang.xml

# 変更前
<Keywords name="Words1">append bool break byte cap case chan close complex complex128 complex64 const continue copy default defer else fallthrough false float32 float64 for func go goto if iota imag import int int16 int32 int64 int8 interface len make map new nil package panic print println range real recover return select string struct switch true type uint uint16 uint32 uint64 uint8 uintptr var</Keywords>

# 変更後
<Keywords name="Words1">append bool break byte cap case chan close complex complex128 complex64 const continue copy default defer else error fallthrough false float32 float64 for func go goto if iota imag import int int16 int32 int64 int8 interface len make map new nil package panic print println range real recover return rune select string struct switch true type uint uint16 uint32 uint64 uint8 uintptr var</Keywords>

変更の背景

このコミットは、Go言語のGo 1リリースに向けた準備作業の一環として行われました。2011年は、Go言語がGo 1.0リリース(2012年3月)に向けて言語仕様を固めていた重要な時期で、errorrune型はGo言語の基本的な構成要素として言語に組み込まれました。

開発コミュニティの協力

  • Review者: gri (Robert Griesemer - Go言語の共同設計者)
  • CC: golang-dev (Go開発チーム)
  • Code Review URL: https://golang.org/cl/5376048

この変更は、Go言語の開発チームによって正式にレビューされ、承認されたものです。

前提知識の解説

Notepad++とは

Notepad++は、Windows向けの高機能テキストエディタで、プログラミング言語のシンタックスハイライト機能を提供します。多くのプログラミング言語に対応しており、ユーザー定義言語(UDL)機能により、新しい言語のサポートを追加できます。

Go言語のシンタックスハイライト体系

Go言語のシンタックスハイライトは、以下の要素で構成されます:

  1. キーワード - 言語の予約語(func, type, varなど)
  2. 組み込み型 - 言語に組み込まれた基本的なデータ型
  3. 組み込み関数 - 言語に組み込まれた基本的な関数
  4. 演算子 - 算術、論理、比較演算子
  5. リテラル - 文字列、数値、文字のリテラル表現

事前宣言識別子(Predeclared Identifiers)

Go言語では、特定の識別子が言語仕様によって事前に定義されており、これらを「事前宣言識別子」と呼びます。これらは明示的にインポートする必要がなく、どのパッケージからでも使用できます。

技術的詳細

error型の詳細

error型は、Go言語のエラーハンドリングの中核となる組み込みのインターフェース型です。

歴史的経緯

  • Go 1以前: エラーはos.Errorとしてosパッケージに定義されていました
  • Go 1以降: errorが事前宣言識別子として言語のコアに組み込まれました

型定義

type error interface {
    Error() string
}

設計思想

  1. システム非依存性: エラーハンドリングをOSパッケージから切り離し、より基本的な概念にしました
  2. 依存関係の解決: osパッケージに依存する他のパッケージのエラーハンドリングを簡素化
  3. 一貫性: 標準ライブラリ全体で統一されたエラーハンドリングを提供

rune型の詳細

rune型は、Unicodeコードポイントを表現するための組み込み型です。

型定義

type rune = int32

設計思想

  1. Unicode完全対応: Go言語のUnicodeファーストのアプローチを反映
  2. 可読性向上: int32よりも意図が明確で、文字データを扱っていることが分かりやすい
  3. 国際化対応: 多言語テキスト処理の基盤となる型

特徴

  • サイズ: 4バイト(32ビット)
  • 範囲: -2,147,483,648 から 2,147,483,647
  • 用途: Unicodeコードポイントの表現(0から0x10FFFF)

UTF-8との関係

Go言語のソースコードは常にUTF-8でエンコードされており、rune型はこのUTF-8テキストを適切に処理するために不可欠です。

// 文字列の各runeを処理する例
for i, r := range "Hello, 世界" {
    fmt.Printf("位置 %d: %c (U+%04X)\n", i, r, r)
}

コアとなるコードの変更箇所

1. go.xml の変更

<!-- 追加された行 -->
<KeyWord name="error" />
<KeyWord name="rune" />

これらの行は、Notepad++のAPI定義ファイルに新しいキーワードを追加します。この定義により、コード内でerrorruneが特別な色でハイライトされます。

2. userDefineLang.xml の変更

<!-- 変更前の Keywords Words1 -->
append bool break byte cap case chan close complex complex128 complex64 const continue copy default defer else fallthrough false float32 float64 for func go goto if iota imag import int int16 int32 int64 int8 interface len make map new nil package panic print println range real recover return select string struct switch true type uint uint16 uint32 uint64 uint8 uintptr var

<!-- 変更後の Keywords Words1 -->
append bool break byte cap case chan close complex complex128 complex64 const continue copy default defer else error fallthrough false float32 float64 for func go goto if iota imag import int int16 int32 int64 int8 interface len make map new nil package panic print println range real recover return rune select string struct switch true type uint uint16 uint32 uint64 uint8 uintptr var

この変更により、ユーザー定義言語の単語リストにerrorruneが追加されました。

コアとなるコードの解説

Notepad++のシンタックスハイライト仕組み

Notepad++では、2つの異なるファイルでシンタックスハイライトが定義されます:

  1. go.xml - API定義ファイル

    • オートコンプリート機能で使用される
    • 関数や型の定義を提供
    • より詳細なコンテキスト情報を含む
  2. userDefineLang.xml - ユーザー定義言語ファイル

    • 基本的なシンタックスハイライトルールを定義
    • キーワード、演算子、コメントの色分けを制御
    • より軽量で高速な処理が可能

技術的な実装の詳細

XMLスキーマの構造

<KeyWord name="keyword_name" />

この形式により、各キーワードが個別に定義されます。Notepad++は、これらの定義を読み込んで、テキスト内でマッチするトークンを特別な色で表示します。

語彙の分類

Go言語の語彙は以下のように分類されます:

  1. キーワード - 言語の予約語
  2. 識別子 - 変数、関数、型の名前
  3. 演算子 - 算術、論理演算子
  4. リテラル - 定数値
  5. 区切り文字 - 括弧、セミコロンなど

errorruneは、事前宣言識別子として特別な位置を占めます。

パフォーマンスへの影響

この変更は、シンタックスハイライトの語彙リストに2つの単語を追加するだけなので、パフォーマンスへの影響は微小です。Notepad++の文字列マッチング機能は高度に最適化されており、語彙リストの大きさがパフォーマンスに与える影響は限定的です。

関連リンク

参考にした情報源リンク