2009-01-15 5 views
11

Ich habe ein paar Sprachen, die ich als Dolmetscher gebaut habe. Wenn ich bereit bin, "diesen nächsten Schritt" zu machen, welche Optionen eignen sich am besten für nicht-native kompilierte Formate ... Was sind die Vor- und Nachteile von jedem?Bester Compiler Ziel

Ich habe auf Compiling zu CLR oder LLVM untersucht, und dachte C-Midcompile ein paar Mal, aber ich bin mir nicht ganz sicher.

Einige Funktionen, die ich bin der Hoffnung, in den Hafen zu können, sind wie folgt:

  1. REPL - Einer der Sprachen, die ich bin Gebäude unterstützt während der Laufzeit auf Blockebene Auswertung.
  2. Robuste Makros - Eine der Sprachen, die ich erstelle, erfordert die Möglichkeit, Code vor dem Tokening einzeln zu filtern, und in der Mitte zwischen Tokenizing und Parsing.

Ok, nicht wirklich "ein paar", nur zwei. Ich denke, ich kann alle anderen Funktionen, die meine Sprachen unterstützen, auf "alles" portieren.

Was sind meine besten Optionen und ihre Vor-/Nachteile?

Antwort

16

Pro/Nachteile:

  • CLR:

    • pro: CLR-Umgebung leicht verfügbar; eine Menge Sachen zum Binden an
    • con: gebunden an CLR (;-);

      • Pro: unabhängig von MS
    • LLVM einige Systeme Targeting schwer oder unmöglich sein wird, (. Reife auf nicht MS-Systeme eingebettet, Großrechner usw. CLR impl könnte weniger sein).

    • con: targetting einige Systeme möglicherweise LLVM (?); Schnittstelle zu DOT-net, Java usw. könnte (möglicherweise muss FFI) lästig sein
  • C als Zielsprache:

    • pro: fast alle Ziele möglich; easy code generation
    • con: Sie müssen einige VM-Sachen als Laufzeitbibliothek implementieren (GC, Dynload, Dyn Compilation etc.); einige Dinge sind in C schwer zu machen (Fortsetzungen, Backtracking, Stack-Tracing, Ausnahmen); einige Dinge sind schwer effizient und portabel in C (GC, dynamische Typen, Stack-Layout-Abhängigkeit).
  • Java-Bytecode als Ziel:

    • pro: wahrscheinlich die größte Menge der möglichen Zielplattformen (auch Telefone mobil und eingebettete Material); viele vorhandene Werkzeuge herum; einfache Anbindung an bestehende Bibliotheken
    • con: Manche Dinge sind schwer zu implementieren oder schwer zu implementieren effizient (dynamische Typen, Fortsetzungen, Backtracking)

Von all den oben genannten, ich denke, Java-Bytecode-Targeting würde wahrscheinlich am besten für dich sein.

EDIT: eigentlich eine Antwort auf einen Kommentar, aber 300chars sind nicht genug.

JByteCode ify - ich stimme zu (als Smalltalker, JBytecode ist zu limitierend für mich).

VM-weise, ich denke, es gibt eine relativ breite Palette von Leistung, die Sie als JVM erhalten können, beginnend mit reinen langsamen Bytecode-Interpreter bis zu High-End-anspruchsvolle JITting VMs (IBM). Ich schätze, CLR-VMs werden aufholen, da MS früher oder später alle Innovationen sowieso stiehlt und integriert, und die Techniken zur Beschleunigung der dynamischen Übersetzung werden veröffentlicht (lesen Sie zum Beispiel die Self-Papers). LLVM wird wahrscheinlich etwas langsamer Fortschritte machen, aber wer weiß. Mit C werden Sie kostenlos von besseren Compilern profitieren, aber Dinge wie dynamische Retranslation usw. sind schwer mit C als Ziel zu implementieren. Mein eigenes System verwendet eine Mischung aus vorkompiliertem und dynamisch kompiliertem Code (mit allen: einem langsamen Bytecode-Interpreter, JITter und vorkompiliertem statischem C-Code in einem Speicherplatz).

+2

Java ByteCode ist etwas, worüber ich schon immer schwärmte. Nennen Sie es schlechte vergangene Erfahrung. Haben einige von ihnen irgendwelche Vorteile in Bezug auf die Leistung ihrer internen VM (anders als nur Bibliotheksaufrufe?) – user54650

+6

C-Code-Generation sieht einfach aus, bis Sie es seit 6 bis 18 Monaten tun. Dann werden die Dinge plötzlich unmöglich. –

3

LLVM scheint vielversprechend. Das Team behauptet bessere Laufzeitleistungen auf gcc mit ihrem Backend im Vergleich zu nativen. Die Möglichkeit, vom AST zu kompilieren, ist wirklich interessant (siehe Tutorial). Es kann zur Laufzeit kompiliert und optimiert werden, was ein Muss für dynamische Anwendungen ist. Es kann auch als reiner Interpreter ausgeführt werden.

Ich betrachte die Verwendung von LLVM in einem Projekt, das die Erstellung einer Tcl-ähnlichen Sprache beinhaltet. Tcl ist stark dynamisch, also weiß ich nicht, was das zu diesem Zeitpunkt bedeutet, aber ich bin zuversichtlich, dass ich bessere Leistungen als der aktuelle Bytecode-basierte Kern bekommen werde.

25

Code-Generierung ist mein Geschäft :-)

Kommentare zu ein paar Optionen:

  • CLR:

    • Pro: Industrie Unterstützung
    • Con: Sie müssen kaufen in ihr Typsystem ziemlich vollständig; je nachdem, was Sie mit Typen tun möchten, kann dies
    • Con keine Rolle: Nur ist Windows-Plattform Primetime-Qualität
  • LLVM wirklich:

    • Pro: begeisterte User-Community mit charismatischen Führer
    • Pro: ernsthafte Unterstützung von Apple
    • Pro: viele interessante Leistungsverbesserungen
    • Con: etwas comple x Schnittstelle
    • Con: Geschichte der Löcher in der Technik; als LLVM die Löcher in der Technik erwarten reift, indem zu der Komplexität der Schnittstelle
  • C--

    • Pro angeschlossen werden: Soll eine tatsächliche Schriftsprache, ist eine API nicht; Sie können ganz einfach überprüfen, debuggen und bearbeiten Sie Ihre C-- Code
    • Pro: Design recht ausgereift ist und einigermaßen sauber
    • Pro: unterstützt genaue Garbage Collection
    • Pro: Die meisten Nutzer berichten, ist es sehr einfach zu bedienen
    • Con: sehr kleines Entwicklungsteam
    • Con: ab Anfang 2009 nur drei Hardware-Plattformen unterstützt (x86, PPC, ARM)
    • Con: Projekt hat nicht: mit einem Garbage Collector nicht
    • Con mitliefert Zukunft
  • C als Zielsprache

    • Pro: leicht
    • Con sieht: fast unmöglich ordentliche Leistung
    • Con zu bekommen: werden Sie Nüsse auf lange Sicht fahren; Fragen Sie die lange Reihe von Leuten, die versucht haben, Haskell, ML, Modula-3, Scheme und mehr mit dieser Technik zu kompilieren. Irgendwann gab jeder dieser Leute auf und baute ihren eigenen nativen Code-Generator.

Zusammenfassung: alles außer C ist eine vernünftige Wahl. Für die beste Kombination aus Flexibilität, Qualität und erwarteter Langlebigkeit würde ich wahrscheinlich LLVM empfehlen.

Vollständige Offenlegung: Ich bin mit dem C - Projekt verbunden.

+2

Nur ein kleiner Hinweis: Sie müssen nicht die LLVM-API verwenden, sondern stattdessen die Assembler-ähnliche Sprache. – Frank