是什么赋予Lisp优异的数学性能?

是什么赋予Lisp优异的数学性能?,lisp,common-lisp,integer-arithmetic,Lisp,Common Lisp,Integer Arithmetic,我在Lisp教科书中读到: Lisp可以对数字进行一些惊人的处理,尤其是与大多数其他语言相比。例如,这里我们使用函数expt计算53的53次方: 大多数语言都会因涉及如此大量的计算而窒息 是的,这很酷,但是作者没有解释为什么Lisp可以比其他语言更容易、更快地实现这一点 当然有一个简单的原因,有人能解释吗?为了补充wvxvw所写的内容,在Lisp中更容易,因为bignum是内置在语言中的。您可以像在C或Java中处理整数一样处理大量的数字。这是一个很好的例子 新泽西方法 “传统”语言,如C/C+

我在Lisp教科书中读到:

Lisp可以对数字进行一些惊人的处理,尤其是与大多数其他语言相比。例如,这里我们使用函数
expt
计算53的53次方:

大多数语言都会因涉及如此大量的计算而窒息

是的,这很酷,但是作者没有解释为什么Lisp可以比其他语言更容易、更快地实现这一点


当然有一个简单的原因,有人能解释吗?

为了补充wvxvw所写的内容,在Lisp中更容易,因为bignum是内置在语言中的。您可以像在C或Java中处理整数一样处理大量的数字。

这是一个很好的例子

新泽西方法 “传统”语言,如C/C++/Java,具有基于硬件功能的有限范围整数算法,例如,
int32\u t
-有符号32位数字,当结果不适合32位时,这些数字会自动溢出。这是非常快的,并且对于实际目的来说似乎已经足够好了,但是会导致微妙的难以发现的bug

麻省理工学院/斯坦福大学风格 Lisp采取了不同的方法

它有一个“小”的非固定整数类型,当fixnum算术的结果不适合
fixnum
时,它会自动透明地升级为任意大小,因此您总是可以得到数学上正确的结果。这意味着,除非编译器能够证明结果是
fixnum
,否则它必须添加代码来检查是否必须分配
bignum
。事实上,这对现代建筑来说应该是零成本,但在40多年前做出这一决定时,这是一个非常重要的决定

“传统”语言在提供bignum算法时,是以“库”的方式实现的,即

  • 必须由用户明确要求
  • 对bignum的操作非常笨拙:
    biginger。添加(a,b)
    而不是
    a+b
  • 即使实际数量很小且适合机器,也会产生成本

请注意,Lisp方法非常符合Lisp的传统,但可能会增加一些额外的复杂性。它还表现在自动化内存管理,这是现在的主流,但在过去被恶意攻击。整数算术的lisp方法现在已经在一些其他语言(例如python)中使用,因此正在取得进展

当时的许多语言都没有试图从依赖硬件的模运算中抽象出算术。许多流行语言(Java或C++)仍然没有做到这一点。然而,很多都有“bignum”或“biginger”库。作为二流公民,这些库通常会产生开销,比如Java中的装箱。
CL> (expt 53 53) 
24356848165022712132477606520104725518533453128685640844505130879576720609150223301256150373