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

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

このコミットは、Go言語の初期開発段階において、任意精度演算(bignum)ライブラリを標準ライブラリとしてシステムに組み込む変更を記録しています。具体的には、usr/gri/bignumという一時的なユーザーディレクトリにあったbignum.goとそのテストファイルbignum_test.goを、それぞれsrc/libtestディレクトリに移動し、ビルドシステムに組み込むことで、Go言語の標準機能として提供されるようにしています。

コミット

commit e2eccf3bd07762ecbcae046a2e41e748f949f176
Author: Robert Griesemer <gri@golang.org>
Date:   Tue Nov 4 13:55:18 2008 -0800

    install bignum as library

    R=r
    DELTA=3501  (1752 added, 1749 deleted, 0 changed)
    OCL=18460
    CL=18471

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

https://github.com/golang/go/commit/e2eccf3bd07762ecbcae046a2e41e748f949f176

元コミット内容

install bignum as library

R=r
DELTA=3501  (1752 added, 1749 deleted, 0 changed)
OCL=18460
CL=18471

変更の背景

このコミットが行われた2008年11月は、Go言語がまだ一般に公開される前の、初期開発の非常に重要な時期にあたります。Go言語の設計目標の一つに、システムプログラミングに適した言語であること、そして効率的で信頼性の高いソフトウェアを構築できることが挙げられます。このような目標を達成するためには、基本的なデータ型や演算子だけでなく、より高度な数値計算をサポートする機能が不可欠です。

bignum(任意精度演算)は、通常の固定長整数型(例: int32, int64)では扱えない非常に大きな数や、小数点以下の精度を厳密に制御する必要がある計算において必須となる機能です。金融計算、暗号化、科学技術計算など、多くの分野で正確な数値計算が求められます。

このコミット以前は、bignumの実装がusr/gri/bignumという、おそらく開発者Robert Griesemer氏の個人作業ディレクトリのような場所に置かれていたと推測されます。これは、機能がまだ実験段階であったり、標準ライブラリとして公開する準備が整っていなかったことを示唆しています。このコミットは、bignumの実装が十分に安定し、Go言語の標準ライブラリとして提供する準備ができたことを意味します。これにより、Go言語のユーザーは、外部ライブラリを導入することなく、任意精度演算を安全かつ効率的に利用できるようになります。

前提知識の解説

任意精度演算 (Arbitrary-Precision Arithmetic / Bignum)

任意精度演算とは、コンピュータの固定長のデータ型(例: 32ビット整数、64ビット整数)の制約を受けずに、理論上はメモリが許す限り任意の桁数の整数や浮動小数点数を扱うことができる計算手法です。

通常の整数型では、表現できる数値の範囲には上限と下限があります。例えば、64ビット符号付き整数(int64)では約-9 quintillionから+9 quintillionまでの範囲しか扱えません。この範囲を超える計算を行おうとすると、オーバーフローやアンダーフローが発生し、誤った結果を招きます。

任意精度演算ライブラリは、これらの問題を解決するために、数値を配列やリストなどのデータ構造で表現し、加算、減算、乗算、除算などの基本的な算術演算を、桁上がりや桁借りを考慮しながらソフトウェア的に実装します。これにより、非常に大きな数(例: 1000桁の数)や、非常に高い精度が要求される浮動小数点数(例: 円周率πを数千桁まで計算)を正確に扱うことが可能になります。

Go言語のmath/bigパッケージがこれに該当し、Int(整数)、Float(浮動小数点数)、Rat(有理数)といった型を提供しています。

Go言語の初期開発とディレクトリ構造

Go言語は、GoogleでRobert Griesemer、Rob Pike、Ken Thompsonによって設計されました。2009年11月にオープンソースとして公開されるまで、内部で活発な開発が行われていました。

初期のGo言語のソースコードリポジトリは、現在のものとは異なるディレクトリ構造を持っていました。このコミットに見られるusr/gri/bignumのようなパスは、特定の開発者(griはRobert Griesemer氏のイニシャル)が個人的に作業していたコードや、まだ標準ライブラリとして統合されていない実験的なコードが置かれていた場所を示唆しています。

src/libは、Go言語の標準ライブラリが配置される予定のディレクトリであり、testは標準テストが配置される場所です。このコミットは、bignumが「個人作業」から「標準ライブラリ」へと昇格したことを明確に示しています。

make.bashスクリプト

make.bashは、Go言語の初期のビルドシステムの一部として使用されていたシェルスクリプトです。Go言語のソースコードをコンパイルし、ライブラリを構築し、実行可能ファイルを生成する役割を担っていました。このスクリプトに新しいファイル名(bignum.go)を追加することは、そのファイルがビルドプロセスに含まれ、コンパイルされてライブラリの一部として利用可能になることを意味します。これは、Go言語の標準ライブラリとしてbignumが正式に認識され、ビルドされるようになったことを示す重要な変更点です。

技術的詳細

このコミットの技術的な核心は、bignumパッケージのコードとテストコードのリポジトリ内での位置変更と、それに伴うビルドシステムへの統合です。

  1. ファイルの移動とリネーム:

    • usr/gri/bignum/bignum.go から src/lib/bignum.go
    • usr/gri/bignum/bignum_test.go から test/bignum_test.go へ この変更は、単なるファイル移動ではなく、bignumパッケージがGo言語の標準ライブラリの一部として正式に位置づけられたことを意味します。src/libはGoの標準ライブラリのソースコードが置かれる場所であり、testはGoの標準テストスイートが置かれる場所です。これにより、bignumはGoの他のコアライブラリと同様に扱われ、Goのリリースサイクルの一部として管理されるようになります。
  2. src/lib/make.bashの更新: make.bashスクリプトにbignum.goが追加されました。これは、Go言語のビルドプロセスにおいて、bignum.goがコンパイル対象のソースファイルとして認識され、src/libディレクトリ内の他の標準ライブラリファイルと同様に、Goの標準ライブラリの一部としてビルドされることを保証します。このステップがなければ、ファイルが移動されても、ビルドシステムはそれを認識せず、ライブラリとして利用可能になりません。

  3. テストファイルの変更: bignum_test.goの移動に加え、テストファイルの冒頭に// $G $D/$F.go && $L $F.$A && ./$A.outというコメントが追加されています。これは、Goの初期のテスト実行方法に関する指示であり、テストがどのようにコンパイルされ、実行されるかを示しています。この行は、テストがGoのビルドシステムとテストフレームワークに適切に統合されたことを示唆しています。

これらの変更は、bignumがGo言語のコア機能として成熟し、開発者が安心して利用できる安定したライブラリとして提供されるための重要なステップでした。

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

このコミットにおけるコアとなるコードの変更は、主にファイルの移動と、ビルドスクリプトへの追加です。

  1. bignum.goの移動:

    --- a/usr/gri/bignum/bignum.go
    +++ b/src/lib/bignum.go
    similarity index 100%
    rename from usr/gri/bignum/bignum.go
    rename to src/lib/bignum.go
    

    これは、usr/gri/bignum/bignum.goというパスにあったファイルが、src/lib/bignum.goというパスに移動し、ファイルの内容は変更されていないことを示しています(similarity index 100%)。

  2. src/lib/make.bashの変更:

    --- a/src/lib/make.bash
    +++ b/src/lib/make.bash
    @@ -35,6 +35,7 @@ for i in \
     	io.go\
     	bufio.go\
     	once.go\
    +	bignum.go\
    
     do
     	base=$(basename $i .go)\
    

    src/lib/make.bashスクリプトの、ビルド対象となるGoファイルのリストにbignum.goが追加されています。これにより、bignum.goがGoの標準ライブラリの一部としてコンパイルされるようになります。

  3. bignum_test.goの移動と変更:

    --- a/usr/gri/bignum/bignum_test.go
    +++ b/test/bignum_test.go
    similarity index 99%
    rename from usr/gri/bignum/bignum_test.go
    rename to test/bignum_test.go
    index f277bb941f..3b80a309c3 100644
    --- a/usr/gri/bignum/bignum_test.go
    +++ b/test/bignum_test.go
    @@ -2,6 +2,8 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
    
    +// $G $D/$F.go && $L $F.$A && ./$A.out
    +
     package main
    
     import Big "bignum"
    

    usr/gri/bignum/bignum_test.gotest/bignum_test.goに移動し、テストファイルの冒頭にテスト実行に関するコメント行が追加されています。similarity index 99%は、ファイル内容がほぼ同じであることを示し、このコメント行の追加が唯一の変更点であることを意味します。

コアとなるコードの解説

このコミットは、Go言語のソースコード自体に大きなロジックの変更を加えるものではなく、既存のbignum実装をGoプロジェクトの標準的な構造に組み込むための構成変更が主です。

  • bignum.goの移動: このファイルは、任意精度演算の実際のロジック(大きな数の表現、加算、減算、乗算などのアルゴリズム)を含んでいます。この移動により、bignumパッケージはGoの標準ライブラリの一部として、他のGoパッケージからimport "math/big"(当時のパスは異なる可能性がありますが、最終的にはmath/bigに落ち着きます)のようにインポートして利用できるようになります。これは、Go言語が提供する基本的な数値計算能力を拡張する上で不可欠なステップです。

  • src/lib/make.bashへの追加: make.bashは、Goのソースコードをコンパイルし、ライブラリを生成するためのビルドスクリプトです。このスクリプトにbignum.goが追加されたことで、Goのビルドプロセスがbignumパッケージを認識し、コンパイルして最終的なGoのバイナリやライブラリに含めるようになります。これにより、bignumはGoの公式な配布物の一部となり、Goをインストールしたすべてのユーザーが利用できるようになります。

  • bignum_test.goの移動とテスト実行指示の追加: テストファイルがtestディレクトリに移動されたことで、bignumの機能がGoの標準テストスイートの一部として定期的にテストされるようになります。追加されたコメント// $G $D/$F.go && $L $F.$A && ./$A.outは、Goの初期のテスト実行コマンドのパターンを示しており、$GはGoコンパイラ、$Dはディレクトリ、$Fはファイル名、$Lはリンカ、$Aは実行可能ファイル名を表していると推測されます。これは、bignumのテストがGoのビルド・テストインフラストラクチャに完全に統合されたことを意味し、将来の変更やリファクタリングに対する安全網を提供します。

これらの変更は、Go言語の初期段階におけるモジュール化と標準化のプロセスを示しており、言語の安定性と将来の拡張性にとって非常に重要でした。

関連リンク

参考にした情報源リンク