Concurrent ML (Concurrent ML)
Concurrent ML | |
---|---|
Семантика | Синхронная передача сообщений |
Класс языка | функциональный, конкурентный |
Тип исполнения | встраиваемый |
Автор | John H. Reppy |
Выпуск | |
Система типов | Хиндли—Милнера |
Испытал влияние | Standard ML |
Повлиял на |
конкурентные расширения для[2] OCaml, Haskell, Scheme, Java |
Лицензия | открытая |
Сайт | cml.cs.uchicago.edu |
Платформа | Standard ML |
ОС | кроссплатформенный |
Concurrent ML (CML) — статически типизированный язык конкурентного программирования высшего порядка, встраиваемый в язык общего назначения[англ.] Standard ML[3][2].
Реализован в виде библиотеки. Входит в стандартную поставку компиляторов SML/NJ[англ.] и MLton. С минимальными изменениями CML планируется ввести в стандарт будущего языка successor ML.
Подробности
[править | править код]CML воплощает модель синхронной передачи сообщений, расширяя SML типизированными каналами и синхронными абстракциями первого класса, которые называются событиями. Этот механизм позволяет инкапсулировать сложные протоколы взаимодействия и синхронизации в виде объектов первого класса, поощряя сокрытие действительных каналов взаимодействия под абстрактными типами данных и улучшая за счёт этого модульность.[3][2]
CML разработан во времена, когда процессоры с поддержкой аппаратного параллелизма были роскошью, так что его ранние реализации ориентировались на физически последовательное исполнение. Впоследствии был разработан «Parallel Concurrent ML»[2], исполняемый на современных процессорах более эффективно.
Своим созданием и развитием CML в основном обязан Джону Реппи (англ. John Reppy)[4].
Реализация
[править | править код]Concurrent ML выделяется среди большинства встраиваемых языков тем, что имеет не единственную реализацию, а две принципиально различные. Это обусловлено различиями между реализациями Standard ML по назначению и применяемым стратегиям компиляции:
- В компиляторе Standard ML of New Jersey[англ.] (SML/NJ) язык CML реализован посредством продолжений, то есть предоставляет платформенно-независимую многопоточность. Поскольку SML/NJ использует при компиляции стратегию программирование в стиле передачи продолжений (англ. Continuation-passing style, CPS), а сам язык SML гарантирует оптимизацию хвостовых вызовов (Tail Call Optimisation, TCO), то из результирующего кода полностью устраняется динамический стек, и распараллеленные программы получаются весьма эффективными.
- MLton использует значительно более агрессивную оптимизацию, изначально ориентируясь на производительность программ уровня Си/C++. При таких требованиях CPS-стратегия оказывается неприменима. Но без неё каждый вызов
callcc
требует временных затрат, пропорциональных размеру стека, что в данном случае тем более неприемлемо. Поэтому при портировании реализация CML была переключена с продолжений на «тонкие» потоки MLton, основанные на потоках операционные системы. Как следствие, исходный код на CML под MLton портируем за счёт абстракции, но скомпилированный код уже получается специфичным для данной платформы. Потоки MLton несколько тяжеловеснее, чем продолжения в SML/NJ, но разработчики полагают, что это исправимо. MLton предоставляет базовую функциональность CML, в основном повторяющую поведение имеющейся в SML/NJ[англ.], но не реализует потоко-безопасную обёртку над Базисной библиотекой и реактивные эквиваленты функциональности модулейIO
иOS
.
Применение
[править | править код]На CML написана библиотека eXene
[5], реализующая параллельную реактивную модель графического интерфейса пользователя под X Window System.
Пример кода
[править | править код]Программа «Hello, world!» для консоли. Здесь порождается поток, который создаёт строковый канал. Этот поток сперва порождает другой поток, который напечатает в консоль первую строку, полученную на канале, а затем посылает на этот порождённый канал строку «hello, world!».
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
Примечания
[править | править код]- ↑ 110.79 Distribution Files (англ.)
- ↑ 1 2 3 4 Reppy, 2009.
- ↑ 1 2 Reppy, Xiao, 2007.
- ↑ John Reppy’s homepage . Дата обращения: 24 июля 2015. Архивировано 27 июля 2015 года.
- ↑ eXene — multi-threaded X-Window System toolkit written in ConcurrentML . Дата обращения: 24 июля 2015. Архивировано 22 февраля 2012 года.
Литература
[править | править код]- John Reppy. Synchronous Operations as First-Class Values. — Conference on Programming Language Design and Implementation (PLDI), 1988.
- John Reppy. Concurrent Programming in ML. — Cambridge University Press, 1999. — ISBN 0521480892. (недоступная ссылка)
- Emden Gansner, John Reppy. A Multi-Threaded Higher-order User Interface Toolkit.. — User Interface Software, 1993.
- Riccardo Puccella. Reactive Programming in Standard ML. — IEEE International Conference on Computer Languages (ICCL), 1998.
- Simon Marlow, Simon Peyton Jones, Andy Moran, John Reppy. Asynchronous Exceptions in Haskell. — Conference on Programming Language Design and Implementation (PLDI), 2001. Архивировано 15 декабря 2024 года.
- Matthew Flatt and Robert Bruce Findler. Kill-Safe Synchronization Abstractions. — Conference on Programming Language Design and Implementation (PLDI), 2004.
- John Reppy, Yingqi Xiao. Specialization of CML message-passing primitives. — Symposium on Principles of Programming Languages (POPL), 2007. — С. 315–326.
- John Reppy, Claudio V. Russo, Yingqi Xiao. Parallel Concurrent ML. — International Conference on Functional Programming (ICFP), 2009.
Ссылки
[править | править код]- Concurrent ML в SML/NJ
- Concurrent ML Implementation in MLton
- MLton Threads
- альтернативный подход к многопоточности в ML:
- Norman Ramsey. Concurrent Programming in ML // Technical Report CS-TR-262-90. — Princeton University, 1990.