Concurrent ML(CML)是Standard ML编程语言并发扩展,其特征是能够允许编程者建立可复合英语Function composition (computer science)的通信抽象,它是为头等对象而并未建入于语言。CML的设计和原语操作已经被一些其他编程语言接纳,比如GNU Guile[6]Racket[7]和Manticore[5]

Concurrent ML
编程范型并发计算
语言家族ML
設計者John Reppy
发行时间1991年,​35年前​(1991[1]
当前版本
  • 110.79(2015年10月4日;穩定版本)[2]
編輯維基數據鏈接
網站cml.cs.uchicago.edu
主要實作產品
SML/NJ[3]MLton[4], Manticore[5]

概念

编辑

很多支持并发性的编程语言提供在并发通信通道,来允许在并发运行于系统中的进程线程之间的值交换。在进程之间建立的通信服从特定的协议,要求编程者书写函数来建立通信所要求的模式。同时,通信系统经常需要建立多个通道,比如多个服务器,并接着在有新数据可获得的时候,在可获得的通道之间进行选择。这可以使用轮询完成,比如Unix系统上的select操作。

组合特定于应用的协议和多方通信二者可能是复杂的,因为需要在预先存在的协议内介入轮询和检查阻塞。Concurrent ML通过介入可同步的事件,简约了这种编程概念的耦合[8]。事件是可用于同步操作(在CML和Racket中叫做sync)的头等抽象,用于潜在的阻塞并接着产生来自通信(例如在通道上的数据传输)结果的一些值。

在CML中,事件可以使用一些原语(primitive)操作来组合或操纵。每个原语操作构造一个新事件而非就地修改事件,允许构造表示想要的通信模式的复合事件。例如,CML允许编程者组合一些子事件来创建复合事件,它可以非确定性的选择其中某一个子事件。另一个原语操作建立新事件,它会修改来自在最初事件上的同步的结果值。这些事件具体化了通信模式,在非CML语言中要使用轮询循环或函数通过给每类事件的处理器来处理。

样例代码

编辑

下面是打印“hello, world”至控制台的样例代码。它产生一个线程来为字符串创建一个通道。这个线程接着产生另一个线程,来打印在这个通道上接收的第一个字符串。前者线程接着在这个通道上发送"hello, world\n"字符串。它使用了SML/NJ和CML:

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
运行:
$ ml-build cml_test.cm Hello.main
Standard ML of New Jersey v110.79 [built: Mon Apr 22 10:14:55 2024]
[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: 2507 bytes]
[scanning 17180-export.cm]
[scanning (17180-export.cm):cml_test.cm]
[parsing (17180-export.cm):17180-export.sml]
[compiling (17180-export.cm):17180-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

引用

编辑
  1. ^ Reppy, John H. CML: a Higher-Order Concurrent Language. PLDI. June 1991. 
  2. ^ 110.79 Distribution Files (英語). 
  3. ^ What is Standard ML of New Jersey?. [April 5, 2021]. (原始内容存档于2021-04-20). 
  4. ^ ConcurrentMLImplementation. [April 5, 2021]. (原始内容存档于2021-05-16). 
  5. ^ 5.0 5.1 Fluet, Matthew; Bergstrom, Lars; Ford, Nic; Rainey, Mike; Reppy, John; Shaw, Adam; Xiao, Yingqi. Programming in Manticore, a Heterogenous Parallel Functional Language (PDF). May 2009 [July 11, 2018]. (原始内容 (PDF)存档于2021-05-16). 
  6. ^ Wingo, Andy. A New Concurrent ML. June 29, 2017 [July 11, 2018]. (原始内容存档于2020-12-06). 
  7. ^ Flatt, Matthew; Findler, Robert Bruce. Kill-safe synchronization abstractions. Proceedings of the ACM SIGPLAN 2004 Conference on Programming Language Design and Implementation. 2004, 39 (6): 47–58. doi:10.1145/996841.996849. 
  8. ^ Reppy, John H. Concurrent ML: Design, application and semantics. Lecture Notes in Computer Science 693. 1993: 165–198. ISBN 978-3-540-56883-4. doi:10.1007/3-540-56883-2_10.  |journal=被忽略 (帮助)

外部链接

编辑

官方网站

📚 Artikel Terkait di Wikipedia

串接式编程语言

达式的并列指示函数复合。串接式编程语言将常见于其他编程样式中的函数应用(英语:Function application),替代为函数复合(英语:function composition (computer science)),作为建造子例程的缺省方法。 串接式语言这个名词,最早在2001年提出的J

高阶函数

排序函数,接受一个比较函数作为参数。 filter函数 fold函数 apply(英语:apply)函数 函数复合(英语:Function composition (computer science)) 积分 回调函数 蒙塔古文法 這是一個Python 脚本语言的例子,其中函式g()有一引數以及回傳一函數.這個例子會列印100

管道 (软件)

,而管道的元素可以叫做过滤器(英语:Filter (software))。将元素连接成管道类似于函数复合(英语:Function composition (computer science))。在软件工程中,称之为管道与过滤器设计模式。 管道的概念是在Unix的发源地贝尔实验室由Douglas

J语言

的《APL字典》,它实现了其中至关重要的秩的概念。J语言提供隐式定义机制包括秩、钩子、叉子和多种函数复合(英语:function composition (computer science)),并介入了作为头等对象的动名词,用以建立控制结构,它常被作为隱式編程的典范之一。 J语言的运算符,承袭APL传统,没有优先级并且最右先行,2

单子 (函数式编程)

算,与之在一起的有两个过程,一个过程用来包装单子内“任何”基本类型的值(产生单子值),另一个过程用来复合(英语:function composition (computer science))那些输出单子值的函数(叫做单子函数)。 单子的概念和术语二者最初都来自范畴论,这里的单子被定义为具有额外结构

Filter (高阶函数)

9,这是通过搜集整数列表1, 2, …, 10中,谓词对其返回布尔值false的那些元素(这里的.是函数复合算子(英语:Function composition (computer science)))。 >>>print(list(filter(lambda x:x % 2 == 0,[1,2,3,4,5

Map (高阶函数)

(f . g) ≡ fmap f . fmap g -- 复合律 这里的.在Haskell中指示函数复合(英语:Function composition (computer science))。 尤其是,它允许为各种搜集定义逐个元素的运算。 此外,如果F和G是两个函子,自然变换是多态类型 h : ∀

隐式编程

这里的参数是不必须的,进而将它改写成如下“无点”也称为函数级编程的样式: sum = foldr (+) 0 Haskell拥有函数复合(英语:Function composition (computer science))算子: (.) :: (b -> c) -> (a -> b) -> a -> c (.) f g = \x