Standard ML of New Jersey
Release Notes
Version 110.98
July 16, 2020

SML/NJ HOME

  https://smlnj.org

FILES

  https://smlnj.org/dist/working/110.98/

## Summary

This release includes substantial improvements to the documentation (the SML/NJ Library is now mostly documented) as well as many small improvements to the SML/NJ Library, various improvements in other parts of the system, and bug fixes.

## Future Plans

We are reworking the back-end of the compiler in preparation for migrating from our current MLRISC code generator to one based on LLVM. With that migration, we expect to drop support for all processors other than the x86-64 (aka amd64), but we plan to add support for the arm64 (aka AArch64).

If you are a user of SML/NJ on the Sparc, PowerPC, or 32-bit x86 and would like to see support for that system continued, please contact us.

## Details

### Compiler

Made the `LambdaVar.lvar` type abstract. This is an internal change that should not affect compiler behavior.

We have started a project to migrate the backend of SML/NJ to use the LLVM infrastructure for code generation. The prepare the ground for this migration, we have made a number of changes to the compiler internals:

- Support for mapping the trigonometry functions `sin`, `cos`, and `tan` to hardware instructions on the x86 architecture has been removed. This change was made to simplify the code generator as we work on migrating to a new LLVM backend.

- The SML operators `div` and `mod` have a floor rounding semantics instead of the truncation semantics supported by hardware. Previously, we relied on MLRISC to handle the implementation of these operators, but we now do that in a new lowering pass. We also added optimizations for when the second argument to `div` or `mod` is a power of two to the CPS contraction phase.

- The lowering pass also lowers trapping conversions (CPS primops `TEST` and `TESTU`) such that they only involve conversions that can be checked using trapping add operations.

### MLRISC

The MLRISC instruction selector for the x86 and amd64 targets erroneously assumed that the `idiv` instruction sets the `OF` (overflow) condition code when dividing the largest negative number by `~1`. In fact, such a division operation traps, which is okay, because the runtime system maps the trap to the `Overflow` exception. Since the check for overflow is unnecessary, it has been removed from the files `MLRISC/amd64/mltree/amd64-gen.sml` and `MLRISC/x86/mltree/x86.sml`.

### Basis Library

This version implements the following Basis Library proposal:

[2020-001]

  Basis Library proposal 2020-001 (Addition of Universal module)— This proposal adds the `Universal` structure found in Poly/ML to the Basis Library.

### SML/NJ Library

The SML/NJ Library is now mostly documented; see `doc/html/smlnj-lib/index.html` in the distribution or the online documentation.

The `HTMLDev` structure in the pretty-printing library (`$/pp-lib.cm`) has been renamed as `HTML3Dev` and moved into its own library (`pp-extras-lib.cm`). The renaming is in anticipation of renaming the HTML Library to "HTML3" and the moving it to its own library removes a dependency from the compiler on `$/html-lib.cm`.

There were many small improvements (and a couple of bug fixes) to various parts of the SML/NJ Library; see the `smlnj-lib/CHANGES` file for details.

### ML-LPT

Changed the semantics of the `--debug` command-line option for ml-antlr. Previously this option replaced the actions with a print expression, but that limited its usefulness because of type errors in the generated code. The new behavior is to preserve the existing actions and just add the printing code.

### Documentation

This release contains a substantial amount of new documentation for the SML/NJ Library (see `doc/html/smlnj-lib`). While the documentation is not complete, it does cover the most commonly used components (with the exception of the pretty-printing library).

### Installation

The default installation for machines that report “`x86_64`” as their hardware is now 64 bits. See the installation instructions for more details.

### 32-bit macOS issues

While the x86 installer for 110.98 works on macOs 10.14 Mojave, building from source requires some extra steps because the version of Xcode distributed for Mojave does not include a 32-bit SDK.

Another issue that you may encounter when building on macOs 10.14 Mojave is an error message for a shell script of the form

      /bin/sh: bad interpreter: Operation not permitted

This error arises because the `com.apple.quarantine` attribute is set on the shell script. To fix the problem, remove the attribute using the command

      xattr -d com.apple.quarantine shell-script

and resume the build.

## Bugs

Here is a list of tracked bugs fixed (or closed) with this release, please see the bug tracker for more details.

238 | Cross compilation from amd64 to x86 does not work
256 | `Ref.exchange` incorrect
257 | `HASH_TABLE` `listItems` error in reference manual
260 | Perform divide on `Position.int` crashes with FPE on Linux
261 | Weird "calc_strictness" message being printed
262 | JSON parser fails on empty object
263 | JSON parser ignores suffixes

## Supported systems

We believe that SML/NJ will build and run on the following systems, but have only tested some of them:

Architecture | Operating System | Status
--- | --- | ---
AMD64 | FreeBSD 12.0 | Tested
| macOS 10.14 (Mojave) | Tested
| macOS 10.15 (Catalina) | Tested
| macOS 11.0 (Big Sur) | Tested
| Ubuntu 16.04.3 LTS | Tested
| Ubuntu 18.04.3 LTS | Tested
Power PC | Mac OS X 10.5 (Leopard) |
| AIX |
Sparc | Solaris |
| Linux |
x86 (32-bit) | Mac OS X 10.6 (Snow Leopard) |
| Mac OS X 10.7 (Lion) |
| Mac OS X 10.8 (Mountain Lion) |
| Mac OS X 10.9 (Mavericks) |
| Mac OS X 10.10 (Yosemite) |
| Mac OS X 10.11 (El Capitan) |
| macOS 10.12 (Sierra) | Tested
| macOS 10.13 (High Sierra) | Tested
| macOS 10.14 (Mojave) | Tested
| Ubuntu 16.04.3 LTS | Tested
| Other Linux variants |
| FreeBSD 12.0 | Tested
| Other BSD variants |
| Windows 7 |
| Windows 10 |
| Cygwin (32-bit) |