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
, andtan
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
andmod
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 todiv
ormod
is a power of two to the CPS contraction phase. -
The lowering pass also lowers trapping conversions (CPS primops
TEST
andTESTU
) 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 |
|
257 |
|
260 |
Perform divide on |
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) |
||
|