åbenlisp | |
---|---|
| |
Type | Kompiler , tolk |
Forfatter | Christian Julien |
Skrevet i | C og OpenLisp |
Operativ system | Windows, Linux, MacOS, Solaris, HP-UX, AIX, OpenBSD, FreeBSD, NetBSD, PocketPC, QNX, VMS, Z/OS, Cygwin |
Første udgave | april 1988 |
Hardware platform | x86, x86_64, ia64, sparc, sparcv9, PowerPC, mips, alpha, parisc, ARM, AArch64 |
nyeste version | 10.3.0 (5. marts 2017 ) |
Licens | Proprietær software |
Internet side | eligis.com |
OpenLisp er et programmeringssprog i Lisp -familien af sprog udviklet af Christian Julien. [1] Den overholder [2] [3] [4] ISO ISLISP- standarden ( ISO/IEC 13816:1997(E) Arkiveret 10. april 2016 på Wayback Machine [5] revideret af ISO/IEC 13816:2007(E) ) Arkiveret 30. juli 2016 på Wayback Machine , udgivet af ISO ).
Kernen er skrevet i C og Lisp og kører på de fleste styresystemer. OpenLisp er en implementering af ISLISP- standarden, men indeholder også en række Common Lisp- kompatible udvidelser (hash-tabeller, læsetabeller, pakker, strukturer, sekvenser, rationaler) og en række biblioteker ( sockets , regulære udtryk , XML , Posix , SQL LDAP ) . [6]
OpenLisp inkluderer en fortolker til interaktiv udvikling ( REPL ), en compiler til et Lisp Assembly Program (LAP) og en kodegenerator, der konverterer LAP til C-kode.
Målene med at skabe denne dialekt af Lisp var:
Oprindeligt havde sproget et internt navn MLisp. I 1993 blev dette navn ændret til OpenLisp, da det viste sig, at MLisp allerede var i brug i Gosling Emacs .
I begyndelsen af 1990'erne blev ordet "åben" ("åben") i applikationen til informationsteknologi oftere brugt til at henvise til systemer, der implementerer åbne specifikationer for grænseflader, tjenester og dataformater, som giver dig mulighed for at bruge disse systemer uden kunstige begrænsninger, skabe interoperable og/eller software, der interagerer med dem (dette er den betydning, som udtrykket bruges i definitionen af " åbent computersystem "). Denne forestilling om "åbenhed" er i overensstemmelse med designmålene for OpenLisp (se ovenfor), ligesom det er det faktum, at den implementerer ISLISP-standarden. [7]
Sprogets navn er således tiltænkt at symbolisere dets åbenhed for brug, men har intet at gøre med Open Source Initiative eller fri software generelt. OpenLisp-miljøet har altid været og bliver fortsat udgivet under en proprietær licens . Nogle af kildeteksterne er lukkede.
OpenLisp-sproget må ikke forveksles med OpenLISP-projektet, der startede i 1997 for at implementere Locator/Identifier Separation Protocol .
OpenLisp er proprietær software . Tolken er gratis tilgængelig til ikke-kommerciel brug.
En del af systemets kildekode er tilgængelig under gratis licenser (GNU GPL, BSD) eller er i det offentlige domæne . Separat licenseret og leveret mod et gebyr er den kildekode, der er nødvendig for at integrere OpenLisp i systemer skrevet i C/C++.
OpenLisp-fortolkeren køres oprindeligt i konsoltilstand (i Cmd på Microsoft Windows eller fra en terminalemulator på Unix -lignende systemer).
;; OpenLisp v9.xy (Build: XXXX) af C. Jullien [Jan 01 20xx - 10:49:13] ;; Copyright (c) Eligis - 1988-20xx. ;; System 'sysname' (64bit, 8 CPU) på 'værtsnavn', ASCII. ;; Gud tak, OpenLisp er tilbage igen! ? ( fib 20 ) ;; forløbet tid = 0,003s, (0gc). = 6765 ? _Det er også muligt at køre REPL under Emacs (du skal initialisere variablen med inferior-lisp-modestien til den binære fil i OpenLisp-fortolkeren). LispIDE by DaanSystems har indbygget understøttelse af OpenLisp-syntaksen.
OpenLisp bruger en virtuel hukommelsesmekanisme til automatisk at allokere og ændre hukommelsen af objekter. Små genstande af samme type placeres ved hjælp af BIBOP (BIg Bag Of Pages) teknologi. For at allokere store objekter bruges proxy- objekter , som peger på det rigtige objekt i Lisp- heapen . Den konservative skraldeopsamler bruger en mark and sweep- teknik og kan konfigureres til at understøtte multithreading .
OpenLisp bruger en tag-arkitektur (4-bit tag på 32-bit, 5-bit tag på 64-bit ord) til hurtig typekontrol (lille heltal, float, symbol, ulemper, streng, vektor). Korte heltal (28 bit på et 32-bit ord, 59 bit på et 64-bit ord) lagres upakkede, lange heltal (32 bit / 64 bit) lagres pakket. Som krævet af ISLISP er bignums også implementeret . Tegn (og dermed strenge) kan enten være 8-bit ( ANSI , EBCDIC ) eller 16/32-bit, hvis Unicode - understøttelse er aktiveret .
Kernen, tolken og kernebibliotekerne er håndskrevne i C. Compileren konverterer kildeteksten til et mellemsprog LAP, som derefter oversættes af kodegeneratoren til C , som igen kan kompileres af enhver C-oversætter af målplatformen.
År | Version | Store ændringer |
---|---|---|
1988 | 1.0 | Projektet startede som et forskningssprog kaldet MLisp (Minimal Lisp) for at eksperimentere med ideer fra den kommende ISLISP- standard . I 1988 var hovedmotivet at implementere Lisp for at udvide EmACT , en klon af Emacs . ISLISP viste sig at være det bedst egnede valg. |
1993 | 3.3 | Første port til 64-bit arkitektur ( DEC Alpha OSF/1). Navneændring til OpenLisp. |
1994 | 4.0 | Første kommercielle brug. |
1995 | 4.5 | Implementeret støtte til stikkontakter. |
1997 | 5.7 | OpenLisp var den første implementering af ISLISP ISO/IEC 13816:1997(E) standarden. [9] |
1998 | 5.8 | Implementeret Unicode- understøttelse . |
2000 | 6.6 | Compiler i LAP. LAP'er fortolkes af den virtuelle maskine, der er en del af systemet. Ydelsen er blevet fordoblet. |
2003 | 7.5 | Implementeret "Lisp to C" back-end. Det blev tilgængeligt til at kompilere Lisp-programmer med flere filer til et eksekverbart modul. Hastigheden er steget 10-20 gange. |
2007 | 8.7 | Opdateret på grund af ny ISO/IEC 13816:2007(E) Arkiveret 30. juli 2016 på Wayback Machine . |
2010 | 9.2 | Implementering af heltalsaritmetik med ubegrænset præcision. |
2017 | 10.3 | Nuværende version (2017-03-05). |
OpenLisp er meget bærbar og kan køre på mange operativsystemer: Microsoft Windows , de fleste Unix - baserede systemer , QNX , MS-DOS , OS/2 , Pocket PC , OpenVMS , z/OS . Mere end 50 forskellige versioner er tilgængelige til download på den officielle hjemmeside.
OpenLisp kan kommunikere med moduler skrevet i C ved hjælp af FFI , ISLISP I/O-streams er udvidet til at understøtte netværkssockets. Biblioteket ./neti det installerede system indeholder eksempler på arbejde med Http , Json , Pop3 , Smtp , Telnet , Rss . En simpel XML- læser kan konvertere XML til Lisp-lister. Det underliggende SQL - modul kan bruges til at få adgang til MySQL , Odbc , SQLite , PostgreSQL . CSV - modulet giver dig mulighed for at læse og skrive filer i CSV-format.
Udviklingsværktøjer omfatter logning, kodeformatering, en profiler , support til kontraktprogrammering og enhedstestning .
./contribImplementeringer af nogle velkendte algoritmer er tilgængelige i kataloget ( simplex-algoritme , Dijkstras algoritme , Ford-Fulkerson-algoritme og andre). Modulerne leveres under BSD-licensen .
Dette afsnit beskriver, hvordan du transformerer Lisp-kode til C-kode i OpenLisp.
Som et eksempel bruges en rekursiv funktion, fibder udfører beregningen af det n'te Fibonacci-tal (dette er den klassiske definition, der bruges i mange benchmarks, og er ikke den mest effektive til rigtige beregninger).
( defun fib ( n ) ( cond (( eq n 1 ) 1 ) (( eq n 2 ) 1 ) ( t ( + ( fib ( - n 1 )) ( fib ( - n 2 ))))))Compileren oversætter Lisp-kildekoden til mellemkode i LAP-listeformat, som er udsat for lokal optimering ( eng. peephole optimization ). Efter optimering ser den resulterende LAP-kode sådan ud:
(( 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 ))Endelig konverterer kodegeneratoren LAP-koden til C-instruktioner.
statisk POINTER OLDEFCOMPILED1 ( olfib_00 , p1 ) { PUNKT a1 ; PUNKER FLYGTIG 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 ( al ); a1 = ollapgsub ( pl , olmakefix ( 2 ) ); a1 = olfib_00 ( al ); a1 = ollapgadd ( a2 , a1 ); _l004 : ollapleave ( SN_OLFIB_00 ); returnere ( a1 ); }Ovenstående kodestykke indeholder kun selve den genererede C-kode. For at få en eksekverbar fil skal denne kode være indlejret i det relevante miljø og kompileret med de biblioteker, der er en del af OpenLisp-miljøet.
Ifølge dataene på siden af forfatteren af systemet Arkiveret 27. februar 2021 på Wayback Machine (dog forældet - de angivne materialer henviser til version 7.9, mens den nuværende version for 2018 er 10.3), sammenlignet med to andre implementeringer af ISLISP, er OpenLisp på samme niveau eller noget hurtigere i fortolkningstilstand og betydeligt (10-20 gange) hurtigere i kompileret applikationshastighed.
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Egenskaber |
| ||||||||||||||
Implementeringer |
| ||||||||||||||
Hardware |
| ||||||||||||||
Fællesskab |
| ||||||||||||||
|