Почему составляют fixnums в Emacs только 29 битов?

В Unix?

pwd

8
задан Luke Girvin 3 September 2011 в 14:04
поделиться

7 ответов

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

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

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

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

18
ответ дан 3 November 2019 в 12:57
поделиться

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

5
ответ дан 3 November 2019 в 12:57
поделиться

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

7
ответ дан 3 November 2019 в 12:57
поделиться

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

3
ответ дан 3 November 2019 в 12:57
поделиться

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

1
ответ дан 3 November 2019 в 12:57
поделиться

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

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

1
ответ дан 3 November 2019 в 12:57
поделиться

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

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

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

0
ответ дан 3 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: