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

szy*_*zet 17 erlang user-interface haskell functional-programming

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

Dee*_*ech 19

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

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

  1. 使用Haskell作为后端的Web应用程序和使用前端的Javascript/HTML.通信仅使用JSON完成.后端没有生成HTML或Javascript.
  2. 使用GTK2HS本机地在纯Haskell中

第一种方法的好处是:

  • 我被迫将GUI代码与后端逻辑分开.它绝对是为了更清洁的设计.
  • Haskell现在拥有高性能的Web服务器[4,5].如果您想在第三方Web服务器上编写PHP样式的脚本,它还具有出色的CGI/FastCGI和数据库支持.我使用后一种方法,效果很好.
  • UI库现在已经足够好了,在Javascript中构建前端是一种非常愉快的体验.我对Qooxdoo [2]非常满意,但有几个选项(jQuery,ExtJS ......)
  • Software Transactional Memory [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/