- •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
Мир алгоритмики и сложен и богат, он алгеброй и логикой поверен. И стать в нем маршалом ты завтра будешь рад, Но нынче будь ему солдатом верным!
Г. Е. Цейтлин. Введение в алгоритмику
Розділ 1. Базові концепції інформатики та програмування
Лекція 1.
Вступ
1.1. Інформатика
За визначенням А.П.Єршова, інформатика - це наука про методи представлення, накопичення, передачі і обробки інформації за допомогою електронно-обчислювальних машин (ЕОМ). Що таке інформація?
Незважаючи на те, що поняття інформації є наріжним каменем всієї науки про обчислювальну техніку, на це питання не може бути дано однозначної відповіді. У цьому значенні поняття "інформація" в інформатиці схоже з поняттям "точка", "пряма" і "площина" в геометрії - все це невизначені терміни, про які можуть бути зроблені деякі твердження і висновки, але які не можуть бути пояснені в термінах більш елементарних понять. Вважається, що інформація - це поняття, що передбачає наявність матеріального носія інформації, джерела і передавача інформації, приймача і каналу зв'язку між джерелом і приймачем інформації.
Наука інформатика знаходиться зараз на етапі свого становлення, її зміст і методи формуються у нас на очах. Однак вже зараз можна виділити ядро, назвемо його загальною інформатикою, куди віднесемо питання постановки задач, їх алгоритмізації і програмування.
Основними в загальній інформатиці будуть три поняття: задача, алгоритм, програма. Відповідно, маємо три етапи в розв’язуванні задач (помітимо, що з точки зору інформатики розв’язати задачу - це отримати програму, тобто по суті забезпечити можливість рішення з допомогою ЕОМ): постановка задачі, побудова і обгрунтування алгоритму, складання і налагодження програми.
Оскільки програма - об'єкт гранично формальний, а тому точний, (можливо не завжди прозорий, навантажений неістотними із змістовної точки зору деталями, але недвозначний) то пов'язані з нею об'єкти також повинні бути точними. Алгоритм містить чіткий і ясний спосіб побудови результатів за точно вказаній в постановці задачі залежності їх від наявних аргументів.
Відповідно етапам маємо три групи засобів інформатики: специфікація, алгоритмізація і програмування.
Для специфікації задач в курсі застосовані засоби типу рекурентних співвідношень, рекурсивних визначень, а також прості інваріантні співвідношення, початкові і кінцеві умови.
Побудова алгоритму за точною постановкою задачі дає можливість його обгрунтування математичними методами. Більш того, існують класи задач, які дозволяють формальне перетворення специфікації в алгоритм. Вивченню деяких таких класів і відповідних методів відводиться важливе місце в нашому курсі.
Істотно, що порівняно з програмою алгоритм може знаходитися на більш високому рівні абстракції, бути вільним від тих або інших деталей реалізації, пов'язаних з особливостями мови програмування та конкретної обчислювальної системи.
Засоби, прийняті для зображення алгоритмів, по традиції називають алгоритмічною мовою. Між іншим, так називалися також перші мови програмування високого рівня, наприклад, Алгол - це просто скорочення ALGOrithmic Language - алгоритмічна мова. Але, взагалі кажучи, жодна мова програмування не може цілком замінити алгоритмічну мову, оскільки консервативна по своїй суті.
Стабільність - одна з необхідних компонент якості мови програмування. Повинні бути гарантії, що всі програми, складені учора, в минулому році, десять років тому, не втратять значення ні сьогодні, ні завтра. Модифікація мови програмування призводить до небажаних наслідків: вимагає переробки системи програмування, знецінює напрацьоване програмне забезпечення. У той же час алгоритмічна мова може створюватися спеціально для певної предметної області, певного класу задач або навіть окремої задачі. Вона може розвиватися навіть при створенні алгоритму, вбираючи в себе новітні результати.
Алгоритм - точне формальне розпорядження, яке однозначно визначає зміст і послідовність операцій, що переводять задану сукупність початкових даних в шуканий результат або можна також сказати, що алгоритм - це скінчена послідовність загальнозрозумілих розпоряджень, формальне виконання яких дозволяє за кінцевий час отримати рішення деякої задачі або будь-якої задачі з деякого класу задач.
1.2. Алгоритм
Слово алгоритм походить від algorithmi - латинської форми написання імені великого математика IX ст. Аль-Хорезмі, який сформулював правила виконання арифметичних дій.
Розглянемо, наприклад, відому задачу про людину з човном (Л), вовком (В), козою (Кз) і капустою (Кп). Алгоритм її розв’язку можна представити таким чином:
початковий стан, { Л, В, Кз, Кп -> }
- 1-ий крок, пливуть Л, Кз, Кп { В -> Л, Кз, Кп }
- 2-ий крок, пливуть Л, Кз { В, Л, Кз <- Кп }
- 3-ій крок, пливуть Л, В { Кз -> Л, В, Кп }
-4-ий крок пливуть Л { Л, Кз <- В, Кп }
- кінцевий стан пливуть Л, Кз { -> Д, В, Кз, Кп }.
Таким чином, алгоритм - це абстрактний математичний об'єкт, тому він вимагає абстрактного виконавця. Визначення цього виконавця по суті дає операційну семантику алгоритмічної мови. Модифікація алгоритмічної мови, очевидно, вимагає відповідної зміни іншого математичного об'єкта - виконавця.
Виконавцем ми будемо називати пристрій, здатний виконувати дії із заданого набору дій. Команду на виконання окремої дії звичайно називають оператором або інструкцією. Приклади виконавців: пральна машина, телефон, мікрокалькулятор, магнітофон, комп'ютер тощо. Приклади інструкцій: перемотати плівку, встановити з'єднання із заданим номером, виконати прання бавовняної білизни, зіграти партію у реверсі і т.д.
Відмітимо особливості виконавців.
По-перше, людина далеко не єдиний виконавець алгоритмів.
По-друге, будь-який виконавець складається з пристрою управління і "робочого інструмента".
По-третє, кожний виконавець алгоритмів володіє обмеженим набором допустимих дій (описати виконавця - значить указати його допустимі дії). Кожний виконавець може розуміти і виконувати якесь порівняно невелике число різних елементарних команд. З цих команд складаються алгоритми. З цього невеликого числа команд можна скласти невелику учбову програму, а можна і складну програму з тисяч команд.
По-четверте, для рішення одних і тих же задач виконавці з більш "бідним" набором допустимих дій вимагають більш складних і докладних алгоритмів. По-п'яте, різні класи задач вимагають різних наборів допустимих дій, різних виконавців.
Розглянемо приклади найпростіших виконавців.
Виконавець "Обчислювач". Він вміє: множити число на 2 (*2); збільшувати число на 1 (+1). Потрібно скласти алгоритм отримання числа 100 з одиниці. Скільки дій в самому короткому з таких алгоритмів?
Розглянемо більш просту задачу отримання з одиниці числа 4. Для її рішення можна використати алгоритм вигляду 1 (+1) (+1) (+1) або +1 (*2) (*2). Очевидно, що другий алгоритм більш короткий. Повернемося до нашої задачі. Для отримання найкоротшого алгоритму перетворюємо число 100 у 1 використовуючи ділення на 2 і віднімання 1. Маємо
100 -> 50 -> 25 -> 24 -> 12 -> 6 -> 3 -> 2 -> 1.
Отже, для нашого виконавця алгоритм 1 (*2) (+1) (*2) (*2) (*2) (+1) (*2) (*2) буде найбільш коротким і містить 8 дій.
І нарешті складання програми для ЕОМ - це заключний етап рішення задачі.
Як влучно помітив А.П.Єршов, "програміст повинен володіти здатністю першокласного математика до абстракції і логічного мислення в поєднанні з едісонівським талантом до створення чого-небудь з нуля і одиниці" (А.П.Єршов "Людський чинник у програмуванні").
Якщо алгоритмічну мову вибирають, виходячи з власних бажань, то вибір мови програмування можуть диктувати певна реальність: замовник, комп'ютер, попередній досвід. Основною, навчальною мовою програмування вважається мова Паскаль, названа в пошану великого французького вченого, який першим в світі у 1642 році виготував автоматичний пристрій для додавання чисел. Мова Паскаль була створена у 1969 році Ніклаусом Віртом в Швейцарському технічному інституті у Цюріху спеціально для вивчення програмування. Сьогодні існує декілька варіантів мови Паскаль.
