самый позитивно-фикснум в Emacs - PullRequest
4 голосов
/ 27 мая 2019

После проверки переменной в 'most-positive-fixnum' в emacs, она выдает:

most-positive-fixnum is a variable defined in ‘data.c’.
Its value is 2305843009213693951
Documentation:
The largest value that is representable in a Lisp integer.

Это значение log2:

In [8]: math.log2(2305843009213693951)
Out[8]: 61.0

почему установлено значение 2 **61, а не 2**62 или 2**63?

1 Ответ

7 голосов
/ 27 мая 2019

Поскольку есть биты тегов: при обнаружении объекта динамически типизированный язык должен знать, какой это тип. Для этого должна быть некоторая информация тега, которая сообщает это. Наивным подходом было бы представлять все объекты по крайней мере двумя машинными словами: словом информации тега и по крайней мере одним словом для самого объекта. Это катастрофа для таких объектов, как целые числа, так как это означает, что вам нужны два машинных слова даже для маленьких целых чисел, которые вы ожидаете поместить в одно. Это, в свою очередь, означает, что, например, (+ 1 2) необходимо выделить хранилище, чего вы не хотели бы делать.

Чтобы обойти это, вы уменьшаете максимальный размер маленьких целых чисел (фиксумов) и используете некоторые из лишних битов в слове в качестве тега, который говорит: «это fixnum». Здесь есть очень хитрый трюк, который вы можете сделать здесь, называемый «младшими тегами»: если вы зарезервируете, например, два бита тега в нижнем конце слова, вы можете сделать их (идущими в порядке младших битов):

  • 0 0: четный фиксн
  • 0 1: нечетное фикснум;
  • 1 0, 1 1: два других вида объекта

И умная вещь в том, что это означает, что ваши фиксированные числа могут быть на один бит больше, чем вы ожидаете, потому что младший бит четного фиксного числа равен 0: он перекрывается с битами тега. В дополнение к фиксированным значениям, представленным таким образом, могут использоваться машинные операции (переполнение по модулю), в то время как умножение требует сдвига, который, как правило, по существу свободен, поскольку не затрагивает память. Я не знаю, использует ли elisp низкие теги, хотя я полагаю, что это так.

...