OpenLisp - OpenLisp
|
OpenLisp działający w Emacsie
| |
| Paradygmaty | Wieloparadygmat : funkcjonalny , proceduralny , obiektowy , refleksyjny , meta |
|---|---|
| Rodzina | Seplenienie |
| Zaprojektowany przez | Christian Jullien |
| Deweloper | Christian Jullien |
| Po raz pierwszy pojawiły się | kwiecień 1988 |
| Wersja stabilna | 11.2.0 / 6 sierpnia 2021
|
| Dyscyplina pisania | Dynamiczny , mocny |
| Język implementacji | C , OpenLisp |
| Platforma | x86 , x86-64 , IA-64 , SPARC , PowerPC , MIPS , Alpha , PA-RISC , ARM , AArch64 , RISC-V |
| OS | Windows , większość Unix , Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , QNX , DOS , OS/2 , Pocket PC , OpenVMS , z/OS , Cygwin |
| Licencja | Prawnie zastrzeżony |
| Stronie internetowej | www |
| Wpływem | |
| Lisp , ISLISP | |
OpenLisp to język programowania z rodziny Lisp opracowany przez Christiana Julliena z firmy Eligis . Jest on zgodny z międzynarodową normą dla ISLISP opublikowany wspólnie przez Międzynarodową Organizację Normalizacyjną (ISO) i Międzynarodowej Komisji Elektrotechnicznej (IEC), ISO / IEC 13816: 1997 (E), zmienionej normy ISO / IEC 13816: 2007 (E).
Napisany w językach programowania C i Lisp, działa na większości popularnych systemów operacyjnych . OpenLisp jest wyznaczyło ISLISP realizacji, ale zawiera również wiele Common Lisp -Kompatybilny Rozszerzenia (Hashtable, readtable, pakunek, defstruct, Sekwencje liczb wymiernych) oraz innych bibliotek ( gniazdo sieciowe , wyrażenia regularne , XML , Portable Operating System Interface ( POSIX ) SQL , lekki protokół dostępu do katalogu (LDAP)).
OpenLisp zawiera interpreter powiązany z pętlą odczytu, oceny i drukowania (REPL), Lisp Assembly Program (LAP) i kompilator zaplecza dla języka C .
Cele
Głównym celem tej wersji Lisp jest zaimplementowanie w pełni zgodnego systemu ISLISP (po uruchomieniu z -islispflagą jest on ściśle ograniczony do specyfikacji ISO/IEC 13816:2007(E)). Celem drugorzędnym jest dostarczenie kompletnego niezabudowany Lisp systemu skorelowane C / C ++ lub Java (przez Java Native Interface (JNI)). Zwrotna mechanizm służy do komunikowania się z programem zewnętrznym. Inne cele to bycie użytecznym jako język skryptowy lub język klejący oraz tworzenie samodzielnych plików wykonywalnych programu .
Licencja
Pomimo swojej nazwy , OpenLisp jest oprogramowaniem własnościowym . Jego tłumacz jest dostępny bezpłatnie do wszelkich niekomercyjnych zastosowań.
Interfejs użytkownika
OpenLisp działa głównie w trybie konsoli: cmd.exew systemie Microsoft Windows i emulatorze terminala w systemach opartych na systemie Unix .
;; OpenLisp v11.x.y (Build: XXXX) by C. Jullien [Jan 01 20xx - 10:49:13]
;; Copyright (c) Eligis - 1988-20xx.
;; System 'sysname' (64-bit, 8 CPU) on 'hostname', ASCII.
;; God thank you, OpenLisp is back again!
? (fib 20)
;; elapsed time = 0.003s, (0 gc).
= 6765
? _
Alternatywne rozwiązania obejmują uruchamianie OpenLisp z Emacsa poprzez konfigurację Emacsa inferior-lisp-modelub użycie zintegrowanego środowiska programistycznego (IDE), które obsługuje składnię OpenLisp . LispIDE firmy DaanSystems robi to natywnie.
Technologia
Menedżer pamięci
Wewnętrznie OpenLisp wykorzystuje pamięć wirtualną do automatycznego przydzielania i rozszerzania obiektów. Małe obiekty tego samego typu są przydzielane za pomocą organizacji pamięci Bibop (BIg Bag Of Pages). Duże obiekty używają proxy, które wskazują na rzeczywisty obiekt w stercie Lisp. Konserwatywne wyrzucanie elementów bezużytecznych to znakowanie i przemiatanie ze stertą koalescencyjną (fazę przeszukiwania można skonfigurować tak, aby używała wątków ).
Typy danych
OpenLisp wykorzystuje architekturę tagowaną (znacznik 4 bity na 32-bit , tag 5 bit na 64-bit ) do szybkiego sprawdzania typu (mała liczba całkowita, liczba zmiennoprzecinkowa, symbol, wady, łańcuch, wektor). Małe liczby całkowite (28 bitów w 32-bitach, 59 bitów w 64-bitach) są nieopakowane , duże (32/64-bitowe) są w ramkach. Zgodnie z wymaganiami ISLISP, zaimplementowana jest również arytmetyka arbitralnej precyzji (bignum). Znaki (stąd ciągi) są albo 8-bitowe ( ANSI , EBCDIC ) albo 16/32-bitowe, jeśli włączona jest obsługa Unicode .
Ewaluator i kompilator
Jądro Lisp, natywny interpreter i podstawowe biblioteki są ręcznie kodowane w języku C , język pośredni LAP wytwarzany przez kompilator jest następnie tłumaczony na C przez generator kodu C backend .
Historia
W 1988 roku pierwszym motywem stojącym za OpenLispem było zaimplementowanie podzbioru Lisp w celu rozszerzenia EmACT, klonu Emacsa . ISLISP szybko stał się oczywistym wyborem. Nastąpił dalszy rozwój.
| Rok | Wersja | Główna cecha |
|---|---|---|
| 1988 | 1,0 | OpenLisp rozpoczął jako język zabawek o nazwie MLisp (Minimal Lisp), aby eksperymentować z pomysłami z procesu standardów ISLISP |
| 1993 | 3,3 | Pierwszy port na maszynie 64-bitowej ( DEC Alpha OSF/1 ); zmiana nazwy z MLisp na OpenLisp |
| 1994 | 4.0 | Pierwsze zastosowanie komercyjne |
| 1995 | 4,5 | Obsługa strumieni gniazd |
| 1997 | 5,7 | OpenLisp jest pierwszym Lispem, który wdrożył standard ISLISP ISO/IEC 13816:1997(E). |
| 1998 | 5,8 | Opcjonalna obsługa Unicode |
| 2000 | 6,6 | kompilator Lisp do LAP; LAP jest interpretowany przez maszynę wirtualną wbudowaną w OpenLisp; prędkość poprawiła się o 2x |
| 2003 | 7,5 | Lisp do backendu C; w stanie skompilować aplikację z wieloma plikami Lisp do samodzielnego pliku wykonywalnego; prędkość poprawiona z 10x do 20x |
| 2007 | 8,7 | Zmiany w celu dopasowania do wersji ISO/IEC 13816:2007(E) |
| 2010 | 9,2 | Obsługa arytmetyki natywnej liczby całkowitej arbitralnej precyzji |
| 2021 | 11.2 | Ostatnia wersja; dodano pełne rozszerzenie formatu CLtL; poprawić wykrywanie sterty; 2021-04-30 |
| 1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1, 1,5, LISP 2 (opuszczony) | ||||||||||||||
| Maclisp | ||||||||||||||
| Interlisp | ||||||||||||||
| MDL (język programowania) | ||||||||||||||
| Lisp Maszyna Lisp | ||||||||||||||
| Schemat | R5RS | R6RS | R7RS mały | |||||||||||
| ZERO | ||||||||||||||
| ZIL (język implementacji Zork) | ||||||||||||||
| Franz Lisp | ||||||||||||||
| Wspólne seplenienie | ||||||||||||||
| Le Lisp | ||||||||||||||
| T | ||||||||||||||
| Schemat Cheza | ||||||||||||||
| Emacs Lisp | ||||||||||||||
| AutoLISP | ||||||||||||||
| PicoLisp | ||||||||||||||
| EuLisp | ||||||||||||||
| ISLISP | ||||||||||||||
| OpenLisp | ||||||||||||||
| Schemat PLT | Rakieta | |||||||||||||
| GNU Guile | ||||||||||||||
| Wizualny LISP | ||||||||||||||
| Clojure | ||||||||||||||
| Łuk | ||||||||||||||
| LFE | ||||||||||||||
| Hy | ||||||||||||||
Porty
OpenLisp twierdzi, że jest niezwykle przenośny, działa na wielu systemach operacyjnych, w tym: Windows , większości opartych na Unix i POSIX ( Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , Cygwin , QNX ), DOS , OS/ 2 , Pocket PC , OpenVMS , z/OS . Sekcja pobierania oficjalnej strony zawiera ponad 50 różnych wersji.
Biblioteki standardowe
Złącza
OpenLisp może wchodzić w interakcje z modułami napisanymi w C przy użyciu obcego interfejsu funkcji (FFI), strumienie ISLISP są rozszerzone o obsługę gniazd sieciowych ( ./netkatalog zawiera przykłady protokołu Hypertext Transfer Protocol (http), JavaScript Object Notation (JSON), Post Office Protocol 3 (POP3) , Simple Mail Transfer Protocol (SMTP), Telnet , Rss ), uproszczony czytnik Extensible Markup Language ( XML ) może konwertować XML na Lisp. Podstawowy moduł SQL może być używany z MySQL , Odbc , SQLite , PostgreSQL . Moduł wartości rozdzielanych przecinkami (CSV) może odczytywać i zapisywać pliki CSV.
Narzędzia
Narzędzia programistyczne obejmują rejestrowanie danych , pretty-printer , profiler , projektowanie według programowania kontraktowego i testy jednostkowe .
Algorytmy
Niektóre dobrze znane algorytmy są dostępne w ./contribkatalogu (Gdańska za simplex algorytm , Algorytm Dijkstry , Ford-Fulkerson algorytm ). Moduły dostarczane są z licencjami BSD .
Pochodzenie nazwy
Przedrostek Open odnosi się do systemów otwartych, a nie do modelu open source .
Nazwa została wybrana w 1993 roku, aby zastąpić wewnętrzną nazwę kodową MLisp, która była już używana przez Gosling Emacs (jako następcę Mocklisp ).
Język programowania OpenLisp różni się od OpenLISP, projektu rozpoczętego w 1997 roku w celu wdrożenia protokołu separacji lokalizatora/identyfikatora .
Kompilator
W tej sekcji opisano, jak kompilator przekształca kod Lisp na C.
Kod źródłowy
Funkcja liczby Fibonacciego (ta klasyczna definicja używana w większości testów porównawczych nie jest najbardziej wydajnym sposobem obliczania fib)
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
Kod pośredni LAP
Kompilator Lisp tłumaczy kod źródłowy Lisp na następujący kod pośredni. Po nim następuje przebieg optymalizacji wizjera, który wykorzystuje ten format pośredni do analizy i optymalizacji instrukcji. Po optymalizacji ostateczny kod LAP to:
((fentry fib 1 0 0)
(param 0)
(jeq _l004 '1)
(jneq _l003 '2)
(move a1 '1)
(return)
_l003
(gsub1 a1)
(recurse 1)
(move a2 a1)
(param 0)
(gsub a1 '2)
(recurse 1)
(gadd a2 a1)
_l004
(return)
(end))
Tłumaczenie kodu C
Wreszcie generator kodu C używa kodu LAP do tłumaczenia instrukcji w C.
static POINTER
OLDEFCOMPILED1(olfib_00, p1) {
POINTER a1;
POINTER VOLATILE a2;
ollapenter(SN_OLFIB_00);
a1 = p1;
if (eq(a1, olmakefix(1))) goto _l004;
if (!eq(a1, olmakefix(2))) goto _l003;
ollapleave(SN_OLFIB_00);
return olmakefix(1);
_l003:
a1 = ollapgsub(a1, olmakefix(1));
a2 = olfib_00(a1);
a1 = ollapgsub(p1, olmakefix(2));
a1 = olfib_00(a1);
a1 = ollapgadd(a2, a1);
_l004:
ollapleave(SN_OLFIB_00);
return a1;
}
Przewodnik po stylach
Długość linii
OpenLisp akceptuje wiersze o nieograniczonej długości. Zalecanym stylem jest to, że każdy wiersz tekstu w kodzie powinien mieć maksymalnie 80 znaków w wierszu .
Przyjęcie
Został wybrany przez SDF Public Access Unix System non-profit, publiczne systemy uniksowe w Internecie jako jeden z języków programowania dostępnych online.
Bricsys używa OpenLisp do implementacji AutoLISP w swoim systemie komputerowego wspomagania projektowania (CAD) Bricscad .
MEVA jest w całości napisana przy użyciu OpenLisp.
Università degli Studi di Palermo używa OpenLisp do nauczania języka Lisp.