Concurrent ML

редактировать

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

Содержание
  • 1 Концепции
  • 2 Пример кода
  • 3 Внешние ссылки
  • 4 Ссылки
Концепции

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

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

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

Пример кода

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

cml_test.cm
Библиотека структура Hello : $ cml / base.cm $ cml / cml.cm cml_test.sml
cml_test.sml
структура Hello = structopen CML fun hello () = letval c: string chan = channel () в spawn (fn () =>TextIO.print (recv c)); send (c, "привет, мир \ n"); exit () endfun main (name, argv) = RunCML.doit (fn () =>ignore (spawn hello), NONE) end
Running
$ 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-экспорт. sml] [компиляция (18518-export.cm): 18518-export.sml] [код: 309, данные: 37, env: 42 байта] $ heap2exec cml_test.x86-linux cml_test $./cml_test привет, мир
Внешние ссылки
Ссылки
Последняя правка сделана 2021-05-15 09:00:38
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте