- •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
Денотаційна семантика.
Нехай задані
область даних D, де визначені операції сигнатури Ω і елементарні предикати сигнатури П;
множина імен R.
Множину всіх
відображень В з множини R в
область даних В позначимо через
B=
і
будемо називати множиною станів
пам’яті або інформаційним середовищем.
З даною програмою
Р зв’яжемо часткову функцію
:
В → B, яка
повинна обчислюватись цією програмою.
Значення функції
(b)
на стані пам’яті b
Є В будемо позначати через
(b).
Визначимо:
а) семантику виразів: : : В → D, де у - вираз;
б) семантику імен
виразів: :
:
В → R, де х -
змінна;
в) семантику умов: :
:
В → {0,1}, де и
- умова.
Виходячи з цього означення і абстрактного синтаксису, денотаційну семантику процедурних програм можна визначити так:
P = (x := y)
(b)(r)
=
(b,r)
= (if(
(b)
= r,
P = (
))
(b)
=
(
;P = if(u,
(b)
= (if(
);P = while(u,Q) (b) =
(b)),
де
n -
найменше натуральне число такe, що для
всіх 0 ≤ т < n
мають місце умови
Більш
лаконічно цe можна записати у вигляді
рекурсивного означення:
(b)
= if(
= 0, b,
).
Операційна семантика
Операційну семантику можна описати як транзиційну систему, тобто як множину станів обчислень і відношення переходів між цими станами.
Пару (Р,b), де Р - програма, a b - стан пам’яті, називатимемо станом обчислень. Серед станів обчислень виділимо стан (succ, b) для фіксації успішного завершення обчислень програмою, тобто стан (succ,b) є заключним станом обчислень.
Бінарне відношення переходів → на станах обчислень позначається через (P, b) → (Р', b') і знаходиться за такими правилами:
а)
(x
:=y,b)
→(succ,
);
;
в)
,
де
г)
;
д)
;
e)
;
є)
.
Таким чином, в результаті розгляду операційної семантики приходимо до поняття історії обчислень, як послідовності станів обчислень
(P,b)
(
)
(
)
…
Ця історія може бути як скінченна, так і нескінченна. Якщо історія скінченна, то її останнім етапом є стан (sucс, b), а стан пам’яті b Є В називається результатом виконання програми Р.
Нехай відношення
*
означає рефлексивно-транзитивне
замикання відношення переходів
,
тобто s
*
s' ⇔
1)s = s'
або 2)s
s' або
3)s
s"
*
s'.
При цьому кожний стан обчислень породжує єдину історію обчислень.
Тепер виникає питання, як пов’язані між собою денотаційна і операційна семантики? Відповідь на це питання дає таке твердження.
Теорема 3.1.
(b)
= b' ⇔
(P,b)
*
(succ, b').
Доведення виконується
методом математичної індукції з розглядом
можливих варіантів обчислення функції
(b)
(пункти 1) - 4)) і відношення
*
(пункти а) - g)).
Розглянемо приклад процедурної програми.
Програма обчислення найбільшого спільного дільника двох натуральних чисел (НСД).
Процедурна програма, як і функціональна, алгебраїчна і логічна програми обчислення НСД(х, у), де х, у - цілі натуральні числа, ґрунтується па таких властивостях цієї функції.
НСД(х,х) = х;
х>у ⇒НСД(х, у) =НСД(х -у,у);
х < у ⇒ НСД(х, у) =НСД(х, у - х).
Імперативна програма має такий вигляд:
НСД(х ,у).
Вхід: х, у Є N.
Вихід: d Є N.
begin
а := х;
b := у;
while а ≠ b do
if а > b then а := а - b else b := b - a; fi;
od;
d := а;
end
