Portability
-
Runs on a variety of platforms.
Robustness
-
Supports the full SML 97 language as given in The Definition of Standard ML (Revised).
-
A complete implementation of the Basis Library.
-
Generates standalone executables.
-
Compiles large programs.
-
Support for large amounts of memory (up to 4G).
-
Array lengths up to 231 - 1, the largest possible twos-complement 32 bit integer.
-
Support for large files, using 64-bit file positions.
-
If there is a program that is valid according to The Definition that is rejected by MLton, or a program that is invalid according to the Definition that is accepted by MLton, it is a bug. For a list of known bugs, see UnresolvedBugs.
-
MLton's implementation matches latest Basis Library specification, and includes a complete implementation of all the required modules, as well as many of the optional modules.
-
No additional code or libraries are necessary in order to run an executable, except for the standard shared libraries. MLton can also generate statically linked executables.
-
MLton is sufficiently efficient and robust that it can compile large programs, including itself (over 140K lines). The distributed version of MLton was compiled by MLton.
Performance
-
Executables have excellent running times.
-
Generates small executables.
-
Native integers, reals, and words.
-
Unboxed native arrays.
-
Multiple garbage collection strategies.
-
Fast arbitrary precision arithmetic (IntInf) based on the GnuMP. For IntInf intensive programs, MLton can be an order of magnitude or more faster than Poly/ML or SML/NJ.
-
MLton takes advantage of whole-program compilation to perform very aggressive dead-code elimination, which often leads to smaller executables than with other SML compilers.
-
In MLton, integers and words are 32 bits and arithmetic does not have any overhead due to tagging or boxing. Also, reals are stored unboxed, avoiding any overhead due to boxing.
-
In MLton, an array (or vector) of integers, reals, or words uses the natural C-like representation. This is fast and supports easy exchange of data with C. Monomorphic arrays (and vectors) use the same C-like representations as their polymorphic counterparts.
Tools
Extensions
-
A simple and fast C ForeignFunctionInterface that supports calling from SML to C and from C to SML.
-
The ML Basis system for programming in the very large, separate delivery of library sources, and more.
-
A number of extension libraries that provide useful functionality that cannot be implemented with the Basis Library. See below for an overview and MLtonStructure for details.
-
continuations
-
finalization
-
interval timers
-
random numbers
-
resource limits
-
resource usage
-
signal handlers
-
size primitive
-
system logging
-
threads
-
weak pointers
-
world save and restore
-
MLton supports continuations via callcc and throw.
-
MLton supports finalizable values of arbitrary type.
-
MLton supports the functionality of the C setitimer function.
-
MLton has functions similar to the C rand and srand functions, as well as support for access to /dev/random and /dev/urandom.
-
MLton has functions similar to the C getrlimit and setrlimit functions.
-
MLton supports a subset of the functionality of the C getrusage function.
-
MLton supports signal handlers written in SML. Signal handlers run in a separate MLton thread, and have access to the thread that was interrupted by the signal. Signal handlers can be used in conjunction with threads to implement preemptive multitasking.
-
MLton includes a primitive that returns the size (in bytes) of any object. This can be useful in understanding the space behavior of a program.
-
MLton has a complete interface to the C syslog function.
-
MLton has support for its own threads, upon which either preemptive or non-preemptive multitasking can be implemented. MLton also has support for Concurrent ML (CML).
-
MLton supports weak pointers, which allow the garbage collector to reclaim objects that it would otherwise be forced to keep. Weak pointers are also used to provide finalization.
-
MLton has a facility for saving the entire state of a computation to a file and restarting it later. This facility can be used for staging and for checkpointing computations. It can even be used from within signal handlers, allowing interrupt driven checkpointing.