OpenLisp - OpenLisp
|
OpenLisp körs inuti Emacs
| |
| Paradigm | Multiparadigm : funktionellt , procedurellt , objektorienterat , reflekterande , meta |
|---|---|
| Familj | Läspa |
| Designad av | Christian Jullien |
| Utvecklare | Christian Jullien |
| Första gången dök upp | April 1988 |
| Stabil frisättning | 11.2.0 / 6 augusti 2021
|
| Skrivdisciplin | Dynamisk , stark |
| Implementeringsspråk | C , OpenLisp |
| Plattform | x86 , x86-64 , IA-64 , SPARC , PowerPC , MIPS , Alpha , PA-RISC , ARM , AArch64 , RISC-V |
| OS | Windows , de flesta Unix -baserade, Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP -UX , AIX , QNX , DOS , OS/2 , Pocket PC , OpenVMS , z/OS , Cygwin |
| Licens | Proprietär |
| Hemsida | www |
| Påverkad av | |
| Lisp , ISLISP | |
OpenLisp är ett programmeringsspråk i familjen Lisp som utvecklats av Christian Jullien från Eligis . Den överensstämmer med den internationella standarden för ISLISP publicerad tillsammans av International Organization for Standardization (ISO) och International Electrotechnical Commission (IEC), ISO/IEC 13816: 1997 (E), reviderad till ISO/IEC 13816: 2007 (E).
Den är skriven på programmeringsspråken C och Lisp och körs på de flesta vanliga operativsystem . OpenLisp betecknas som en ISLISP -implementering , men innehåller också många Common Lisp -kompatibla tillägg (hashtable, readtable, package, defstruct, sekvenser, rationella nummer) och andra bibliotek ( nätverksuttag , reguljärt uttryck , XML , Portable Operating System Interface ( POSIX ), SQL , Lightweight Directory Access Protocol (LDAP)).
OpenLisp inkluderar en tolk som hör samman med en läs-eval-print loop (REPL), en Lisp Assembly Program (LAP) och en backend kompilator för språket C .
Mål
Huvudmålet med denna Lisp -version är att implementera ett fullt kompatibelt ISLISP -system (när det lanseras med -islispflagga är det strikt begränsat till ISO/IEC 13816: 2007 (E) -specifikationen). Det sekundära målet är att tillhandahålla ett komplett inbyggbart Lisp -system som kan länkas till C/ C ++ eller Java (via Java Native Interface (JNI)). En återuppringningsmekanism används för att kommunicera med det externa programmet. Andra mål är att vara användbara som skriptspråk eller limspråk och att producera fristående programkörbara filer.
Licens
Trots sitt namn är OpenLisp proprietär programvara . Dess tolk är tillgänglig gratis för icke -kommersiell användning.
Användargränssnitt
OpenLisp körs huvudsakligen i konsolläge: cmd.exepå Microsoft Windows och terminalemulator på Unix -baserade system.
;; 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
? _
Alternativa lösningar inkluderar kör OpenLisp från Emacs via inrätta Emacs inferior-lisp-modeeller med hjälp av en integrerad utvecklingsmiljö (IDE) som stöder OpenLisp syntax . LispIDE by DaanSystems gör det inbyggt.
Teknologi
Minneshanterare
Internt använder OpenLisp virtuellt minne för att automatiskt tilldela och utöka objekt. Små objekt av samma typ tilldelas med hjälp av en Bibop (BIg Bag Of Pages) minnesorganisation. Stora objekt använder en proxy som pekar på det riktiga objektet i Lisp -hög. Den konservativa sopsamlingen är ett märke och svep med sammanfogande hög (svepningsfas kan konfigureras för att använda trådar ).
Datatyper
OpenLisp använder taggad arkitektur (4 bitars tagg på 32-bitars , 5 bitars tagg på 64-bitars ) för snabb typkontroll (litet heltal, float, symbol, nackdelar, sträng, vektor). Små heltal (28 bitar på 32-bitars, 59 bitar på 64-bitars) är oboxade , stora (32/64-bitars) heltal är inramade. Såsom krävs av ISLISP implementeras också godtycklig precision aritmetik (bignums). Tecken (därav strängar) är antingen 8-bitars ( ANSI , EBCDIC ) eller 16/32-bitar om Unicode- stöd är aktiverat.
Utvärderare och kompilator
Lisp Kernel, native tolk och grundbibliotek är handkodade på språket C , LAP -mellanspråk som produceras av kompilatorn översätts sedan till C av C -backend -kodgeneratorn .
Historia
1988 var det allra första motivet bakom OpenLisp att implementera en Lisp -delmängd för att förlänga EmACT, en Emacs -klon. ISLISP blev snabbt ett självklart val. Ytterligare utveckling följde.
| År | Version | Huvud funktion |
|---|---|---|
| 1988 | 1.0 | OpenLisp börjat som en leksak språk som heter MLisp (Minimal Lisp) att experimentera med idéer från ISLISP standarder process |
| 1993 | 3.3 | Första porten på 64-bitars maskin ( DEC Alpha OSF/1 ); namnändring från MLisp till OpenLisp |
| 1994 | 4.0 | Första kommersiella användningen |
| 1995 | 4.5 | Socket streams stöd |
| 1997 | 5.7 | OpenLisp är den första Lisp som implementerar standarden ISLISP ISO/IEC 13816: 1997 (E). |
| 1998 | 5.8 | Unicode valfritt stöd |
| 2000 | 6.6 | Lisp till LAP -kompilator; LAP tolkas av en virtuell maskin inbäddad i OpenLisp; hastigheten förbättrades ca 2x |
| 2003 | 7.5 | Lisp till C backend; kunna kompilera en applikation med många Lisp -filer till en fristående körbar; hastigheten förbättrades från 10x till 20x |
| 2007 | 8.7 | Ändringar för att matcha ISO/IEC 13816: 2007 (E) revision |
| 2010 | 9.2 | Ursprungligt heltal godtyckligt precision aritmetiskt stöd |
| 2021 | 11.2 | Senaste versionen; lagt till komplett tillägg i CLtL -format; förbättra högdetektering; 2021-04-30 |
| 1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1, 1.5, LISP 2 (övergiven) | ||||||||||||||
| Maclisp | ||||||||||||||
| Interlisp | ||||||||||||||
| MDL (programmeringsspråk) | ||||||||||||||
| Lisp Machine Lisp | ||||||||||||||
| Schema | R5RS | R6RS | R7RS liten | |||||||||||
| NOLL | ||||||||||||||
| ZIL (Zork Implementation Language) | ||||||||||||||
| Franz Lisp | ||||||||||||||
| Vanlig Lisp | ||||||||||||||
| Le Lisp | ||||||||||||||
| T | ||||||||||||||
| Chez Scheme | ||||||||||||||
| Emacs Lisp | ||||||||||||||
| AutoLISP | ||||||||||||||
| PicoLisp | ||||||||||||||
| EuLisp | ||||||||||||||
| ISLISP | ||||||||||||||
| OpenLisp | ||||||||||||||
| PLT -schema | Racket | |||||||||||||
| GNU Guile | ||||||||||||||
| Visuell LISP | ||||||||||||||
| Clojure | ||||||||||||||
| Båge | ||||||||||||||
| LFE | ||||||||||||||
| Hy | ||||||||||||||
Hamnar
OpenLisp hävdar att den är extremt bärbar, den körs på många operativsystem inklusive: Windows , de flesta Unix- och POSIX- baserade ( Linux , macOS , FreeBSD , OpenBSD , NetBSD , Solaris , HP-UX , AIX , Cygwin , QNX ), DOS , OS/ 2 , Pocket PC , OpenVMS , z/OS . Den officiella hemsidan för nedladdning innehåller över 50 olika versioner.
Standardbibliotek
Anslutningar
OpenLisp kan interagera med moduler skrivna i C med gränssnitt för främmande funktioner (FFI), ISLISP -strömmar utökas för att stödja nätverksuttag ( ./netkatalogen innehåller prover för Hypertext Transfer Protocol (http), JavaScript Object Notation (JSON), Post Office Protocol 3 (POP3) , Simple Mail Transfer Protocol (SMTP), Telnet , Rss ), en förenklad XML -läsare ( Extensible Markup Language ) kan konvertera XML till Lisp. En grundläggande SQL -modul kan användas med MySQL , Odbc , SQLite , PostgreSQL . En kommaseparerad värde (CSV) -modul kan läsa och skriva CSV-filer.
Verktyg
Utvecklarverktyg inkluderar dataloggning , snygg skrivare , profiler , design genom kontraktsprogrammering och enhetstester .
Algoritmer
Några välkända algoritmer finns tillgängliga i ./contribkatalogen (Dantzigs simplexalgoritm , Dijkstras algoritm , Ford – Fulkerson -algoritm ). Moduler levereras med BSD -licenser .
Ursprung för namn
Prefixet Öppen refererar till öppna system, inte till modellen med öppen källkod .
Namnet valdes 1993 för att ersätta MLisp interna kodnamn som redan användes av Gosling Emacs (som efterträdare av Mocklisp ).
OpenLisp programmeringsspråk är annorlunda än OpenLISP, ett projekt som startades 1997 för att implementera Locator/Identifier Separation Protocol .
Kompilator
Det här avsnittet beskriver hur en kompilator omvandlar Lisp -kod till C.
Källkod
Den Fibonacci nummer funktionen (denna klassiska definition som används i de flesta riktmärken är inte det mest effektiva sättet att beräkna fib)
(defun fib (n)
(cond ((eq n 1) 1)
((eq n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2))))))
LAP -mellanliggande kod
Lisp -kompilatorn översätter Lisp -källkoden till följande mellankod. Det följs av ett titthålsoptimeringspass som använder detta mellanliggande format för att analysera och optimera instruktioner. Efter optimering är den sista LAP -koden:
((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))
C -kodöversättning
Slutligen använder C -kodgenerator LAP -kod för att översätta instruktioner i 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;
}
Stil guide
Linjelängd
OpenLisp accepterar linjer med obegränsad längd. Den rekommenderade stilen är att varje textrad i koden ska ha högst 80 tecken per rad .
Adoption
Det har valts av SDF Public Access Unix System ideella offentliga Unix -system på Internet som ett av dess programmeringsspråk som är tillgängliga online.
Bricsys använder OpenLisp för att implementera AutoLISP i sitt Bricscad dator-aided design (CAD) -system.
MEVA är helt skrivet med OpenLisp.
Università degli Studi di Palermo använder OpenLisp för att lära ut Lisp.