用一种语言编写GUI,用另一种语言编写主应用

时间:2011-06-13 13:20:13

标签: user-interface haskell erlang functional-programming

假设我在Haskell或Erlang中编写了一个应用程序(或者其他任何内容,无所谓),我希望它能用更友好的语言(我的观点)与我的gui一起工作。让我们说Python。如何粘这两个?您将如何在这两个应用程序之间进行通信?制作某种服务器或什么?这种解决方案很受欢迎吗?我见过像SMplayer这样的东西,它是mplayer的gui,它的效果非常好。您对这种设计有何看法?

6 个答案:

答案 0 :(得分:19)

我使用两种方法(客户端/服务器,本机)在Haskell中编写应用程序,并且它们都具有{dis}优势。我意识到这更多是你所要求的,但我已经记录了这两种方法的优点和缺点,希望它能帮助你做出更明智的决定。

更具体地说,我使用的方法是:

  1. 使用Haskell作为后端的Web应用程序和使用前端的Javascript / HTML的Web应用程序。通信仅使用JSON完成。后端没有生成HTML或Javascript。
  2. 使用GTK2HS本地使用纯Haskell
  3. 第一种方法的优点是:

    • 我被迫将GUI代码与后端逻辑分开。它绝对是为了更清洁的设计。
    • Haskell现在拥有高性能的网络服务器[4,5]。如果您想在第三方Web服务器上编写PHP样式的脚本,它还具有出色的CGI / FastCGI和数据库支持。我使用后一种方法,效果很好。
    • 现在,在Javascript中构建前端是非常愉快的体验,UI库已经足够好了。我对Qooxdoo [2]非常满意,但有几个选项(jQuery,ExtJS ......)
    • 软件事务存储器[3]使得在服务器端存储并发访问状态变得微不足道。 STM是这种方法可行且有趣的最大原因。
    • 我喜欢UI是一致的,可以轻松部署到任何可以运行Web浏览器的平台上。如果你的应用程序必须在Mac以及Windows和Linux上运行,我仍然认为这是最好的方法(更多信息如下)。

    第一种方法的缺点是:

    • 即使我知道这是一个单用户应用程序,我也必须处理身份验证和会话。现在有框架(Yesod,Happstack ......)可以帮助解决这个问题,但我认为通过编写本机应用程序可以避免意外的复杂性。
    • 我不得不推出自己的客户端/服务器通信协议。扩展协议并确保它是正确的在Javascript端是痛苦的,但在Haskell端是一个绝对的快乐。我怀疑你选择的任何GUI友好语言/ Haskell组合都会出现这种情况。
    • 我的代码中有很大一部分只是编组和解组JSON数据。现在这不是一个问题,因为我认为有许多Haskell库可以自动化这个[1]。
    • 大多数主机不支持Haskell应用程序。

    第二种方法的优点是:

    • 您的所有开发都使用相同的语言,因此更容易测试。
    • Glade非常适合用于可视化构建GUI,而Haskell集成非常好。
    • 在Windows和Linux上部署非常简单。
    • GTK2HS非常好,完整且文档齐全。
    • 绑定也试图反映GTK本身的OO结构。这有一些缺点(见下文),但最大的优点是我能够使用其他语言绑定的文档来填补任何文档空白。当我开发时,我经常提到Python的优秀GTK文档。

    第二种方法的缺点是:

    • 在Mac上部署GTK2HS应用程序非常糟糕,启动时看起来很难看。
    • 在Windows上安装GTK2HS非常重要,在Mac上这是一个开放的研究问题。
    • GTK2HS要求您编写非常 unidiomatic Haskell。整个地方都有可变状态,缺少对象意味着你实际上是在编写程序代码。

    希望这不是TMI。

    -deech

    [1] http://www.google.co.uk/search?hl=en&as_sitesearch=hackage.haskell.org%2Fpackage&as_q=json

    [2] http://www.qooxdoo.org

    [3] http://www.haskell.org/haskellwiki/Software_transactional_memory

    [4] http://hackage.haskell.org/package/warp-0.3.2.3

    [5] http://snapframework.com/

答案 1 :(得分:2)

你可以这样做:

  • Haskell或Erlang中的核心程序可以在命令行上自行运行,并提供控制台提示等。
  • 任何语言的GUI启动核心程序并通过核心的stdin和stdout驱动它。

此方法由gdb(core)/ ddd(GUI)使用。 这使您可以轻松调试commande线上的核心。 使用这种方法,您还可以使用核心,单元测试等轻松完成批处理脚本。

答案 2 :(得分:1)

如果用gui友好语言表示使用Visual GUI Designer,那么你仍然可以在haskell中使用它。 2个主要的linux GUI框架,GTK和QT都有视觉设计师,你可以使用他们从haskell生成的GUI文件。

查看gtk2hs或qthaskell库。

答案 3 :(得分:1)

Thrift支持Haskell,Erlang和Python:

  

Thrift是一个软件框架   可扩展的跨语言服务   发展。它结合了一个软件   堆栈与代码生成引擎   构建有效工作的服务   并且在C ++,Java之间无缝地,   Python,PHP,Ruby,Erlang,Perl,   Haskell,C#,Cocoa,JavaScript,   Node.js,Smalltalk和OCaml。

答案 4 :(得分:0)

您有两个明显的选择:

  1. 将整个应用程序放在一个进程中。这通常涉及Windows DLL(本机,COM,托管程序集等)或Unix共享对象。
  2. 使用IPC机制在应用程序的两个部分之间进行通信。
  3. 如果所涉及的语言适合,通常选项1是优选的。

答案 5 :(得分:0)

它将取决于您想要用于GUI和逻辑的确切语言。正如大卫回答的那样,你基本上只有这两种选择,而且它们都有优点和缺点:

将所有内容放在一个应用程序中是性能最佳的,因为当您调用另一种语言时,它将不会等到另一个进程获得控制权,然后不会等待您的进程获得再次控制以获得答案。如果您可以将语言嵌入另一种语言中,这也是最简单的解决方案,那么根据定义它们将在同一个过程中运行。

如果你一直在“逻辑”过程中做很多事情,那么使用不同的过程可能会很好,但是希望gui仍能保持响应。 (虽然这也可以通过线程实现,在一个过程中)。此外,如果您无法嵌入语言,这将是最简单的解决方案。 (例如,使用IPC的简单套接字,它几乎存在于所有语言中,并且是真正可移植的。(对于像管道或共享内存这样的东西不是这样)

所以这取决于您选择的语言。