Sprachen wie Clojure oder Scala haben den funktionalen Programmierstil wieder ins Gespräch gebracht. Weiter vorn auf der Beliebtheitsskala steht jedoch immer noch der erste Vertreter der Gattung: Lisp.

Lisp ist nach Fortran die zweitälteste Programmiersprache, zählt im Gegensatz zu diesem jedoch immer noch als „mainstream language“ – jedenfalls, wenn es nach dem TIOBE-Index geht. Dort belegte das geistige Kind des kürzlich verstorbenen John McCarthy (siehe Seite 20 in iX 12/2011) im Oktober 2010 immerhin Platz 13, während sich das im wissenschaftlichen Bereich noch häufig anzutreffende Fortran mit Rang 31 zufriedengeben musste.

Das könnte daran liegen, dass Lisp deutlich vielseitiger ist: Es unterstützt funktionale, imperative und objektorientierte Programmierung sowie das interaktive Arbeiten mit einem Interpreter nebst dazugehörigem Quelltext-Debugger. Außerdem versteht sich Lisp hervorragend auf das Manipulieren symbolischer Ausdrücke, sogenannter S-Expressions. Daher kommt es in einschlägiger Software wie dem Computer-Algebra-System Maxima oder dem Theorem Prover ACL2 zum Einsatz.

Beide verlangen ein Lisp, das weitgehend dem Standard ANSI INCITS 226-1994 (Common Lisp) entspricht. Dafür bietet sich zum Beispiel GNU CLISP an. Die von Bruno Haible und Michael Stoll ursprünglich für den Atari ST geschriebene Software läuft auf nahezu jedem Linux- oder Unix-System, Max OS X und Windows. Dabei geht sie sparsam mit den Systemressourcen um: Das Programm kommt nach Aussage der Entwickler mit 4 MByte RAM aus. Ein integrierter Compiler erzeugt Bytecode für eine virtuelle Stack-Maschine, der um den Faktor 5 schneller laufen soll als interpretierter Code.

Schnittstelle zu C

Darüber hinaus bietet CLISP mit seinem Foreign Function Interface (FFI) die Möglichkeit, in C geschriebene Routinen einzubinden. Auf Unix-kompatiblen Plattformen, die die Funktionen dlopen und dlsym kennen, kann das auch zur Laufzeit geschehen. Viele Funktionen sind jedoch bereits vorhanden, etwa ein Socket-Interface für den Netzzugriff, Perl- und POSIX-kompatible Regular Expressions sowie eine Schnittstelle zu GNU gettext, die „internationalisierte“ Meldungen ermöglicht. Zugriff auf das X Window System bekommt der Entwickler per CLX. Inzwischen ist CLISP Teil des GNU-Projekts. Das auf Kyoto Common Lisp basierende GNU Common Lisp (GCL) andererseits scheint verwaist: Die letzte Release kam 2005 heraus.

Etwas weniger portabel ist das an der Carnegie Mellon University entstandene CMUCL. Offiziell unterstützt das Projekt nur Linux, Mac OS X, FreeBSD und NetBSD auf Intel-kompatiblen CPUs sowie Solaris/SPARC. Eine Portierung auf andere Plattformen dürfte nicht zuletzt deshalb Schwierigkeiten bereiten, weil der integrierte Compiler im Gegensatz zu dem von CLISP Maschinencode erzeugt, der sich in puncto Ausführungstempo mit dem eines C-Compilers messen können soll. Unter Linux/x86 kann CMUCL statt der regulären Floating-Point-Befehle des Prozessors den SSE2-Befehlssatz verwenden.

Das Foreign Function Interface von CMUCL kann auf selbst in C geschriebene Routinen, Shared Libraries und Linux/Unix-Systemaufrufe zugreifen. Außerdem unterstützt die Software Interprocess Communication (IPC) und Remote Procedure Calls (RPC). Die Entwicklungsumgebung bringt einen Emacs-ähnlichen Editor, einen grafischen Quellcode-Debugger und einen Code Profiler mit.

Steel Bank Common Lisp (SBCL) entstand 1999 aus CMUCL. Im Gegensatz zu diesem läuft es auch auf OpenBSD, Solaris/x86 und Windows sowie unter Linux mit PowerPC-, SPARC-, Alpha- oder MIPS-Prozessor. Für Linux/x86, Mac OS X und FreeBSD sind 64-Bit-Varianten verfügbar. Außerdem kann SBCL auf diversen Plattformen, darunter Linux/x86, native Threads nutzen, während CMUCL auf User Space Threads und damit auf einen Prozessorkern beschränkt ist. Die Entwickler beider Projekte arbeiten eng zusammen, sodass Verbesserungen und Bugfixes in der Regel in beide Programme einfließen. Ein Vorteil beider gegenüber CLISP besteht in den weniger strikten Lizenzbedingungen: Große Teile sind Public Domain, die übrigen stehen unter der BSD- oder MIT-Lizenz.

Klammern unter der Haube

Lisp eignet sich jedoch nicht nur als Entwicklungsplattform. Embeddable Common Lisp (ECL) etwa erlaubt es, Common Lisp als eingebettete Sprache beziehungsweise Basis für eine Domain Specific Language (DSL) in eigenen C/C++-Anwendungen zu nutzen. Per Foreign Function Interface lassen sich eigene Funktionen hinzufügen. Umgekehrt kann man Standard-Lisp-Funktionen von C aus aufrufen. ECL unterstützt Multithreading mit nativen Threads, die aus historischen Gründen allerdings „Prozesse“ heißen.

Mit dem mitgelieferten Compiler lässt sich der Lisp-Code in „Fastload“-Dateien verwandeln, die man zur Laufzeit in den Lisp-Interpreter integrieren kann. Es ist jedoch auch möglich, die Routinen in einer Bibliothek abzulegen und diese mit der Anwendung zu linken. Die Software steht unter Version zwei der GNU Library General Public License (LGPL) und lässt sich unter Linux, *BSD, Windows ab XP, Mac OS X ab 10.4 sowie Solaris verwenden. (mr)



Alle Links: www.ix.de/ix1112135