OpenLisp - OpenLisp

OpenLisp
OpenLisp in esecuzione all'interno di GNU Emacs.jpg
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 ; 33 anni fa ( 1988-04 )
Rilascio stabile
11.2.0 / 6 agosto 2021 ; 0 giorni fa ( 2021-08-06 )
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 .eligis .com
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.

Pietre miliari di OpenLisp
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

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.

Riferimenti

link esterno