8

Para usar con una clase que enseñaré, estoy buscando un compilador rápido o un intérprete de código de bytes para ML estándar. Estoy buscando tiempos de compilación rápidos; cualquier tiempo de ejecución razonable hará. Bonificación si el modelo de compilación es simple y claro. Los estudiantes en la clase también usarán MLton para generar buenos binarios, pero MLton tarda en compilarse y hay momentos en que los estudiantes necesitan algo con lo que puedan interactuar.Compilador Fast Standard ML o intérprete de bytecode, con loop read-eval-print, para Linux?

Esto es lo que ya sé:

  • ml estándar de Nueva Jersey tiene una lectura-eval-print-bucle interactivo, pero sus reglas de compilación son un poco extraño, y es un poco lento. Aún así, puede ser el principal contendiente.

  • Moscú ML solía ser ideal, pero aún no se ha actualizado con la biblioteca 2004 Standard Basis. Lo más desafortunado, porque además de sus muchas otras buenas propiedades, Moscow ML también tiene un sistema de ayuda interactiva — pero no puedo infligir a mis alumnos un compilador cuyas bibliotecas hagan algo diferente de lo que dice toda la documentación en línea.

  • Poly/ML bien podría encajar en la factura, excepto que al mirar la documentación en línea, no puedo encontrar la manera de compilarla. Eso podría estar bien.

Por el momento parece que SML/NJ o Poly/ML serían el mejor compromiso. Han pasado muchos años desde que hice un trabajo serio en Standard ML, y me gustaría obtener información sobre otros compiladores o cuál de estas alternativas es, en su experiencia, la más rápida de interactuar y la más fácil de aprender a usar.

Respuesta

10

Poly/ML parece ser un poco más rápido que SML/NJ. Por ejemplo, la compilación de HaMLet (aprox. 25.850 líneas de SML comentado) con poli/ML, SML/NJ, y MLton, consigo el siguiente:

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

La diferencia entre Poli/ML y SML/NJ ISN' t es tan pronunciada al compilar MLton (aprox 175779 líneas de SML comentado.):

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

como REPLs, Poly/ML y SML/NJ son casi equivalentes. Encuentro que los mensajes de error de SML/NJ son un poco mejores; ellos tienden a tener ubicaciones de fuentes más específicas. Por supuesto, cuando se utilizan como REPL, las ubicaciones de origen de SML/NJ están en términos de stdIn, para lo cual los números de línea no son terriblemente útiles.

Si sus estudiantes solo van a utilizar el REPL o compilar programas de un solo archivo, me imagino que Poly/ML o SML/NJ cumplirían sus propósitos. Ambos proporcionan la función SML use. Los programas de archivos múltiples probablemente sean mejor atendidos por el administrador de compilación de SML/NJ o el sistema ML Basis de MLton; Poly/ML proporciona otro sistema de compilación (PolyML.make), pero nunca lo he usado.

¿Qué dificultades tiene al compilar Poly/ML? Desde la versión 5.0, Poly/ML ha admitido una compilación simple de ./configure ; make ; make install. El uso de Poly/ML 5.X para compilar un ejecutable independiente requiere el uso de PolyML.export e invocar un compilador de C, pero está bastante bien descrito en las notas de la versión 5.0.

+0

No he tenido dificultades para compilar Poly/ML; Acabo de instalar el paquete Debian. Es el "otro sistema de compilación" que estoy teniendo problemas para descubrir. Quiero mucho que los estudiantes puedan usar un modelo con el que estén familiarizados --- compilar código fuente para obtener un archivo binario ejecutable --- pero con algo un poco más rápido que MLton. Tal vez debería descargar HaMLet y ver cómo está configurado Makefile. +1 –

+1

Tanto HaMLet como MLton (y Isabelle AFAICT) controlan Poly/ML a través de la función 'use'. No sé de ningún proyecto (además de Poly/ML en sí) que utilice la función PolyML.make. Puede solicitar punteros en la lista de correo Poly/ML; su bajo tráfico, pero receptivo. –

+1

Isabelle/ML utiliza la muy conveniente estructura PolyML.Compiler para implementar su propia variante de 'uso', de modo que el efecto en el entorno ML se gestiona internamente, p. para permitir deshacer/deshacer del entorno estático. – Makarius

1

Hay un LLVM port de Moscow ML.No sé si aún se puede usar para todos los propósitos, pero con respecto a la velocidad, debería ser mejor que el viejo camlrunm.

Quizás valga la pena que transfiera la característica que cree que difiere del código en la documentación. Estoy seguro de que los mantenedores de ML de Moscú lo apreciarán.

No encontré una diferencia en la documentación que viene con Moscow ML y la implementación real, pero no hice ningún gran proyecto en Standard ML. Creo que sería útil si pudiera dar un ejemplo donde la documentación de Moscow ML difiere de la implementación. Esto también me interesaría.

+0

Los módulos de biblioteca 'TextIO',' Array' y 'Vector' no se ajustan a la norma. He estado persiguiendo a los ML de Moscú sobre esto durante * años *, y básicamente no les importa. Si no les importa mejorar su software, ¿por qué debería hacerlo? En otra nota, tal vez mi pregunta no era clara, pero me preocupan ** los tiempos de compilación rápidos **. Cualquier tiempo de ejecución plausible está bien para mí. –

+0

Veré qué puedo hacer con respecto a la conformidad estándar de las bibliotecas estándar. Parece ser un trabajo útil. Creo que el problema principal con Moscow ML es que parece ser abandonado por sus mantenedores originales. Con el puerto LLVM ganó un poco de impulso cuando dos estudiantes daneses comenzaron a tocarlo después de casi una década, pero esto también parece haberse estancado. Creo que Standard ML perdió muchos usuarios (potenciales) e investigadores de Haskell. Tal vez es por eso que a nadie le importa tanto. –

+0

De hecho, le di el enlace incorrecto al repositorio exsml. Lo corregí. –

3

Aprecio que esta es una respuesta muy tardía a la pregunta, pero hay un proyecto de ML de Moscú en github con una Biblioteca de Bases actualizada. Está en https://github.com/kfl/mosml/ (con una actualización en noviembre de 2012!)

También tengo un código que implementa gran parte de la nueva Biblioteca de Bases para Moscow ML para que pueda usar tanto este como Poly/ML para implementar HOL4. El código para eso está todo dentro de http://github.com/mn200/HOL, y podría ser extraído si lo quisiera.

Cuestiones relacionadas