Парадигмы | Императивный , структурированный , параллельный |
---|---|
Семья | Вирт Паскаль |
Разработано | Пер Бринч Хансен |
Впервые появился | Апрель 1974 г . |
Печатная дисциплина | Статичный и динамичный , прочный , безопасный |
Платформа | DEC PDP 11 |
Под влиянием | |
АЛГОЛ 60 , Simula 67, Паскаль |
Concurrent Pascal - это язык программирования, разработанный Пером Бринчем Хансеном для написания программ параллельных вычислений , таких как операционные системы и системы мониторинга вычислений в реальном времени на компьютерах с общей памятью . [1]
Отдельный язык, Sequential Pascal , используется в качестве языка для прикладных программ, выполняемых операционными системами, написанными на Concurrent Pascal. Оба языка являются расширениями Никлаус Вирт «s Паскаля , и имеет общий резьбовой код интерпретатор . [2] Ниже описывается, чем Параллельный Паскаль отличается от Паскаля Вирта.
Описание языка [ править ]
Несколько конструкций в Pascal были удалены из Concurrent Pascal для простоты и безопасности: [2]
- Варианты записей
- Оператор Goto и метки
- Процедуры как параметры
- Упакованные массивы
- Типы указателей
- Типы файлов и соответствующие стандартные процедуры ввода / вывода
Эти упущения позволяют гарантировать за счет комбинации проверок времени компиляции и минимальных проверок времени выполнения в интерпретаторе многопоточного кода, что программа не может нанести вред себе или другой программе, обращаясь за пределами выделенного ей пространства.
Параллельный Паскаль включает типы данных класса, монитора и процесса. Экземпляры этих типов объявляются как переменные и инициализируются в init
операторе.
Классы и мониторы похожи: как частные переменные, так и процедуры в пакете с общедоступными процедурами (называемые записями процедур). Экземпляр класса может использоваться только одним процессом, тогда как экземпляр монитора может совместно использоваться процессами. Мониторы предоставляют единственный механизм межпроцессного взаимодействия в программе Concurrent Pascal.
В данном экземпляре монитора одновременно может выполняться только один процесс. Встроенный тип данных, очередь, вместе с операциями delay
и continue
используются для планирования в мониторах. Каждая переменная типа queue может содержать один процесс. Если в мониторе должно быть отложено много процессов, необходимо предоставить несколько переменных очереди, обычно организованных в виде массива. Переменная одиночной очереди процесса дает монитору полный контроль над среднесрочным планированием, но программист несет ответственность за разблокировку правильного процесса.
У процесса, такого как класс или монитор, есть локальные переменные, процедуры и начальный оператор, но нет записей процедур. Начальный оператор обычно выполняется бесконечно, вызывая локальные процедуры, процедуры класса и процедуры мониторинга. Процессы общаются через процедуры мониторинга. Языковые правила предотвращают тупик, налагая на мониторы иерархию. Но ничто не может помешать монитору ошибочно забыть разблокировать отложенный процесс (не вызвав continue), так что система по-прежнему может эффективно зависать из-за ошибок программирования.
Конфигурация процессов, мониторов и классов в программе Concurrent Pascal обычно устанавливается в начале выполнения и после этого не изменяется. Пути связи между этими компонентами устанавливаются переменными, переданными в init
операторах, поскольку переменные экземпляра класса и монитора не могут использоваться в качестве параметров процедуры.
Пример [ править ]
В следующем примере показано объявление простого монитора и его использование двумя взаимодействующими процессами.
type «Монитор ограниченного буфера» buffer = Монитор сохранен var : Integer ; "сохраненный элемент является целым числом" fullq , emptyq : Queue ; «используется только двумя процессами» full : Boolean ; "истина, если элемент сохранен:" «Оферта элемент в буфере» Процедура вход путы ( элемент : Целое число ); начать, если заполнено, затем задержка ( fullq ); "блокировать при заполнении" сохранено : = item ; "сохранить элемент" полный : = true ; «пометить как заполненный» continue ( emptyq ) «разблокировать потребителя» end ; Запись процедуры «Получает элемент из буфера» get ( var item : Integer ); начать, если не полный, то задержка ( emptyq ); элемент "блокировать, если пуст" : = сохранено ; "получить товар" полный : = false ; «пометить как неполный» продолжить ( fullq ) «разблокировать производителя» конец ; «Инициализировать монитор» begin full : = false end ; «Производитель использует буфер» производитель = процесс ( проход : Буфер ); var item : Integer ; begin cycle "выполнять в цикле навсегда" "производить элемент" проход . put ( item ) "передать элемент на монитор" end end ; «Потребитель использует буфер» consumer = process ( pass : Buffer ); var item : Integer ; начать цикл прохода . получить ( элемент ); "получить предмет с монитора" "потребить предмет" end end ;«объявить экземпляры монитора, производителя и потребителя» «предоставить производителю и потребителю доступ к монитору» var pass : Buffer ; prod : Продюсер ; минусы : Потребительский ; начать инициализации пройти , «инициализировать монитор» лезвие ( пропуск ), «начать процесс производителя» минусы ( передача ) «начать процесс потребительского» конец .
Ссылки [ править ]
- ^ Бринч Хансен, Per (июнь 1975). «Язык программирования Concurrent Pascal» (PDF) . IEEE Transactions по разработке программного обеспечения (2): 199–207. DOI : 10.1109 / tse.1975.6312840 .
- ^ a b Бринч Хансен, Пер (1977). Архитектура параллельных программ . Прентис Холл. ISBN 978-0-13-044628-2.