OCaml:GUI编程的有效路径?

19
我看到了一些关于OCaml GUI编程的讨论,但我觉得它们并没有明确地提供在需要GUI界面时的解决方案。
更具体地说,我的问题是:在编写OCaml软件的GUI方面,最有效(且易于掌握)的方法是什么?有人接触过OCaml本身的简单有效的GUI模块,或者找到了一种有效的语言或自由软件包,可以用它来完成这项工作,并与OCaml良好地通信/协作吗?
我已经用OCaml编写了一个解释器,因此我的词法分析器、语法分析器、核心解释器函数等都是OCaml模块。目前,我有一个命令行解决方案(一个“main.ml”),允许用户通过在命令行中输入表达式并接收打印的终端输出来与解释器交互,显示已解析和简化的表达式等。然而,这个命令行解决方案只是为了测试目的。我希望用户通过GUI进行交互,它可以很简单(Java框架是从很久以前开始考虑的),但需要以某种方式与我编码的OCaml模块进行接口。到目前为止,我已经找到了一个OCaml库:http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html。有人知道这是否有效和有用吗?(我认为我已经听到关于这个库的负面评论)
如果我选择用更适合的语言编写GUI,那么软件交互会是:用适合的语言编写GUI(例如C++,Python等),然后将OCaml编写的解释器编译成可执行文件,然后以某种方式将GUI连接到可执行文件。我不感兴趣的是一些松散连接或奇怪的解决方案,比如管道(我一直在想操作系统设计中所涉及的进程间通信)或套接字(我倾向于将这些用于网络编程),如果不是OCaml本身,我想象一定有一种方法可以将我的OCaml编码的解释器“嵌入”到另一种语言的GUI代码中。有什么想法、指导或建议吗?
编辑:如果我能在类似Linux RedHat的操作系统上得到GUI,我会很高兴。如果我能让GUI在Windows上工作,那就太好了,但至少我要在Linux上运行。

编辑2:刚刚发现这个,有人对"OCaml-Java"有什么看法吗?http://ocamljava.x9c.fr/它听起来相当有趣,因为它具有"...运行已经使用ocamlc编译的Objective Caml源代码的能力;其次,将Objective Caml源代码编译成可执行的jar文件的能力。"我的担忧是,从未让我觉得Java是获得快速但有用的GUI的最佳方式...

当前解决方案:在检查了下面@Jeffrey Scofield提供的各种解决方案后,我选择目前深入研究LablGtk(这将允许我保持在OCaml中)。对于那些查看此帖子的人来说,下一个有前途的选择是研究与C的外语接口,因为C和OCaml已经有了一些关系。似乎有办法在OCaml中调用C代码,在C中调用OCaml(尽管这可能非常困难,因为您最终将用相当复杂的包装器函数包装OCaml函数调用,并且这些函数将更具体地针对从OCaml内部调用的函数类型-->即您将不得不处理每个OCaml函数及其参数在C中的“映射”)。请查看http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html获取更多信息。最初,OCaml-Java似乎是一个很好的想法,因为我熟悉Java GUI编程,但是两种语言之间的交互不像C和OCaml那样直接,而且这方面的文档似乎很少(使用OCaml-Java不是你只需拿起并开始进行Java GUI编程...)。OCaml-JavaScript看起来很有趣,但请记住,如果您选择这条路,最可能需要投资时间进行良好的HTML 5编码设置以及一些JavaScript。或者,这里有几篇SO文章谈论管道和套接字,这是创建GUI后端系统的有效方法。但是,如果您不介意您的程序系统/产品将是“松散耦合”的,那么这是一个好主意。我将在弄清楚LablGtk并确保它为我的OCaml后端代码产生可接受的GUI前端后更新此解决方案。

知道你的目标平台或平台将有所帮助。就此而言,在单个主机内使用套接字是完全合理的。如果您在类Unix系统上,则有“Unix域套接字”。 - Jeffrey Scofield
刚更新了我的帖子,根据你的评论提供了有关目标平台的信息! 此外,@JeffreyScofield,虽然你说套接字可能不是要排除的东西,但如果有一种解决方案,我可以将GUI和解释器(用OCaml编写)打包到一个程序/可执行文件中,我会非常感兴趣。但如果这不是可能的路径,那么套接字可能是正确的选择...但我认为这是一种松散耦合的系统,如果我能保持更紧密的耦合,那就太理想了! - 9codeMan9
2个回答

10

我认为LablGtk工具包目前相当更新和维护良好。因此,这将是一个选择。但我自己没有使用过。

将一组OCaml模块链接到用C、C++或Objective C编写的主程序中并不太困难。您可以直接或间接调用OCaml函数并获得结果。为此,您需要学习外部函数接口,一旦进入状态就并不太难。然后,您可以从C家族的任何GUI库中选择喜欢的。如果您对此方法感兴趣,则可以从OCaml手册的第19章开始。

您可以使用C中间人连接其他语言,具体取决于语言。对于解释性语言,您可能可以将您的OCaml函数添加为新原语。(在我的经验中,解释器通常用C或C++编写。)

对于Java,有OCaml-Java(正如您提到的)。我自己没有使用过它,但它很有趣。我相信JVM会有一些限制,所以您可能需要在编码时多加小心。

对于Web应用程序,有js-of-ocaml,它将OCaml编译为JavaScript。


虽然所有这些选项都很吸引人,但我真的很喜欢 OCaml 对接 C 的外部函数接口(FFI)。你推荐我查阅哪些资源来学习用 C 编写 FFI?我知道如何编写 C 程序,但该如何集成 FFI 呢?我应该从哪里开始学习呢? - 9codeMan9
我所知道的关于它的一切都是从OCaml手册的第19章中学来的! - Jeffrey Scofield
你提供的解决方案很好。我会在顶部添加一个注释,说明我选择了什么。感谢你的见解! - 9codeMan9
此链接现在已经到达手册的第19章,即“使用C与OCaml进行接口编程”。 - semperos

2

我目前在雇主的项目中使用C++和OCaml与Qt一起使用,为了互操作性,在OCaml中添加了一个C部分。 C++调用OCaml部分作为进程,两者通过Qt的共享内存进行通信。它对我们的项目有效,但对于更频繁的数据交换,它将不会是有效的。

这里可能有另一种解决方案,使用转译器:https://github.com/bloomberg/bucklescript

该项目将您的OCaml代码转换为JavaScript,因此您可以以这种方式在基于HTML5的GUI框架上进行GUI。

这个转译器的主要作者也曾经是OCaml编译器的核心贡献者,React团队也对这个项目给出了很多反馈。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接