СуперПаскаль
Парадигма | параллельный , императивный , структурированный |
---|---|
Семья | Вирт Паскаль |
Разработано | Пер Бринч Хансен |
Впервые появился | 1993 год |
Стабильная версия | 1
/ 1993 |
Дисциплина набора текста | Сильный |
Веб-сайт | бринч хансен |
Под влиянием | |
Взаимодействие последовательных процессов , Паскаль , Параллельный Паскаль , Джойс , occam |
SuperPascal — это императивный для параллельных вычислений, язык программирования разработанный Пером Бринчом Хансеном . [1] Он был разработан как язык публикации : инструмент мышления, позволяющий ясно и кратко выражать концепции в параллельном программировании. Это контрастирует с языками реализации, которые часто сложны из-за деталей машины и исторических соглашений. Он был создан для удовлетворения потребности в параллельном языке публикации. Можно утверждать, что немногие языки сегодня являются достаточно выразительными и краткими, чтобы их можно было использовать в качестве инструментов мышления.
и развитие История
SuperPascal основан на Никлауса Вирта последовательном языке Pascal , расширяя его функциями для безопасного и эффективного параллелизма. Сам Паскаль широко использовался в качестве языка публикаций в 1970-х годах. Он использовался для обучения практикам структурного программирования и фигурировал в учебниках, например, по компиляторам. [2] и языки программирования. [3] Хансен ранее разработал язык Concurrent Pascal , [4] один из первых параллельных языков для разработки операционных систем и систем управления в реальном времени .
Требования SuperPascal были основаны на опыте, полученном Хансеном за три года при разработке набора модельных параллельных программ, реализующих методы для решения распространенных задач в информатике . [5] Это экспериментирование позволило ему сделать следующие выводы о будущем научных параллельных вычислений :
- Будущие параллельные компьютеры будут универсальными , что позволит программистам мыслить в терминах проблемно-ориентированных конфигураций процессов. Это было основано на его опыте программирования сетей транспьютеров общего назначения , которые представляли собой процессоры , способные соединяться в массивы , деревья или гиперкубы .
- Обычные задачи в информатике требуют только детерминированного параллелизма , то есть ожидания связи от конкретного канала , а не от нескольких.
- Параллельные научные алгоритмы могут быть разработаны на элегантном языке публикации и протестированы на последовательном компьютере. Когда установлено, что алгоритм работает, его можно легко реализовать на языке параллельной реализации.
Затем это привело к следующим требованиям к параллельному языку публикации:
- Язык должен расширить широко используемый стандартный язык с помощью детерминированного параллелизма и передачи сообщений . Расширения должны соответствовать духу стандартного языка.
- Язык должен позволять программировать произвольные конфигурации параллельных процессов, связанных каналами связи. Эти конфигурации могут определяться итеративно или рекурсивно и создаваться динамически.
- Язык должен позволять однопроходному компилятору проверять, не влияют ли параллельные процессы в зависимости от времени.
Особенности [ править ]
Ключевой идеей при разработке SuperPascal было обеспечение безопасного программирования с использованием абстрактных концепций параллелизма. [6] [7]
Безопасность [ править ]
SuperPascal безопасен , поскольку он должен позволять своему компилятору и системе выполнения обнаруживать как можно больше случаев, когда концепции языка нарушаются и приводят к бессмысленным результатам. [8] SuperPascal накладывает ограничения на использование переменных, которые позволяют однопроходному компилятору проверять непересекаемость параллельных процессов, даже если процессы используют процедуры с глобальными переменными, что исключает ошибки, зависящие от времени. Некоторые функции Паскаля были неоднозначными или небезопасными и были исключены из SuperPascal, например метки и goto
операторы, указатели и предварительные объявления. [6]
Параллелизм [ править ]
Параллельные функции SuperPascal являются подмножеством occam 2 с добавленной общностью динамических массивов процессов и рекурсивных параллельных процессов. [7]
А parallel
Оператор означает, что фиксированное количество содержащихся в нем операторов должно выполняться параллельно. Например:
parallel source() | sink() end
А forall
оператор обозначает параллельное выполнение оператора динамическим количеством процессов, например:
forall i := 0 to 10 do something()
Каналы и коммуникация [ править ]
Параллельные процессы взаимодействуют, отправляя типизированные сообщения через каналы, создаваемые динамически. Каналы сами по себе не являются переменными, но идентифицируются уникальным значением, известным как ссылка на канал , которое хранится в переменных канала . Канал объявляется, например, объявлением
type channel = *(boolean, integer);
var c: channel;
который определяет новый (смешанный) тип с именемchannel и переменную этого типа с именем c . Канал смешанного типа ограничен передачей только указанных типов, в данном случае логических и целочисленных значений. Канал c инициализируется open
заявление:
open(c)
Обмен сообщениями затем осуществляется с помощью send(channel, value)
и receive(channel, variable)
заявления. Выражение или переменная, предоставляющая значение для send
и переменная в receive
, оба должны быть того же типа, что и первый аргумент канала. В следующем примере показано использование этих функций в процессе, который получает значение из левого канала и выводит его в правый .
var left, right: channel; a: number;
receive(left, a);
send(right, a)
Функции send
и receive
может принимать несколько входных и выходных аргументов соответственно:
send(channel, e1, e2,..., en); receive(channel, v1, v2,..., vn)
Могут возникнуть следующие ошибки связи во время выполнения :
- Конфликт за канал возникает, когда два параллельных процесса одновременно пытаются отправить или получить данные по одному и тому же каналу.
- Ошибка типа сообщения возникает, когда два параллельных процесса пытаются взаимодействовать через один и тот же канал, а выходное выражение и входная переменная имеют разные типы.
- Взаимная блокировка возникает, когда операция отправки или получения ожидает завершения неопределенное время.
Параллельная рекурсия [ править ]
Рекурсивные процедуры можно комбинировать с parallel
и forall
операторы для создания параллельных рекурсивных процессов. В следующем примере показано, как можно рекурсивно определить конвейер процессов с помощью parallel
заявление.
procedure pipeline(min, max: integer; left, right: channel);
var middle: channel;
begin
if min < max then
begin
open(middle);
parallel
node(min, left, middle) |
pipeline(min + 1, max, middle, right)
end
end
else node(min, left, right)
end;
Другой пример — рекурсивное определение дерева процессов :
procedure tree(depth: integer, bottom: channel);
var left, right: channel;
begin
if depth > 0 then
begin
open(left, right);
parallel
tree(depth - 1, left) |
tree(depth - 1, right) |
root(bottom, left, right)
end
end
else leaf(bottom)
Контроль помех [ править ]
Самый сложный аспект параллельного программирования — непредсказуемое или невоспроизводимое поведение, вызванное зависящими от времени ошибками. Ошибки, зависящие от времени, вызваны помехами между параллельными процессами из-за обновлений переменных или конфликтов каналов. Если процессы, совместно использующие переменную, обновляют ее в непредсказуемое время, результирующее поведение программы зависит от времени. Аналогично, если два процесса одновременно пытаются отправить или получить данные по общему каналу, результат будет зависеть от времени.
SuperPascal налагает определенные ограничения на использование переменных и обмен данными, чтобы минимизировать или устранить ошибки, зависящие от времени. В случае с переменными требуется простое правило: параллельные процессы могут обновлять только непересекающиеся наборы переменных. [1] Например, в parallel
оператор, целевая переменная не может быть обновлена более чем одним процессом, но переменная выражения (которая не может быть обновлена) может использоваться несколькими процессами. В некоторых случаях, когда переменная, такая как массив, является целью нескольких параллельных процессов, и программист знает, что ее поэлементное использование является непересекающимся , тогда ограничение непересекаемости может быть переопределено предыдущим [sic]
заявление.
Структура и синтаксис [ править ]
SuperPascal — это язык с блочной структурой , имеющий тот же базовый синтаксис, что и Pascal. Программа состоит из заголовка , определений глобальных переменных , определений функций или процедур и основной процедуры. Функции и процедуры состоят из блоков , где блок представляет собой набор операторов . Операторы разделяются точкой с запятой, в отличие от таких языков, как C или Java , где они завершаются точкой с запятой.
Ниже приведен пример полной программы SuperPascal, которая создает конвейерную структуру связи со 100 узлами. Главный узел отправляет целочисленный токен первому узлу, затем он передается по конвейеру и увеличивается на каждом этапе и, наконец, принимается главным узлом и распечатывается.
program pipeline;
const
len = 100;
type
channel = *(integer);
var
left, right: channel;
value: integer;
procedure node(i: integer; left, right: channel);
var value: integer;
begin
receive(left, value);
send(right, value+1)
end;
procedure create(left, right: channel);
type row = array [0..len] of channel;
var c: row; i: integer;
begin
c[0] := left;
c[len] := right;
for i := 1 to len-1 do
open(c[i]);
forall i := 1 to len do
node(i, c[i-1], c[i])
end;
begin
open(left, right);
parallel
send(left, 0) |
create(left, right) |
receive(right, value)
end;
writeln('The resulting value is ', value)
end.
Реализация [ править ]
Доступ к программному обеспечению SuperPascal можно получить бесплатно из архива Brinch Hansen. [9] Он состоит из компилятора и интерпретатора, которые написаны на обычном последовательном языке Паскаль (стандартный Паскаль ISO уровня 1). Это поддерживается компилятором GNU Pascal и более новыми версиями компилятора Free Pascal (2.7.1+) с -Miso
переключатель со следующими небольшими изменениями в коде.
Для GPC файл interpret.p
использует нестандартный clock
функция (строка 1786), которая используется для получения системного времени. Вместо этого расширенный Паскаль getTimeStamp
можно использовать функцию (которая поддерживается компилятором GNU Pascal), объявив переменную типа TimeStamp
, установив это с текущим временем, используя getTimeStamp
и назначение Second
поле TimeStamp
к переменной t
.
Free Pascal также нуждается в решении вышеуказанной проблемы с «часами» (в Windows просто объявите gettickcount как внешний с именем «clock»). Кроме того, сброс/перезапись, помеченные в исходном коде как нестандартные, должны быть изменены для назначения/сброса (или перезаписи) пар. (GPC, вероятно, выдает ошибку только в том случае, если вы включаете строгие флаги), а команды препроцессора C #include 'xx' необходимо изменить на {$include 'xx'}.
{ Time code for readtime in Freepascal on unix systems }
Function FpTime(var tloc : integer): integer; external name 'FPC_SYSC_TIME';
procedure readtime(
var t: integer);
begin
{ A nonstandard function reads
the processor time in ms }
t:=fptime(t);
end;
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б Хансен, Пер Бринч (1993), SuperPascal: язык публикации для параллельных научных вычислений
- ^ Уэлш, Джим (1980). Структурное системное программирование . Река Аппер-Сэддл, Нью-Джерси, США: Прентис-Холл. ISBN 0-13-854562-6 .
- ^ Теннент, Р.Д. (1981). Принципы языков программирования . Река Аппер-Сэддл, Нью-Джерси, США: Прентис-Холл. ISBN 0-13-709873-1 .
- ^ Хансен, Бринч (1977). Архитектура параллельных программ . Прентис-Холл. ISBN 978-0130446282 .
- ^ Хансен, Бринч (май 1993 г.), «Модельные программы для вычислительной науки: методология программирования для мультикомпьютеров», Concurrency: Practice and Experience , стр. 407–423.
- ^ Jump up to: Перейти обратно: а б Хансен, Бринч (1994). «Язык программирования СуперПаскаль». Программное обеспечение: практика и опыт . 24, 5 : 399–406.
- ^ Jump up to: Перейти обратно: а б Хансен, Бринч (1977). Изобретение параллельного программирования . Нью-Йорк: Springer Verlag. ISBN 0-387-95401-5 .
- ^ Хоар, ЦАР (1974). «Советы по проектированию языков программирования». Надежность компьютерной системы : 505–534.
- ^ Хайден, CC (11 июня 2008 г.). «Архив Пера Бринч-Хансена» . Проверено 3 марта 2020 г.
Внешние ссылки [ править ]
- Официальный сайт , Архив Бринч-Хансена, набор его статей и программное обеспечение SuperPascal, которое можно скачать в сжатом файле; содержит полную спецификацию языка и полезную документацию.
- superpascal на GitHub — модифицированная версия оригинальной реализации SuperPascal Кристофера Лонга; компилируется и работает под современным Free Pascal; выполнение программы происходит быстрее, чем в Perl 5 или 6, почти так же быстро, как в Python 3.