Concurrent ML (CML) - это параллельное расширение языка программирования Standard ML, характеризующееся его способностью позволять программистам создавать составные коммуникативные абстракции, которые являются первоклассными, а не встроенными в язык. Дизайн CML и его примитивные операции были приняты в нескольких других языках программирования, таких как GNU Guile , [5] Racket , [6] и Manticore. [4]
Парадигма | Параллельные вычисления |
---|---|
Семья | ML |
Впервые появился | 1991 [1] |
Веб-сайт | http://cml.cs.uchicago.edu/ |
Основные реализации | |
SML / NJ , [2] MLton , [3] Мантикора [4] |
Концепции
Многие языки программирования, поддерживающие параллелизм, предлагают каналы связи, которые позволяют обмениваться значениями между процессами или потоками, выполняющимися одновременно в системе. Связь, устанавливаемая между процессами, может следовать определенному протоколу, требующему от программиста написания функций для установления требуемого шаблона связи. Между тем, система связи часто требует установления нескольких каналов, например, для нескольких серверов , а затем выбора между доступными каналами, когда доступны новые данные. Это может быть выполнено с помощью опроса , например, с помощью операции выбора в системах Unix.
Комбинирование протоколов для конкретных приложений и многосторонней связи может быть затруднено из-за необходимости введения опроса и проверки блокировки в рамках уже существующего протокола. Параллельное машинное обучение решает эту проблему, уменьшая эту взаимосвязь концепций программирования за счет введения синхронизируемых событий . [7] События - это первоклассная абстракция, которую можно использовать с операцией синхронизации (называемой sync
в CML и Racket), чтобы потенциально заблокировать, а затем произвести какое-либо значение, полученное в результате связи (например, данные, передаваемые по каналу).
В CML событиями можно комбинировать или управлять ими с помощью ряда примитивных операций. Каждая примитивная операция создает новое событие, а не изменяет событие на месте, что позволяет создавать составные события, представляющие желаемый шаблон связи. Например, CML позволяет программисту комбинировать несколько под-событий, чтобы создать составное событие, которое затем может сделать недетерминированный выбор одного из под-событий. Другой примитив создает новое событие, которое изменит значение, полученное в результате синхронизации исходного события. Эти события воплощают шаблоны взаимодействия, которые на языке, отличном от CML, обычно обрабатываются с помощью цикла опроса или функции с обработчиками для каждого вида событий.
Образец кода
Вот пример кода для вывода « hello, world » на консоль. Он порождает поток, который создает канал для строк . Затем этот поток порождает другой поток, который печатает первую строку, полученную на канале. Первый поток затем отправляет на канал строку «hello, world \ n». Он использует SML / NJ и CML (обратите внимание, что имя кучи будет другим на платформах, отличных от linux-x86; вам может потребоваться изменить строку с "cml_test.x86-linux" на что-то другое):
- cml_test.cm
Структура библиотеки Hello is $ cml / базис. см $ cml / cml.cm cml_test.sml
- cml_test.sml
структура Hello = struct open CML fun hello () = let val c: string chan = channel () в spawn ( fn () => TextIO.print (recv c)); send (c, "привет, мир \ n"); выход () конец весело main (имя, argv) = RunCML.doit (fn () => ignore (создать привет), NONE) конец
- Бег
$ ml-build cml_test.cm Hello.main Стандартный ML из Нью-Джерси v110.60 [построено: 27 ноября, понедельник, 14:19:21 2006] [сканирование cml_test.cm] [библиотека $ cml / base.cm стабильна] [библиотека $ cml / cml.cm стабильна] [parsing (cml_test.cm): cml_test.sml] [создание каталога .cm / SKEL] [библиотека $ cml / cml-internal.cm стабильна] [библиотека $ cml / core-cml .cm стабильна] [библиотека $ SMLNJ-BASIS / base.cm стабильна] [компиляция (cml_test.cm): cml_test.sml] [создание каталога .cm / GUID] [создание каталога .cm / x86-unix] [код : 2170, данные: 42, env: 2561 байт] [сканирование 18518-export.cm] [сканирование (18518-export.cm): cml_test.cm] [синтаксический анализ (18518-export.cm): 18518-export.sml] [компиляция (18518-export.cm): 18518-export.sml] [код: 309, данные: 37, env: 42 байта] $ heap2exec cml_test.x86-linux cml_test $ ./cml_test привет, мир
Внешние ссылки
Рекомендации
- ^ Reppy, Джон Х. (июнь 1991). CML: параллельный язык высшего порядка . PLDI.
- ^ "Что такое Standard ML в Нью-Джерси?" . Проверено 5 апреля 2021 года .
- ^ «ConcurrentMLImplementation» . Проверено 5 апреля 2021 года .
- ^ а б Флейт, Мэтью; Бергстром, Ларс; Форд, Ник; Рейни, Майк; Реппи, Джон; Шоу, Адам; Сяо, Инци (май 2009 г.). «Программирование на мантикоре, гетерогенном параллельном функциональном языке» (PDF) . Проверено 11 июля 2018 года .
- ^ Винго, Энди (29 июня 2017 г.). «Новый параллельный ML» . Проверено 11 июля 2018 года .
- ^ Флатт, Мэтью; Финдлер, Роберт Брюс (2004). «Абстракции безопасной синхронизации». Труды конференции ACM SIGPLAN 2004 по проектированию и реализации языков программирования . 39 (6): 47–58. DOI : 10.1145 / 996841.996849 .
- ^ Реппи, Джон Х. (1993). Параллельное машинное обучение: дизайн, применение и семантика . Функциональное программирование, параллелизм, моделирование и автоматизированное рассуждение . Конспект лекций по информатике. 693 . С. 165–198. CiteSeerX 10.1.1.50.7965 . DOI : 10.1007 / 3-540-56883-2_10 . ISBN 978-3-540-56883-4.