stringtranslate.com

Параллельный МО

Concurrent ML (CML) — это многопарадигмальный , универсальный , высокоуровневый , функциональный язык программирования . Это диалект языка программирования ML , который является параллельным расширением стандартного языка ML , характеризующимся своей способностью позволять создавать компонуемые коммуникационные абстракции , которые являются первоклассными, а не встроенными в язык. Дизайн CML и его примитивные операции были приняты в нескольких других языках программирования, таких как GNU Guile , [5] Racket , [6] и Manticore. [4]

Концепции

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

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

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

Привет, мир

Вот программа "Hello, World!" , которая печатает на системной консоли . Она порождает один поток с каналом для строк и другой поток, который печатает строку, полученную на канале. Она использует стандартный ML Нью-Джерси (SML/NJ) и CML. (На платформах, отличных от linux-x86, имя кучи будет отличаться; строку с "cml_test.x86-linux" может потребоваться изменить на что-то другое.)

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

Ссылки

  1. ^ Реппи, Джон Х. (июнь 1991 г.). CML: параллельный язык высшего порядка . PLDI.
  2. ^ "Что такое стандартный ML Нью-Джерси?" . Получено 5 апреля 2021 г. .
  3. ^ "ConcurrentMLImplementation" . Получено 5 апреля 2021 г.
  4. ^ ab Fluet, Matthew; Bergstrom, Lars; Ford, Nic; Rainey, Mike; Reppy, John; Shaw, Adam; Xiao, Yingqi (май 2009 г.). "Программирование на Manticore, гетерогенном параллельном функциональном языке" (PDF) . Получено 11 июля 2018 г. .
  5. ^ Wingo, Andy (29 июня 2017 г.). "A New Concurrent ML" . Получено 11 июля 2018 г. .
  6. ^ Флэтт, Мэтью; Финдлер, Роберт Брюс (2004). «Абстракции безопасной синхронизации». Труды конференции ACM SIGPLAN 2004 по проектированию и реализации языков программирования . Том 39. С. 47–58. doi :10.1145/996841.996849. ISBN 1581138075. S2CID  5547460.
  7. ^ Reppy, John H. (1993). "Concurrent ML: Design, application and semantics". Функциональное программирование, параллелизм, моделирование и автоматизированное рассуждение . Lecture Notes in Computer Science. Vol. 693. pp. 165–198. CiteSeerX 10.1.1.50.7965 . doi :10.1007/3-540-56883-2_10. ISBN  978-3-540-56883-4.