为什么Emacs中的fixnum仅29位?
他们为什么不改变呢?
编辑:
问的原因是因为我是emacs的新手,所以我想将Emacs用作"程序员计算器"。因此,我可以操纵32位和64位整数,并使它们的行为与在本机上的行为相同。
解决方案
Lisp解释器将其余3位用作标志。 (通过为64位计算机编译Emacs,可以获得更大的整数。)
这仅适用于32位体系结构,并且可以根据构建选项进行更改。其他位用于标记基本数据结构。
我们可以使用具有更大整数的64位版本,并且有用于任意大整数算术的程序包。
或者,我们只是在问一个听起来很生气和重要的修辞问题...
在许多Lisp实现中,单词中的某些位用于标签。这使诸如垃圾收集器之类的东西无需猜测就可以知道什么是指针,什么不是。
我们为什么关心Elisp fixnum有多大?我们可以按原样打开巨大的文件。
其他三位用作对象类型的标签。这曾经如此普遍,以至于许多CPU体系结构在其指令集中至少对标记的整数提供了一些支持:
Sparc,
Α,
巴勒斯和
例如K机。现在,我们让Lisp运行时处理标签,而无需其他硬件支持。如果我们想快速了解历史,建议阅读有关Sparc的第一个链接。
Emacs-Lisp是一种动态类型的语言。这意味着我们需要在运行时输入类型标签。如果我们想使用数字,则通常必须将它们打包到可以指向的某种带标签的容器中(即将其装箱),因为在运行时如果没有一些方法就无法将指针与机器整数区分开一种标记方案。
出于效率方面的考虑,因此大多数Lisp实现都不使用原始指针,而是使用描述符。这些描述符通常是一个单一的机器字,可以表示一个指针,一个未装箱的数字(所谓的fixnum)或者其他各种硬编码的数据结构中的一种(例如,通常也应特别对NIL和cons单元进行编码) )。
现在,很明显,如果添加了type标签,那么数字将剩下32位,因此,如MIT方案中的26位或者Emacs中的29位或者任何其他数量的位我们没有用完标签。
各种动态语言的某些实现为fixnum保留了多个标签,以便它们可以为我们提供30位甚至31位的fixnum。 SBCL是Common Lisp的一种实现方式。不过,我认为这种情况造成的复杂性对于Emacs不值得。在甚至没有将Lisp代码编译为机器代码的文本编辑器中,我们需要多长时间使用30位Fixnum快速算法而不是29位Fixnum算法?我们正在用Emacs-Lisp编写一个分布式.net客户端吗?那么,最好切换到Common Lisp! ;)
其他人则评论了为什么fixnums只有29位宽。但是,如果我们需要程序员的计算器,请查看calc。它提供了任意精度的整数,矩阵运算,单位转换,通过gnuplot进行的图形处理,统计函数,财务函数,科学函数,RPN和代数表示法,公式简化...,并且它已经是Emacs的一部分,因此开始使用,请访问" calc"的信息节点,并从本教程开始。
我将Common Lisp解释器CLISP用作程序员的计算器。 Common Lisp具有我在任何编程语言中所见过的最简单的数字处理方式。最值得注意的是,它具有任意大小的整数(即bignums)以及有理数。它还具有任意数字基数的输入和bignums的按位函数。如果要从Emacs中进行计算,则可以在M-x Shell中运行CLISP。另外,语法几乎与我们在Emacs Lisp中使用的语法完全相同。