Jump to content

Concurrent ML

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Takikawa (talk | contribs) at 19:59, 11 July 2018 (Add categories & reference section). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Concurrent ML (CML) is a concurrent extension of the Standard ML programming language characterized by its ability to allow programmers to create composable communication abstractions that are first class rather than built into the language. The design of CML and its primitive operations have been adopted in several other programming languages such as GNU Guile,[1] Racket,[2], and Manticore.[3]

Sample Code

Here is sample code to print "hello, world" to the console. It spawns a thread which creates a channel for strings. This thread then spawns another thread which prints the first string that is received on the channel. The former thread then sends the "hello, world\n" string on the channel. It uses SML/NJ and CML (note that the heap name will be different on non linux-x86 platforms; you may need to change the line with "cml_test.x86-linux" to something different):

cml_test.cm
   Library
       structure Hello
   is
       $cml/basis.cm
       $cml/cml.cm
       cml_test.sml
cml_test.sml
   structure Hello =
   struct
       open CML
           
       fun hello () =
           let val c : string chan = channel ()
           in
               spawn (fn () => TextIO.print (recv c));
               send (c, "hello, world\n");
               exit ()
           end
           
       fun main (name, argv) =
           RunCML.doit (fn () => ignore (spawn hello), NONE)
   end
Running
$ ml-build cml_test.cm Hello.main
Standard ML of New Jersey v110.60 [built: Mon Nov 27 14:19:21 2006]
[scanning cml_test.cm]
[library $cml/basis.cm is stable]
[library $cml/cml.cm is stable]
[parsing (cml_test.cm):cml_test.sml]
[creating directory .cm/SKEL]
[library $cml/cml-internal.cm is stable]
[library $cml/core-cml.cm is stable]
[library $SMLNJ-BASIS/basis.cm is stable]
[compiling (cml_test.cm):cml_test.sml]
[creating directory .cm/GUID]
[creating directory .cm/x86-unix]
[code: 2170, data: 42, env: 2561 bytes]
[scanning 18518-export.cm]
[scanning (18518-export.cm):cml_test.cm]
[parsing (18518-export.cm):18518-export.sml]
[compiling (18518-export.cm):18518-export.sml]
[code: 309, data: 37, env: 42 bytes]
$ heap2exec cml_test.x86-linux cml_test
$ ./cml_test
hello, world

References

  1. ^ Wingo, Andy (June 29, 2017). "A New Concurrent ML". Retrieved July 11, 2018.
  2. ^ Flatt, Matthew; Findler, Robert Bruce (2004). "Kill-safe synchronization abstractions". Proceedings of the ACM SIGPLAN 2004 conference on Programming language design and implementation. doi:10.1145/996841.996849. Retrieved July 11, 2018.
  3. ^ Fluet, Matthew; Bergstrom, Lars; Ford, Nic; Rainey, Mike; Reppy, John; Shaw, Adam; Xiao, Yingqi (May 2009). "Programming in Manticore, a Heterogenous Parallel Functional Language" (PDF). Retrieved July 11, 2018.