Джойс (язык программирования)
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Парадигма | параллельный , императивный , структурированный |
---|---|
Семья | Вирт Паскаль |
Разработано | Пер Бринч Хансен |
Впервые появился | 1987 год |
Стабильная версия | 1
/ 1987 |
Дисциплина набора текста | Сильный |
Под влиянием | |
Взаимодействие последовательных процессов , Паскаль , Параллельный Паскаль | |
Под влиянием | |
СуперПаскаль |
Joyce — безопасный язык программирования для параллельных вычислений, разработанный Пером Бринчом Хансеном в 1980-х годах. [1] Он основан на последовательном языке Паскаль и принципах взаимодействия последовательных процессов (CSP). Он был создан для устранения недостатков CSP, применяемого в качестве языка программирования, и для предоставления инструмента, в основном для обучения, для реализации распределенных вычислительных систем.
Язык основан на концепции агентов ; одновременно выполняемые процессы, которые взаимодействуют только посредством использования каналов и передачи сообщений . Агенты могут активировать субагенты динамически и рекурсивно . Разработка Джойса легла в основу языка SuperPascal , также разработанного Хансеном примерно в 1993 году.
Особенности [ править ]
Joyce основан на небольшом подмножестве Pascal, дополненном функциями параллелизма, вдохновленными CSP. [2] В следующих разделах описаны некоторые из наиболее новых функций, которые были представлены.
Агенты [ править ]
Агент — это процедура, состоящая из набора операторов и, возможно, вложенных определений других агентов. Агент может динамически активировать субагенты, которые выполняются одновременно со своим создателем . Агент может завершить работу только тогда, когда все его субагенты также завершили работу. Например, агент process2
активирует process1
:
agent process1(x, y: integer);
begin
...
end;
agent process2();
use process1;
begin
process1(9, 17);
end;
Активация агента создает новые экземпляры всех локальных переменных , и значение каждого формального параметра копируется в локальную переменную. Следовательно, агенты не могут получить доступ к переменным других агентов, и им разрешено общаться только через каналы. Это ограничение предотвращает проблемы, связанные с использованием общих переменных, таких как условия гонки .
Общение [ править ]
Агенты общаются через объекты, называемые каналами . Каналы имеют алфавит, определяющий набор символов, которые могут передаваться. Каналы создаются динамически, доступ к ним осуществляется с помощью переменных порта . Тип порта определяется отдельным набором символов, составляющих его алфавит. Символы с несколькими значениями определяются определенным типом. Например:
stream = [int(integer), eos];
Символ int(integer)
обозначает символ сообщения , называемый int
любого целочисленного значения. Второе объявление бестипового символа eos
(конец потока) называется сигналом . После определения типа порта можно объявить переменную порта этого типа:
out : stream
in : stream
И тогда сущность канала, внутренняя для создающего его агента, может быть активирована следующим образом:
+out;
Затем символы можно отправлять и получать по каналам с помощью операторов ввода и вывода в стиле CSP. ?
и !
соответственно. Связь может происходить только в том случае, если существует агент-получатель, соответствующий агенту-отправителю. Принимающий агент должен ожидать получения отправляемого типа символа. Например, значение 9, за которым следует eos
символ отправляется в порт out
:
out ! int(9)
out ! eos
И целочисленное сообщение принимается в переменную соответствующего типа, за которым следует eos
:
received : integer
in ? int(received)
in ? eos
Заявления опроса [ править ]
Заявления опроса основаны на концепции защищенных альтернатив CSP. Оператор опроса состоит из набора операторов, каждый из которых защищен оператором входного канала. Когда связь между передающим агентом и охраной согласована, выполняется охрана, за которой следует соответствующий оператор. Например:
poll
in ? X -> x := x + 1 |
in ? Y -> y := y + 1
end
Где порт in
контролируется по сигналам X
или Y
, при соответствующей связи соответствующие переменные x
или y
увеличиваются.
Безопасность [ править ]
Джойс был спроектирован как безопасный язык в том смысле, что компилятор сможет обнаружить все нарушения языковых правил.
Пример программы [ править ]
Ниже приведен полный пример программы, взятый из оригинальной статьи, знакомящей с языком программирования Джойса. [1] реализация алгоритма генерации простых чисел, основанного на методе просеивания для генерации простых чисел . А sieve
Агенту отправляется поток целых чисел от своего предшественника, первое из которых является простым числом. Он удаляет из потока все кратные этому простому числу и активирует преемника. Это продолжается до тех пор, пока eos
Сигнал распространяется по набору сит.
agent sieve(inp, out: stream);
var more: boolean; x, y: integer;
succ: stream;
begin
poll
inp?int(x) -> +succ;
sieve(succ, out); more := true |
inp?eos -> out!eos; more := false
end;
while more do
poll
inp?int(y) ->
if y mod x <> 0 then succ!int(y) |
inp?eos -> out!int(x);
succ!eos; more := false
end;
end;
Следующий агент инициализирует набор ситовых агентов и вводит в них поток целых чисел от 3 до 9999.
agent primes;
use generate, sieve, print;
var a, b: stream;
begin
+a; +b; generate(a, 3, 2, 4999);
sieve(a, b); print(b)
end;
Реализация [ править ]
Распределение стека [ править ]
Из-за одновременного выполнения процедур агента традиционную схему последовательного распределения стека нельзя использовать, поскольку записи активации вызовов агента не следуют шаблону «последним пришел — первым вышел». Вместо этого отношения создатель-субагент образуют стек с древовидной структурой. Для реализации такого поведения используется простая схема, которая работает путем выделения новых записей активации наверху стека и связывания записей активации субагентов с записью их создателя. Эти записи освобождаются только тогда, когда агент завершает работу и они оказываются на вершине стека. [3] Эффективность этой схемы зависит от структуры и поведения программы, что в некоторых случаях приводит к неэффективному использованию памяти. Более эффективная схема была реализована в языке Хансена SuperPascal .
Ссылки [ править ]
- ^ Перейти обратно: а б Хансен, Бринч (2002). «Джойс: язык программирования для распределенных систем». В Хансене, Пер Бринч (ред.). Происхождение параллельного программирования: от семафоров к удаленным вызовам процедур . Нью-Йорк, Нью-Йорк: Спрингер. стр. 464–492. дои : 10.1007/978-1-4757-3472-0 . ISBN 978-1-4419-2986-0 . S2CID 44909506 .
- ^ Хансен, Бринч (июнь 1989 г.). «Отчет о языке Джойса» . Программное обеспечение: практика и опыт . 19 (6). Джон Уайли и сыновья: 553–578. дои : 10.1002/спе.4380190606 . S2CID 30474491 .
- ^ Хансен, Бринч (июнь 1989 г.). «Многопроцессорная реализация Джойса» . Программное обеспечение: практика и опыт . 19 (6). Джон Уайли и сыновья: 579–592. дои : 10.1002/спе.4380190606 . S2CID 30474491 .
Внешние ссылки [ править ]
- Официальный сайт , Архив Бринч Хансена, комплект его документов.