2013-03-27 8 views
17

Ich habe ein paar Threads gesehen, die GUI-Programmierung in OCaml betreffen, aber ich glaube nicht, dass sie eindeutig zu einer klaren Lösung führen, wenn eine GUI-Schnittstelle benötigt wird.OCaml: Effektiver Pfad zur GUI-Programmierung?

Meine Frage, um genauer zu sein, ist wie folgt: Was ist der effektivste (und leicht zu erlernen) Ansatz bei der Programmierung einer GUI für OCaml-Software? Hat jemand mit einfachen und effektiven GUI-Modulen in OCaml selbst Kontakt aufgenommen oder eine effektive Sprache oder ein kostenloses Softwarepaket gefunden, in dem dies möglich ist und das gut mit OCaml kommuniziert/spielt?

Ich habe einen Interpreter in OCaml geschrieben, also sind meine Lexer, Parser, Kern-Interpreter-Funktionen usw. OCaml-Module. Gegenwärtig habe ich eine Befehlszeilenlösung (eine "main.ml"), die dem Benutzer erlaubt, mit dem Interpreter zu interagieren, indem er Ausdrücke in die Befehlszeile eingibt und eine gedruckte Terminalausgabe empfängt, die den analysierten und reduzierten Ausdruck usw. anzeigt. Die Befehlszeilenlösung dient nur zu Testzwecken. Ich möchte, dass Benutzer über eine grafische Benutzeroberfläche interagieren, es kann einfach sein (Java-Frames kommen mir schon seit Äonen vor), muss aber irgendwie mit den von mir codierten OCaml-Modulen interagieren. Es gibt eine Bibliothek in OCaml, die ich bisher gefunden habe: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html. Weiß jemand, ob dies effektiv und nützlich ist? (Ich glaube, ich habe negative Kommentare über diese Bibliothek gefangen)

Wenn ich die GUI in einer optimaleren Sprache programmieren würde, wäre die Software-Interaktion: schreiben GUI in geeigneter Sprache (vielleicht C++, Python, etc.) , kompilieren Sie dann den OCaml geschriebenen Interpreter in eine ausführbare Datei, verbinden Sie dann die GUI irgendwie mit der ausführbaren Datei? Ich interessiere mich nicht für eine lose zusammenhängende oder seltsame Lösung, über Pipes (ich denke immer an die Interprozesskommunikation für diese, was beim Betriebssystem-Design ist) oder an Sockets (ich denke an diese für die Netzwerkprogrammierung), Ich stelle mir vor, dass es einen Weg gibt, meinen OCaml-codierten Interpreter in den GUI-Code einer anderen Sprache zu "unterbringen", wenn nicht OCaml selbst. Irgendwelche Gedanken, Anleitungen oder Vorschläge?

EDIT: Ich würde mich freuen, wenn ich eine GUI für ein Linux-ähnliches Betriebssystem (d. H. Linux RedHat) bekommen könnte. Wenn ich die GUI unter Windows zum Laufen bringen könnte, wäre das großartig, aber zumindest ziele ich auf Linux ab.

EDIT 2: Nur gefunden, hat jemand Gedanken zu "OCaml-Java"? http://ocamljava.x9c.fr/ Es klingt ziemlich interessant, wie es, "... die Fähigkeit, Objective Caml Quellen, die mit ocamlc kompiliert worden sind, zu laufen; zweitens die Fähigkeit, Objective Caml Quellen in ausführbare jar-Dateien zu kompilieren." Meine Sorge ist, dass es mir nie auffiel, dass Java der beste Weg wäre, um eine schnelle, aber nützliche GUI zu bekommen ...

AKTUELLE LÖSUNG: Nach der Untersuchung der verschiedenen Optionen in der Lösung Post, die @ Jeffrey Scofield unten setzen Ich habe mich entschieden, LablGtk jetzt genauer zu untersuchen (was mir erlauben würde, innerhalb von OCaml zu bleiben). Die nächste vielversprechende Option für diejenigen, die sich diesen Beitrag ansehen, wäre, in Fremdsprachen zu schauen, die mit C interagieren, da C und OCaml bereits eine Beziehung haben, um damit zu beginnen. Es scheint Möglichkeiten zu geben, C-Code innerhalb von OCaml und OCaml innerhalb von C aufzurufen (obwohl dies sehr schwierig sein kann, da OCaml-Funktionsaufrufe im Wesentlichen mit etwas komplexeren Wrapper-Funktionen verpackt werden, die spezifischer für die Art von Funktionen sind, von denen aus aufgerufen wird innerhalb von OCaml -> dh Sie müssen sich mit dem "Mapping" jeder OCaml-Funktion und ihrer Argumente innerhalb von C befassen. Werfen Sie einen Blick auf: http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html, für weitere Informationen. OCaml-Java sah ursprünglich wie eine großartige Idee aus, da ich mit Java GUI-Programmierung vertraut war, aber die Interaktion zwischen den beiden Sprachen war nicht so direkt wie bei C und OCaml, und die Dokumentation dafür schien schlank zu sein (und OCaml zu verwenden) -Java war nicht etwas, das du einfach aufnimmst und zum Java-GUI-Zeug gehst ...). OCaml-JavaScript sah interessant aus, aber denken Sie daran, dass Sie wahrscheinlich zusätzlich zu etwas JavaScript Zeit in gutes HTML 5 Coding-Setup investieren müssen, wenn Sie diesen Pfad wählen. Alternativ gibt es hier in SO mehrere Beiträge, in denen über Pipes und Sockets gesprochen wird. Dies sind gültige Methoden zum Erstellen eines GUI-Backend-Systems.Dies ist jedoch eine gute Idee, wenn es Ihnen nichts ausmacht, dass Ihr Programmsystem/Produkt "lose gekoppelt" ist. Ich werde diese Lösung aktualisieren, sobald ich LablGtk herausgefunden habe und sicherstellen, dass es ein akzeptables GUI-Frontend für meinen OCaml-Backend-Code liefert.

+0

Es wäre hilfreich zu wissen, was Ihre Zielplattform oder Plattformen sind. Für das, was es wert ist, ist es durchaus sinnvoll, Sockets in einem einzigen Host zu verwenden. Wenn Sie auf einem Unix-ähnlichen System arbeiten, gibt es "Unix Domain Sockets". –

+0

Ich habe gerade meinen Beitrag mit Informationen zur Zielplattform aktualisiert. Weiter, @ JeffreyScofield, während Sie Recht haben, dass Sockets möglicherweise nicht etwas auszuschließen sind, würde ich sehr interessiert sein, wenn es eine Art Lösung gibt, wo ich die GUI und Interpreter (in OCaml geschrieben) in einer Art von Programm/Executable, aber wenn das kein möglicher Pfad ist, dann können Sockets der richtige Weg sein ... aber das ist ein lockerer gekoppeltes System. Ich denke, wenn ich die Dinge enger zusammenhalten könnte, wäre das ideal! – 9codeMan9

Antwort

8

Ich denke, die LablGtk Toolkit ist derzeit auf dem neuesten Stand und gepflegt. Das wäre also eine Option. Ich habe es jedoch selbst nicht benutzt.

Es ist nicht zu schwierig, eine Reihe von OCaml-Modulen in ein Hauptprogramm in C, C++ oder Objective C zu integrieren. Sie können mehr oder weniger direkte Aufrufe an Ihre OCaml-Funktionen ausführen und Ergebnisse zurückerhalten. Dazu müssen Sie die Fremdfunktionsschnittstelle lernen, die nicht so schwierig ist, sobald Sie in den Groove kommen. Dann können Sie jede beliebige GUI-Bibliothek von der C-Familie aus verwenden. Wenn Sie an diesem Ansatz interessiert sind, können Sie mit Chapter 19 des OCaml-Handbuchs beginnen.

Sie können andere Sprachen abhängig von der Sprache mit einem C-Vermittler verknüpfen. Für eine interpretierte Sprache könnten Sie Ihre OCaml-Funktionen wahrscheinlich als neue Primitive hinzufügen. (Interpreter werden normalerweise nach meiner Erfahrung in C oder C++ geschrieben.)

Für Java gibt es OCaml-Java (wie Sie erwähnen). Ich habe es nicht selbst benutzt, aber es ist faszinierend. Ich glaube, es gibt ein paar Einschränkungen, die von der JVM auferlegt werden, also müssen Sie vielleicht ein wenig extra vorsichtig in Ihrer Programmierung sein.

Für eine Web-App gibt es js-of-ocaml, die OCaml zu JavaScript kompiliert.

+0

Während alle diese Optionen ansprechend sind, mag ich die Fremdfunktionsschnittstelle von OCaml in C wirklich. Welche Ressourcen empfehlen Sie, dass ich konsultiere, um FFI zu lernen, das in C geschrieben ist? Ich weiß, wie man in C programmiert, aber wie geht man bei der Integration eines FFI vor? Wo fange ich an zu lernen, wie man das macht? – 9codeMan9

+0

Ich habe alles, was ich darüber weiß, in [Kapitel 19] (http://caml.inria.fr/pub/docs/manual-ocaml/manual033.html) des OCaml-Handbuchs gelernt! –

+0

Die Lösungswege, die Sie vorgestellt haben, sind gut. Ich füge oben eine Notiz hinzu, für die ich mich entschieden habe. Danke für deine Einsichten! – 9codeMan9

1

Derzeit verwende ich in meinem Projekt in meinem Arbeitgeber C++ und OCaml mit Qt, mit einem C-Teil zu OCaml für Interop hinzugefügt. Der OCaml-Teil wird von C++ als Prozess bezeichnet, die beiden kommunizieren mit dem gemeinsamen Speicher von Qt. Es funktioniert für unser Projekt, aber für einen häufigeren Datenaustausch ist es nicht effektiv.

hier vielleicht ein andere Lösung, mit einem transpilator: https://github.com/bloomberg/bucklescript

Dieses Projekt zu OCaml Codes in JavaScript, so dass Sie GUI auf HTML5 Basis-GUI-Framework auf diese Weise tun können.

Der Hauptautor dieses Transpilators war auch eine Zeitlang ein wichtiger Beitrag für den OCaml-Compilator. Das React-Team gab auch viele Rückmeldungen zu diesem Projekt.