【问题标题】:Embedding an ocaml interpreter嵌入 ocaml 解释器
【发布时间】:2014-10-15 02:28:01
【问题描述】:

我有一种小型语言,它基本上是 OCaml 的扩展(实际上它是 OCaml 子集的扩展,但这并不重要)。为了简化事情,我有一个“转义”表达式,可以将 OCaml 文字传输到我的语言中(因此您可以将任意 OCaml 代码嵌入到该语言中)。将这样的表达式编译为 OCaml 只是意味着解开字符串,但是如何评估它呢?

当然,我了解 OCaml 是一种静态类型语言以及该类型系统的一般工作原理。因此,我还需要能够提供一个环境并检查表达式的推断类型(或至少应对类型错误)。我也意识到需要管理解释器状态等。让我们暂时假设嵌入的表达式没有副作用。

显然这是可能的,因为 utop 和 toplevel 都是在 OCaml 中实现的。所以我的第一个想法是选择其中一个并根据我的需要进行调整。现在解决我的问题:

  • toplevel 显然是主要分布的一部分。尽管有一个具有必要功能的 toplevel.mli 甚至是 .mllib,但我找不到作为 打包库 的顶层 - 是否需要进一步的配置调整才能获得“解释器作为库”包?

  • utop 似乎做了更奇怪的事情。从我可以从源代码中得知,它在构建时将一些编译器库复制到其源目录中。这似乎很奇怪:如果它在构建时知道如何找到这些编译器库,为什么不简单地链接?

那么有什么合理的方法可以将 OCaml 解释器嵌入到 OCaml 程序中?

【问题讨论】:

  • 不包含你需要的'compiler-libs.toplevel'?
  • 确实。我不知道确切的库名称。能否请您对此做出回答,以便我接受?
  • @choeger 我认为自己这样做是可以的。 (/我不想窃取业力信用,但仍然希望得到正确的答案。)

标签: embed ocaml interpreter staging


【解决方案1】:

afaik 最简单的方法是使用字节码编译器将提供的代码编译成模块,然后用dynlink 加载并执行。您也可以通过本机编译器对其进行编译,但这需要您自己安装。

更新

你可以用任何方式编译你的文件,包括system命令,但你也可以直接调用编译器接口[1]:

Compile.implementation Format.std_formatter "test.ml" "test";;

这将在与“test.ml”文件相同的目录中创建test.cmotest.cmi 文件。之后,您可以使用Dynlink 加载它:

Dynlink.loadfile "test.cmo";;

[1] 该模块位于compiler-libs 库中的某个位置,可能是"compiler-libs.bytecomp"

【讨论】:

  • 哪些 API 提供了该功能?
  • 我在回复中添加了一个示例。
猜你喜欢
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
相关资源
最近更新 更多