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

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

このコミットは、Go言語のbignum_test.goファイルから、一時的なワークアラウンド(回避策)を削除するものです。これは、bignumパッケージ(現在のmath/bigパッケージの前身)のテストコードに含まれていた、特定のバグや未実装機能に対応するための記述が不要になったことを示しています。

コミット

commit 8b8a862da8e402febf27980b4dae8789d58dfb5d
Author: Robert Griesemer <gri@golang.org>
Date:   Thu Jan 8 17:38:24 2009 -0800

    - removed temporary work-arounds from bignum_test, not needed anymore
    
    R=r
    DELTA=93  (0 added, 61 deleted, 32 changed)
    OCL=22348
    CL=22366

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

https://github.com/golang/go/commit/8b8a862da8e402febf27980b4dae8789d58dfb5d

元コミット内容

このコミットの元の内容は、bignum_testから一時的なワークアラウンドを削除したというものです。これは、それらのワークアラウンドがもはや必要なくなったためです。

変更の背景

Go言語は2009年11月に一般公開されましたが、このコミットはそれ以前の2009年1月に行われています。これはGo言語の非常に初期の開発段階にあたります。bignumパッケージ(現在のmath/bigパッケージの前身)は、Go言語の標準ライブラリの一部として、任意精度演算を提供するために開発されていました。

開発の初期段階では、新しい機能やライブラリには多くのバグや未実装の部分が存在するのが一般的です。bignumパッケージも例外ではなく、そのテストコードであるbignum_test.goには、これらの初期の不具合を回避したり、特定のテストケースが正しく動作しないことを一時的にマークしたりするための「ワークアラウンド」や「BUG」コメントが含まれていました。

このコミットが行われた時点では、bignumパッケージの基盤となる実装が成熟し、以前のバグが修正されたか、あるいはテストのロジックが改善されたため、これらの「一時的なワークアラウンド」が不要になったと推測されます。これにより、テストコードがよりクリーンになり、本来の意図通りにbignumパッケージの機能を直接テストできるようになりました。

前提知識の解説

  • 任意精度演算 (Arbitrary-Precision Arithmetic): 通常のプログラミング言語では、整数や浮動小数点数の表現には固定のビット数(例: 32ビット整数、64ビット浮動小数点数)が割り当てられています。これにより、表現できる数値の範囲や精度には限界があります。任意精度演算は、この限界を取り払い、必要に応じてメモリを動的に割り当てることで、理論上は無限の桁数を持つ数値を扱うことを可能にする技術です。科学計算、暗号学、金融計算など、高い精度や非常に大きな数値を扱う必要がある分野で不可欠です。Go言語では、標準ライブラリのmath/bigパッケージがこれを提供しています。

  • Go言語の初期開発: Go言語は、GoogleでRobert Griesemer、Rob Pike、Ken Thompsonによって設計されました。このコミットが行われた2009年1月は、Go言語がまだ内部で開発されており、一般に公開される前の段階でした。この時期のコードベースは、機能の追加、APIの変更、バグ修正が頻繁に行われる、非常に流動的な状態でした。

  • テスト駆動開発 (Test-Driven Development, TDD): このコミットがテストファイル(bignum_test.go)の変更であることから、Go言語の開発がテスト駆動で行われていたことが伺えます。TDDでは、まずテストを書き、それが失敗することを確認し、次にそのテストが成功するようにコードを実装し、最後にリファクタリングを行います。初期の「BUG」コメントやワークアラウンドは、このTDDサイクルの中で、まだ解決されていない問題や、一時的にテストをスキップする必要がある箇所を示していたと考えられます。

技術的詳細

このコミットの技術的な詳細は、bignum_test.goファイルから、以前のコミットで導入された一時的なコードやコメントが削除された点に集約されます。具体的には、以下のような変更が見られます。

  1. return;//BUG の削除: TestNatConv関数内にあったreturn;//BUGという行が削除されています。これは、この行以降のテストコードが一時的に実行されないようにするためのものでした。この削除は、NatConv(自然数の変換)に関する問題が解決され、関連するテストが正常に実行できるようになったことを意味します。

  2. //BUG コメントの削除とコードの簡素化: TestRatConvSumTestNatAddMulTestNatMulTestNatDivTestNatModTestNatShiftTestNatLog2TestNatGcdTestNatPopといった複数のテスト関数で、//BUGというコメントが付与された行が削除されています。これらのコメントは、その行のテストが期待通りに動作しない、あるいはその行のコードに問題があることを示していました。 同時に、これらの//BUGコメントに関連して、一時的な変数(例: t1, t2, na, nb, g, ncなど)を導入して複雑な計算を段階的に行っていた部分が、元の簡潔な式に戻されています。これは、bignumパッケージの各メソッド(Mul, Add, Shr, Div, Mod, Shl, Cmp, Log2, Gcd, Popなど)が安定し、正しく動作するようになったため、テストコード内で余計な中間変数やステップを挟む必要がなくなったことを示しています。

    例えば、TestNatAdd関数では、以前は以下のように複数のステップで計算を行っていました。

    //BUG: NAT_EQ(i, Sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c));
    t1 := t.Mul(t);
    t2 := t1.Add(t);
    t3 := t2.Shr(1);
    t4 := t3.Mul(c);
    NAT_EQ(i, Sum(i, c), t4);
    

    これが、今回のコミットで以下のように簡潔な1行の式に戻されています。

    NAT_EQ(i, Sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c));
    

    これは、t.Mul(t).Add(t).Shr(1).Mul(c)という一連のメソッド呼び出しが、期待通りに連鎖して正確な結果を返すようになったことを意味します。

これらの変更は、bignumパッケージの内部実装が改善され、より堅牢になった結果として、テストコードからデバッグやワークアラウンドのための余分な記述を削除できるようになったことを明確に示しています。

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

変更はすべてsrc/lib/bignum_test.goファイル内で行われています。

  • src/lib/bignum_test.go:
    • return;//BUG の削除 (L115)
    • TestRatConv関数内の//BUGコメントと一時的な変数による計算の削除 (L152-155)
    • Sum関数内の//BUGコメントと一時的な変数による計算の削除 (L172-175)
    • TestNatAdd関数内の//BUGコメントと一時的な変数による計算の削除 (L190-194)
    • Mul関数内の//BUGコメントと一時的な変数による条件分岐の簡素化 (L206-219)
    • TestNatMul関数内の//BUGコメントと一時的な変数による計算の削除 (L253-255)
    • TestNatDiv関数内の//BUGコメントと一時的な変数による計算の削除 (L268-270)
    • TestNatMod関数内の//BUGコメントと一時的な変数による計算の削除 (L343-352)
    • TestNatShift関数内の//BUGコメントと一時的な変数による計算の削除 (L362-379)
    • TestNatLog2関数内の//BUGコメントと一時的な変数による計算の削除 (L462-471)
    • TestNatGcd関数内の//BUGコメントと一時的な変数による計算の削除 (L482-486)
    • TestNatPop関数内の//BUGコメントと一時的な変数による計算の削除 (L508-521)

コアとなるコードの解説

このコミットのコアとなる変更は、bignum_test.goファイルから、以前のコミットで導入された一時的なワークアラウンドやデバッグ用のコードが削除されたことです。

具体的には、以下のようなパターンでコードが変更されています。

変更前(例: TestNatAdd):

//BUG: NAT_EQ(i, Sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c));
t1 := t.Mul(t);
t2 := t1.Add(t);
t3 := t2.Shr(1);
t4 := t3.Mul(c);
NAT_EQ(i, Sum(i, c), t4);

このコードでは、t.Mul(t).Add(t).Shr(1).Mul(c)という一連の計算が、//BUGコメントによって一時的に問題があるとマークされていました。そのため、この複雑な式を直接NAT_EQに渡す代わりに、t1, t2, t3, t4といった中間変数を使って計算を段階的に行い、その結果をNAT_EQに渡していました。これは、bignumパッケージのメソッドチェーンが正しく動作しない、あるいはデバッグのために中間結果を確認する必要があったためと考えられます。

変更後(例: TestNatAdd):

NAT_EQ(i, Sum(i, c), t.Mul(t).Add(t).Shr(1).Mul(c));

変更後では、//BUGコメントとすべての中間変数が削除され、元の簡潔な式が直接NAT_EQに渡されています。これは、bignumパッケージのMul, Add, Shrといったメソッドが安定し、正しく連鎖して動作するようになったため、テストコード内で余計なステップを挟む必要がなくなったことを示しています。

同様の変更が、TestRatConvSumMulTestNatMulTestNatDivTestNatModTestNatShiftTestNatLog2TestNatGcdTestNatPopといった他のテスト関数でも行われています。これにより、テストコードはより読みやすく、簡潔になり、bignumパッケージの機能が期待通りに動作していることを直接検証できるようになりました。

このコミットは、Go言語のbignumパッケージが初期の不安定な状態から、より堅牢で信頼性の高い状態へと進化している過程を示していると言えます。

関連リンク

参考にした情報源リンク