首页 文章

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

提问于
浏览
17

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

6 回答

  • 1

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

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

    • 使用Haskell作为后端的Web应用程序和用于前端的Javascript / HTML . 通信仅使用JSON完成 . 后端没有生成HTML或Javascript .

    • 使用GTK2HS本身在纯Haskell中

    第一种方法的好处是:

    • 我被迫将GUI代码与后端逻辑分开 . 它绝对是为了更清洁的设计 .

    • Haskell现在拥有高性能的Web服务器[4,5] . 如果您想在第三方Web服务器上编写PHP样式的脚本,它还具有出色的CGI / FastCGI和数据库支持 . 我使用后一种方法,效果很好 .

    • UI库现在已经足够好了,在Javascript中构建前端是一种非常愉快的体验 . 我对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 . 有's mutable state all over the place and the lack of objects means that you'本质上是编写程序代码 .

    希望这不是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/

  • 19

    你可以这样做:

    • Haskell或Erlang中的核心程序可以在命令行上自行运行,并带有控制台提示符等 .

    • 任何语言的GUI启动核心程序并通过核心的stdin和stdout驱动它 .

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

  • 0

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

    查看gtk2hs或qthaskell库 .

  • 0

    Thrift支持Haskell,Erlang和Python:

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

  • 1

    你有两个明显的选择:

    • 将整个应用程序放在一个进程中 . 这通常涉及诸如Windows DLL(本机,COM,托管程序集等)或Unix共享对象之类的东西 .

    • 使用IPC机制在应用程序的两个部分之间进行通信 .

    如果所讨论的语言是合适的,通常选项1是优选的 .

  • 2

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

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

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

    所以它真的取决于你会选择的语言 .

相关问题