これは「悪いことが常に良いとは限らない」という良い例です。
ニュージャージーのアプローチ
C/C++/Java などの「従来の」言語では、ハードウェアの機能に基づいて整数演算の範囲が制限されてint32_t
います。これは非常に高速で、多くの場合、実用的な目的には十分に思えますが、見つけにくい微妙なバグが発生します。
MIT/スタンフォード スタイル
Lisp は別のアプローチを取りました。
「小さい」ボックス化されていない整数型fixnum
があり、 fixnum 算術の結果が に収まらない場合、fixnum
自動的かつ透過的に任意のサイズbignum
に昇格されるため、常に数学的に正しい結果が得られます。これは、コンパイラが結果が a であることを証明できない限り、 aを割り当てる必要があるfixnum
かどうかをチェックするコードを追加する必要があることを意味します。bignum
これは、実際には、現代のアーキテクチャではコストがゼロになるはずですが、40年以上前に行われたときは重要な決定でした.
「伝統的な」言語は、ビッグナム算術を提供する場合、「ライブラリ」の方法でそれを行います。つまり、
- ユーザーが明示的に要求する必要があります。
- bignum はぎこちない方法で操作され
BigInteger.add(a,b)
ますa+b
。
- 実際の数が小さく、マシンの int に収まる場合でも、コストが発生します。
Lisp のアプローチは、余分な複雑さを犠牲にして正しいことを行うというLisp の伝統に完全に沿っていることに注意してください。また、現在主流になっている自動メモリ管理にも現れていますが、過去には悪質な攻撃を受けていました。整数演算への Lisp アプローチは現在、他のいくつかの言語 (たとえば、python) で使用されているため、進歩が起こっています!