そして、なぜ彼らはそれを変えないのですか?
編集:質問する理由は、私がemacsを初めて使用し、Emacsを「プログラマー電卓」として使用したいからです。そのため、32 ビットと 64 ビットの整数を操作して、ネイティブ マシンと同じように動作させることができます。
Emacs-Lisp は動的型付け言語です。これは、実行時に型タグが必要であることを意味します。したがって、数値を操作したい場合は、実行時にポインターとマシン整数を区別する方法がないため、通常、数値を指定できる何らかのタグ付きコンテナーにパックする必要があります (つまり、数値を「ボックス化」する必要があります)。ある種のタグ付けスキームなしで。
したがって、効率上の理由から、ほとんどの Lisp 実装は生のポインターを使用せず、記述子と呼ばれるものを使用します。これらの記述子は通常、ポインター、ボックス化されていない数値 (いわゆるfixnum )、またはその他のさまざまなハードコードされたデータ構造の 1 つを表す単一のマシン ワードです (多くの場合、NIL およびコンス セルも特別にエンコードする価値があります。たとえば、 )。
ここで、明らかに、type タグを追加すると、数値に完全な 32 ビットが残っていないため、MIT スキームのように 26 ビット、Emacs のように 29 ビット、またはその他のビット数が残ります。タグ付けに使い果たしませんでした。
さまざまな動的言語の一部の実装では、fixnum 用に複数のタグが予約されているため、30 ビットまたは 31 ビットの fixnum を提供できます。SBCL は、これを行うCommon Lisp の 1 つの実装です。ただし、これが引き起こす複雑さは、Emacs にとってそれだけの価値があるとは思いません。Lispコードをマシンコードにコンパイルすることさえしないテキストエディタで、29ビットのfixnum演算とは対照的に、どのくらいの頻度で高速な30ビットのfixnum演算が必要になりますか(または、実際には覚えていません)? Emacs-Lisp で distributed.net クライアントを作成していますか? それなら、Common Lisp に切り替えた方がよいでしょう! ;)
残りの 3 ビットは、Lisp インタプリタによってフラグとして使用されます。(Emacs を 64 ビット マシン用にコンパイルすると、より大きな整数を取得できます。)
他の人は、fixnumが29ビット幅しかない理由についてコメントしています。ただし、プログラマーの計算機が必要な場合は、calcを確認してください。任意精度の整数、行列演算、単位変換、gnuplotによるグラフィックス、統計関数、財務関数、科学関数、RPNと代数表記、数式の簡略化などを提供します。すでにEmacsの一部であるため、開始するには、 「calc」の情報ノードで、チュートリアルから始めます。
多くのLisp実装では、単語の一部のビットがタグに使用されます。これにより、ガベージコレクターのようなものは、何がポインターで何がそうでないかを推測することなく知ることができます。
Elisp fixnumの大きさを気にするのはなぜですか?巨大なファイルをそのまま開くことができます。
CommonLispインタープリターCLISPをプログラマーの計算機として使用しています。Common Lispは、私があらゆるプログラミング言語で見た中で最も健全な数値処理を備えています。最も注目すべきは、任意のサイズの整数、つまりbignumと、有理数があります。また、任意の基数の入力とbignumのビット単位の関数もあります。Emacs内から計算する場合は、MxシェルでCLISPを実行できます。ボーナスとして、構文はEmacsLispで使用するものとほぼ同じです。
これは 32 ビット アーキテクチャにのみ当てはまり、ビルド オプションに基づいて変更できます。その他のビットは、基本データ構造のタグ付けに使用されます。
より大きな整数を持つ 64 ビット ビルドを使用でき、任意に大きな整数演算用のパッケージがあります。
または、怒っているように聞こえて重要に聞こえるように修辞的な質問をしているだけです...