OpenLisp - OpenLisp
|
OpenLisp in esecuzione all'interno di Emacs
| |
| Paradigmi | Multiparadigma : funzionale , procedurale , orientato agli oggetti , riflessivo , meta |
|---|---|
| Famiglia | Lisp |
| Progettato da | Christian Jullien |
| Sviluppatore | Christian Jullien |
| Apparso per la prima volta | aprile 1988 |
| Rilascio stabile | 11.2.0 / 6 agosto 2021
|
| Disciplina di digitazione | Dinamico , forte |
| Linguaggio di implementazione | C , OpenLisp |
| piattaforma | x86 , x86-64 , IA-64 , SPARC , PowerPC , MIPS , Alpha , PA-RISC , ARM , AArch64 , RISC-V |
| OS | Windows , la maggior parte basata su Unix , Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , QNX , DOS , OS/2 , Pocket PC , OpenVMS , z/OS , Cygwin |
| Licenza | proprietario |
| Sito web | www |
| Influenzato da | |
| Lisp , ISLISP | |
OpenLisp è un linguaggio di programmazione della famiglia Lisp sviluppato da Christian Jullien di Eligis . È conforme allo standard internazionale per ISLISP pubblicato congiuntamente dall'International Organization for Standardization (ISO) e dalla International Electrotechnical Commission (IEC), ISO/IEC 13816:1997(E), rivisto in ISO/IEC 13816:2007(E).
Scritto nei linguaggi di programmazione C e Lisp, funziona sui sistemi operativi più comuni . OpenLisp è designato come implementazione ISLISP , ma contiene anche molte estensioni compatibili con Common Lisp (hashtable, readtable, package, defstruct, sequenze, numeri razionali) e altre librerie ( socket di rete , espressioni regolari , XML , Portable Operating System Interface ( POSIX ), SQL , protocollo LDAP ( Lightweight Directory Access Protocol )).
OpenLisp include un interprete associato a un ciclo read–eval–print (REPL), un Lisp Assembly Program (LAP) e un compilatore di backend per il linguaggio C .
Obiettivi
L'obiettivo principale di questa versione Lisp è implementare un sistema ISLISP pienamente conforme (quando lanciato con -islispflag, è strettamente limitato alla specifica ISO/IEC 13816:2007(E)). L'obiettivo secondario è fornire un sistema Lisp integrabile completo collegabile a C/ C++ o Java (tramite Java Native Interface (JNI)). Un meccanismo di callback viene utilizzato per comunicare con il programma esterno. Altri obiettivi sono essere utilizzabili come linguaggio di scripting o linguaggio di incollaggio e produrre eseguibili di programmi autonomi .
Licenza
Nonostante il nome , OpenLisp è un software proprietario . Il suo interprete è disponibile gratuitamente per qualsiasi uso non commerciale.
Interfaccia utente
OpenLisp funziona principalmente in modalità console: cmd.exesu Microsoft Windows ed emulatore di terminale su sistemi basati su 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
? _
Le soluzioni alternative includono l'esecuzione di OpenLisp da Emacs tramite la configurazione di Emacs inferior-lisp-modeo l'utilizzo di un ambiente di sviluppo integrato (IDE) che supporta la sintassi OpenLisp . LispIDE di DaanSystems lo fa in modo nativo.
Tecnologia
Gestore della memoria
Internamente, OpenLisp utilizza la memoria virtuale per allocare ed estendere automaticamente gli oggetti. Piccoli oggetti dello stesso tipo vengono allocati utilizzando un'organizzazione di memoria Bibop (BIg Bag Of Pages). Gli oggetti di grandi dimensioni utilizzano un proxy che punta all'oggetto reale nell'heap Lisp. La Garbage Collection conservativa è un mark and sweep con heap coalescente (la fase di sweep può essere configurata per l'uso di thread ).
Tipi di dati
OpenLisp utilizza un'architettura con tag (tag a 4 bit su 32 bit , tag a 5 bit su 64 bit ) per il controllo veloce del tipo (piccolo numero intero, float, simbolo, contro, stringa, vettore). Gli interi piccoli (28 bit su 32 bit, 59 bit su 64 bit) sono unboxed , gli interi grandi ( 32/64 bit) sono boxed. Come richiesto dall'ISLISP, vengono implementate anche aritmetiche a precisione arbitraria (bignum). I caratteri (quindi le stringhe) sono a 8 bit ( ANSI , EBCDIC ) oa 16/32 bit se è abilitato il supporto Unicode .
Valutatore e compilatore
Il Lisp Kernel, nativo di interprete e le librerie di base sono codificate nel linguaggio mano C , Giro lingua intermedia prodotta dal compilatore viene poi tradotto in C dal C backend generatore di codice .
Storia
Nel 1988, il primo vero motivo alla base di OpenLisp è stato quello di implementare un sottoinsieme Lisp per estendere EmACT, un clone di Emacs . ISLISP è diventata rapidamente una scelta ovvia. Seguì un ulteriore sviluppo.
| Anno | Versione | Caratteristica principale |
|---|---|---|
| 1988 | 1.0 | OpenLisp è nato come linguaggio giocattolo chiamato MLisp (Minimal Lisp) per sperimentare idee dal processo degli standard ISLISP |
| 1993 | 3.3 | Prima porta su macchina a 64 bit ( DEC Alpha OSF/1 ); cambio di nome da MLisp a OpenLisp |
| 1994 | 4.0 | Primo uso commerciale |
| 1995 | 4.5 | Supporto per flussi socket |
| 1997 | 5.7 | OpenLisp è il primo Lisp ad implementare lo standard ISLISP ISO/IEC 13816:1997(E). |
| 1998 | 5.8 | Supporto opzionale Unicode |
| 2000 | 6.6 | Compilatore da Lisp a LAP; LAP è interpretato da una macchina virtuale incorporata in OpenLisp; velocità migliorata di circa 2x |
| 2003 | 7.5 | backend da Lisp a C; in grado di compilare un'applicazione con molti file Lisp in un eseguibile autonomo; velocità migliorata da 10x a 20x |
| 2007 | 8.7 | Modifiche per adeguarsi alla revisione ISO/IEC 13816:2007(E) |
| 2010 | 9.2 | Supporto aritmetico a precisione arbitraria di numeri interi nativi |
| 2021 | 11.2 | Ultima versione; aggiunta estensione completa del formato CLtL; migliorare il rilevamento dell'heap; 2021-04-30 |
| 1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1, 1.5, LISP 2 (abbandonato) | ||||||||||||||
| Maclisp | ||||||||||||||
| Interlisp | ||||||||||||||
| MDL (linguaggio di programmazione) | ||||||||||||||
| Lisp macchina Lisp | ||||||||||||||
| schema | R5RS | R6RS | R7RS piccolo | |||||||||||
| NIL | ||||||||||||||
| ZIL (linguaggio di implementazione di Zork) | ||||||||||||||
| Franz Lisp | ||||||||||||||
| Lispa comune | ||||||||||||||
| Le Lisp | ||||||||||||||
| T | ||||||||||||||
| Schema Chez | ||||||||||||||
| Emacs Lisp | ||||||||||||||
| AutoLISP | ||||||||||||||
| PicoLisp | ||||||||||||||
| EuLisp | ||||||||||||||
| ISLISP | ||||||||||||||
| OpenLisp | ||||||||||||||
| Schema PLT | Racchetta | |||||||||||||
| GNU Guile | ||||||||||||||
| LISP visivo | ||||||||||||||
| Clojure | ||||||||||||||
| Arco | ||||||||||||||
| LFE | ||||||||||||||
| Hy | ||||||||||||||
porti
OpenLisp afferma di essere estremamente portabile, funziona su molti sistemi operativi tra cui: Windows , la maggior parte basati su Unix e POSIX ( Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , Cygwin , QNX ), DOS , OS/ 2 , Pocket PC , OpenVMS , z/OS . La sezione download del sito ufficiale contiene oltre 50 versioni diverse.
Librerie standard
Connettori
OpenLisp può interagire con i moduli scritti in C utilizzando l'interfaccia di funzione esterna (FFI), i flussi ISLISP sono estesi per supportare il socket di rete (la ./netdirectory include esempi per Hypertext Transfer Protocol (http), JavaScript Object Notation (JSON), Post Office Protocol 3 (POP3) , Simple Mail Transfer Protocol (SMTP), Telnet , Rss ), un lettore XML (Extensible Markup Language ) semplificato può convertire XML in Lisp. Un modulo SQL di base può essere utilizzato con MySQL , Odbc , SQLite , PostgreSQL . Un modulo con valori separati da virgole (CSV) può leggere e scrivere file CSV.
Strumenti
Gli strumenti per sviluppatori includono registrazione dei dati , pretty-printer , profiler , programmazione design by contract e unit test .
Algoritmi
Alcuni algoritmi ben noti sono disponibili nella ./contribdirectory (di Dantzig algoritmo simplex , l'algoritmo di Dijkstra , Ford-Fulkerson algoritmo ). I moduli vengono spediti utilizzando le licenze BSD .
Origine del nome
Il prefisso Open si riferisce a sistemi aperti non al modello open-source .
Il nome è stato scelto nel 1993 per sostituire il nome in codice interno MLisp che era già utilizzato da Gosling Emacs (come successore di Mocklisp ).
Il linguaggio di programmazione OpenLisp è diverso da OpenLISP, un progetto iniziato nel 1997 per implementare il protocollo di separazione Locator/Identifier .
compilatore
Questa sezione descrive come un compilatore trasforma il codice Lisp in C.
Codice sorgente
La funzione del numero di Fibonacci (questa definizione classica utilizzata nella maggior parte dei benchmark non è il modo più efficiente per calcolare fib)
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
Codice intermedio LAP
Il compilatore Lisp traduce il codice sorgente Lisp nel seguente codice intermedio. È seguito da un passaggio di ottimizzazione spioncino che utilizza questo formato intermedio per analizzare e ottimizzare le istruzioni. Dopo l'ottimizzazione, il codice LAP finale è:
((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))
Traduzione del codice C
Infine, il generatore di codice C utilizza il codice LAP per tradurre le istruzioni in 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;
}
Guida di stile
Lunghezza della linea
OpenLisp accetta linee di lunghezza illimitata. Lo stile consigliato è che ogni riga di testo nel codice dovrebbe contenere al massimo 80 caratteri per riga .
Adozione
È stato scelto da SDF Public Access Unix System senza scopo di lucro per i sistemi Unix ad accesso pubblico su Internet come uno dei suoi linguaggi di programmazione disponibili online.
Bricsys utilizza OpenLisp per implementare AutoLISP nel suo sistema CAD ( computer-aided design ) Bricscad .
MEVA è interamente scritto con OpenLisp.
L'Università degli Studi di Palermo utilizza OpenLisp per insegnare Lisp.