Concurrent ML

Concurrent ML(CML)是Standard ML程式語言並發擴展,其特徵是能夠允許編程者建立可複合英語Function composition (computer science)的通信抽象,它是為頭等對象而並未建入於語言。CML的設計和原語操作已經被一些其他程式語言接納,比如GNU Guile[6]Racket[7]和Manticore[5]

Concurrent ML
編程範型並發計算
語言家族ML
設計者John Reppy
釋出時間1991年,​33年前​(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: 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

引用

  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=被忽略 (幫助)

外部連結

官方網站