Question

Et pourquoi ne le changent-ils pas?

Modifier: La raison de cette demande est que je suis nouveau sur emacs et que je voudrais utiliser Emacs en tant que "calculateur de programmeur". Je peux donc manipuler les fichiers 32 bits & amp; Entiers 64 bits et qu’ils se comportent comme ils le feraient sur la machine native.

Était-ce utile?

La solution

Emacs-Lisp est un langage à typage dynamique. Cela signifie que vous avez besoin de balises de type à l'exécution. Si vous voulez travailler avec des nombres, vous devez donc normalement les empaqueter dans un type de conteneur étiqueté que vous pouvez désigner (c.-à-d. «Les mettre»), car il est impossible de distinguer un pointeur d'un entier de la machine lors de l'exécution. sans une sorte de système de marquage.

Pour des raisons d'efficacité, la plupart des implémentations Lisp n'utilisent donc pas de pointeurs bruts, mais ce que je pense s'appelle des descripteurs. Ces descripteurs sont généralement un seul mot machine pouvant représenter un pointeur, un nombre non encadré (un soi-disant fixnum ), ou l’une des nombreuses autres structures de données codées en dur (il vaut souvent la peine d’encoder NIL et ses inconvénients. cellules spécialement, par exemple).

Maintenant, évidemment, si vous ajoutez la balise de type, vous n'avez plus les 32 bits complets pour le nombre. Il vous reste donc 26 bits comme dans le schéma MIT ou 29 bits comme dans Emacs ou tout autre nombre. des bits que vous n'avez pas utilisés pour le marquage.

Certaines implémentations de divers langages dynamiques réservent plusieurs tags pour les fixnums afin qu’ils puissent vous donner des fixnums 30 bits, voire 31 bits. SBCL est une implémentation de Common Lisp que fait de même . Je ne pense pas que la complication que cela cause en vaille la peine pour Emacs, cependant. À quelle fréquence avez-vous besoin d'une arithmétique rapide du fixnum 30 bits, par opposition à l'arithmétique du fixnum 29 bits dans un éditeur de texte qui ne compile même pas son code Lisp en code machine (ou le fait-il? Ne te souviens pas, en fait) Etes-vous en train d'écrire un client distribué.net dans Emacs-Lisp? Mieux vaut passer à Common Lisp, alors! ;)

Autres conseils

Les 3 bits restants sont utilisés comme indicateurs par l'interpréteur Lisp. (Vous pouvez obtenir de plus grands entiers en compilant Emacs pour une machine 64 bits.)

D'autres ont expliqué pourquoi les fixnums ne font que 29 bits de large. Mais si vous voulez une calculatrice de programmeur, consultez calc . Il offre des entiers à précision arbitraire, des opérations sur les matrices, des conversions d'unités, des graphiques via gnuplot, des fonctions statistiques, des fonctions financières, des fonctions scientifiques, des notations RPN et algébriques, la simplification de formules ... et fait déjà partie d'Emacs. Nœud d'information pour " calc " et commencez par le didacticiel.

Les trois autres bits sont utilisés comme balises du type d’objet. Auparavant, cela était si répandu qu'un certain nombre d'architectures de CPU incluaient au moins une certaine prise en charge des entiers étiquetés dans leurs jeux d'instructions: Sparc , Alpha , Burroughs , et le K-Machine par exemple. De nos jours, nous laissons le runtime Lisp s'occuper des tags, sans support matériel supplémentaire. Je vous recommande de lire le premier lien, à propos de Sparc, si vous souhaitez obtenir un aperçu rapide de l'historique.

Dans de nombreuses implémentations Lisp, certains des bits d’un mot sont utilisés pour une balise. Cela permet aux choses comme le ramasse-miettes de savoir ce qu'est un pointeur et ce qui ne l'est pas sans avoir à deviner.

Pourquoi vous souciez-vous de la taille d'un fixnum Elisp? Vous pouvez ouvrir des fichiers gigantesques tels quels.

J'utilise l'interpréteur Common Lisp CLISP comme calculateur de programmeur. Common Lisp possède le traitement le plus sain que j'ai jamais vu dans un langage de programmation; en particulier, il a des entiers de taille arbitraire, c'est-à-dire des bignums, ainsi que des nombres rationnels. Il a également une entrée dans des bases de nombres arbitraires et des fonctions au niveau des bits pour les bignums. Si vous voulez calculer depuis Emacs, vous pouvez exécuter CLISP dans un shell M-x. En prime, la syntaxe est presque identique à celle que vous utiliseriez dans Emacs Lisp.

Cela n’est vrai que pour les architectures 32 bits et peut être modifié en fonction des options de construction. Les autres bits sont utilisés pour baliser les structures de données de base.

Vous pouvez utiliser une version 64 bits comportant des entiers plus grands. Il existe des packages pour l'arithmétique des entiers arbitrairement grands.

Ou, vous posez simplement une question rhétorique pour tenter de paraître énervé et important ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top