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" может потребоваться изменить на что-то другое.)