Concurrent ML (CML) — это многопарадигмальный высокоуровневый функциональный язык программирования общего назначения . Это диалект языка программирования ML , который является параллельным расширением стандартного языка ML и характеризуется способностью создавать составные коммуникационные абстракции , которые являются первоклассными , а не встроенными в язык. Конструкция CML и его примитивные операции были приняты в нескольких других языках программирования, таких как GNU Guile , [5] Racket , [6] и Manticore. [4]
Многие языки программирования, поддерживающие параллелизм, предлагают каналы связи , позволяющие обмениваться значениями между процессами или потоками , одновременно работающими в системе. Связь, установленная между процессами, может осуществляться по определенному протоколу, требующему от программиста написания функций для установления требуемого шаблона связи. Между тем, система связи часто требует установления нескольких каналов, например, для нескольких серверов , а затем выбора между доступными каналами при появлении новых данных. Это можно сделать с помощью опроса , например, с помощью операции выбора в системах Unix.
Объединение протоколов, специфичных для приложения, и многосторонней связи может быть затруднено из-за необходимости внедрения опроса и проверки блокировки в уже существующем протоколе. Concurrent ML решает эту проблему, уменьшая связанность концепций программирования за счет введения синхронизируемых событий . [7] События — это первоклассная абстракция, которую можно использовать с операцией синхронизации (называемой sync
в CML и Racket) для того, чтобы потенциально заблокировать, а затем создать некоторую ценность, полученную в результате связи (например, данные, передаваемые по каналу).
В CML события можно комбинировать или манипулировать ими с помощью ряда примитивных операций. Каждая примитивная операция создает новое событие, а не изменяет его на месте, что позволяет создавать составные события, которые представляют желаемый шаблон связи. Например, CML позволяет программисту объединять несколько подсобытий для создания составного события, которое затем может сделать недетерминированный выбор одного из подсобытий. Другой примитив создает новое событие, которое изменяет значение, полученное в результате синхронизации с исходным событием. Эти события воплощают шаблоны взаимодействия, которые на языке, отличном от CML, обычно обрабатываются с использованием цикла опроса или функции с обработчиками для каждого типа событий.
Вот «Привет, мир!» программа , выводящая на системную консоль . Он порождает один поток с каналом для строк и другой поток, который печатает строку, полученную по каналу. Он использует стандарт ML Нью-Джерси (SML/NJ) и CML. (На платформах, отличных от Linux-x86, имя кучи будет другим; строку с «cml_test.x86-linux», возможно, придется изменить на что-то другое.)