Warum sind Fixnums in Emacs nur 29 Bit?

8

Und warum ändern sie es nicht?

Bearbeiten: Der Grund dafür ist, weil ich neu bei Emacs bin und ich möchte Emacs als "Programmierrechner" benutzen. Also, ich kann 32-Bit & amp; 64-Bit-Ganzzahlen und verhalten sich wie auf der nativen Maschine.

    
hyperlogic 20.09.2008, 00:44
quelle

7 Antworten

17

Emacs-Lisp ist eine dynamisch typisierte Sprache. Dies bedeutet, dass Sie zur Laufzeit Typ-Tags benötigen. Wenn Sie mit Zahlen arbeiten wollten, müssten Sie diese normalerweise in einen markierten Container packen, auf den Sie zeigen können (dh sie "boxen"), da es zur Laufzeit nicht möglich ist, einen Zeiger von einer Maschinen-Ganzzahl zu unterscheiden ohne irgendeine Art von Tagging-Schema.

Aus Gründen der Effizienz verwenden die meisten Lisp-Implementierungen daher keine rohen Pointer, aber was ich denke, nennt man Deskriptoren. Diese Deskriptoren sind normalerweise ein einzelnes Maschinenwort, das einen Zeiger, eine ungepackte Zahl (ein sogenanntes fixnum ) oder eine von verschiedenen anderen fest codierten Datenstrukturen darstellen kann (es lohnt sich oft, NIL und Nachteile zu codieren) Zellen auch, zum Beispiel).

Wenn Sie nun das Typ-Tag hinzufügen, haben Sie natürlich nicht mehr die vollen 32 Bits für die Nummer übrig. Sie haben also 26 Bits wie in MIT Scheme oder 29 Bits wie in Emacs oder einer anderen Zahl von Bits, die Sie nicht zum Markieren verwendet haben.

Einige Implementierungen verschiedener dynamischer Sprachen reservieren mehrere Tags für Fixnums, sodass sie Ihnen 30-Bit- oder sogar 31-Bit-Fixnummern geben können. SBCL ist eine Implementierung von Common Lisp, die dies tut . Ich denke nicht, dass die Komplikation, die das verursacht, Emacs wert ist. Wie oft benötigen Sie schnelle 30-Bit-Fixnum-Arithmetik im Gegensatz zu 29-Bit-Fixnum-Arithmetik in einem Texteditor , der seinen Lisp-Code nicht einmal in Maschinencode übersetzt (oder nicht? (erinnerst du dich eigentlich)? Schreiben Sie einen Distributed.net-Client in Emacs-Lisp? Dann besser zu Common Lisp wechseln! ;)

    
Matthias Benkard 20.09.2008, 08:40
quelle
7

Die restlichen 3 Bits werden vom Lisp-Interpreter als Flags verwendet. (Sie können größere Ganzzahlen erhalten, indem Sie Emacs für eine 64-Bit-Maschine kompilieren.)

    
cjm 20.09.2008 01:09
quelle
5

Andere haben bemerkt, warum Fixnummern nur 29 Bit breit sind. Aber wenn Sie einen Taschenrechnerrechner wollen, schauen Sie sich calc an. Es bietet beliebig genaue Ganzzahlen, Matrixoperationen, Einheitenumrechnungen, Grafiken über gnuplot, statistische Funktionen, Finanzfunktionen, wissenschaftliche Funktionen, RPN und algebraische Notation, Formelvereinfachung ... und es ist bereits Teil von Emacs, also um zu beginnen, besuchen Sie die Info-Knoten für "calc" und starten Sie am Tutorial.

    
Jouni K. Seppänen 21.10.2008 13:15
quelle
3

Die anderen drei Bits werden als Tag des Objekttyps verwendet. Dies war so weit verbreitet, dass eine Anzahl von CPU-Architekturen zumindest einige Unterstützung für getaggte Ganzzahlen in ihren Befehlssätzen beinhaltete: Sparc , Alpha , Burroughs und die K-Machine zum Beispiel. Heutzutage lassen wir die Lisp-Laufzeit mit Tags umgehen, ohne zusätzliche Hardware-Unterstützung. Ich würde empfehlen, den ersten Link über Sparc zu lesen, wenn Sie einen schnellen Überblick über die Geschichte erhalten möchten.

    
DGentry 20.09.2008 05:07
quelle
1

In vielen Lisp-Implementierungen werden einige der Bits in einem Wort für ein Tag verwendet. So können Dinge wie der Garbage Collector wissen, was ein Zeiger ist und was nicht, ohne raten zu müssen.

Warum interessiert es dich, wie groß ein Elisp-Fixnum ist? Sie können riesige Dateien so öffnen, wie sie sind.

    
jfm3 20.09.2008 03:30
quelle
1

Ich benutze den Common Lisp Interpreter CLISP als Programmierrechner. Common Lisp hat die beste Zahlenverarbeitung, die ich in jeder Programmiersprache gesehen habe. am bemerkenswertesten ist, dass es Ganzzahlen beliebiger Größe, d. h. Bignums, sowie rationale Zahlen aufweist. Es hat auch Eingaben in willkürlichen Zahlbasen und bitweise Funktionen für bignums. Wenn Sie in Emacs berechnen möchten, können Sie CLISP in einer M-x-Shell ausführen. Als Bonus ist die Syntax fast genau die gleiche wie in Emacs Lisp.

    
debeige 11.12.2008 10:17
quelle
0

Dies gilt nur für 32-Bit-Architekturen und kann basierend auf Build-Optionen geändert werden. Die anderen Bits werden zum Markieren der grundlegenden Datenstrukturen verwendet.

Sie können einen 64-Bit-Build verwenden, der größere Ganzzahlen hat, und es gibt Pakete für beliebig große Ganzzahlarithmetik.

Oder Sie fragen nur eine rhetorische Frage, die wütend und wichtig klingen soll ...

    
Trey Jackson 20.09.2008 01:09
quelle

Tags und Links