编程范型 | 并发计算 |
---|---|
语言家族 | ML |
設計者 | John Reppy |
发行时间 | 1991年[1] |
当前版本 |
|
網站 | cml |
主要實作產品 | |
SML/NJ[3],MLton[4], Manticore[5] |
Concurrent ML(CML)是Standard ML编程语言的并发扩展,其特征是能够允许编程者建立可复合的通信抽象,它是为头等对象而并未建入于语言。CML的设计和原语操作已经被一些其他编程语言接纳,比如GNU Guile[6]、Racket[7]和Manticore[5]。
很多支持并发性的编程语言提供在并发通信通道,来允许在并发运行于系统中的进程或线程之间的值交换。在进程之间建立的通信服从特定的协议,要求编程者书写函数来建立通信所要求的模式。同时,通信系统经常需要建立多个通道,比如多个服务器,并接着在有新数据可获得的时候,在可获得的通道之间进行选择。这可以使用轮询完成,比如Unix系统上的select
操作。
组合特定于应用的协议和多方通信二者可能是复杂的,因为需要在预先存在的协议内介入轮询和检查阻塞。Concurrent ML通过介入可同步的事件,简约了这种编程概念的耦合[8]。事件是可用于同步操作(在CML和Racket中叫做sync
)的头等抽象,用于潜在的阻塞并接着产生来自通信(例如在通道上的数据传输)结果的一些值。
在CML中,事件可以使用一些原语(primitive)操作来组合或操纵。每个原语操作构造一个新事件而非就地修改事件,允许构造表示想要的通信模式的复合事件。例如,CML允许编程者组合一些子事件来创建复合事件,它可以非确定性的选择其中某一个子事件。另一个原语操作建立新事件,它会修改来自在最初事件上的同步的结果值。这些事件具体化了通信模式,在非CML语言中要使用轮询循环或函数通过给每类事件的处理器来处理。
下面是打印“hello, world”至控制台的样例代码。它产生一个线程来为字符串创建一个通道。这个线程接着产生另一个线程,来打印在这个通道上接收的第一个字符串。前者线程接着在这个通道上发送"hello, world\n"
字符串。它使用了SML/NJ和CML:
Library
structure Hello
is
$cml/basis.cm
$cml/cml.cm
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
$ ml-build cml_test.cm Hello.main
Standard ML of New Jersey v110.79 [built: Sat Oct 26 12:27:04 2019]
[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]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[compiling (cml_test.cm):cml_test.sml]
[creating directory .cm/GUID]
[creating directory .cm/x86-unix]
[code: 2738, data: 42, env: 2506 bytes]
[scanning 68899-export.cm]
[scanning (68899-export.cm):cml_test.cm]
[parsing (68899-export.cm):68899-export.sml]
[compiling (68899-export.cm):68899-export.sml]
[code: 317, data: 37, env: 40 bytes]
$ sml @SMLload=cml_test.x86-linux
hello, world
注意在非linux-x86平台上堆名字可能不同,若此则需要将有cml_test.x86-linux
的行变更为对应的变体。在Ubuntu系统下,CML的安装包是libcml-smlnj
。
|journal=
被忽略 (帮助)