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

Nor*_*sey 8 compiler-construction interpreter functional-programming sml

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

这就是我所知道的:

  • 新泽西州的标准ML有一个交互式读取 - 评估 - 打印循环,但它的编译规则有点奇怪,而且有点慢.不过,它可能是领先的竞争者.

  • 莫斯科ML曾经是理想的,但它仍未提供2004年标准基础库.最不幸的是,因为除了它的许多其他优良属性外,莫斯科ML还有一个交互式帮助系统 - 但我不能给我的学生一个编译器,它的库与所有在线文档所说的不同.

  • Poly/ML可能很适合这个法案,除了在线查看文档,我无法弄清楚如何编译它.那可能没问题.

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

小智 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
Run Code Online (Sandbox Code Playgroud)

在编译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
Run Code Online (Sandbox Code Playgroud)

作为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 ; make ; make install构建.使用Poly/ML 5.X编译独立的可执行文件需要使用PolyML.export和调用C编译器,但在5.0版发行说明中对此进行了详细描述.