Compiler construction 用于Linux的快速标准ML编译器或字节码解释器,带读取-评估-打印循环?

Compiler construction 用于Linux的快速标准ML编译器或字节码解释器,带读取-评估-打印循环?,compiler-construction,functional-programming,interpreter,sml,Compiler Construction,Functional Programming,Interpreter,Sml,对于我将要教授的课程,我正在寻找标准ML的快速编译器或字节码解释器。我正在寻找快速编译时间任何合理的运行时间都可以。如果编译模型简单明了,则会有好处。课堂上的学生也将使用MLton生成好的二进制文件,但MLton编译速度慢,有时学生需要一些可以交互的东西 以下是我已经知道的: 新泽西州的标准ML有一个交互式的read-eval-print循环,但是它的编译规则有点奇怪,而且有点慢。不过,它可能是领先的竞争者 莫斯科ML曾经是理想的,但它仍然没有与2004年的标准基础库一起更新。最不幸的是,除了

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

以下是我已经知道的:

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

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

  • Poly/ML可能很适合这一要求,除了在线查看文档,我不知道如何编译它。也许可以


目前看来,SML/NJ或Poly/ML是最好的折衷方案。我已经很多年没有认真使用标准ML了,我希望了解其他编译器的信息,或者根据您的经验,这些编译器中哪一个交互速度最快,使用起来也最容易。

Poly/ML似乎比SML/NJ快一点。例如,使用Poly/ML、SML/NJ和MLton编译(约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):

作为repl,Poly/ML和SML/NJ几乎是等效的。我发现来自SML/NJ的错误消息要好一点;它们往往有更具体的震源位置。当然,当用作REPL时,SML/NJ的源位置是以
stdIn
为单位的,行号对它们没有太大帮助

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

编译Poly/ML有什么困难?从5.0版开始,Poly/ML支持一个简单的
/configure;制作进行安装
build。使用Poly/ML 5.X编译一个独立的可执行文件需要使用
PolyML.export
并调用C编译器,但在5.0版发行说明中有相当好的描述。

莫斯科ML有一个版本。我不知道它是否适用于所有用途,但在速度方面,它应该比旧的camlrunm更好

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


我没有发现莫斯科ML附带的文档与实际实现之间的差异,但我没有在标准ML中执行任何大型项目。我认为如果您能给出一个莫斯科ML文档与实现之间的差异的示例,这将是非常有帮助的。这也会引起我的兴趣。

我很感激这是一个很晚才回答这个问题的答案,但是github上有一个莫斯科ML项目,它有一个更新的Basis库。它位于(2012年11月更新!)


我还得到了实现莫斯科ML的大部分新Basis库的代码,这样我就可以使用它和Poly/ML来实现HOL4。这方面的代码都在里面,如果您需要,可以将其挖掘出来。

我在编译Poly/ML时没有遇到任何困难;我刚刚安装了Debian软件包。我搞不清楚的是“另一个编译系统”。我非常希望学生们能够使用他们熟悉的模型——编译源代码以获得可执行的二进制文件——但要比MLton快一点。也许我应该下载HaMLet,看看Makefile是如何设置的+1 HaMLet和MLton(以及Isabelle AFAICT)通过
use
功能驱动Poly/ML。我不知道有哪个项目(除了Poly/ML本身)使用PolyML.make工具。您可以要求Poly/ML邮件列表上的指针;Isabelle/ML使用非常方便的PolyML.Compiler结构来实现自己的
use
变体,这样就可以在内部管理对ML环境的影响,例如允许撤消/回滚静态环境。库模块
TextIO
Array
,和
Vector
不符合标准。多年来,我一直在关注莫斯科人民解放军,他们根本不在乎。如果他们不关心软件的改进,我为什么要这样做?另一方面,也许我的问题不清楚,但我关心的是快速编译时间。任何合理的运行时间对我来说都没问题。我将看看我能为标准库的标准一致性做些什么。这似乎是一份有用的工作。我认为莫斯科ML的主要问题是它似乎被原来的维护者抛弃了。近十年后,当两名丹麦学生开始触摸LLVM端口时,它获得了一点动力,但这似乎也停滞不前。我认为标准ML失去了很多(潜在的)用户和研究人员给Haskell。也许这就是为什么没有人再那么在意的原因。实际上,我给了exsml存储库错误的链接。我改正了。你能看一下,看看它是否正确吗
[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