ハイゼンバッグとは:用語の歴史と例

これは、ハイゼンバッグに関する参考資料です。 クラウドの先駆者であるメインフレームにどのように見え、どのように関連するかについて話しているところです。




/写真Lars Zimmermann CC BY



ハイゼンバグ (ハイゼンバグまたはハイゼンバグ)は、コードのデバッグ中にプロパティを変更するエラーを説明する用語です。 つまり、テストおよびデバッグ中に表示されなくなりますが、本番環境では表示されます。



ハイゼンバッグ」という名前は、量子力学のハイゼンベルク不確定性原理を指します。 一般的には、観測の結果として、観測されるオブジェクトのプロパティの予期しない変化として説明できます。



物語



ハイゼンバグという用語は、IBM Research Centerの従業員であるBruce Lindsayと見なされます。 彼はリレーショナルデータベースの開発に貢献し、 IBM System Rエンタープライズデータベースの開発に携わってきました。



1985年、バークレー大学で学んでいる間、ブルースとコンピューターシステムの理論のアメリカの科学者であるジムグレイ (ジェームズニコラスグレイ)は、OS CAL-TSSに取り組みました。 これは、軍が大量のデータを処理するControl Process 6400デュアルプロセッサメインフレーム[ PDF 、p。3]専用に作成されました。



もちろん、開発プロセス中にバグがありました。 しかし、それらのいくつかは特別でした-エンジニアがそれらを修正しようとするとすぐに、それらは消えました。 当時、リンゼイは物理学、特にハイゼンベルグの原理を研究していたにすぎませんでした。 突然、それはリンゼイで夜明けになりました-彼とグレイは、同様の現象の目撃者になりました。観察はオブジェクトの特性に影響を与えたため、エラーは消えました。 そのため、「ヘイゼンバッグ」という名前が由来します。



リンゼイは、2003年のコンピューティングエンジニアリング協会 (ACM)の代表者とのインタビューでこの話をしました



ハイゼンバグの例



ネットワークおよびStack Overflowのようなテーマプラットフォームのユーザーは、プロジェクトで出会ったheisenbagsの例をいくつか共有しました。 SOの居住者の1人は、小数点以下3桁の精度で2つの曲線間の図の面積を計算しようとしました。 C ++でアルゴリズムをデバッグするために、次の行を追加しました。



cout << current << endl;
      
      





しかし、彼がコメントするとすぐに、コードは動作を停止し、ループしました。 プログラムは次のとおりです。



 #include <iostream> #include <cmath> using namespace std; double up = 19.0 + (61.0/125.0); double down = -32.0 - (2.0/3.0); double rectangle = (up - down) * 8.0; double f(double x) { return (pow(x, 4.0)/500.0) - (pow(x, 2.0)/200.0) - 0.012; } double g(double x) { return -(pow(x, 3.0)/30.0) + (x/20.0) + (1.0/6.0); } double area_upper(double x, double step) { return (((up - f(x)) + (up - f(x + step))) * step) / 2.0; } double area_lower(double x, double step) { return (((g(x) - down) + (g(x + step) - down)) * step) / 2.0; } double area(double x, double step) { return area_upper(x, step) + area_lower(x, step); } int main() { double current = 0, last = 0, step = 1.0; do { last = current; step /= 10.0; current = 0; for(double x = 2.0; x < 10.0; x += step) current += area(x, step); current = rectangle - current; current = round(current * 1000.0) / 1000.0; //cout << current << endl; //<-- COMMENT BACK IN TO "FIX" BUG } while(current != last); cout << current << endl; return 0; }
      
      





heisenbugの本質 :プリントアウトがない場合、プログラムはプロセッサレジスタで高精度の比較を実行します。 さらに、結果の精度はdoubleの能力を超えています。 値を出力するために、コンパイラーは計算の結果をメインメモリーに返しますが、小数部分は破棄されます。 そして、whileでのその後の比較は正しい結果につながります。 行がコメント化されている場合、小数部分の暗黙的な切り捨てはありません。 このため、whileの2つの値は常に互いに等しくないことがわかります。 この問題の解決策として、ディスカッションの参加者の1人は、浮動小数点数のおおよその比較を使用することを提案しました。



heisenbagに関するもう1つの話は、UnixのSmalltalk-80言語環境で作業するエンジニアによって共有されました 。 しばらくアイドル状態のままにすると、システムがクラッシュすることに気付きました。 しかし、マウスカーソルを移動した後、すべてが通常どおり再び機能しました。



問題は、アイドル状態のタスクの優先度を下げるUnixスケジューラーにありました。 ある時点で、Smalltalkのプロセスが完了する時間がないほど優先度が大幅に低下しました。 タスクスタックが大きくなり、プログラムがハングしました。 ユーザーがカーソルを移動すると、OSが優先度を回復し、すべてが正方形に戻りました。



その他*バグ



Borbag​​、Mandelbug、Schrödinbagなど、あらゆる種類のエラーを表す用語がいくつかあります。



Heisenbugの反対のBorbagは、見つけやすく修正しやすい一般的な間違いです。 1913年に原子の構造のシンプルでわかりやすいモデルを提案したNiels Bohrにちなんで名付けられました。 このモデルによると、原子の電子は特定の軌道を移動します。つまり、その運動量と運動半径を予測できます。 同様に、必要な条件が作成されていれば、Borbag​​sの外観を予測できます。





/ ORNL CC BYの写真OLCF



Schrödingbugは、開発者が確認するまで存在し、同時に存在しない誤りです。 エラーの名前は有名な思考実験に敬意を表していました。



Mandelbagに関しては、これはシステムが不安定で予測できない振る舞いをするための間違いです。 この現象は、物理学者、数学者、フラクタル幾何学の創造者であるブノワマンデルブロにちなんで命名されました。



結果は何ですか



ハイゼンバッグ(およびその他の*バグ)の例は多数あります。 それらを見つけるのは非常に困難ですが、原因は通常ありふれています。初期化されていない変数、マルチスレッド環境での同期エラー、 デッドコード除去アルゴリズムの問​​題です。 このようなエラーに対処するには、アプリケーション設計の段階でもエラーをカットする必要があります。






企業のIaaSブログから:






All Articles