[linux-l] Trennung von "readline" und Interpreter im Unix-Stil

Volker Grabsch vog at notjusthosting.com
Do Apr 5 21:32:40 CEST 2007


Liebe Gruppe,

ich habe soeben ein architektonisch sehr interessante Werkzeuge
gefunden: ledit und rlwrap.

Hintergrund: Ich habe etwas mit Ocaml herumgespielt. Der Ocaml-
Interpreter (aka "ocaml toplevel") nutzt keine "readline"-Bibliothek
oder ähnliches. Eine interaktive Sitzung ohne History! Aus dem
Python-Umfeld bin ich es gewohnt, dass der Interpreter wenigstens
das mitbringt.

Für Python gibt's sogar ein Tool "ipython", das noch haufenweise
sprachspezifische Features mitbringt (z.B. Tab-Vervollständigung,
die z.B. mittels Reflection zur Laufzeit bestimmt, welche Methoden
ein Objekt gerade hat.

Für Ocaml gibt's das nicht, aber es gibt "ledit", ein "line editor",
den man wie folgt verwenden kann:
    ledit ocaml
Ocaml macht nach wie vor billiges stdin/stdout, und ledit kümmert
sich um History und Co. Sogar eine sehr primitive rein text-
baiserte Tab-Vervollständigung hat es (leider durch "ESC-/" statt
"Tab" ausgelöst .. wtf?!).

------------------------------------------------------------------

Wir haben hier also zwei grundverschiedene Ansätze: Auf der einen
Seite die Aufgabentrennung im klassischen Unix-Stil:
- "ledit" als universelle Kommandozeile
- der Interpreter (z.B. Ocaml), der durch Pipelines angesteuert wird

Auf der anderen Seite eine enge Kopplung ala "ipython", die auch
höhere Ansprüche bedienen kann. z.B. braucht man ne enge Verbindung
für die Tab-Autovervollständigung. Die ist ja abhängig ist von dem,
was man in der Interpretersitzung gerade definiert oder importiert hat.

Nun wird aber "ipython" intern ebenfalls eine Aufgabentrennung haben,
und für alle "Interpreter-Aufgaben" entsprechende Libraries verwenden.
Das heißt, die Ansätze konkurrieren eigentlich auf einer ganz anderen
Ebene: Trennt man die Aufgabe in zwei Prozesse mit einfacher/universeller
Schnittstelle, oder trennt man sie durch dynamisches Linken gegen eine
entsprechende Bibliothek, d.h. mit einer API als Schnittstelle?

Wie seht ihr das? Sind das zwei gleichberechtigte Ansätze, oder
gibt es sowas wie Design-Richtlinien, welchen man i.d.R. bevorzugen
sollte?

Sie beide haben Vor- und Nachteile, aber es gibt so viele Fälle,
in denen man erstmal nicht weiß, welcher Ansatz das bessere Design
liefert.

Bin ich auf eine uralte ungelöste Grundsatzfrage gestoßen, oder
gibt es dazu inzwischen Forschungen, die greifbare Antworten liefern,
die über das "Designer-Bauchgefühl" hinaus gehen?

--------------------------------------------------------------------

Abschließende Bemerkungen:

rlwrap ist ein Werkzeug mit ähnlichem Zweck wie ledit. Einen genauen
Feature-Vergleich dieser Werkzeuge habe ich nicht.

Jedoch ist mittlerweile auch ein moderneres Ocaml-Toplevel in
Arbeit, vielleicht kann es irgendwann mit ipython konkurrieren.


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l