- •1.Системы программирования. Основные понятия и классификация.
- •2.Процесс компиляции. Основные понятия о процессе компиляции.(48)
- •3.Грамматики и классификация по Хомскому. Способы описания синтаксиса языков программирования.(стр43)
- •4.Лексический анализ. Основные понятия.(50)
- •5.Задачи синтаксического анализа. Основные понятия, канонические формы, используемые в синтаксическом анализе (Префиксная и постфиксная записи выражений.) (58)
- •6.Определение семантики языков на основе средств логического программирования. Определение базисных операторов на языке исчисления предикатов.
- •7.Теория взаимодействующих процессов. Основные принципы и определения.
- •8. Теория взаимодействующих процессов. Определения операций над следами.
- •9. Теория взаимодействующих процессов. Определение процесса.
- •10 Теория взаимодействующих процессов. Определение операций над процессами.
- •11. Параллельное программирование. Основные понятия на основе теории взаимодействующих процессов.
- •12. Основные принципы объектно-ориентированного программирования.
- •13. Порождения и их представления в виде синтаксических деревьев.
- •14. Способы представления процессов в теории взаимодействующих процессов (теоретико-множественное, процедурное, с помощью выражений над процессами).
- •15. Нисходящий синтаксический анализ.
- •16.Восходящий синтаксический анализ.
- •17.Этапы синтеза. Распределение памяти.
- •18. Принципы программирования на языке оссам.
12. Основные принципы объектно-ориентированного программирования.
Объектно-ориентированное программирование базируется на трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.
1. Инкапсуляция - это объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта (свойствами), а алгоритмы - объектными методами или просто методами.
Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения. Она существенно повышает надежность разрабатываемых программ, т.к. локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объемами данных, причем количество и тип этих данных обычно тщательно контролируются. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищенности программ в ООП почти не используются глобальные переменные).
Другим немаловажным следствием инкапсуляции является легкость обмена объектами, переноса их из одной программы в другую.
2. Наследование - есть свойство объектов порождать своих потомков. Объект-потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.
Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые "умеют" делать то, что не реализовано в родителе.
3. Полиморфизм - это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами. В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, то есть объявить в потомке одноименный метод и реализовать в нем нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
13. Порождения и их представления в виде синтаксических деревьев.
Введем несколько полезных определений , которые будут использо-ваны в дальнейшем.
Левое порождение определяется как порождение , на каждом шаге которого заменяется крайний левый нетерминал сентенциальной
формы.
Правое порождение определяется как порождение , на каждом шаге которого заменяется крайний правый нетерминал сентенциальной
формы.
Рассмотрим в качестве примера язык вида { x m y n |m, n > 0 } , определяемый следующими продукциями :
S -> XY
X -> xX
X -> x
Y - >yY
Y -> y
Строка xxxyy может быть сгенерирована одним из двух порождений :
1) S => XY => xXY => xxXY => xxxY => xxxyY => xxxyy
2) S => XY => XyY => Xyy => xXyy => xxX yy => xxxyy .
Первое порождение является левым , а второе - правым .
Порождение можно выразить по-другому - через синтаксическое дерево(дерево синтаксического разбора ). Например порождение S=>XY=>xXY=>xXyY=>xxXyY=>xxXyy=>xxxyy можно выразить следующим синтаксическим деревом :
S
X
Y
x X y Y
x X y
x
Рис. 3.1.1-1. Пример синтаксического дерева.
Грамматика называется однозначной, если каждое сгенерированное этой грамматикой предложение имеет единственное синтаксическое дерево. В противном случае грамматика называется неоднозначной. Многие компиляторы создаются на основе однозначных грамматик, однако при разработке компиляторов в ряде случаев возникают неоднозначные грамматики, для которых, однако чаще всего находятся методы устранения неоднозначности. Неоднозначные языки, для которых не существует однозначной грамматики, обычно не используются в языках программирования.
