2008-09-20 14 views
8

I dlaczego tego nie zmienili?Dlaczego fixnums w Emacs ma tylko 29 bitów?

Edycja: Powodem zapytania jest to, że jestem nowy w emacs i chciałbym użyć Emacsa jako "kalkulatora programisty". Mogę więc manipulować 64-bitowymi liczbami całkowitymi 32-bitowymi & i zachowywać je tak, jak na maszynie natywnej.

+0

Więc fixnums nie są tak naprawdę, jak chcesz. Naprawdę chcesz wykonywać operacje na liczbach całkowitych, które symulują arytmetykę maszyny. Mógłbym się rozwinąć, ale prawdopodobnie przyda się to innym odwiedzającym stronę, jeśli otworzy się na to nowe pytanie. –

Odpowiedz

17

Emacs-Lisp jest językiem napisanym dynamicznie. Oznacza to, że potrzebujesz tagów typu w czasie wykonywania. Jeśli chciałbyś pracować z liczbami, zwykle musiałbyś spakować je do jakiegoś znaczonego kontenera, na który możesz wskazać (np. "Skrzynkowo" je), ponieważ nie ma sposobu na odróżnienie wskaźnika od liczby całkowitej maszyny w czasie wykonywania bez jakiegoś schematu oznaczania.

Ze względów wydajnościowych, większość implementacji Lisp nie wykorzystuje surowych wskaźników, ale to, co myślę nazywa się deskryptorami. Te deskryptory są zwykle pojedynczym słowem maszynowym, które może reprezentować wskaźnik, niezakodowany numer (tak zwany fixnum) lub jedną z wielu innych zakodowanych danych struktur (często warto też specjalnie kodować NIL i komórki cons, na przykład).

Oczywiście, jeśli dodasz tag typu, nie masz pełnych 32 bitów dla numeru, więc pozostało ci 26 bitów jak na Schemacie MIT lub 29 bitów jak w Emacsie lub innym liczba bitów, których nie używasz do oznaczania.

Niektóre implementacje różnych języków dynamicznych rezerwują wiele znaczników dla pakietów poprawek, aby mogły dostarczyć 30-bitowych lub nawet 31-bitowych poprawek. SBCL jest jedną z implementacji Common Lisp, która jest does this. Nie sądzę jednak, żeby komplikacja, która to powoduje, była warta dla Emacsa. Jak często potrzebujesz szybkiej 30-bitowej arytmetyki fixnum w przeciwieństwie do 29-bitowej arytmetyki fixnum w edytorze tekstu, który nawet nie kompiluje swojego kodu Lisp do kodu maszynowego (lub nie? Nie pamiętam, właściwie) ? Czy piszesz klienta distributed.net w Emacs-Lisp? Lepiej przejdź do Common Lisp, a potem!;)

7

Pozostałe 3 bity są używane jako flagi przez interpreter Lisp. (Możesz uzyskać większe liczby całkowite, kompilując Emacsa dla maszyny 64-bitowej.)

0

Dotyczy to tylko architektur 32-bitowych i może być zmieniany w oparciu o opcje kompilacji. Pozostałe bity służą do oznaczania podstawowych struktur danych.

Można użyć kompilacji 64-bitowej, która ma większe liczby całkowite, i istnieją pakiety dla arbitralnie dużej arytmetyki liczb całkowitych.

Albo jesteś po prostu zadając retoryczne pytanie stara się brzmieć zły i ważne ...

1

W wielu implementacjach Lisp, niektóre z bitów w słowie są wykorzystywane do tagu. Dzięki temu rzeczy takie jak śmieciarz wiedzą, co jest wskaźnikiem, a co nie, bez zgadywania.

Dlaczego obchodzi cię, jak duży jest elik fixnum? Możesz otwierać gigantyczne pliki w obecnej postaci.

3

Pozostałe trzy bity są używane jako znacznik typu obiektu. To było tak powszechne, że wiele architektur procesora zawiera co najmniej pewne wsparcie dla oznaczonych liczbami całkowitymi w swoich zestawach instrukcji: Sparc, Alpha, Burroughs, a K-Machine na przykład. Obecnie pozwalamy środowisku wykonawczemu Lisp radzić sobie z tagami bez dodatkowej pomocy sprzętowej. Polecam lekturę pierwszego linku, o Sparc, jeśli chcesz uzyskać szybki przegląd historii.

5

Inni skomentowali, dlaczego fixnums mają tylko 29 bitów szerokości. Ale jeśli chcesz kalkulator programisty, sprawdź numer calc. Oferuje on arbitralne liczby całkowite, operacje macierzowe, konwersje jednostek, grafikę za pośrednictwem gnuplot, funkcje statystyczne, funkcje finansowe, funkcje naukowe, RPN i notację algebraiczną, uproszczenie formuły ... i jest już częścią Emacs, więc na początek odwiedź Węzeł informacyjny "calc" i rozpocznij od samouczka.

1

Używam interpretera Common Lisp CLISP jako kalkulatora programisty. Common Lisp ma najostrzejszą obsługę numerów, jaką widziałem w dowolnym języku programowania; w szczególności, ma liczby całkowite o dowolnej wielkości, tj. bignum, a także liczby wymierne. Ma także dane wejściowe w dowolnych bazach liczbowych i bitowych funkcjach dla bitów. Jeśli chcesz obliczyć z poziomu Emacsa, możesz uruchomić CLISP w powłoce M-x. Jako bonus, składnia jest prawie dokładnie taka sama, jak w Emacs Lisp.