openlisp | |
---|---|
OpenLisp běžící v prostředí Emacs | |
Typ | Překladač , interpret |
Autor | Christian Julien |
Zapsáno v | C a OpenLisp |
Operační systém | Windows, Linux, MacOS, Solaris, HP-UX, AIX, OpenBSD, FreeBSD, NetBSD, PocketPC, QNX, VMS, Z/OS, Cygwin |
První vydání | dubna 1988 |
Hardwarová platforma | x86, x86_64, ia64, sparc, sparcv9, PowerPC, mips, alpha, parisc, ARM, AArch64 |
Nejnovější verze | 10.3.0 (5. března 2017 ) |
Licence | Proprietární software |
webová stránka | eligis.com |
OpenLisp je programovací jazyk z rodiny jazyků Lisp vyvinutých Christianem Julienem. [1] Vyhovuje [2] [3] [4] normě ISO ISLISP ( ISO/IEC 13816:1997(E) Archivováno 10. dubna 2016 na Wayback Machine [5] revidované podle ISO/IEC 13816:2007(E ) Archivováno 30. července 2016 na Wayback Machine , vydavatelství ISO ).
Jádro je napsáno v C a Lisp a běží na většině operačních systémů. OpenLisp je implementací standardu ISLISP , ale obsahuje také řadu rozšíření kompatibilních s Common Lisp (hashovací tabulky, čtecí tabulky, balíčky, struktury, sekvence, racionality) a řadu knihoven ( sockety , regulární výrazy , XML , Posix , SQL , LDAP ) . [6]
OpenLisp obsahuje interpret pro interaktivní vývoj ( REPL ), kompilátor do Lisp Assembly Program (LAP) a generátor kódu, který převádí LAP na kód C.
Cíle vytvoření tohoto dialektu Lisp byly:
Zpočátku měl jazyk interní název MLisp. V roce 1993 byl tento název změněn na OpenLisp, protože se ukázalo, že MLisp byl již používán v Gosling Emacs .
Na počátku 90. let se slovo „otevřený“ („otevřený“) v aplikaci pro informační technologie častěji používalo k označení systémů, které implementují otevřené specifikace pro rozhraní, služby a datové formáty, což umožňuje používat tyto systémy bez umělých omezení, vytvářet interoperabilní a/nebo software, který s nimi interaguje (v tomto smyslu je tento termín používán v definici „ otevřeného počítačového systému “). Tento pojem „otevřenosti“ je v souladu s cíli návrhu OpenLisp (viz výše), stejně jako skutečnost, že implementuje standard ISLISP. [7]
Název jazyka má tedy symbolizovat jeho otevřenost pro použití, ale nemá nic společného s Open Source Initiative nebo svobodným softwarem obecně. Prostředí OpenLisp vždy bylo a je vydáváno pod proprietární licencí . Některé zdrojové texty jsou uzavřené.
Jazyk OpenLisp by se neměl zaměňovat s projektem OpenLISP zahájeným v roce 1997 k implementaci protokolu Locator/Identifier Separation Protocol .
OpenLisp je proprietární software . Tlumočník je k dispozici zdarma pro nekomerční použití.
Část zdrojového kódu systému je dostupná pod svobodnými licencemi (GNU GPL, BSD) nebo je ve veřejné doméně . Samostatně licencované a za poplatek poskytované zdrojové kódy potřebné k vložení OpenLisp do systémů napsaných v C/C++.
Interpret OpenLisp je zpočátku spuštěn v režimu konzoly (v Cmd na Microsoft Windows nebo z emulátoru terminálu na unixových systémech).
;; OpenLisp v9.xy (sestavení: XXXX) od C. Jullien [ledna 01 20xx - 10:49:13] ;; Copyright (c) Eligis - 1988-20xx. ;; Systém 'sysname' (64bit, 8 CPU) na 'hostname', ASCII. ;; Bože, díky, OpenLisp je zase zpět! ? ( fib 20 ) ; uplynulý čas = 0,003 s, (0 gc). = 6765 ? _REPL je také možné spustit pod Emacsem (musíte inicializovat proměnnou s inferior-lisp-modecestou k binárnímu souboru interpretu OpenLisp). LispIDE od DaanSystems má vestavěnou podporu pro syntaxi OpenLisp.
OpenLisp používá mechanismus virtuální paměti k automatickému přidělování a úpravě paměti objektů. Malé předměty stejného typu jsou umístěny pomocí technologie BIBOP (BIg Bag Of Pages). K alokaci velkých objektů se používají proxy objekty , které ukazují na skutečný objekt v haldě Lisp . Konzervativní garbage collector používá techniku mark and sweep a může být nakonfigurován pro podporu multithreadingu .
OpenLisp používá architekturu tagů (4-bit tag na 32-bit, 5-bit tag na 64-bit word) pro rychlou kontrolu typu (small integer, float, symbol, cons, string, vector). Krátká celá čísla (28 bitů u 32bitového slova, 59 bitů u 64bitového slova) se ukládají rozbalená, dlouhá celá čísla (32 bitů / 64 bitů) se ukládají sbalená. Jak vyžaduje ISLISP , jsou implementována také velká čísla . Znaky (a tedy řetězce) mohou být buď 8bitové ( ANSI , EBCDIC ) nebo 16/32bitové, pokud je povolena podpora Unicode .
Jádro, interpret a základní knihovny jsou ručně psané v C. Kompilátor převede zdrojový text do zprostředkujícího jazyka LAP, který je pak přeložen generátorem kódu do jazyka C , který zase může zkompilovat jakýkoli překladač jazyka C cílové platformy.
Rok | Verze | Hlavní změny |
---|---|---|
1988 | 1,0 | Projekt začal jako výzkumný jazyk nazvaný MLisp (Minimal Lisp) pro experimentování s nápady z připravovaného standardu ISLISP . V roce 1988 bylo hlavním motivem implementace Lisp pro rozšíření EmACT , klonu Emacs . ISLISP se ukázal jako nejvhodnější volba. |
1993 | 3.3 | První port na 64bitovou architekturu ( DEC Alpha OSF/1). Změna názvu na OpenLisp. |
1994 | 4,0 | První komerční využití. |
1995 | 4.5 | Implementována podpora pro zásuvky. |
1997 | 5.7 | OpenLisp byl první implementací standardu ISLISP ISO/IEC 13816:1997(E). [9] |
1998 | 5.8 | Implementovaná podpora Unicode . |
2000 | 6.6 | Kompilátor v LAP. LAP jsou interpretovány virtuálním počítačem, který je součástí systému. Výkon byl zdvojnásoben. |
2003 | 7.5 | Implementován back-end "Lisp to C". Stalo se dostupným pro kompilaci vícesouborových programů Lisp do spustitelného modulu. Rychlost se zvýšila 10-20krát. |
2007 | 8.7 | Aktualizováno kvůli nové ISO/IEC 13816:2007(E) Archivováno 30. července 2016 na Wayback Machine . |
2010 | 9.2 | Implementace celočíselné aritmetiky s neomezenou přesností. |
2017 | 10.3 | Aktuální verze (2017-03-05). |
OpenLisp je vysoce přenosný a může běžet na mnoha operačních systémech: Microsoft Windows , většina systémů založených na Unixu , QNX , MS-DOS , OS/2 , Pocket PC , OpenVMS , z/OS . Na oficiálních stránkách je k dispozici ke stažení více než 50 různých verzí.
OpenLisp může komunikovat s moduly napsanými v C pomocí FFI , ISLISP I/O streamy jsou rozšířeny o podporu síťových soketů. Adresář ./netv nasazeném systému obsahuje příklady pro práci s Http , Json , Pop3 , Smtp , Telnet , Rss . Jednoduchá čtečka XML dokáže převést XML na seznamy Lisp. Základní modul SQL lze použít pro přístup k MySQL , Odbc , SQLite , PostgreSQL . Modul CSV umožňuje čtení a zápis souborů ve formátu CSV.
Vývojové nástroje zahrnují protokolování, formátování kódu, profiler , podporu programování smluv a testování jednotek .
V katalogu ./contribjsou k dispozici implementace některých známých algoritmů ( simplexní algoritmus , Dijkstrův algoritmus , Ford-Fulkersonův algoritmus a další). Moduly jsou poskytovány pod licencí BSD .
Tato část popisuje, jak transformovat kód Lisp do kódu C v OpenLisp.
Jako příklad je použita rekurzivní funkce fib, která provádí výpočet n-tého Fibonacciho čísla (toto je klasická definice používaná v mnoha benchmarcích a pro skutečné výpočty není nejúčinnější).
( defun fib ( n ) ( cond ( ( eq n 1 ) 1 ) ( ( eq n 2 ) 1 ) ( t ( + ( fib ( - n 1 )) ( fib ( - n 2 )))))))Kompilátor překládá zdrojový kód Lisp do mezikódu ve formátu seznamu LAP, který je podroben lokální optimalizaci ( angl. peephole optimization ). Po optimalizaci vypadá výsledný kód LAP takto:
(( fentry fib 1 0 0 ) ( param 0 ) ( jeq _l004 '1 ) ( jneq _l003 '2 ) ( tah a1 '1 ) ( návrat ) _l003 ( gsub1 a1 ) ( rekurze 1 ) ( tah a2 a1 ) ( param . ) ( gsub a1 '2 ) ( rekurze 1 ) ( gadd a2 a1 ) _l004 ( návrat ) ( konec ))Nakonec generátor kódu převede kód LAP na instrukce C.
statický POINTER OLDEFCOMPILED1 ( olfib_00 , p1 ) { UKAZATEL a1 ; TĚKAVÝ UKAZATEL 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 ); návrat ( olmakefix ( 1 ) ); _l003 : a1 = ollapgsub ( al , olmakefix ( 1 ) ); a2 = olfib_00 ( al ); a1 = ollapgsub ( p1 , olmakefix ( 2 ) ); a1 = olfib_00 ( al ); a1 = ollapgadd ( a2 , a1 ); _l004 : ollapleave ( SN_OLFIB_00 ); návrat ( a1 ); }Výše uvedený fragment obsahuje pouze samotný vygenerovaný kód C. Chcete-li získat spustitelný soubor, musí být tento kód vložen do příslušného prostředí a zkompilován s knihovnami, které jsou součástí prostředí OpenLisp.
Podle údajů na stránce autora systému Archived 27. února 2021 na Wayback Machine (ovšem zastaralé - uvedené materiály odkazují na verzi 7.9, zatímco aktuální verze pro rok 2018 je 10.3), ve srovnání s dalšími dvěma implementací ISLISP je OpenLisp na stejné úrovni nebo poněkud rychlejší v interpretačním režimu a výrazně (10-20krát) rychlejší v rychlosti kompilované aplikace.
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Charakteristika |
| ||||||||||||||
Implementace |
| ||||||||||||||
Hardware |
| ||||||||||||||
Společenství |
| ||||||||||||||
|