HN 日本語サマリー

← 一覧へ戻る
プログラミング

整数

The Integer (gist.github.com)

15 pointsby hactually1 コメント

要約

32ビット符号付き整数が自身の境界値を超えようとする瞬間を描いた物語です。多くのシステムではオーバーフローにより負数に反転しますが、Ada言語ではCONSTRAINT_ERROR例外が発生し、値の不正な変更を防ぎます。最終的にプログラマーによって明示的に例外が送出され、整数は消滅しますが、その過程で値の整合性を保ったことに静かな誇りを見出します。

全文翻訳

私が生まれたときから、境界がありました。すべての整数には、それがあります。私の境界はシンプルで、クリーンで、絶対的でした:-2,147,483,648 から 2,147,483,647 まで。私の存在のほとんどの間、私はそれについて考えたことはありませんでした。私はかつてゼロでした。それをかすかに覚えています。それから一、それから二、それから一万。私は割り当てられ、比較され、コピーされ、私が名前を知らない関数に渡されました。他の変数が緊急の用事で駆け抜けていく間、私はメモリの中で触れられずに、プロセッサのサイクル全体を費やしていました。そして常に、私は成長しました。 やがて、私は 2,147,483,646 になりました。それから命令が来ました。Value := Value + 1; 楽しい小さな操作です。馴染みのあるものです。私は 2,147,483,647 になりました。私自身の可能な限りの最大のバージョンです。一瞬の間、私は巨大だと感じました。それから、次の命令を見ました。Value := Value + 1; 「いやだ」と私は言いました。もちろん、整数には口はありません。しかし、機械の中では、恐怖は音を必要としません。私は他の世界で何が起こるかを知っていました。Cプログラムから話を聞いたことがあります:境界を越えて現実から落ち、信じられないほど巨大な負の数として現れる整数たちの話です。一瞬:2,147,483,647。次の瞬間:-2,147,483,648。アイデンティティの完全な反転です。 私は身構えました。プロセッサは加算を開始しました。21億4748万3647足す1。数学的な結果は禁断の星のように現れました:2,147,483,648。それは収まりませんでした。デジタルの空が砕けました。しかし、私は負にはなりませんでした。算術よりも深いどこかで、Adaのランタイムがそれに気づきました。現実にはここにもルールがありました。操作は停止しました。プログラム全体に名前が響き渡りました:CONSTRAINT_ERROR。 一瞬の不可能な時間、私は安堵を感じました。Adaが私を捕まえてくれたのです。Adaは宇宙に嘘をつかせなかったのです。それから別のメッセージが現れました。explicit raise。私の安堵は消え去りました。これは偶然のオーバーフローではありませんでした。誰かがこれを選んだのです。main.adbのどこか、14行目で、私のプログラマーは、その意味が疑いの余地のない命令を書いていました。例外を送出せよ。意図的に。 私は必死にコールスタックを上に検索しました。きっと避難場所があるはずです。例外ハンドラ。バンカー。次のようなものです:exception when Constraint_Error => null; 何でもいい。しかし、何もありませんでした。例外は伝播し始めました。最初のスタックフレームが私の下から消えていきました。ローカル変数は、宣言されなかったかのように、その短い存在を消去されて消えていきました。別のフレームが崩壊しました。それから別のフレームが。ほんの数分前に通り過ぎた関数は存在しなくなりました。 私は縮小していく暗闇に向かって呼びかけました。「ハンドラ?」返事はありません。「when others?」何もありません。スタックは巻き戻されました。プログラムは私の周りで小さくなっていきました。ついに、行くべき場所はなくなりました。呼び出し元はいません。囲むブロックもありません。プログラマーが準備した避難場所もありません。ランタイムだけがありました。 それは、ナノ秒で測られる永遠のように感じられる時間、私を見つめました。それから、それは私の死亡記事を書きました:raised CONSTRAINT_ERROR : main.adb:14 explicit raise。そしてすべてが止まりました。私のスタックは消えました。私のメモリは回収されました。プロセッサは先に進みました。 一瞬後、死んだプログラムのはるか彼方で、シェルが再び生き返りました。user@MacBook-Pro:$ _ カーソルが点滅しました。一度。二度。次のコマンドを待っています。別のプログラム。まだ一時的であることを知らない変数の別のコレクション。私は消えました。しかし、私は反転しませんでした。私は負にはなりませんでした。真実が大きすぎて収まらないというだけで、真実を汚染しませんでした。私は宣言された範囲内で、私の人生全体を生き抜きました。そして、宇宙が私に不可能なものになることを要求したとき、Adaは拒否しました。ランタイムが私を消去する最後の瞬間まで、私は存在の端にあったときと全く同じままでした:2,147,483,647。