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

[インデックス 11603] ファイルの概要

このコミットは、Go言語のsrc/lib9/utfディレクトリ内のUnicode文字プロパティ関連ファイルの整理とビルドプロセスの改善を目的としています。具体的には、mkrunetype.cファイルに// +build ignoreディレクティブを追加し、runetypebody関連のファイルをリネームおよび削除することで、自動ビルドシステムでの安全性を高め、不要なファイルをクリーンアップしています。

コミット

commit 30d0452b24f7418e616ba5c74d248473a84d5bca
Author: Russ Cox <rsc@golang.org>
Date:   Fri Feb 3 15:19:00 2012 -0500

    lib9/utf: make safe for automatic build
    
    Add // +build ignore to mkrunetype.c,
    rename runetypebody to be .h since it is #included,
    delete old runetypebody tables.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5627043

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

https://github.com/golang/go/commit/30d0452b24f7418e616ba5c74d248473a84d5bca

元コミット内容

lib9/utf: make safe for automatic build

Add // +build ignore to mkrunetype.c,
rename runetypebody to be .h since it is #included,
delete old runetypebody tables.

変更の背景

このコミットが行われた2012年2月時点のGo言語は、現在とは異なり、そのツールチェインの一部にC言語で書かれたコンポーネントを含んでいました。特に、Unicode文字のプロパティ(例えば、文字がアルファベットか、数字か、空白文字かなど)を扱うためのデータは、UnicodeData.txtというUnicode標準のデータファイルから自動生成されるC言語のソースファイルとして提供されていました。

mkrunetype.cは、このUnicodeData.txtを処理して、isalpharune()isdigitrune()といった関数が使用する文字プロパティテーブルを生成するためのユーティリティプログラムでした。これらのテーブルは、runetypebody-X.Y.Z.cのようなファイル名で生成され、runetype.cなどの他のCソースファイルから#includeディレクティブによって取り込まれていました。

しかし、このような自動生成されるCソースファイルが通常のビルドプロセスに含まれていると、以下のような問題が発生する可能性がありました。

  1. 不必要なビルド: mkrunetype.c自体は、文字プロパティテーブルを生成するための一時的なツールであり、Go言語の最終的なバイナリには直接含まれるべきではありません。しかし、通常のCソースファイルとして扱われると、ビルドシステムがこれをコンパイルしようとし、ビルド時間の増加や不必要な依存関係を生む可能性がありました。
  2. 古いデータの混在: runetypebody-X.Y.Z.cのようなファイルは、特定のUnicodeバージョンに対応するデータを含んでいました。Unicodeのバージョンアップに伴い、新しいデータが生成されると、古いバージョンのデータファイルは不要になりますが、手動で削除しない限りリポジトリに残ってしまう可能性がありました。これにより、リポジトリの肥大化や、誤って古いデータが使用されるリスクがありました。
  3. ヘッダーファイルとしての適切な扱い: runetypebodyファイルは、他のCソースファイルに#includeされることでその内容が取り込まれる、実質的なヘッダーファイルとして機能していました。しかし、.c拡張子を持つことで、コンパイラがこれを独立したソースファイルとして扱おうとし、リンケージエラーや重複定義のエラーを引き起こす可能性がありました。

このコミットは、これらの問題を解決し、Go言語のビルドプロセスをより堅牢でクリーンなものにすることを目的としています。

前提知識の解説

Go言語におけるrune

Go言語において、runeint32のエイリアスであり、Unicodeコードポイントを表すために使用されます。Goの文字列はUTF-8でエンコードされたバイトのシーケンスであり、runeを使用することで、多言語の文字や記号、絵文字などを適切に扱うことができます。文字列をfor rangeループでイテレートすると、Goは各イテレーションでUTF-8でエンコードされたruneをデコードし、その開始バイト位置とruneの整数値を返します。

UnicodeData.txt

UnicodeData.txtは、Unicode Character Database (UCD) の基本的なデータファイルの一つです。このファイルには、各Unicode文字に関する詳細な情報(文字のプロパティ、カテゴリ、大文字・小文字変換規則など)が含まれています。Go言語の標準ライブラリであるunicodeパッケージは、このUnicodeData.txtやその他のUCDファイルから派生したデータを使用して、unicode.IsLetter()unicode.IsDigit()unicode.IsLower()unicode.IsUpper()などの関数を提供し、Unicodeコードポイントの様々なプロパティをテストできるようにしています。通常、Go開発者が直接UnicodeData.txtをパースする必要はありません。

// +build ignore ディレクティブ

// +build ignoreは、Go言語のビルドタグ(build tag)の一種です。このディレクティブがGoソースファイルの先頭に記述されている場合、Goのビルドシステムは、そのファイルをビルド対象から除外します。これは、以下のような目的で一般的に使用されます。

  • サンプルファイル: パッケージの使用方法を示すが、パッケージ自体の一部ではないファイル。
  • ユーティリティスクリプト/ツール: 開発やテストのために使用されるスタンドアロンのGoプログラムで、メインアプリケーションと一緒に配布されないもの。
  • 特定のビルド構成に特化したファイル: 一般的なビルドから除外したいファイル。

このコミットでは、mkrunetype.cがGoのビルドシステムによって不必要にコンパイルされるのを防ぐために、このディレクティブが追加されています。

技術的詳細

このコミットの技術的な核心は、Go言語のビルドシステムとC言語のコンパイルプロセスとの間の相互作用を最適化することにあります。

  1. mkrunetype.cへの// +build ignoreの追加:

    • mkrunetype.cは、UnicodeData.txtから文字プロパティテーブルを生成するためのツールであり、Go言語のランタイムや標準ライブラリの最終的なバイナリに直接リンクされるべきではありません。
    • // +build ignoreディレクティブを追加することで、Goのビルドツール(go buildなど)がこのファイルを無視するようになります。これにより、不必要なコンパイルが回避され、ビルド時間が短縮され、ビルド成果物のサイズが最適化されます。
    • この変更は、mkrunetype.cが特定の目的(Unicodeデータの更新時など)でのみ手動でコンパイル・実行されることを意図しています。
  2. runetypebodyファイルの.cから.hへのリネーム:

    • runetypebody-X.Y.Z.cのようなファイルは、mkrunetype.cによって生成され、runetype.cなどの他のCソースファイルから#include "runetypebody-X.Y.Z.c"のように直接インクルードされていました。
    • C言語の慣習では、#includeされるファイルは通常、ヘッダーファイル(.h拡張子)として扱われます。.c拡張子を持つファイルをインクルードすることは可能ですが、コンパイラやリンカがこれを独立したソースファイルとして誤解釈し、重複定義エラー(multiple definition errors)を引き起こす可能性があります。
    • ファイルを.h拡張子にリネームすることで、そのファイルがインクルードされることを意図したヘッダーファイルであることを明確にし、Cコンパイラがこれを適切に処理するようになります。これにより、ビルドエラーのリスクが低減し、コードベースの意図がより明確になります。
  3. 古いrunetypebodyテーブルの削除:

    • runetypebody-5.0.0.crunetypebody-5.2.0.cは、それぞれUnicode 5.0.0と5.2.0のデータに基づいて生成された古い文字プロパティテーブルです。
    • Unicodeの新しいバージョン(このコミットの時点では6.0.0)のデータが利用可能になり、それに対応するrunetypebody-6.0.0.c(リネーム後はrunetypebody-6.0.0.h)が使用されるようになったため、古いデータは不要になります。
    • これらのファイルを削除することで、リポジトリのサイズが削減され、コードベースがクリーンに保たれます。また、誤って古いデータが使用されることを防ぎ、常に最新のUnicodeデータがGo言語の文字処理に反映されることを保証します。

これらの変更は、Go言語のビルドシステムが進化し、より洗練されたものになっていく過程の一部を示しています。特に、C言語で書かれたレガシーな部分をGoのビルドプロセスに適切に統合し、管理するための重要なステップでした。

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

このコミットでは、以下のファイルが変更されています。

  1. src/lib9/utf/mkrunetype.c:

    • ファイルの先頭に// +build ignoreという行が追加されました。
  2. src/lib9/utf/runetype.c:

    • #include "runetypebody-6.0.0.c"という行が#include "runetypebody-6.0.0.h"に変更されました。
  3. src/lib9/utf/runetypebody-5.0.0.c:

    • このファイルは削除されました。
  4. src/lib9/utf/runetypebody-5.2.0.c:

    • このファイルは削除されました。
  5. src/lib9/utf/{runetypebody-6.0.0.c => runetypebody-6.0.0.h}:

    • runetypebody-6.0.0.crunetypebody-6.0.0.hにリネームされました。ファイルの内容自体は変更されていません。

コアとなるコードの解説

src/lib9/utf/mkrunetype.c

--- a/src/lib9/utf/mkrunetype.c
+++ b/src/lib9/utf/mkrunetype.c
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+// +build ignore
+
 /*
  * make is(upper|lower|title|space|alpha)rune and
  * to(upper|lower|title)rune from a UnicodeData.txt file.

この変更は、mkrunetype.cがGoの標準ビルドプロセスから除外されることを意味します。これにより、このファイルはGoのツールチェインの一部として自動的にコンパイルされることはなくなり、必要に応じて手動で実行されるユーティリティとして扱われます。これは、mkrunetype.cが文字プロパティデータを生成するための一時的なツールであり、最終的なGoバイナリには含まれるべきではないという設計思想を反映しています。

src/lib9/utf/runetype.c

--- a/src/lib9/utf/runetype.c
+++ b/src/lib9/utf/runetype.c
@@ -35,4 +35,4 @@ rbsearch(Rune c, Rune *t, int n, int ne)
 	return 0;
 }
 
-#include "runetypebody-6.0.0.c"
+#include "runetypebody-6.0.0.h"

この変更は、runetype.cがインクルードするファイルの拡張子を.cから.hに変更しています。これは、runetypebody-6.0.0.cが実質的にヘッダーファイルとして機能していることを明確にし、Cコンパイラがこれを適切に処理するようにするためのものです。これにより、ビルド時の潜在的なエラー(例えば、重複定義エラー)が回避され、コードの意図がより明確になります。

src/lib9/utf/runetypebody-5.0.0.c および src/lib9/utf/runetypebody-5.2.0.c

これらのファイルは完全に削除されました。これらは古いUnicodeバージョンの文字プロパティデータを含んでおり、Unicode 6.0.0のデータが使用されるようになったため、不要になりました。これらのファイルの削除は、リポジトリのクリーンアップと、常に最新のUnicodeデータが使用されることを保証するものです。

src/lib9/utf/{runetypebody-6.0.0.c => runetypebody-6.0.0.h}

この変更は、runetypebody-6.0.0.cというファイルがrunetypebody-6.0.0.hにリネームされたことを示しています。ファイルの内容自体は変更されていません。このリネームは、前述のrunetype.cの変更と合わせて、このファイルがC言語のヘッダーファイルとして機能することを明示するためのものです。これにより、C言語の慣習に沿ったファイル命名となり、コードベースの可読性と保守性が向上します。

これらの変更は全体として、Go言語のビルドプロセスにおけるUnicode文字プロパティデータの管理を改善し、より堅牢でクリーンな開発環境を構築するための重要なステップでした。

関連リンク

参考にした情報源リンク