5

私はLispの教科書でこれを読んでいます:

Lisp は、特に他のほとんどの言語と比較した場合、数値に関して驚くべき偉業を成し遂げることができます。たとえば、ここでは関数を使用してexpt53 の 53 乗を計算しています。

CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373

ほとんどの言語は、このような大きな数を含む計算で窒息します。

はい、それは素晴らしいことですが、著者は、Lisp が他の言語よりも簡単かつ迅速にこれを実行できる理由を説明していません。

確かに単純な理由がありますが、誰か説明できますか?

4

2 に答える 2

12

これは「悪いことが常に良いとは限らない」という良い例です。

ニュージャージーのアプローチ

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) で使用されているため、進歩起こっています!

于 2013-10-30T13:43:34.773 に答える