MLton has the following features.



  • Supports the full SML 97 language as given in The Definition of Standard ML (Revised).

    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.

  • A complete implementation of the Basis Library.

    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.

  • Generates standalone executables.

    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.

  • Compiles large programs.

    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.

  • Support for large amounts of memory (up to 4G on 32-bit systems; more on 64-bit systems).

  • Support for large array lengths (up to 231-1 on 32-bit systems; up to 263-1 on 64-bit systems).

  • Support for large files, using 64-bit file positions.


  • Executables have excellent running times.

  • Generates small executables.

    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.

  • Untagged and unboxed native integers, reals, and words.

    In MLton, integers and words are 8 bits, 16 bits, 32 bits, and 64 bits and arithmetic does not have any overhead due to tagging or boxing. Also, reals (32-bit and 64-bit) are stored unboxed, avoiding any overhead due to boxing.

  • Unboxed native arrays.

    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.

  • 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.



  • 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

      MLton supports continuations via callcc and throw.

    • finalization

      MLton supports finalizable values of arbitrary type.

    • interval timers

      MLton supports the functionality of the C setitimer function.

    • random numbers

      MLton has functions similar to the C rand and srand functions, as well as support for access to /dev/random and /dev/urandom.

    • resource limits

      MLton has functions similar to the C getrlimit and setrlimit functions.

    • resource usage

      MLton supports a subset of the functionality of the C getrusage function.

    • signal handlers

      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.

    • size primitive

      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.

    • system logging

      MLton has a complete interface to the C syslog function.

    • threads

      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).

    • weak pointers

      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.

    • world save and restore

      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.