Почему фиксированные значения в Emacs составляют всего 29 бит?

StackOverflow https://stackoverflow.com/questions/106597

  •  01-07-2019
  •  | 
  •  

Вопрос

И почему они этого не меняют?

Редактировать:Причина ask в том, что я новичок в emacs и хотел бы использовать Emacs в качестве "калькулятора программиста".Итак, я могу манипулировать 32-битными и 64-битными целыми числами и заставлять их вести себя так, как они вели бы себя на родной машине.

Это было полезно?

Решение

Emacs-Lisp - это язык с динамической типизацией.Это означает, что вам нужны теги типа во время выполнения.Поэтому, если вы хотите работать с числами, вам обычно приходится упаковывать их в какой-то помеченный контейнер, на который вы можете указать (т. е.“вставлять” их), поскольку нет способа отличить указатель от машинного целого числа во время выполнения без какой-либо схемы тегов.

Поэтому из соображений эффективности большинство реализаций Lisp используют не необработанные указатели, а то, что, по-моему, называется дескрипторами.Эти дескрипторы обычно представляют собой одно машинное слово, которое может представлять указатель, распакованное число (так называемый фиксированный номер), или одна из различных других жестко закодированных структур данных (например, часто стоит специально кодировать ячейки NIL и cons).

Теперь, очевидно, что если вы добавите тег type , у вас не останется полных 32 бит для числа, поэтому у вас останется 26 бит, как в MIT Scheme, или 29 бит, как в Emacs, или любое другое количество бит, которое вы не использовали для пометки.

Некоторые реализации различных динамических языков резервируют несколько тегов для фиксированных чисел, чтобы они могли выдавать вам 30-битные или даже 31-битные фиксированные числа.SBCL - это одна из реализаций Common Lisp, которая делает ли это.Однако я не думаю, что сложности, которые это вызывает, того стоят для Emacs.Как часто вам нужна быстрая 30-битная числовая арифметика в отличие от 29-битной числовой арифметики в текстовый редактор это даже не компилирует свой код Lisp в машинный код (или не компилирует?Вообще-то я не помню)?Вы пишете распределенный файл?сетевой клиент в Emacs-Lisp?Тогда лучше переключитесь на Common Lisp!;)

Другие советы

Оставшиеся 3 бита используются интерпретатором Lisp в качестве флагов.(Вы можете получить большие целые числа, скомпилировав Emacs для 64-разрядной машины.)

Другие комментировали, почему фиксированные числа имеют ширину всего 29 бит.Но если вам нужен программный калькулятор, ознакомьтесь вычислять.Он предлагает целые числа произвольной точности, матричные операции, преобразования единиц измерения, графику с помощью gnuplot, статистические функции, финансовые функции, научные функции, RPN и алгебраическую нотацию, упрощение формул...и это уже часть Emacs, поэтому, чтобы начать, посетите информационный узел для "calc" и начните с руководства.

Остальные три бита используются в качестве тега типа объекта.Раньше это было настолько распространено, что ряд архитектур процессоров включали по крайней мере некоторую поддержку помеченных целых чисел в свои наборы команд:Спарк, Альфа, Берроуз, и тот К-машина например.В настоящее время мы позволяем среде выполнения Lisp работать с тегами без дополнительной аппаратной поддержки.Я бы порекомендовал прочитать первую ссылку о Sparc, если вы хотите получить краткий обзор истории.

Во многих реализациях Lisp некоторые биты в word используются для тега.Это позволяет таким вещам, как сборщик мусора, знать, что является указателем, а что нет, без необходимости угадывать.

Почему вас волнует, насколько велик Elisp fixnum?Вы можете открывать гигантские файлы как есть.

Я использую интерпретатор Common Lisp CLISP в качестве калькулятора программиста.Common Lisp обладает самой разумной обработкой чисел, которую я когда-либо видел в любом языке программирования;наиболее примечательно, что он содержит целые числа произвольного размера, т.е.величины, а также рациональные числа.Он также имеет входные данные в виде произвольных числовых баз и побитовых функций для значений.Если вы хотите выполнять вычисления из Emacs, вы можете запустить CLISP в оболочке M-x.В качестве бонуса, синтаксис почти точно такой же, как тот, который вы использовали бы в Emacs Lisp.

Это верно только для 32-разрядных архитектур и может быть изменено в зависимости от параметров сборки.Остальные биты используются для пометки базовых структур данных.

Вы можете использовать 64-разрядную сборку, которая содержит большие целые числа, и существуют пакеты для сколь угодно большой целочисленной арифметики.

Или же вы просто задаете риторический вопрос, пытаясь казаться сердитым и важным...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top