Frage

Ich habe ein paar Sprachen habe ich habe als Dolmetscher baut. Als ich bin bereit „den nächsten Schritt“ zu nehmen, sind welche Möglichkeiten am besten für nicht-native kompilierte Formate ... was sind die Vor- und Nachteile der einzelnen?

Ich habe sucht worden CLR oder LLVM zu kompilieren und in Betracht gezogen, C-midcompile ein paar Mal, aber ich bin nicht ganz sicher.

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

    REPL
  1. - Eine der Sprachen, die ich bin Gebäude unterstützt Block-Level-Auswertung während der Laufzeit
  2. .
  3. Robust Makros - Eine der Sprachen, die ich Gebäude sind erfordert die Fähigkeit, durch den Code zu filtern separat vor Tokenerstellung und in der midstep zwischen Tokenisieren und Parsing
  4. .

Ok, nicht wirklich "ein paar", nur zwei. Ich mag denken, ich kann Port andere meine Sprachen Funktionen unterstützen zu „etwas“.

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

War es hilfreich?

Lösung

Pro / Nachteile:

  • CLR:

    • pro: CLR-Umgebung leicht verfügbar; eine Menge Sachen zu
    • zu binden
    • con: gebunden CLR (;-); einige Systeme Targeting wird schwer oder unmöglich sein (Mainframes eingebettet, usw. CLR impl. könnte reifen weniger auf nicht MS-Systeme)
  • LLVM:

    • pro:. Unabhängig von MS
    • con: (?) Einige Systeme Targeting könnte beinhalten LLVM portieren; Schnittstelle zu DOT-net, Java usw. lästig sein könnte (möglicherweise muss FFI)
  • C als Zielsprache:

    • pro: fast alle Ziele möglich; einfache Code-Generierung
    • con: Sie haben einige VM Sachen als Runtime-Bibliothek zu implementieren (GC, dynload, dyn Zusammenstellung etc.); einige Dinge sind schwer in C (Fortsetzungen, Rückzieher, Stapel Tracing, Ausnahmen) zu tun; einige Dinge sind schwer effizient und tragbar in C (GC, dynamischen Typen, Stapel Layout Abhängigkeit) zu tun.
  • Java-Bytecode als Ziel:

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

Von all den oben, ich denke Targeting Java-Bytecode wahrscheinlich am besten für Sie wäre.

EDIT: eigentlich eine Antwort auf einen Kommentar, aber 300chars nicht ausreicht, um

.

JByteCode iffy - Ich bin damit einverstanden (als ein Smalltalker, JBytecode auch für mich zu begrenzen).

VM-weise, denke ich, ein relativ breites Spektrum an Leistung ist, dass Sie als JVM bekommen, bei reinem langsamem Bytecode-Interpreter bis zu High-End-Ausgang anspruchsvollen JITting VMs (IBM). Ich denke, CLR VM aufholen wird, wie MS stahl und alle Innovationen sowieso früher oder später zu integrieren und die Techniken dynamische Übersetzung Speedup veröffentlicht werden (die Selbst Papiere lesen, zum Beispiel). LLVM wird wahrscheinlich ein wenig langsamer, Fortschritt, aber wer weiß. Mit C, werden Sie von einem besseren Compiler kostenlos profitieren, aber Dinge wie dynamische Neuübersetzung usw. sind schwer mit C als Ziel zu implementieren. Mein eigenes System verwendet eine Mischung aus vorkompilierte und dynamisch kompilierte Code (mit Programm: ein langsames Bytecode-Interpreter, Jitter und vorkompilierte statischen C-Code in einem Speicherplatz).

Andere Tipps

Code-Generierung ist mein Geschäft: -)

Kommentare zu ein paar Optionen:

  • CLR:

    • Pro: Industrie Unterstützung
    • Con: Sie haben in ihrer Art System kaufen ziemlich vollständig; je nachdem, was Sie mit Typen tun will, diese Angelegenheit nicht
    • Con: Nur Windows-Plattform ist wirklich Primetime-Qualität
  • LLVM:

    • Pro: begeisterte User-Community mit charismatischen Führern
    • Pro: ernsthafte Unterstützung von Apple
    • Pro: viele interessante Leistungsverbesserungen
    • Con: etwas komplexer 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
    • angeschlossen werden
  • C--

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

    • Pro: sieht einfach
    • Con: fast unmöglich ordentliche Leistung zu bekommen
    • Con: werden Sie Nüsse auf lange Sicht fahren; die lange Schlange von Menschen fragen, die versucht haben Haskell, ML, Modula-3, Schema und mehr mit dieser Technik zu kompilieren. Irgendwann gab jeder dieser Menschen und bauten ihre 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 Langlebigkeit zu erwarten, würde ich wahrscheinlich LLVM empfehlen.

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

LLVM scheint vielversprechend. Das Team behauptet, eine bessere Laufzeit Leistungen auf gcc mit ihrem Backend nativen verglichen. Die Fähigkeit, aus dem AST zu kompilieren ist wirklich interessant (werfen Sie einen Blick auf das Tutorial). Es kann zur Laufzeit kompilieren und optimieren, die ein Muss für dynamisch ist. Es kann auch als reinen Interpreter ausgeführt.

Ich halte in einem Projekt LLVM verwenden, das die Schaffung eines Tcl-ähnliche Sprache beinhaltet. Tcl ist stark dynamisch, so dass ich weiß nicht, was das zu diesem Zeitpunkt schon sagt, aber ich bin zuversichtlich, dass ich den aktuellen Bytecode-basierten Kern bessere Leistungen erhalten werden als.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top