1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
|
-----------------------------------------------------------------------------
SML# version 4.1.0 (released on 2024-11-08)
* Changed and improved LLVM support.
SML# now supports from LLVM 7.1 to LLVM 18.1.
For the developers to precompile SML#, LLVM 7.1.0 is required.
To precompile, set the "--with-llvm7" configure switch.
* Fixed a number of bugs including the issues #10, #39, #67, #68
and added some test cases in ~/tests/data/regression.
-----------------------------------------------------------------------------
SML# version 4.0.0 (released on 2021-04-06)
* In agreement with Tohoku University, we (the SML# development team) have
relicensed the SML# software. It is now distributed under the MIT license
copyrighted by the SML# development team. See LICENSE file for the
current license.
* We have relocated the SML# website at https://smlsharp.github.io/ and
its distrution site at https://github.com/smlsharp/smlsharp .
* LLVM 11.1 support has been added.
-----------------------------------------------------------------------------
SML# version 3.7.1 (released on 2021-03-15)
* Fixed segmentation fault occurred when rank-1 polymorphic functions
are exported and called from different modules.
* SML# now supports LLVM 12.
-----------------------------------------------------------------------------
SML# version 3.7.0 (released on 2021-01-04)
* Experimental feature: existential type variable declararion has been
added in the _dynamiccase expression. Now we can write
fun apply x = _dynamiccase x of {'a} (f:'a -> int, x:'a) => f x;
where {'a} is an existential type variable declaration local to the
rule with the restriction that 'a must not escape from the scope.
The type instance of 'a is dynamically computed every time the
matching is performed. The following expressions are correct and
evaluate to 2.
apply (Dynamic.dynamic (foldl (op +) 0, [1, 1]));
apply (Dynamic.dynamic (trunc, 2.34));
* Bugs found in the concurrent and parallel garbage collector were fixed.
* Bugs found in the DynamicLink structure were fixed.
* Bugs found in the SQL integration were fixed.
* Bugs found in the value printer of the interactive mode were fixed.
* The SML/NJ Library has been updated to 110.99.
* Several modules in the SML/NJ Library has been ported to SML#.
* The JSON parser has been replaced with the one provided in the SML/NJ
Library. The YAJL library is no longer needed.
* SML# now supports LLVM 11.
SEQURITY ALERT: A potential code injection vulnerability was found in
the built-in JSON parser of SML# 3.6.0 and earlier. This is due to
inappropriate interaction between FFI and GC. Any SML# program that is
compiled by the SML# compiler version from 3.1.0 to 3.6.0 and using
SML#'s JSON feature (JSON.import, Dynamic.fromJSON, and/or
Dynamic.fromJSONFile) is affected. It is recommended for SML# users
to upgrade your SML# installation and recompile programs that use the
JSON or Dynamic feature.
-----------------------------------------------------------------------------
SML# version 3.6.0 (released on 2020-05-29)
* SML#'s garbage collector is replaced with a novel concurrent and
parallel one. In the new garbage collection algorithm, no thread is
dedicated for garbage collection. Instead, each worker thread (Pthread)
sometime acts as an collector running concurrently with other threads.
This organization eliminates sequentialities due to memory management
and achieves parallelism competitive with other parallel languages.
Our benchmark programs (benchmark/benchmarks_parallel) shows good
scalability: x50.7, x52.7, x44.6, and x37.0 speedup of the fib,
mandelbrot, nqueens, and cilksort benchmark with 64 CPU cores of
AMD EPYC 7501 2.0GHz.
* The SQL integration is refined so that SQL is integrated with SML#
more seamlessly. One of major changes is the new semantics of SQL
value expressions. Each subexpression that can be evaluated by SML#
in an SQL query is evaluated by SML# and its value is automatically
embedded in the SQL query. SQL.Op.toSQL is no longer needed to embed
a value. For example, the function
fn x => _sql db => select #e.salary from #db.employee where #e.age >= x
now takes an integer (int), not an SQL expression fragment of type int
((int, 'w) exp). Another change is the SQLite3 in-memory database
support. SQL.connectAndCreate allows us to use an in-memory database
as a record storage. For example:
val d = _sqlserver SQL.sqlite3 ":memory:" : {foo:{a:int, b:string} list}
val c = SQL.connectAndCreate d
val l = List.tabulate (100000, fn x => {a = x, b = Int.toString x})
val _ = (_sql db => insert into #db.foo (a, b) values l) c
val r = (_sql db => select #foo.b from #db.foo limit 10) c
val a = SQL.fetchAll r
val _ = SQL.closeConn c
* SML# now supports LLVM 10.
* A lot of bugs has been fixed.
-----------------------------------------------------------------------------
SML# version 3.5.0 (released on 2019-12-24)
New features:
* Dynamic typing support. You can make any statically-typed value to
dynamically-typed value by Dynamic.dynamic primitive and perform
dynamic type cast to get back the statically-typed value by _dynamic
expression. For example:
# val x = Dynamic.dynamic {a = 1, b = "c"};
val x = _ : Dynamic.void Dynamic.dyn
# val y = _dynamic x as {a:int, b:string};
val y = {a = 1, b = "c"} : {a : int, b : string}
JSON support is reorganized on top of the dynamic typing mechanism.
The _json expression is integrated into the _dynamic expression.
The following example shows the new notation of dealing with JSON data:
# val x = Dynamic.fromJson "{\"a\":1, \"b\":\"c\"}";
val x = _ : Dynamic.void Dynamic.dyn
# val y = _dynamic x as {a:int} Dynamic.dyn
val y = _ : {a : int} Dynamic.dyn
# val z = Dynamic.view y;
val z = {a = 1} : {a : int}
# Dynamic.valueToJson z;
val it = "{\"a\" : 1}" : string
* Polymorphic Type Elimination. A new optimization phase named as
PolyTyElimination is added. This phase computes the set of possible
type instances for each type abstraction and minimizes the insertion
of extra lambda abstractions by the type-directed compilation.
According to our evaluation using micro benchmarks, this achieves 10%
speed-up and 12% code size reduction on average.
Improvements:
* The SML# compiler now uses LLVM 3.9.1 or later. The latest one,
LLVM 9.0.0, is preferable.
* Pthread support is turned on by default. MassiveThreads and Pthread
can be mixed in the same program. --without-massivethreads is no
longer needed to enable Pthread support.
* SIGINT is now handled in the interactive session. By pressing Ctrl-C,
you can abort the current execution and go back to the prompt.
* SQLite3 support is added.
* In addition to the above improvements, a lot of bugs has been fixed.
Other changes:
* SMLFormat now uses the same parser as the SML# compiler.
* Manpages of the smlsharp, smlformat, smllex, and smlyacc commands
are provided.
-----------------------------------------------------------------------------
SML# version 3.4.0 (released on 2017-08-31)
New features:
* Automatic Makefile generation. The smlsharp command with new "-Mm"
command line option computes file dependency of the given programs
and outputs a complete Makefile.
* Loading an additional library for the interactive mode. New "-r"
command line option let the compiler load a separately-compiled
library into the initial interactive environment.
By combining these two, you can use your own library in the
interactive mode simply by the following three steps:
$ smlsharp -Mm mylib.smi -o Makefile
$ make mylib
$ smlsharp -r mylib.smi
Improvements:
* The value and type printer of the interactive session is improved.
Other changes:
* The source tree has been reorganized.
-----------------------------------------------------------------------------
SML# version 3.3.0 (released on 2017-06-20)
* The new feature of this version is massive parallelism for
multicore processors, powered by MassiveThreads --- an efficient
light-weight thread library for multicore CPUs. By the combination
of MassiveThreads and our fully concurrent GC, SML# is now capable
of running millions of threads on multicore processors, as seen in
thefollowing simple example:
val cutOff = 10
fun fib 0 = 0
| fib 1 = 1
| fib n =
if n < cutOff
then fib (n - 1) + fib (n - 2)
else let val t = Myth.Thread.create (fn _ => fib (n - 2))
in fib (n - 1) + Myth.Thread.join t
end
The Myth structure is the binding library of MassiveThreads; it
provides primitives for thread creation and synchronization.
To enable the full functionality of MassiveThreads, set the
MYTH_NUM_WORKERS environment variable to 0 when you start an SML#
interactive session or run a SML# program.
* The SQL integration has been significantly improved.
Firstly, SQL query syntax becomes more direct and closer to the
SQL commands. One can write
val q = _sql db => select #t.name from #db.people as t
where (#t.age = 25 and #t.salary > 300)
instead of the old notation:
val q = _sql db => select #t.name from #db.people as t
where SQL.andAlso (SQL.== (#t.age, 25),
SQL.> (#t.salary, 300)).
Moreover, queries can be programmed by composing higher-order
functions for component clauses. The above q is also coded as:
val sel = _sql select #t.name
val frm = fn db => _sql from #db.people as t
val whr = fn () => _sql where (#t.age = 25 and #t.salary > 300)
val q = _sql db => select...(sel) from...(frm db) where...(whr ())
Note that new SQL-related constructs are not compatible with old
one in the following points:
(1) SQL query syntax is changed as described above.
(2) SQL tables are now associated with ML lists and therefore you
need to write "list" for each table type in _sqlserver
declaration. For example, write
val s = _sqlserver : {people : {name:string, age:int, salary:int} list}
instead of
val s = _sqlserver : {people : {name:string, age:int, salary:int}}.
(3) The _sqleval and _sqlexec construct are no longer needed and
avaiable. The new _sql expression is a function that executes
a query through the given database connection. For example, to
execute the above query, one can just call it with a connection
as follows:
val c = SQL.connect s
val result = q c
* Another relatively minor new feature is type reification mechanism.
Using this, for example, SML# define a polymorphic print function "pp"
at the top-level. One can do as follows:
# pp;
val it = fn : ['a#reify. 'a -> unit]
# pp 1;
1
val it = () : unit
# pp [1,2,3];
[1, 2, 3]
val it = () : unit
# pp 3.14;
3.14
Note that pp is not a macro but an ordinary polymorphic function.
Document on this is not yet ready, but the interested programmer may
look at some modules in src/compiler/compiler-utils/reflection/main.
* In addition to the above improvements, a lot of bugs has been fixed.
-----------------------------------------------------------------------------
SML# version 3.2.0 (released on 2016-09-16)
This version contains the type system for natural join operations.
With this, SQL integration is extended to natural join operator, as
seen in the following example:
# _sql db =>
select #t.name, #t.sarary
from (#db.Employees natural join #db.Salary) as t;
val it = fn
: ['a#{Employees: 'b, Salary: 'c},
'b#{},
'c#{},
'd::{int, intInf, word, char,...},
'e::{int, intInf, word, char,...},
'f::{int, intInf, word, char,...},
'g::{int, intInf, word, char,...},
'h#{name: 'd, sarary: 'f}.
('h = 'b join 'c) =>
'a SQL.db -> ('d * 'f) SQL.query]
Other improvements:
* Typeful JSON support is extended to null values. JSON's "null"
value can be coerced to "NONE" of an "option" type in SML#, as
seen in the following example:
# val j = JSON.import "{\"foo\":null, \"hoge\":1}";
val j = _ : JSON.void JSON.dyn
# _json j as {foo: string option, hoge: int option};
val it = {foo = NONE, hoge = SOME 1}
: {foo: string option, hoge: int option}
* Minor improvements on PostgreSQL's type support.
* Minor refinements on value printers in interactive session.
Fixed bugs:
* Fixed a memory allocation bug caused by a combination of a
record update expression and a statically-allocated record.
-----------------------------------------------------------------------------
SML# version 3.1.1 (released on 2016-07-15)
Fixed bugs:
* Fixed bugs of _jsoncase expression, which did not work unfortunately.
* Stopped printing the values of opaque types in interactive mode.
* Type arity check was not performed in foreign function types.
* Fixed bugs of excpetion handling.
* Fixed errors in the configure script.
Improvements:
* Improvements in SQL integration:
* added INNER JOIN support.
* refined the compilation of SQL queries.
* slightly changed the type of SQL queries.
* Refined type printer in interactive mode.
-----------------------------------------------------------------------------
SML# version 3.1.0 (released on 2016-05-26)
This version contains the full implementation of JSON support
described in the forthcoming paper:
A Calculus with Partially Dynamic Records for Typeful Manipulation of
JSON Objects" Atsushi Ohori, Katsuhiro Ueno, Tomohiro Sasaki, Daisuke
Kikuchi,
to appear in ECOOP 2016 Research Track.
http://2016.ecoop.org/event/ecoop-2016-papers-a-calculus-with-partially-dynamic-records-for-typeful-manipulation-of-json-objects
A pre-version is available on the SML# home page.
-----------------------------------------------------------------------------
SML# version 3.0.1 (released on 2016-04-04)
Fixed bugs:
* Fixed segmentation faults, mysterious type errors, and improper value
printing occurred in the interactive mode.
-----------------------------------------------------------------------------
SML# version 3.0.0 (released on 2016-03-31)
This is a major release of the SML# language system with a number of
improvements and bugfixes. The notable changes include the following:
* x86_64 support: The SML# compiler now works on 64-bit platform and
generates 64-bit native code.
* Native multithread support: The multithread support is enabled by
default. The user can import POSIX thread APIs through SML#'s foreign
function interface and enjoy multithread programming in SML#. For
example, the "spawn" primitive can be implemented by the following
user-level code:
type pthread_t = unit ptr (* system dependent *)
val pthread_create =
_import "pthread_create"
: (pthread_t ref, unit ptr, unit ptr -> unit ptr, unit ptr)
-> int
fun spawn f =
let
val ret = ref (Pointer.NULL ())
in
pthread_create (ret, Pointer.NULL (), f, Pointer.NULL ());
!ret
end
* Fully concurrent garbage collection: An unobtrusive concurrent
non-moving garbage collector has been integrated. This collector runs
in a separate thread and never stop any thread due to garbage
collection. This colletor improves both response time and throughput
of SML# programs in most cases.
For the details, see the SML# 3.0.0 documentations.
* The Japanese version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/3.0/ja/index.xhtml
* The English version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/3.0/en/index.xhtml
The documents contain an overview of the SML# language and a
comprehensive tutorial, which provides sufficient information to start
writing SML# programs.
Enjoy!
-----------------------------------------------------------------------------
SML# version 2.0.0 (released on 2014-04-04)
This is the brand new release of the SML# language system. The most
notable change is that the SML# compiler now works with the LLVM
Compiler Infrastructure. The new SML# compiler generates LLVM IR code
and produces native code through LLVM. More than half of compilation
phases and library modules has been rewritten for the LLVM support.
These changes also greatly speed up the compilation processes.
The following compile options are added:
* Optimization options such as -O1, -O2, -O3, -Os and -Oz. These
options enables LLVM's code-level optimization.
* -emit-llvm. If this option is specified, SML# compiler produces
LLVM IR code or LLVM bitcode instead of native code.
While LLVM supports multiple target platforms, this version of SML#
supports only x86 target. At least x86-64 support will be available
in near future.
For the details, see the SML# 2.0.0 documentations.
* The Japanese version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/2.0/ja/index.xhtml
* The English version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/2.0/en/index.xhtml
Enjoy!
-----------------------------------------------------------------------------
SML# version 1.2.0 (released on 2012-11-14)
Improvements:
* Functor applications and structure replications in interface files
are supported.
* Tuned up the non-moving garbage collector.
* SML# compiler code is optimized, achieving fast compilation.
* Refined type and value printers and error messages.
* Inlining optimization is implemented.
* Modified ml-yacc command and libraries to be suitable for SML#.
* Implemented some optimizations to smlformat.
* Added interface files for benchmarks.
Fixed bugs:
* Fixed several bugs related to functor.
* Fixed a bug of polymorphic record pattern.
-----------------------------------------------------------------------------
SML# version 1.1.0 (released on 2012-08-08)
Improvements:
* Functor definition is now available in interactive mode.
* SML# compiler now rejects signatures that do not have any instance.
Rejecting them is not strictly compliant with the definiton of SML,
but necessary for separately compiling a functor.
* Refined value, type and signature printers of interactive mode.
* Refined type error messages.
Fixed bugs:
* Fixed several bugs of functor with signature constraints.
* Fixed a bug of eqtype constraint.
* Fixed a bug of opaque signature constraint with datatype.
* Fixed a bug of exception replication.
* Fixed a bug that handle expresions may cause infinite loop.
-----------------------------------------------------------------------------
SML# version 1.0.3 (released on 2012-06-25)
Fixed bugs:
* Fixed a bug of type inference phase.
* Fixed a bug that some form of polymorphic record selector caused a
runtime error.
* Fixed a bug that accepted duplicate labels in a record expression
in some cases.
* Fixed a bug of evaluation of comparison operators with two constant
literals.
* Fixed a bug of elaboration of "withtype" of "abstype" declaration.
-----------------------------------------------------------------------------
SML# version 1.0.2 (released on 2012-05-14)
Fixed bugs:
* Some illegal SQL select queries were accepted due to lack of a type
unification.
* Using capital letters in an SQL query caused runtime error when the
query is sent to a database server.
* Real.fmt returned wrong results. This bug was also affected to the
value printer of the interactive mode.
* Name evaluation passed duplicate link symbols in a case that those
symbols are declared in different interface files.
* "make" was aborted due to no rule on .desc files if --enable-fast-build
is enabled.
-----------------------------------------------------------------------------
SML# version 1.0.1 (released on 2012-04-24)
Fixed bugs:
* Vector.update caused segentation fault.
* Bound type variables in a record kind caused a BUG exception.
* opeining a structure containing overloaded ids caused a BUG exception.
Improvements:
* builtin-primitives are now printed in the interactive session.
* link time warning about tmpnam(3) is suppressed.
* --enable-fast-build option is added to configure script.
This option reduces the time for building SML# compiler by
reusing assembly code of minismlsharp.
-----------------------------------------------------------------------------
SML# version 1.0.0 (released on 2012-04-06)
SML# 1.0.0 is the first fully functional version of the SML# language
system. It supports all the features the SML# project had initially
aimed at, including:
* Record polymorphism.
* Direct interoperability with the C langauge.
* Seamless integration of SQL.
* True separate compilation and linking
In addition to these goals we had set, we have also completed the
development of:
* Native multithread support on multicore hardware.
* A fully concurrent non-moving GC.
These two feature have not yet been well tested, and are not supported
in this version. (Multithread support is turned off by default and the
concurrent GC is not included.) These two features will soon be
available in a forthcoming SML# version.
For the details, see the SML# 1.0.0 documentations.
* The Japanese version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/1.0/ja/index.xhtml
* The English version:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/1.0/en/index.xhtml
The documents contain an overview of the SML# language, and a
comprehensive tutorial, which provides sufficient information to start
writing SML# programs.
Enjoy cool and practical programming with SML# 1.0.0
-----------------------------------------------------------------------------
SML# version 0.90 (released on 2011-09-14)
1. Overview
SML# 0.90 is an experimental release of the forthcoming new generation
of SML#.
This 0.90 version is a separate compilation system for SML# (which is
backward compatible with the Standard ML). This version complements
the interactive compiler of 0.60 series.
The functionality of separate compilation is outlined in the following
section. A detailed document will be released in the forthcoming SML#
1.00, which combines this separate compilation system and the
interactive compiler. Meanwhile, the interested programmers and
researchers can contact us for more details.
2. Separate Compilation Overview
2.1 smlsharp command
Typical functionalities of the SML# 0.90 compiler command include the
following.
(1) Compile one source file into an object file. The command line
% smlsharp -c foo.sml
reads foo.sml and produces foo.o, consulting with its interface
file. The programmer can specify an interface file of foo.sml in one
of the following two ways:
* to include a compiler directive line:
_interface "<filename>"
* to create a file foo.smi in the same directory.
(2) Link object files. The command line
% smlsharp A.smi
locates all the object files referenced in A.smi, links them together
(by invoking the system linker, ld) and produces an executable file,
whose default file name is a.out.
(3) Compile and link a source file. The command line
% smlsharp A.sml
compiles A.sml, links it with all the files referenced in A.smi
and generates a.out.
In (2), (3), if the source file references external C functions
through _import declarations, then the programmer should
list their object files (generated by C complier) as in
% smlsharp A.sml clib.a cfun.o
In addition, smlsharp command performs a number of other things
related to compiling and linking.
2.2 Interface language
To separately compile a source file, foo.sml, the programmer need to
write its interface file, whose default name is foo.smi. This
interface file specifies the resources foo.sml requires and those that
are provided by foo.sml.
The syntax of an interface file consists of the following.
i. a list of require specification of the following form
_require <interface file name>
ii. a list of provide specifications.
Its syntax is defined roughly as follows.
<itopdec> ::= <idecl> | <ifundecl>
<idecl> ::= val <valdesc>
| type <itypbind>
| eqtype <tyvarSeq> id (= <ty>)
| datatype <idatbind>
| datatype <id> = datatype <longid>
| exception <exbind>
| structure <id> = <istrexp>
| infix <n> <id>
| infixr <n> <id>
| noninfix <n> <id>
<itypbind> ::= <tyvarSeq> <id> = <ty>
| <tyvarSeq> <id> ( = <ty> )
<idatbind> ::= <tyvarSeq> <id> = <conbinds> [and <idatbind>]
| <tyvarSeq> <id> ( = <conbinds> [and <idatbind>] )
<istrexp> ::= struct <idecl-seq> end
<ifundec> ::= functor <id> ( <id> : <sigexp> ) = <istrexp>
Nonterminals not defined are analogous to those of Standard ML
signature.
They resemble Standard ML signatures but they also need to
specify the information needed for smlsharp to compile a
source that reference this interface into object code.
Extra syntax are there for this purpose.
-----------------------------------------------------------------------------
SML# version 0.62 (released on 2010-12-17)
1. Overview
This is a patch release of SML# 0.60 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- added static allocation optimization.
This optimization allocates constant records and closures to memory
at compile time. This optimization is available only for native code
and enabled by default. To disable this optimization, specify
--xdoStaticAllocation=no option to the command line.
- restructured the prelude library to improve performance.
It also reduces time for compiling the native prelude library.
- rewrote register allocation phase.
New register allocation phase is based on Appel-George's iterative
register allocator with register coalescing. The register coalescing
is enabled by default. To disable the coalescing, specify
--xdoRegisterCoalescing=no option to the command line.
- enabled generational version of the non-moving bitmap marking
garbage collector by default.
This collector is available only for native code.
- added support for SQL commands for transaction control.
You may write "begin", "commit" or "rollback" command in a _sql
expression as a SQL command.
- added SQL.queryString and SQL.commandString primitive function.
- fixed bug of handling real variables defined at toplevel in native
code generation.
- fixed type errors of intermediate representations for native code
generation.
- refactored native code backend.
-----------------------------------------------------------------------------
SML# version 0.61 (released on 2010-11-26)
1. Overview
This is a patch release of SML# 0.60 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- added a feature that CConfig creates a cache file for check results.
- added Pointer structure.
This structure is experimental and provides primitive functions for
C pointers such as pointer arithmetics and memory access.
-----------------------------------------------------------------------------
SML# version 0.60 (released on 2010-11-12)
1. Overview
An experimental release of a new feature of SML#.
Only the source package is provided.
2. The new feature
The major new feature of SML# 0.60 is seamless interoperability with
database systems.
In this version, (a subset of) SQL is directly available as
first-class SML# expressions and can be freely combined with any other
language constructs in SML#. The SML# type system with record
polymorphism always infers a principal type for any type consistent
expression involving SQL query expressions. The compiler separates SQL
queries and delegates them to a database server.
To show a simple example, consider the following an SQL query
SELECT name, age
FROM person
WHERE age <= 25
This is a function which takes a connection to a database that contains
"person" table having "age" column of type integer and name column of
any SQL supported atomic values possibly containing null. The
following shows an SML# session defining this query:
# val young =
_sql db =>
select #person.name as name, #person.age as age
from #db.people as person
where SQL.<= (#person.age, 35);
val young = fn
: ['a#{people:'b},
'b#{age:int, name:'d},
'c,
'd::{int, word, char, string, real, 'e option},
'e::{int, word, char, bool, string, real}.
('a, 'c) SQL.db -> {age: int, name: 'd} SQL.query]
"'e option" represents values possibly containing null. The inferred
type is indeed a principal type of "young". In addition to SQL
queries, database servers and database connections are also typed
first-class citizens. These feature allow the SML programmer to write
a typed polymorphic higher-order programs with SQL queries.
In this version, only PostgreSQL is supported; MySQL binding will be
added in a future release.
For a brief description on how to use this feature, see the web page:
http://www.pllab.riec.tohoku.ac.jp/smlsharp/?FeatureDatabaseIntegration
3. Oteher changes and improvements
none.
-----------------------------------------------------------------------------
SML# version 0.58 (released on 2010-10-16)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- fixed a bug that String.sub returns a negative integer if given
string contains a non-ASCII character.
- fixed a bug of printing string values on interactive mode.
- fixed a bug of compilation of polymorphic flexible record patterns.
- refined messages of type errors due to record kinds.
-----------------------------------------------------------------------------
SML# version 0.57 (released on 2010-10-01)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- Updated parser and improved conformance with the Definition.
- accept unmatched "*)".
- reject "*" as a tycon.
- reject integer starting with "0" as a record label.
- Updated the build system so that SML# can be built only by MLton.
If --with-mlton option is specified to configure, and the build
system uses MLton (without SML/NJ) to compile SML# compiler and
other tools.
-----------------------------------------------------------------------------
SML# version 0.56 (released on 2010-09-17)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- refined several Makefiles and .cm files.
[SMLDoc]
- fixed errors in Makefile.
[mlb2use]
- added support for SML/NJ .cm files.
-----------------------------------------------------------------------------
SML# version 0.55 (released on 2010-09-03)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- fixed a bug of parsing unclosed comments and unclosed string
literals. They now causes a parse error.
-----------------------------------------------------------------------------
SML# version 0.54 (released on 2010-08-20)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. the Basis test suite
This version includes the first public version of our test suites for
Basis Library.
One of advantages of Standard ML is that implementations share the
specification of the language and Basis library. It encourages
portability and stable long life of softwares written in Standard ML.
We present a test suite for Standard ML Basis library. Compiler
implementors can use it to check the conformance of their implementation
to the Basis specification. We hope that this test suite helps to
eliminate differences remaining among implementations of Basis library.
This test suite is at smlsharp/SMLUnit/basis/ in the SML# source package.
3. Other changes and improvements
[SML#]
- rewrote Array2 from scratch to fix problems.
- added Word8Array2.
- added CharArray2.
- implemented overflow check in Int.{scan, fromLarge, div, mod, quot, rem}.
- implemented overflow check in IntInf.toInt.
- fixed bugs of IntInf.log2.
- fixed a bug of Real.split on cygwin.
- added error checks to Date functions.
-----------------------------------------------------------------------------
SML# version 0.53 (released on 2010-08-06)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
- fixed a bug of raising Div exception.
- fixed a bug of floating-point literal compilation in native backend.
- fixed a problem of SIGINT handling.
- fixed many bugs in Array, Char, CharVector, Real, IEEEReal, String,
VectorSlice, and Word, Word8 structures.
- implemented String.scan, String.concatWith, and Real.nextAfter.
- improved conformance of IEEEReal structure with the Basis library
specification.
[SMLUnit]
* added assert functions for tuples and datatypes defined in Basis
structures.
* changed the type of assert functions to return a unit.
-----------------------------------------------------------------------------
SML# version 0.52 (released on 2010-07-23)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
* fixed a bug of an alternative implementation of signbit in the native
runtime. This fix affects several primitive functions defined in Real
structure.
* fixed a bug of functor management and global symbol resolution in
native code backend.
-----------------------------------------------------------------------------
SML# version 0.51 (released on 2010-07-09)
1. Overview
This is a patch release of SML# 0.50 series.
This version is still experimental.
2. Changes and improvements
[SML#]
* slightly improved compilation for "orelse" and "andalso".
* slightly speed up of booting interactive mode by compacting pickled
context of the prelude.
* refined unification algorithm to print more reasonable error messages.
[SMLUnit]
* added support files for MLton.
[mlb2use]
* fixed a bug of dealing with backslashes.
-----------------------------------------------------------------------------
SML# version 0.50 (released on 2010-06-25)
1. Overview
An experimental release of a new feature of SML#.
Only the source package is provided.
2. The new feature
The major new feature of SML# 0.50 is first-class overloading.
First-class overloading may not be ardent wanted by ordinary SML
programmers, but we find this feature essential in our development of
seamless interoperability with database system, which we shall include
in our near future release.
This version implements a lightweight first-class overloading mechanism
that is readily realized by SML#'s polymorphic record compilation.
With this extension, overloaded operators such as + and > are now
first-class values having a polymorphic type that represents their
overloaded status, as seen in the following example:
# op +;
val it = fn
: ['a::{int, IntInf.int, real, Real32.real, word, Word8.word}.
'a * 'a -> 'a
# fun sumList nil z = z
> | sumList (h::t) z = sumList t (h+z);
val sumList = fn
: ['a::{int, IntInf.int, real, Real32.real, word, Word8.word}.
'a list -> 'a -> 'a]
# sumList [1,2,3] 0;
val it = 6 : int
# sumList [1.1,2.2,3.3] 0.0;
val it = 6.6 : real
where "::{....}" in 'a::{....} is an overload kind, restricting
possible instances of type variable 'a.
Any operator having the following two properties can be supported.
1. Its overloaded nature is representable as a polymorphic type using
overload kinds. Its type can contain multiple overloaded type
variables. The instance types in their overload kinds may also
contain type variables possibly with overload kind restriction.
2. Each instance corresponds to a set of type instances specified by
ground type constructors and wild card "_".
For example, the type
['a#{int, real, 'b list, 'c array}, 'b#{bool, char}, 'c#{int, bool}.
'a * 'a -> 'a]
represents an overloaded binary operator having the instances for
{int, real, bool list, char list, int array, bool array}. These
correspond to the following instantiations of 'a, 'b, and 'c:
[int,_,_] for int op
[real,_,_] for real op
[bool list, bool, _] for bool list op
[char list, char, _] for bool list op
[int array, _, int] for int array op
[bool array, _, bool] for bool array op
In the currently version, overloaded operator declaration is not yet
made available to the programmer. We plan to include a special
syntax for this purpose in future version.
3. Oteher changes and improvements
[SML#]
* fixed a bug of pretty-printing for evaluation results in interactive mode.
* fixed a bug of equality type inference.
* fixed a bug of introducing dummy types due to value restrictions.
* made type printers much prettier.
[SMLFormat]
* fixed a bug in handling newline indicators in nested guards.
* updated documents.
[OLE/SML#]
* a minor-change of OLE_DECIMAL signature.
* updated a sample code using MS Excel.
-----------------------------------------------------------------------------
SML# version 0.43 (released on 2010-06-11)
1. Overview
This is an release of SML# 0.42. This version is still experimental
and not intended to replace SML# 0.31.
2. Changes and improvements
[SML#]
* added native code generation for Windows. Both mingw and cygwin
are supported.
* improved native callback function generation so that C program
can call ML functions anytime.
* added interoperability for float (32bit floating point number)
to the native code generation.
* fixed a bug of native code selection.
* improved accuracy of native code compilation for floating point
constant literals.
* implemented Real32 structure.
* fixed a bug of Array.array.
* fixed a bug of printing an exception.
* refined UnmanagedString.export.
* fixed a bug of native version of UnmanagedMemory.export.
* fixed a bug of smlsharp2exe.
* fixed a buffer overflow in the runtime.
[OLE/SML#, .NET/SML#]
* changed module configuration of OLE library.
* supported OLE SAFEARRAY of builtin types of .NET, except for char.
* fixed a minor problem in handling a literal in C# code.
-----------------------------------------------------------------------------
SML# version 0.42 (released on 2010-05-28)
1. Overview
This is an bug-fix release of SML# 0.41. This version is still
experimental and not intended to replace SML# 0.31.
2. Changes and improvements
* fixed a bug of hiding int values in result printings after open Int.
* fixed a bug of user type variable unification.
* fixed a bug of Word32.fromLargeWord.
* fixed a bug of compiling negative IntInf constant literals.
* fixed a bug of equality of exceptions.
* suppressed diagnosis messages printed by native code backend.
* improved result printing for hidden types.
* implemented a few functions in Real32.real.
* SMLUnit: added Assert.assertEqualByCompare.
* Java/SML#: fixed conflictions between Java identifiers and SML keywords.
* .NET/SML#: added support for all built-in datatypes of C#.
* OLE/SML#: added support for I2, UI2, I8, UI8, R4 and DECIMAL.
* OLE/SML#: fixed problems in passing I4 and I1.
-----------------------------------------------------------------------------
SML# version 0.41 (released on 2010-05-14)
1. Overview
This is a bug-fix release of SML# 0.40. This version is still
experimental and not intended to replace SML# 0.31.
2. Changes and improvements
* fixed problems of building SML# on Windows.
* smlformat command now raises an error if no file is specified.
* fixed a bug of isAlphaNum of LMLML.
* fixed a bug of Word32.toLargeIntX.
* fixed a bug of String.fromString and String.fromCString.
* changed LMLML interface.
* added and updated sample code for Java/SML#.
-----------------------------------------------------------------------------
SML# Version 0.40 (released on 2010-04-30)
1. Overview
This is an experimental release for testing new backend and runtime
system. It is not intended to replace SML# 0.30.
2. New features and improvements of SML#
* Native code generation for x86 Linux and Intel-based Mac OS X.
The native code compiler backend produces native object files that
can be linked with C libraries by standard linker (e.g. ld
command) without any unusual extension and hand-written glue code.
To try the native code generation, invoke SML# comiler with
--native option. The compiler produces an executable file named
"a.sme". See SML# website for details.
* Runtime library for native code.
This library also includes non-moving bitmap marking garbage
collector.
* Experimental module flattening and ID allocation phases.
3. Other improvements
* Java/SML# interface:
* fixed a bug in renaming overloaded Java methods and constructors
* supported java array of float and long.
* improved Java exception handling.
* minor-changed Java library interface.
-----------------------------------------------------------------------------
SML# Version 0.30 (released on 2007-07-02)
1. Overview
The major change from SML# 0.20 is implementation of several
optimization phases in the SML# compiler, among which the most
significant is Record Unboxig described below.
2. Distribution Package
The SML# distribution package is re-organized to contain the SML#
compiler and its supporting tools in one package. The distribution
package is available in the following forms.
(a) Source tar file.
smlsharp-0.30.tar.gz
(b) Mac OS X universal binary (after 10.4)
smlsharp-0.30-Universal-Installer.dmg
(c) Windows binary installer
smlsharp-0.30-mingw.exe
Each of the above package contains the following:
* the SML# compiler and its supporting library including LMLML
* SMLFormat (a pretty printer generator)
* SMLDoc (a document generation tool)
* SMLUnit (a unit test support tool)
3. Contact information and mailing list
- The contact address of the SML# development team.
smlsharp @ pllab . riec . tohoku . ac . jp
- The SML# mailing list:
smlsharp-list @ pllab . riec . tohoku . ac . jp
This list is for general discussions on the SML# language, the
compiler and its supporting tools. This is open to everyone.
For more details, visit the "Contact Us" page of the SML# web.
4. New Features of the SML# compiler
4.1 Printer Control
The following structure is added to control the printer used to print
binding information in the interactive session
SMLSharp.Control.Printer
: sig
val getColumns : unit -> int
val getMaxDepth : unit -> int option
val getMaxRefDepth : unit -> int
val getMaxWidth : unit -> int option
val setColumns : int -> unit
val setMaxDepth : int option -> unit
val setMaxRefDepth : int -> unit
val setMaxWidth : int option -> unit
end
4.2 Optimization
The following optimization phases have been implemented.
(a) Record Unboxing
This optimization attempts to "unbox" tuples/records by flattening
component tuples and changing top-level tuples to multiple value
passing. It is a type-directed source-to-source transformation that
does not seem to be considered in existing literature or compiler.
The required type based analysis is quite simple but shown to be very
effective. Experiments on this technique shown a 27% speed-up in the
lexgen benchmark and a 21% speed-up in mlyacc benchmark. The compiler
switch
--xdoRecordUnboxing=yes/no
enables/disables this optimization. It is enabled by default.
(b) Record Alignment
To meat architecture requirements, the SML# compiler aligns record
component such as (unboxed) floating point values to double-word
boundary by inserting padding words. This would introduce some runtime
overhead, especially in the presence of polymorphism. The Record
Alignment optimization attempts to minimize this overhead cost as much
as possible. The compiler switch
--xalignRecord=yes/no
enables/disables this optimization. It is enabled by default.
(c) Representation Analysis
This optimization attempts to reduce the overhead due to type-directed
compilation for those polymorphic functions that are instantiated to
types representing the same runtime property by statically computing
the type attributes. The compiler switch
--xdoRepresentationAnalysis=yes/no
enables/disables this optimization. It is enabled by default.
(d) Other Conventional Optimizations.
In addition to those new type-based optimization, the version 0.30
also implements the following conventional optimizations.
Optimization Compiler Switch
constant folding --xdoConstantFolding=yes/no
common expression elimination --xdoCommonExpressionElimination=yes/no
useless code elimination --xdoUselessCodeElimination=yes/no
stack slot minimization --xdoStackReallocation=yes/no
4.3 Other Changes
(a) SML# executable file name
In the batch-mode, the current SML# executable file name can be
obtained by the function:
SMLSharp.CommandLine.executableImageName : unit -> string option
In the interactive mode, it returns NONE.
(b) "Shebang" line in a source file.
By default, the SML# compiler ignores the first if it begins "#!"
(shebang line). This feature is used to execute SML# file in a Unix
shell as shown in the following example.
$ cat foo.sml
#!/usr/local/bin/smlsharp
print "foo\n";
$ ./foo.sml
foo
The compiler switch
--xskipShebang=yes/no
enables/disables this feature. It is enabled by default.
4.4 bug fixes
Several minor bugs are fixed:
* Make & install fails on Free BSD
* Make fails for SMLUnit, SMLDoc, and SMLFormat on Unix/Linux due to
improper newline codes in their source files.
* Tests and benchmarks fail in the system made with SML/NJ 110.63
* "smlsharp -c" command does not report error messages properly.
* Functions fromLarge, toLarge, toLargeX were missing in Word[N] structures.
* TextIO.flushOut sometimes fails to flush the output buffer
* Signature mismatch error due to difference of constructor order in
datatype def and spec.
* Missing error check for a layered pattern with a long id as its left pattern
5. Tools
5.1 SMLFormat
Three constructors, MaxDepthOfGuards, MaxWidthOfGuards and CutOverTail,
have been added to SMLFormat.parameter datatype. These can be used to
limit the size of the formatted string.
5.2 SMLUnit
The following two assert functions have been added to SMLUnit.Assert
structure.
val assert : string -> bool -> unit
val assertSameArray : 'a array assertEqual
-----------------------------------------------------------------------------
SML# Version 0.20 (released on 2007-03-30)
|