comms
-------------------> |y y * y | -> chan2
Программа , адекватная приведенной выше схеме , будет иметь вид :
CHAN comms
PAR
VAR x:
WHILE x>0
SEQ
chan1 ? x
comms ! x*x
VAR y:
WHILE y>0
SEQ
comms ?y
chan2 ! y*y
Данная программная конструкция определяет два взаимодействующих параллельных процесса с результатом вычисления x4 , который выводится в канал chan2 . Взаимодействие параллельных процессов
осуществляется через общий канал comms . Содержательная сущность представленного выше параллельного выполнения процессов сводится
к тому , что вычисление y2 = ( x2 ) 2 может выполняться одновременно
с вычислением квадрата последующего введенного значения
переменной x .
Приведенную выше программу можно написать короче , если определим следующую процедуру :
PROC square (CHAN source, sink) =
VAR x:
WHILE x>0
SEQ
source ? x
sink ! x*x
Таким образом , на основе определенной выше процедуры , перепишем программу следующим образом :
CHAN comms
PAR
square (chan1 , comms)
square (comms , chan2)
Приведем другой пример , иллюстрирующий операцию альтернативной композиции процессов . В качестве примера рассмотрим
программу моделирования работы цифрового радиоприемника , точнее
часть программы , управляющей громкостью звучания. Для управления
звуком мы имеем две клавиши louder и softer , нажимая которые мы либо увеличиваем громкость звучания (louder) , либо уменьшаем (softer) .При
программировании будем представлять эти клавиши в виде каналов.
Кроме каналов louder и softer введем канал amplifier , который будет определять усилитель. Наконец , введем переменную volume , целочисленное значение которой будет определять громкость звучания .
Передача значения переменной volume на усилитель amplifier будет выполняться оператором amplifier ! volume .
Таким образом процесс
SEQ
volume:=volume +1
amplifier ! volume
моделирует увеличение громкости , а процесс
SEQ
volume:=volume -1
amplifier ! volume
моделирует уменьшение громкости .
Далее , нажатие клавиши louder будет активизировать выполнение
оператора louder ? ANY , а нажатие клавиши softer будет активизировать выполнение оператора softer ? ANY. Значение переменной ANY здесь не играет никакой роли , для нас является важным только сам факт выполнения события ввода ( louder ? ANY или softer ? ANY ) . Таким
образом мы получаем следующую альтернативную операцию :
(louder ? ANY -> LPROC) | (softer ? ANY ->SPROC ) ,
где процесс LPROC моделирует увеличение громкости , а процесс SPROC моделирует уменьшение громкости . То есть при выполнении события louder ? ANY запускается процесс LPROC , а при выполнении события softer ? ANY запускается процесс SPROC . На языке OCCAM
имеем :
ALT
louder ? ANY
LPROC
softer ? ANY
SPROC
На основе вышеперечисленного представим следующую программу
на языке OCCAM :
VAR volume:
SEQ
volume:=0
WHILE true
ALT
louder ? ANY
SEQ
volume:=volume +1
amplifier ! volume
softer ? ANY
SEQ
volume:=volume -1
amplifier ! volume
Конструкция WHILE true определяет " бесконечный цикл " до выключения цифрового радиоприемника .
В приведенной выше программе не определены верхняя и нижняя границы громкости звучания . Для учета этих границ программу можно переписать следующим образом :
DEF max=10, min=2
VAR volume:
SEQ
volume:=0
WHILE true
ALT
( volume<max ) & ( louder ? ANY )
SEQ
volume:=volume +1
amplifier ! volume
( volume>min ) & (softer ? ANY)
SEQ
volume:=volume -1
amplifier ! volume
В настоящее время используется достаточно большое количество языков параллельного программирования . Это - диалекты и расширения известных языков ( например CC++ , C/C+ , PARSEC и т.д.) , а также
языки , специально созданные для параллельных вычислений
( ADA , Concurrent Clean ,MODULA 3 и другие) . Язык OCCAM отличается от всех этих перечисленных языков своей оригинальностью , простотой
и , наконец , тем , что он явно базируется на специально созданной для целей параллельного программирования теории .
2.6. Объектно-ориентированное программирование.
2.6.1.Основные определения и принципы.
При объектно-ориентированном подходе в качестве основного строительного блока в процессе программирования выступает объект , принадлежащий определенному классу ( являющийся экземпляром определенного класса ) . Идея объектно-ориентированного подхода появилась при проведении исследований в области языков
программирования , а впервые была реализована при создании языка моделирования SIMULA , в котором впервые появилось и было использовано в программировании понятие класса объектов. Дальнейшее развитие объектно-ориентированного подхода , вызвавшее достаточно широкий интерес к этому способу программирования , связывают с появлением языка SMALLTALK . Следует отметить важную особенность большинства объектно-ориентированных систем программирования , которые , наряду с объектно - ориентированными средствами , предоставляют программистам возможность процедурно-
ориентированного программирования , позволяя гибко сочетать разные подходы в процессе разработки программ. Здесь мы ограничимся рассмотрением только основных принципов объектно- ориентированного программирования . Более полное и детальное описание объектно-
- ориентированного подхода можно найти в книге [ 3 ] .
Определим ряд основополагающих понятий объектно-ориентированного подхода к проектированию и реализации программного обеспечения .
Объектно-ориентированное проектирование - это методология проектирования , основанная на объектной декомпозиции и приемах представления логической , физической ,статической и динамической моделей проектируемого программного обеспечения . При процедурно - - ориентированном походе проектирование основывается на
алгоритмической ( процедурной ) декомпозиции , которая предусматривает представление некоторого программного модуля P в виде
P = W ( P1 ,P2 ,…,Pn ) ,
где W - функция , реализуемая в соответствующей среде программирования , а P1 ,P2 ,…,Pn - модули , из которых строится модуль P . Объектная декомпозиция предполагает , что в качестве элементов P , P1 ,P2 ,…,Pn вместо программных модулей фигурируют объекты .
Объектно-ориентированное программирование - это методология программирования , основанная на представлении программ в виде совокупности объектов , каждый из которых является экземпляром
определенного класса с наследованием свойств этого класса. Поскольку
во многих современных объектно-ориентированных системах
программирования каждый класс может представляться в качестве экземпляра более абстрактного класса , то в этих случаях классы образуют иерархию наследования . Содержательно класс можно рассматривать как некий абстрактный объект , наделяемый свойствами , характерными для некоторого множества объектов . В последнее время появилось достаточно много различных объектно-ориентированных систем про-граммирования , среди которых нибольшую популярность приобрели C++ , DELPHI , JAVA , UML . Особое место отводится объектно-ориентированным системам управления базами данных
( СУБД ) . В отличие от других систем программирования , СУБД представляют эффективные средства для обработки больших информационных структур . По мнению многих разработчиков программного обеспечения именно появление и дальнейшая модификация СУБД спровоцировало широкое внедрение объектно -
- ориентированного подхода . Примерами объектно-ориентированных СУБД , получивших широкое распространение , являются CACHE , VisualFoxpro , MS SQL , JASMINE , ORACLE . С другой стороны
многие современные системы программирования (например такие ,
как C++ ) , изначально не рассматриваемые в качестве СУБД , снабжа-ются в настоящее время дополнительными средствами обработки баз данных .
Методы - это процедуры и функции , реализующие операции над классами и объектами в объектно-ориентированном программировании .
Основными принципами объектно - ориентированного
программирования являются наследование , инкапсуляция и полиморфизм .
Принцип наследования заключается в передаче свойств от класса к экземпляру этого класса , который может представлять либо просто
объект или в свою очередь класс. Таким образом наследование тесно связано с иерархией классов , определяющей родительские и дочерние классы ( объекты ) . Если некоторый класс обладает некоторым фиксированным набором свойств , то экземпляр этого класса содержит тот же набор свойств и , возможно , дополнительные новые свойства , характерные для соответствующего экземпляра. Ниже следует пример
иерархической вложенности классов :
класс "Компьютер" -> класс "Персональный компьютер"->
класс " Персональный компьютер типа Pentium 4" ->
объект " конкретный персональный компьютер типа Pentium 4
№51175-028-9713636-11440 "
Инкапсуляция - это сокрытие деталей реализации классов и объектов. Можно также рассматривать инкапсуляцию как процесс отделения интерфейса от методов реализации . Если вернуться к примеру
с классом "Компьютер" , то можно проиллюстрировать инкапсуляцию следующим образом .Основным субъектом , взаимодействующим с этим классом , является пользователь , которому нет необходимости в совершенстве знать внутреннее устройство компьютера . Этот принцип
позволяет эффективно модифицировать объектно-ориентированные программы , .
Полиморфизм представляет свойство , позволяющее по разному интер-претировать выполняемые одноименные методы в зависимости от того , какому из классов относится тот или иной метод . Например , операция "выключить" по разному выполняется по отношению к таким различным объектам , как электрический свет , компьютер и автомобиль.
К другим принципам , которые , как правило , присущи большинству
современных объектно-ориентированных систем относятся следующие .