是什么让Lisp具有出色的数学表现?

joh*_*ers 5 lisp common-lisp integer-arithmetic

我在Lisp教科书中读到这篇文章:

Lisp可以用数字执行一些惊人的壮举,特别是与大多数其他语言相比时.例如,这里我们使用函数expt来计算53的53的幂:

CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373
Run Code Online (Sandbox Code Playgroud)

大多数语言会在涉及如此大数目的计算中窒息.

是的,这很酷,但作者没有解释为什么Lisp可以比其他语言更容易,更快地完成这项工作.

当然有一个简单的原因,任何人都可以解释一下吗?

sds*_*sds 12

这是一个很好的例子,"更坏并不总是更好".

新泽西的方法

"传统"语言,如C/C++/Java,基于硬件功能具有有限范围的整数算术,例如,int32_t- 当有结果不适合32位时,有符号的32位数字无声地溢出.这是非常快的,并且通常看起来足够实用,但导致很难发现错误.

麻省理工学院/斯坦福大学的风格

Lisp采取了不同的方法.

它有一个"小"的未装箱整数类型fixnum,当fixnum算术的结果不适合a时fixnum,它会自动且透明地提升到任意大小bignum,因此你总能获得数学上正确的结果.这意味着,除非编译器能够证明结果是a fixnum,否则它必须添加代码以检查是否bignum必须分配.实际上,这应该在现代建筑上花费0,但是在4年前制作时这是一个非平凡的决定.

"传统"语言,当他们提供bignum算术时,以"图书馆"的方式做到这一点,即,

  • 它必须由用户明确要求;
  • bignums以笨拙的方式操作:BigInteger.add(a,b)而不是a+b;
  • 即使实际数量很小并且适合机器int,也会产生成本.

请注意,Lisp方法非常符合Lisp的做法,即以可能的额外复杂性为代价做正确的事情.它也体现在自动化内存管理中,现在已成为主流,但在过去遭到了恶意攻击.整数算术的lisp方法现在已经在其他一些语言中使用(例如,python),所以进展正在发生!