Gibt es Lisp-Codecompiler?
Gibt es native-code-Compiler für Lisp? Inwieweit kann es selbst kompiliert werden, mit allen, die die dynamische Natur, die garbage collection, Makros und was sonst noch?
InformationsquelleAutor der Frage Headcrab | 2009-05-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Viele Lisp-Compiler kompilieren, um "native" - code. "Native" bedeutet hier "machine code" (x86-32bit oder 64bit-Modus, PowerPC, SPARC, ...).
Andere Fragen:
kann 'non-native-code-Compiler erzeugen, eine einzige Datei, ausführbare Dateien? -> ja.
kann 'native-code-Compiler erzeugen, eine einzige Datei, ausführbare Dateien? -> ja.
wie 'native' ist 'native'? -> Lisp-system die meisten der Zeit, haben Ihre eigenen internen Daten-Struktur-Layouts (CLOS-Klassen), Ihre eigene Fehlerbehandlung ("Bedingungen"), die Ihre eigene Speicherverwaltung (garbage collection), die Ihre eigenen Bibliotheken, ...
kann Lisp laufen ohne GC? -> in der Regel nicht. Es gibt auch Ausnahmen.
was über die Anwendung Größe? -> standardmäßig einfache Weise generiert Lisp-Anwendung führen oft zu großen ausführbaren Dateien. Die ausführbaren Dateien sind den ganzen Lisp-einschließlich seiner Bibliothek, die Namen aller Symbole, Informationen über die Argumente zu Funktionen, die compiler, debugger, source code, location information, und mehr. Einige Compiler erzeugen auch groessere code (SBCL ist ein Beispiel).
Möglichkeiten gibt es, zu schrumpfen Anwendung Größen? -> das hängt von der Lisp-system. Kommerzielle Lisp-Systeme wie LispWorks und Allegro CL kann. Für application delivery, Sie können entfernen Sie unbenutzte code, entfernen von debugging-Informationen, entfernen Sie Teile des Lisp (Bibliotheken, compiler, ...) und vieles mehr.
können Common Lisp-Systeme erzeugen kleine ausführbare Dateien. Ich meine wirklich kleine. -> Nicht wirklich. Die Programme sind entweder große (CCL) oder sehr groß (SBCL). Einige Common Lisp-Systeme erzeugen kann, die mittlere ausführbaren Dateien. Aber keiner kann wirklich erzeugen kleine ausführbare Dateien.
gibt es wirklich keine Möglichkeit generieren sehr kleine ausführbare Dateien? -> Jahren-Compiler geschrieben wurden, die einen relativ kompakten C-code ohne großen Bibliotheken. Aber diese Compiler sind nicht gepflegt.
gibt es andere Möglichkeiten zu schrumpfen, ausführbare Dateien? -> Wenn Sie wollen, mehr als einen Lisp-Anwendung, macht es Sinn, Wiederverwendung runtime, compiler, Bibliotheken, die in eine oder mehrere shared-libraries. So, den code zu liefern, wird kleiner sein, wenn eine runtime bereits installiert ist als eine shared library (oder ähnlich).
wie finde ich heraus, was die Lisp-ich bin mit unterstützt als application delivery? -> Lesen Sie das Handbuch und Fragen Sie andere Benutzer.
okay, also die meisten Common Lisp-Systeme können nicht generieren, winzige Anwendungen. Gibt es andere Lisp-Dialekte, die generieren können kleinere executables. -> ja, einige Schema-Compiler können.
wie funktioniert Common Lisp behandeln von Laufzeitfehlern? -> hängt davon ab, wie Sie die Anwendung generieren. Standardmäßig erhalten Sie eine Lisp-debugger (es sei denn, Sie haben es entfernt). Aber Sie können Ihre eigenen Fehler-handling-Routinen in Ihrer Anwendung und können verhindern, dass der debugger erscheint.
was sind Common Lisp Besondere stärken bei der Erzeugung von wirklich kleinen ausführbaren Dateien nicht? -> Sie können auch eine REPL, um mit der Anwendung interagieren, können Sie mit einem mitgelieferten compiler zu kompilieren, die neue (oder geänderte code) zur Laufzeit, die Sie verwenden können, die FASL (compiled Lisp-code) loader zum LADEN von zusätzlichen nativen code zur Laufzeit (denken, plugins, patches, Erweiterungen, ...), ausgefeilte Fehlerbehandlung einschließlich error-recovery ist möglich, ...
aber Lisp ist dynamisch? -> ja, dynamisch bedeutet, dass es kann viele Dinge, die während der Laufzeit. Zum Beispiel in Common Lisp, die Sie ändern können, eine CLOS-Klasse zur Laufzeit und die Klasse' Instanzen übernehmen, um die änderungen. Aber die verschiedenen Lisp-Systeme haben verschiedene Möglichkeiten, um entfernen Sie einige der dynamischen Eigenschaften. Strukturen sind weniger dynamisch als CLOS-Klassen. Sie können erklären, Arten und kompilieren mit unterschiedlichen Optimierungen (Geschwindigkeit, Sicherheit, debug, ...). Sie können inline-Funktionen. Und mehr.
Einen einfachen Weg, um zu sehen, die den kompilierten code für die Funktionen ist die Verwendung der Common Lisp-Funktion zu ZERLEGEN. Beispiel in Clozure CL auf einem x86-64-Mac -
...
Die Ausgabe ZERLEGEN, offensichtlich, hängt von der Prozessor-Architektur, das Betriebssystem, die verwendete Lisp-compiler und den aktuellen Optimierungseinstellungen.
InformationsquelleAutor der Antwort Rainer Joswig
Es gibt viele Lisp-Compiler, die in systemeigenen code kompilieren. CMUCL, SBCL, ClozureCL sind bekannt unter den open-source-Lisp-Compiler.
Garbage collection ist nicht ein Hindernis für die Zusammenstellung in systemeigenen code. Auch in einigen Fällen Lisp verwenden können stack-Zuweisung, die nicht brauchen, GC und kann erheblich verbessern die Leistung (Dynamik-Umfang, Erklärung; zumindest SBCL dies unterstützt).
Makros (und code, der ausgeführt wird, auf " read-time (lese-Makros und read-eval), compile-Zeit (Makros und compiler-Makros, code in eval-when)) erfordern inkrementelle Kompilierung (erste makro-Funktion kompiliert werden, und dann code mithilfe von Makros erstellt werden können). Diese etwas kompliziert Zusammenstellung, aber es ist nicht zu viel ein problem. Auch Makros und compiler-Makros selbst helfen, die Kompilierung, da Sie es erlauben Programmierer schreiben code-Generatoren und code-Optimierer, die im wesentlichen customizing der compiler.
Damit der compiler ist komplizierter, als einige einfachere Sprachen (wie C), aber die Komplexität ist überschaubar (siehe Design von CMU Common Lisp).
Dynamische Natur von Common Lisp ist steuerbar und entwickelt, um effeciently kompilierbar. Im Gegensatz zu einigen anderen dynamischen Sprachen (z.B. Python), die Dynamik ist eingeschränkt (z.B. können Sie nicht nehmen, das aktuelle lexikalische Umgebung zur Laufzeit), die Compiler eine gewisse Freiheit zu optimieren.
InformationsquelleAutor der Antwort dmitry_vk
Gibt es riesige zahlen von Lisp-Compiler in systemeigenen code, siehe http://www.thefreecountry.com/compilers/commonlisp.shtml und z.B. die CMU-Common-Lisp-Compiler.
InformationsquelleAutor der Antwort Alex Martelli
Den Sie Wetten. Chez Scheme (eine kommerzielle compiler) ist einer der besseren. Gambit und Diebstahl sind Forschungs-Compiler, die auch das generieren von systemeigenem code.
InformationsquelleAutor der Antwort Norman Ramsey
Vergessen Sie nicht Huhn Schema.
InformationsquelleAutor der Antwort Jonathan Arkell
Ja. Sehen http://en.wikipedia.org/wiki/Common_Lisp . Es wird erwähnt, dass Steel Bank Common Lisp (ein Recht beliebter Umsetzung) kompiliert alles zu native standardmäßig. Die Tatsache, dass garbage collections und solche verwendet werden, ist kein Hindernis für native code. Das bedeutet nur eine Art von runtime benötigt wird. Aber so was? Auch C hat eine Laufzeit.
InformationsquelleAutor der Antwort Matthew Flaschen