Параллельный ML - Concurrent ML

Параллельный ML (CML) - это одновременный расширение Стандартный ML язык программирования, который позволяет программистам создавать составной общение абстракции которые первый класс а не встроены в язык. Дизайн CML и его примитивные операции были приняты в нескольких других языках программирования, таких как GNU Guile,[1] Ракетка,[2] и Мантикора.[3]

Концепции

Многие языки программирования, поддерживающие параллелизм, предлагают каналы связи которые позволяют обмениваться ценностями между процессы или потоки работает одновременно в системе. Связь, устанавливаемая между процессами, может следовать определенному протоколу, требующему от программиста написания функций для установления требуемого шаблона связи. Между тем, коммуникационная система часто требует установления нескольких каналов, например, нескольких серверы, а затем выбор между доступными каналами при появлении новых данных. Это можно сделать с помощью опрос, например, с Выбрать работа в системах Unix.

Комбинирование протоколов для конкретных приложений и многосторонней связи может быть затруднено из-за необходимости введения опроса и проверки блокировка в рамках ранее существовавшего протокола. Concurrent ML решает эту проблему, уменьшая связь концепций программирования путем введения синхронизируемых События.[4] События - это первоклассная абстракция, которую можно использовать с операцией синхронизации (называемой синхронизировать в CML и Racket), чтобы потенциально заблокировать, а затем создать какое-либо значение, полученное в результате обмена данными (например, данные, передаваемые по каналу).

В CML событиями можно комбинировать или управлять ими с помощью ряда примитивных операций. Каждая примитивная операция создает новое событие, а не модифицирует событие на месте, что позволяет создавать составные события, представляющие желаемый шаблон связи. Например, CML позволяет программисту объединить несколько вспомогательных событий, чтобы создать составное событие, которое затем может сделать недетерминированный выбор одного из вспомогательных событий. Другой примитив создает новое событие, которое изменит значение, полученное в результате синхронизации исходного события. Эти события воплощают шаблоны взаимодействия, которые на языке, отличном от CML, обычно обрабатываются с помощью цикла опроса или функции с обработчиками для каждого вида событий.

Образец кода

Вот пример кода для печати "Привет мир "на консоль. Он порождает нить который создает канал для струны. Затем этот поток порождает другой поток, который печатает первую строку, полученную на канале. Первый поток затем отправляет на канал строку «hello, world n». Оно использует SML / NJ и CML (обратите внимание, что имя кучи будет другим на платформах, отличных от linux-x86; вам может потребоваться изменить строку с "cml_test.x86-linux" на что-то другое):

cml_test.cm
   Библиотека       структура Здравствуйте является       $ cml / base.cm $ cml / cml.cm cml_test.sml
cml_test.sml
   структура Привет = структура       открыто CML весело привет () = позволять вал c: строка chan = channel () в               порождать (fn () => TextIO.print (recv c)); send (c, "привет, мир  n"); выход () конец                  весело main (name, argv) = RunCML.doit (fn () => ignore (создать привет), NONE) конец
Бег
$ ml-build cml_test.cm Hello.mainStandard ML of New Jersey v110.60 [построено: 27 ноября, понедельник, 14:19:21 2006 г.][сканирование cml_test.cm][библиотека $ cml / base.cm стабильна][библиотека $ cml / cml.cm стабильна][синтаксический анализ (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Привет мир

внешние ссылки

использованная литература

  1. ^ Винго, Энди (29 июня 2017 г.). "Новый параллельный ML". Получено 11 июля, 2018.
  2. ^ Флэтт, Мэтью; Финдлер, Роберт Брюс (2004). «Абстракции безопасной синхронизации». Труды конференции ACM SIGPLAN 2004 по разработке и реализации языков программирования. 39 (6): 47–58. Дои:10.1145/996841.996849.
  3. ^ Флейт, Мэтью; Бергстром, Ларс; Форд, Ник; Рейни, Майк; Реппи, Джон; Шоу, Адам; Сяо, Инци (май 2009 г.). «Программирование на мантикоре, гетерогенном параллельном функциональном языке» (PDF). Получено 11 июля, 2018.
  4. ^ Реппи, Джон Х. (1993). Параллельное машинное обучение: дизайн, применение и семантика. Функциональное программирование, параллелизм, моделирование и автоматизированное рассуждение. Конспект лекций по информатике. 693. С. 165–198. CiteSeerX  10.1.1.50.7965. Дои:10.1007/3-540-56883-2_10. ISBN  978-3-540-56883-4.