【问题标题】:Can js_of_ocaml compile in-memory data-structures from the OCaml compiler?js_of_ocaml 可以从 OCaml 编译器编译内存数据结构吗?
【发布时间】:2013-11-13 23:46:32
【问题描述】:

鉴于 OCaml 编译器和 js_of_ocaml 都是用 OCaml 编写的,(对我而言)我应该能够编写一个使用的包装器似乎是合理的:

  1. OCaml compilerlibs 将 OCaml 源代码编译成 Instruct.instruction list(使用 Bytegen.compile_implementation),以及
  2. js_of_ocaml 将指令列表编译成 JavaScript,从而绕过Parse_bytecode

因此,我会将所有数据保存在内存中,避免写入然后读取cmo 文件。我希望我可以将 cmo 写入缓冲区并让 js_of_ocaml 处理它,但它似乎充其量是低效的。

这是现实的/以前做过,还是我只是想在错误的地方/方式加入这两个组件?

【问题讨论】:

  • 标签compiler 应用于有关编译器编程的问题或有关编译器详细内部工作的问题。不要使用compiler 询问有关特定编译器的选项和设置的问题,请改用您感兴趣的编译器的名称。
  • 其中一个编译器 (ocamlc) 没有标签。我使用了其他编译​​器的标签(js_of_ocaml)。此外,我还引用了两个编译器(Instruct 和 Parse_bytecode)的内部工作原理。我的问题是我如何以编程方式将两个编译器粘合在一起。

标签: ocaml js-of-ocaml


【解决方案1】:

我几乎可以肯定http://edit.ocamlpro.com/ 在浏览器中在线将源代码编译为 OCaml 字节码时使用了这种方法。

来源:https://github.com/pcouderc/ocp-webedit

【讨论】:

  • src/toplevel-src/toplevelw.ml 暗示编译器+解释器在 JavaScript 中执行(字节码被解释)。但是, src/main-src/mytoplevel 包含一个 Eval (str) (暗示对 JavaScript 的一些编译)。然后, mycompile 似乎只编译为字节码。这里似乎没有任何紧密的集成。否则,如果 edit.ocamlpro 类似于 js_of_ocaml 中的顶层,它会编译为字节码并在 JavaScript 编译程序中解释它。无需编译 JavaScript。
  • 我无法完全理解您的评论,但 ocp-webedit 允许将生成的字节码下载到机器上,并且它不会在单独的服务器上执行它,因此它会在 Javascript 中生成字节码,因此它在客户端使用编译器库。我错过了什么?
  • 是的,它使用客户端的编译器库来生成字节码。该字节码在 OCaml VM 中执行(参见 toploop)。 VM 本身是从字节码编译成 JavaScript 并在浏览器的 JavaScript VM 中执行的。等效的是在浏览器中执行 js_of_ocaml 以跳过 OCaml VM 步骤。
【解决方案2】:

他们说它更容易维护。

https://www.lri.fr/~conchon/TER/2012/3/js_of_ocaml.pdf

虚拟机提供了非常稳定的 API。 ... 因此,无需在每个版本的语言都修改编译器以支持最新功能

【讨论】:

  • 感谢您的参考和报价,这关闭了方法的大门。很遗憾,因为js_of_ocaml/instr.ml 看起来像是将字节码转换回指令,而ocamlc/emitcode.ml 将指令转换为字节码,很难理解为什么指令集之间的分歧会便于维护。
  • js_of_ocaml 必须检查 cmo 文件之间的一致性,并链接这些文件?
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多