- •1.2. Алгоритм
- •1.3. Предмет науки програмування
- •1.4. Застосування мов програмування
- •1.5. Стандартизація мов програмування
- •1.6. Середовище розробки
- •1.7. Тестування і верифікація програм
- •Лекція 2. Алгоритми і обчислення
- •2.1. Алгоритми
- •2.2. Обчислювальні машини
- •2.3. Основи фон-нейманівської архітектури
- •Лекція 3. Парадигми програмування
- •3.1. Базові парадигми програмування
- •Процедурне програмування
- •Абстрактна семантика процедурних програм.
- •Денотаційна семантика.
- •Операційна семантика
- •Структурність і модульність
- •3. 3. Модульне програмування
- •3.4. Об’єктно-орієнтовне програмування
- •3.5. Функціональне програмування
- •3.6. Логічне програмування
- •3.6. Алгебраїчна парадигма
- •Висновок
- •Лекція 4. Огляд основних мов програмування
- •4.1. Мова Picmkalkul Конрада Цузе
- •4.1.1. Історичні передумови
- •4.1.2. Огляд мови
- •4.2. Мінімальне програмування на апаратному рівні: псевдокоди
- •4.2.1. Мова Short Code
- •4.2.2. Система Speedcoding
- •4.2.3. Система "компіляції" univac
- •4.2.4. Суміжна робота
- •4.3. Комп'ютер ibm 704 і мова fortran
- •4.3.1. Історична ретроспектива
- •4.3.2. Процес розробки
- •4.3.3. Огляд мови fortran I
- •4.3.4. Огляд мови fortran II
- •4.3.5. Мови fortran IV, fortran 77 і fortran 90
- •4.4. Функціональне програмування: мова lisp
- •4.4.1. Витоки робіт в області штучного інтелекту та обробка списків
- •4.4.2. Процес розробки мови lisp
- •4.4.3. Огляд мови
- •4.4.5. Два нащадки мови lisp
- •4.4.6. Споріднені мови
- •4.5. Перший крок до удосконалення: мова algol 60
- •4.5.1. Історична ретроспектива
- •4.5.2. Початкова стадія розробки
- •4.5.3. Огляд мови algol 58
- •4.5.4. Прийняття звіту про мову algol 58
- •4.5.5. Процес розробки мови algol 60
- •4.5.6. Огляд мови algol 60
- •4.5.7. Оцінка мови algol 60
- •Лекція 5. Трансляція і формальні граматики
- •5.1. Транслятори
- •5.2. Процес трансляції
- •5.3. Формальні граматики. Нбф-граматика
- •Лекція 6. Java - мова ооп
- •6.2. Основні властивості програм і перші приклади
- •6.3. Арифметичні і побітові оператори мови Java
Процедурне програмування
Процедурне програмування подає програму у вигляді набору алгоритмів, для оформлення яких можуть застосовуватися іменовані програмні блоки — процедури і функції. В останньому випадку передбачається наявність механізмів передачі параметрів і поверненні результату.
Для представлення даних використовуються стани пам’яті. Змінні або імена можуть бути типізованими або ніі, а їх значення беруться з областей даних, які визначаються як абстрактні або конкретні типи.
Алгоритми в процедурних мовах програмування представляються як композиції операторів присвоювання, що змінюють стани пам’яті. В процесі розвитку процедурної парадигми ще в 60-70-х роках з’ясувалось, що всі різновиди композицій зрештою зводяться до чотирьох основних: присвоювання, послідовної композиції, умовного оператора та умовного циклу. Це призвело до відкриття Глушковим В. М. алгебри алгоритмів, яка лягла в основу структурного програмування. Кожна процедурна програма визначає деяке часткове перетворення на множині станів пам’яті.
Стратегія виконання цього перетворення (операційна семантика) являє собою послідовність кроків, кожний з яких перевіряє умову і реалізує оператор присвоювання. Ця стратегія визначається структурою програми майже однозначно.
Розглянемо коротко семантичні проблеми для процедурних (імперативних) програм.
Абстрактна семантика процедурних програм.
Кожну програму Р можна розглядати як слово в деякій мові програмування, побудоване за правилами синтаксису цієї мови. Якщо задана інтерпретація (значення) змінних програми Р, то можна говорити про семантику (сенс) даної програми.
Побудова синтаксису мови програмування і синтаксично правильного слова (програми Р) в цій мові на сьогодні не складає великої проблеми. А от побудова семантично правильної програми - це одна з основних (якщо не основна) проблема при проектуванні програмної системи. Складність цієї проблеми полягає в тому, що обґрунтування семантики тієї чи іншої мови програмування - це, як правило, вимагає розв’язання не однієї, а декількох складних математичних задач, в зв’язку з можливими інтеграціями парадигм. Дослідження самих парадигм програмування і їх об’єктів дає можливість описати для деяких з них абстрактну семантику, тобто описати семантику незалежно від конкретної мови програмування.
Як зазначалося вище, при розгляді процедурної парадигми, будь-яку процедурну програму можна розглядати як структурну, побудова якої (без викликів підпрограм і процедур-функцій) зводиться до композиції таких чотирьох об’єктів:
(х := у) - присвоювання,
(Р; Q) - послідовна композиція,
if(u, Р, Q) - умовна композиція,
while(u, Р) - умовний цикл або ітерація.
Виходячи з цього, абстрактний синтаксис процедурної програми можна записати в нормальній формі Бекуса так:
< program >::=< operational-expression >;
< operational-expression > ::= < operator > | < operational-expression >;
< operator > ::= < assign > | < sequentional-composition > |
< conditional-composition > | < iteration >;
< assign > ::= < variable > := < expression >;
< variable > ::= < element-from-setvariables R >;
< expression > ::= < term-of-algebra TD(R) >;
< sequential-composition > ::= (< operator >; < operational-expression >);
< conditional-composition > ::= if(< condition >,< operational-expression >,
< operational-expression >);
< iteration > ::= while(< condition >, < operational-expression >);
<
condition > ::= < propositional-boolean-function-on
(R)
>.
Вираз (R) означає алгебру термів над алфавітом змінних R, які приймають свої значення в множині D.
Семантика програм, незалежно від їх парадигм, має два різновиди: денотаційна семантика і операційна семантика. Як ми вже зазначали цей поділ ґрунтується на тому, що при виконанні будь-якої програми необхідно вміти відповідати на такі два питання:
а) що обчислювати? і б) як обчислювати?
Відповідь на перше питання повинна давати денотаційна семантика, а відповідь на друге - операційна.
