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 进行编程,软件交互会是:用合适的语言(可能是 C++、Python 等)编写 GUI,然后将 OCaml 编写的解释器编译成可执行文件,然后以某种方式将 GUI 连接到可执行文件?我对一些松散连接或奇怪的解决方案不感兴趣,通过管道(我一直在考虑这些的进程间通信,例如操作系统设计中所关心的)或套接字(我倾向于将这些用于网络编程),我想象一下,如果不是 OCaml 本身,必须有某种方法将我的 OCaml 编码解释器“容纳”在另一种语言的 GUI 代码中。有什么想法、指导或建议吗?

编辑:如果我能得到一个类似 Linux 的操作系统(即 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-->ie 中,您将不得不处理 C) 中每个 OCaml 函数及其参数的“映射”。看一眼: http://www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html, 了解更多信息。OCaml-Java 最初似乎是一个好主意,因为我对 Java GUI 编程很熟悉,但是这两种语言之间的交互不像 C 和 OCaml 那样直接,另外,这方面的文档似乎很薄(并且使用 OCaml -Java 不是你刚刚学习并获得 Java GUI 的东西......)。OCaml-JavaScript 看起来很有趣,但请记住,如果您选择此路径,除了一些 JavaScript 之外,您很可能还需要在良好的 HTML 5 编码设置上投入时间。或者,这里有几篇关于管道和套接字的帖子,它们是创建 GUI 后端系统的有效方法。但是,如果您不介意您的程序系统/产品将“松散耦合”,这是一个好主意。

4

2 回答 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。

于 2013-03-27T04:16:29.157 回答
2

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

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

这个项目用 JavaScript 翻译你的 OCaml 代码,所以你可以用这种方式在 HTML5 基础 GUI 框架上做 GUI。

这个编译器的主要作者也曾作为 OCaml 编译器的核心贡献者有一段时间了。React 团队也对这个项目提供了很多反馈。

于 2017-06-11T08:38:55.097 回答