2009-02-16 19 views
20

Was ist besser für die Entwicklung von GUI-Anwendungen mit Haskell, WXWidgets (über) oder GTK (über Gtk2HS)?Was sind die relativen Vorteile von wxHaskell und Gtk2HS?

Was sind die Vor- und Nachteile von jedem? Ist das abhängig von der Plattform, auf die Sie ausgerichtet sind (ich würde hauptsächlich an OS X arbeiten, möchte aber, dass meine Programme auch unter Linux und Windows funktionieren)?

Antwort

23

[Disclaimer: Ich bin ein wxHaskell Maintainer]

Beide sind stabil und ziemlich vollständige GUI-Bindungen, und Sie könnten entweder für die meisten Projekte mit Zuversicht wählen. Beide haben ein gewisses Maß an "höheren" Haskell-Bindungen, aber in beiden Fällen müssen Sie in eine eher imperative "C" -Stil-Kodierung fallen, um die Dinge zu erledigen. Mein Eindruck ist, dass wxHaskell Ihnen erlaubt, etwas mehr Zeit in den höheren Bindings zu verbringen, aber ich habe nicht viel GTK2HS gemacht, und auf jeden Fall finden Sie auf jeden Fall am dünnen Ende des Wrappers für beide Bibliotheken - und ich denke, dass die Gesamtkomplexität der Programmierung in beiden Fällen ähnlich ist.

Deshalb nehmen wir die grundlegende Funktionalität als gegeben und konzentrieren uns auf die Unterschiede. Bitte beachten Sie, dass ich wirklich glaube, dass GTK2HS eine ausgezeichnete Arbeit ist, und dass Sie glücklich sein werden, wenn Sie es wählen. Das meiste, was ich unten sage, ist eine persönliche Interpretation der Unterschiede, und warum ich selbst und mit wxHaskell arbeite.

GTK2HS arbeitet an einem größeren Team und wird regelmäßig veröffentlicht. wxHaskell wird nicht so häufig aktualisiert, aber das Kernteam ist aktiv, und es gibt regelmäßige Bugfixes, aber mit großen neuen Funktionen, die etwas langsamer hinzugefügt werden, als wir möchten (wir haben alle Tagesjobs).

wxHaskell bietet eine echte native Anwendung Erscheinung auf allen unterstützten Plattformen out of the box. GTK2HS ist natürlich nativ auf Linux und hat ein ziemlich gutes natives Thema auf Windows (d. H. Gut genug, um alle außer Pedanten zu befriedigen ...), hat aber GTK Aussehen und Verhalten auf OSX und hängt davon ab, X11 installiert zu haben. Ich glaube, dass eine "native" GTK-Bibliothek von OSX gerade entwickelt wird, aber als relativ unreif gilt. Sobald dies stabil ist, sollte GTK2HS in der Lage sein, leicht von dem gleichen "teilweise nativen" Aussehen und Verhalten zu profitieren (z. B. GTK OSX screenshot).

wxHaskell ist wahrscheinlich ein wenig einfacher zu erstellen, wenn Sie nicht auf Linux (GTK2HS ist wahrscheinlich einfacher, wenn Sie Linux gehostet), aber beide sind ziemlich komplex zu bauen, um ehrlich zu sein, da es eine erhebliche Anzahl von Abhängigkeiten gibt in beiden Fällen.

Es ist etwas einfacher (IMHO), Anwendungen basierend auf wxHaskell zu verteilen, einfach weil es weniger Bibliotheksabhängigkeiten hat. Ich vertreibe Anwendungen hauptsächlich mit InnoSetup unter Windows und als App-Bundles unter OSX. Ich würde zugeben, dass mit nur wenigen zusätzlichen Arbeiten dasselbe mit GTK2HS getan werden könnte, was wahrscheinlich das schwächste Argument für wxHaskell ist.

Es ist meine persönliche Meinung, dass wxHaskell freundlicher zu Closed Source (z. B. kommerziellen) Entwicklungen ist. Dies ist natürlich das Thema endloser Flammenkriege, also werde ich nur sagen, dass wxHaskell unter der wxWidgets license steht, was eindeutig eine Closed-Source-Entwicklung ermöglicht. GTK2HS ist LGPL, also müssen Sie Ihren Anwalt fragen - obwohl ich deutlich machen muss, dass viele Menschen und Unternehmen zu dem Schluss gekommen sind, dass LGPL mit der kommerziellen Entwicklung vereinbar ist; Die Anwälte der Firma, für die ich arbeite, sind zu dem Schluss gekommen, dass dies für unsere Projekte nicht angemessen ist.

Ich denke, wenn Linux meine Hauptentwicklungs- und Lieferplattform wäre, würde ich wahrscheinlich GTK2HS verwenden. Es ist jedoch nicht: Ich liefere hauptsächlich mit gelegentlichen OSX zu Windows, und ich denke, wxHaskell ist eine bessere Übereinstimmung mit diesen Plattformen, obwohl beide Optionen alle drei Plattformen unterstützen.

Ich hoffe, dass dies Ihnen bei Ihrer Wahl helfen wird.

3

Ich habe ziemlich unvollständige Informationen, aber da Sie noch keine Antworten haben, sind vielleicht unvollständige Informationen besser als keine.

Die Frage zu stellen ist: Ist das Toolkit nur ein Wrapper um C-ähnliche Funktionalität, oder gibt es eine zusätzliche Ebene, die dem Toolkit eine "native Haskell-like" API gibt? Als wxHaskell zum ersten Mal auf dem Haskell-Workshop angekündigt wurde, sah die Entwicklung der nativen Haskell-API äußerst vielversprechend aus, war aber immer noch unvollständig. Es sieht so aus, als ob die "Haskellized" API für wxHaskell noch bearbeitet wird, während das Gtk2Hs Projekt dieses Problem überhaupt nicht erwähnt. Aus diesem Grund würde ich WxHaskell empfehlen.

4

Eine Überlegung ist, dass es derzeit etwas einfacher ist, wxHaskell nativ auf Mac OS X zu verwenden. GTK2HS hängt von GTK ab, das eine Implementierung mit nativen Widgets unter Mac OS X hat, aber diese Implementierung ist nicht so einfach wie die wxWidgets-Implementierung für Mac OS X ist.

Wenn Sie also Code entwickeln möchten, der ohne X11.app läuft, sind Sie mit wxHaskell derzeit etwas besser dran.

ist jedoch zu beachten, dass dies schnell ändert: http://www.haskell.org/haskellwiki/Gtk2Hs#Using_the_GTK.2B_OS_X_Framework zeigt, wie GTK2HS mit nativen GTK + auf Mac OS X.

Ein Vorteil GTK2HS zu verwenden ist die Glade-Unterstützung, die Entwicklung von einfachen Benutzeroberfläche macht sehr schnell. Die höheren Kombinierer in wxHaskell mindern den größten Teil dieses Vorteils, aber sie erfordern ein tieferes Verständnis darüber, wie Ihre Oberfläche aussehen und sich verhalten soll, und sind daher auf explorative Weise schwieriger zu verwenden.

0

Persönlich würde ich in eine Art Reactive-Paket/Erweiterung schauen. Es scheint mit dem Paradigma viel näher zusammen zu sein. Anstatt Ihr grafisches Zeug zwingend zu spezifizieren, können Sie es deklarativ tun. Beispiel (nicht repräsentativ für eine bestimmte Sprache oder Implementierung):

x, y, z    :: Int 
click, buttonclicked :: Bool 
x = <X coordinate of mouse> 
y = <Y coordinate of mouse> 
click = <Whether mouse button is currently being pressed> 
z = x + y 
buttonclicked = (x == 10 && y == 10 && click) 

ButtonClicked und z werden automatisch jedes Mal, x und y Änderung aktualisiert werden.

Sie könnten dann eine gewisse Logik haben irgendwo, dass so etwas wie folgt aussieht:

if buttonclicked then <do something> else <do something else> 

Das ist alles, aber sehr unscharf. Schauen Sie sich einige reaktive Schnittstellen an: