2010-04-24 2 views
6

Sowohl in Haskell als auch in OCaml ist es möglich, aus C-Programmen die Sprache aufzurufen. Wie durchführbar wäre es, native Anwendungen für Windows, Mac oder Linux zu erstellen, die diese Technik ausgiebig nutzen?Erstellen von GUI-Desktop-Anwendungen, die entweder OCaml oder Haskell aufrufen - Ist es ein Idiot?

(Ich weiß, dass es GUI-Bibliotheken wie wxHaskell, aber nehme man einen Teil Ihrer Anwendungslogik in der Fremdsprache. Nur haben wollte)

Oder ist dies eine schreckliche Idee?

+0

http://mldonkey.sourceforge.net/Main_Page – grettke

+0

http://coherentpdf.com/blog/?tag=ocaml – grettke

+0

Caveat (http://www-list.cea.fr/labos/gb/LSL/ caveat/index.html) ist ein Verifikationswerkzeug für kritisches eingebettetes C, das hauptsächlich in C++ geschrieben ist, aber OCaml als Skriptsprache verwendet (ein während einer interaktiven Sitzung erzeugtes Caml-Journal kann kompiliert und mit Caveat verknüpft werden, um jederzeit wiedergegeben zu werden) . –

Antwort

3

Ich mache ausgiebig Gebrauch von diesem, indem ich haskell geteilte Bibliotheken zusammenstelle, die außerhalb Haskell genannt werden.

in der Regel der beteiligten Aufgaben wären

  1. die richtigen ausländischen Ausfuhranmeldungen
  2. Storable Instanzen für alle Datentypen Sie
  3. erstellen, um die C-Strukturen (oder Strukturen in der Sprache Marschall müssen erstellen Sie erstellen Diese Informationen lesen Sie bitte
  4. Da ich die Haskell RTS nicht manuell initialisieren möchte, füge ich der lib selbst Initialisierungs-/Beendigungscode hinzu. (dllmain in windows __attribut__ ((Konstruktor)) auf Unix)
  5. Da ich keine von ihnen mehr brauche, erstelle ich eine .def-Datei, um alle Schließ- und RTS-Funktionen davor zu verbergen, in der Exporttabelle (Windows)
  6. zu sein
  7. GHC verwenden, um alles zusammen

Diese Aufgaben sind eher Roboter und strukturiert, bis zu einem Punkt kompilieren Sie etwas, sie zu automatisieren schreiben konnte. Tatsächlich verwende ich selbst ein Tool, das die Abhängigkeitsverfolgung von Funktionen, die Sie zum Exportieren markiert haben, durchführt. Es wird sie zusammenfassen und die gemeinsam genutzte Bibliothek für Sie kompilieren und Ihnen die Deklarationen in C/C++ geben.

(leider ist dieses Tool noch nicht auf Hackage, weil es etwas ist, ich muss noch beheben und eine Menge mehr zu testen, bevor ich bequem bin dabei)

-Tool verfügbar ist hier http://hackage.haskell.org/package/Hs2lib-0.4.8

5

Nun, das Hauptrisiko besteht darin, dass während Einrichtungen vorhanden sind, sie nicht gut getestet sind - nicht viele Apps tun dies. Sie sollten nicht viel Mühe haben Haskell von C aufrufen, sieht ziemlich einfach:

http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

Ich würde sagen, wenn es einen zwingenden Grund ist C für das vordere Ende zu verwenden (zB Sie eine Legacy-App haben) und du brauchst wirklich eine Haskell-Bibliothek oder willst Haskell aus einem anderen Grund benutzen, dann, ja, mach es. Das Hauptrisiko besteht nur darin, dass nicht viele Menschen dies tun, also weniger Dokumentation und Beispiele, als dass sie den anderen Weg weisen.

4

Sie können OCaml in C einbetten als auch (siehe the manual), obwohl diese als Verlängerung OCaml mit C.

2

nicht so häufig getan wird, oder ist dies eine schreckliche Idee?

Es ist keine schreckliche Idee überhaupt. Aber wie Don Stewart bemerkt, ist es wahrscheinlich ein weniger ausgetretener Pfad. Sie könnten Ihr Programm sicherlich als Haskell oder OCaml starten, dann lassen Sie es einen ausländischen Funktionsaufruf direkt aus dem Starttor — tun und ich empfehle Ihnen, Ihren Code so zu strukturieren —, aber es ändert nicht die Tatsache, dass viele mehr Leute anrufen von Haskell nach C als von C nach Haskell. Ebenso für OCaml.

4

Ich glaube, dass der beste Ansatz, auch wenn sowohl GUI als auch Logik in derselben Sprache geschrieben sind, darin besteht, zwei Prozesse auszuführen, die über ein lesbares, textbasiertes Protokoll (ein DSL von einer Art) kommunizieren. Diese Architektur gilt auch für Ihren Fall.

Die Vorteile liegen auf der Hand: GUI ist abnehmbar und austauschbar, automatisierte Tests sind einfacher, Logging und Debugging sind viel einfacher.

Verwandte Themen