OpenLisp - OpenLisp

OpenLisp
OpenLisp działający wewnątrz GNU Emacs.jpg
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 ; 33 lata temu ( 1988-04 )
Wersja stabilna
11.2.0 / 6 sierpnia 2021 ; 0 dni temu ( 2021-08-06 )
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 .eligis .com
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.

Kamienie milowe OpenLisp
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

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.

Bibliografia

Linki zewnętrzne