Почему фиксированные значения в Emacs только 29 бит? - PullRequest
8 голосов
/ 20 сентября 2008

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

Edit: Причина в том, что я новичок в emacs и хотел бы использовать Emacs в качестве «калькулятора программирования». Таким образом, я могу манипулировать 32-битными и 64-битными целыми числами и заставить их вести себя так же, как на родной машине.

Ответы [ 7 ]

18 голосов
/ 20 сентября 2008

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

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

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

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

7 голосов
/ 20 сентября 2008

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

5 голосов
/ 21 октября 2008

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

3 голосов
/ 20 сентября 2008

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

1 голос
/ 11 декабря 2008

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

1 голос
/ 20 сентября 2008

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

Почему тебя волнует, насколько велика фиксация Элиспа? Вы можете открывать гигантские файлы как есть.

0 голосов
/ 20 сентября 2008

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

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

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

...