8

为了与我将要教授的课程一起使用,我正在为标准 ML 寻找快速编译器或字节码解释器。 我正在寻找快速编译时间;任何合理的运行时间都可以。如果编译模型简单明了,则有好处。班上的学生也将使用 MLton 生成好的二进制文件,但 MLton 编译速度很慢,而且有时学生需要可以与之交互的东西。

这是我已经知道的:

  • 新泽西的标准 ML 有一个交互式的 read-eval-print-loop,但是它的编译规则有点奇怪,而且有点慢。不过,它可能是领先的竞争者。

  • 莫斯科 ML 曾经是理想的,但它仍然没有被 2004 标准基础库更新。最不幸的是,因为除了许多其他优良特性之外,Moscow ML 还有一个交互式帮助系统——但我不能让我的学生使用一个编译器,它的库所做的事情与所有在线文档所说的不同。

  • Poly/ML 可能很符合要求,除了查看在线文档,我不知道如何编译它。那可能没问题。

目前,SML/NJ 或 Poly/ML 似乎是最好的折衷方案。自从我在标准 ML 方面做任何认真的工作以来已经有很多年了,我欢迎提供有关其他编译器的信息,或者根据您的经验,这些替代方案中的哪一个是交互最快且最容易学习使用的。

4

3 回答 3

10

Poly/ML 似乎比 SML/NJ 快一点。例如,用 Poly/ML、SML/NJ 和 MLton 编译HaMLet(大约 25850 行注释的 SML),我得到以下信息:

[mtf@fenrir hamlet-1.3.1.polyml]$ /usr/bin/time make with-poly
...
        2.92 real         2.31 user         0.55 sys
[mtf@fenrir hamlet-1.3.1.smlnj]$ /usr/bin/time make with-smlnj
...
       11.98 real        11.08 user         0.78 sys
[mtf@fenrir hamlet-1.3.1.mlton]$ /usr/bin/time make with-mlton
...
       24.51 real        21.04 user         3.05 sys

在编译 MLton 时,Poly/ML 和 SML/NJ 之间的区别并不那么明显(大约 175779 行注释的 SML):

[mtf@fenrir mlton.polyml]$ /usr/bin/time make polyml-mlton
...
      117.67 real       112.12 user         4.87 sys
[mtf@fenrir mlton.smlnj]$ /usr/bin/time make smlnj-mlton
...
      123.31 real       116.24 user         6.38 sys
[mtf@fenrir mlton.mlton]$ /usr/bin/time make mlton-compile
...
      238.44 real       232.01 user         5.49 sys

作为 REPL,Poly/ML 和 SML/NJ 几乎是等价的。我发现来自 SML/NJ 的错误消息要好一些;他们往往有更具体的来源位置。当然,当用作 REPL 时,SML/NJ 的源位置stdIn

如果您的学生只打算使用 REPL 或编译单文件程序,那么我想 Poly/ML 或 SML/NJ 都可以满足您的目的。两者都提供 SMLuse功能。多文件程序可能最好由 SML/NJ 的 Compilation Manager 或 MLton 的 ML Basis System 提供服务;Poly/ML 提供了另一个编译系统 ( PolyML.make),但我从未使用过它。

您在编译 Poly/ML 时遇到什么困难?从 5.0 版开始,Poly/ML 支持简单./configure ; make ; make install构建。使用 Poly/ML 5.X 编译独立的可执行文件需要使用PolyML.export和调用 C 编译器,但在 5.0 版本的发行说明中有很好的描述。

于 2010-07-08T19:58:21.847 回答
3

我很欣赏这是对这个问题的一个非常晚的答案,但是 github 上有一个带有更新的基础库的莫斯科 ML 项目。它位于https://github.com/kfl/mosml/(2012年 11 月更新!)

我还获得了实现莫斯科 ML 的大部分新基础库的代码,这样我就可以使用它和 Poly/ML 来实现 HOL4。代码都在http://github.com/mn200/HOL里面,如果你想要的话可​​以挖出来。

于 2013-01-18T09:31:38.013 回答
1

莫斯科 ML有一个LLVM 端口。我不知道它是否可用于所有用途,但就速度而言,它应该比旧的 camlrunm 更好。

也许值得您花时间移植您认为与文档中的代码不同的功能。我相信莫斯科 ML 的维护者会很感激它。

我没有发现莫斯科 ML 附带的文档和实际实现有什么不同,但我没有在标准 ML 中做任何大项目。我认为,如果您能举一个莫斯科 ML 文档与实现不同的示例,将会很有帮助。这也会让我感兴趣。

于 2010-07-11T19:57:27.687 回答