Openlisp

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 17. března 2021; kontroly vyžadují 4 úpravy .
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  ( 1988-04 )
Hardwarová platforma x86, x86_64, ia64, sparc, sparcv9, PowerPC, mips, alpha, parisc, ARM, AArch64
Nejnovější verze 10.3.0 (5. března 2017 ) ( 2017-03-05 )
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.

Rozvojové cíle

Cíle vytvoření tohoto dialektu Lisp byly:

Dialektové jméno

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 .

Licenční a distribuční podmínky

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++.

Uživatelské rozhraní

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.

Podrobnosti implementace

Správce paměti

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 .

Datové typy

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 .

Interpret a kompilátor

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.

Historie

Hlavní milníky ve vývoji OpenLisp. [osm]
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).

Portování

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í.

Standardní knihovny

I/O a interakce s jiným softwarem

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ývojářské nástroje

Vývojové nástroje zahrnují protokolování, formátování kódu, profiler , podporu programování smluv a testování jednotek .

Algoritmy

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 .

Kompilace

Tato část popisuje, jak transformovat kód Lisp do kódu C v OpenLisp.

Zdrojový kód

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 )))))))

LAP

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 ))

Generování kódu C

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.

Výkon

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.

Aplikace

  • Nezisková organizace SDF (také známá jako freeshell.org), která poskytuje internetový přístup k prostředí UNIX , [10] [11] používá OpenLisp jako jeden z programovacích jazyků dostupných na webu.
  • Bricsys používá OpenLisp k implementaci své varianty AutoLISP pro Bricscad . [12]
  • MEVA [13] je celý napsán v OpenLisp.
  • Univerzita v Palermu používá jako vyučovací jazyk OpenLisp. [čtrnáct]

Poznámky

  1. Pierre Parquier. JTC1/SC22 N3170 . ISO/IEC (2000). Staženo: 11. března 2012.  (nepřístupný odkaz)
  2. Keld Simonsen. Islisp-faq . ISO/IEC (13. března 1999). Staženo 11. listopadu 2016. Archivováno z originálu 1. listopadu 2018.
  3. IZUMI NOBUTO (Tohoku Univ., Grad. Sch.) ITO TAKAYASU (Tohoku Univ., Grad. Sch.). Interpret a kompilátor ISO standardu Lisp ISLISP. (nedostupný odkaz) . Transactions of Information Processing Society of Japan (1999). Získáno 17. června 2013. Archivováno z originálu dne 26. srpna 2018. 
  4. Paul McJones. ISLISP . Skupina pro ochranu softwaru (2010). Získáno 18. března 2012. Archivováno z originálu 26. srpna 2018.
  5. Pierre Parquier (JTC1 SC22 WG16 Convenor). ISO/IEC JTC1 SC22 WG16 N177 - hlasování DIS . ISO/IEC (1996). Získáno 15. března 2012. Archivováno z originálu dne 27. ledna 2021.
  6. C. Jullien. Referenční příručka OpenLisp v9.8.0 . Eligis (2011). Získáno 14. března 2012. Archivováno z originálu 4. června 2001.
  7. C. Jullien. Otevřete Lisp FAQ . Eligis (2011). Staženo: 15. března 2012.
  8. C. Jullien. OpenLispChangeLog . Eligis (2011). Staženo: 15. března 2012.
  9. William Rinehuls. JTC1/SC22 N2969 . ISO/IEC (4. srpna 1999). Získáno 11. listopadu 2016. Archivováno z originálu 26. ledna 2021.
  10. Gene Michael Stover. 7.2 Jazyky na SDF . SDF Public Access UNIX System, Inc. (2005). Získáno 14. března 2012. Archivováno z originálu 10. května 2017.
  11. Hostingové společnosti (downlink) . ALU (Asociace uživatelů Lisp). Datum přístupu: 18. března 2012. Archivováno z originálu 9. února 2011. 
  12. Bricscad News . Briccad (2009). Získáno 20. března 2012. Archivováno z originálu 27. srpna 2018.
  13. Kompetitivní inteligence a problémy s rozhodováním . Amos Davis (2013). Staženo: 30. září 2014.
  14. Corso di Informatica Teorica . Università degli Studi di Palermo (2013). Získáno 22. března 2013. Archivováno z originálu 9. července 2018.

Odkazy