Методами математичного аналізу можна довести, що значення y може бути зроблено як завгодно близьким до 
1.14. Абстракція даних
Приклади Виконавців, розглянуті вище, використовують абстрактні представлення про предметні області, над якими визначаються алгоритми. Вони показують, що поняття Виконавця є однією з основних абстракцій, використовуваних для опису алгоритмів. Саме система команд Виконавця і є уточненням набору засобів, за допомогою яких будуються алгоритми. У наших прикладах системи команд Виконавця предметно-орієнтовані. Так, у прикладі 1.1 Виконавець має справу з цілочисельною арифметикою, а в задачі 1.4 – з арифметикою дійсних чисел. Особливо наочно це демонструє Виконавець приклада 1.2, команди якого виконують геометричні побудови.
Розроблювач конкретного прикладного алгоритму (програміст) або проектує його в термінах раніше визначеного набору команд Виконавця, або попередньо описує (проектує) систему команд Виконавця, створюючи тим самим понятійний апарат і інструментарій предметної області Виконавця, а потім використовує його в описі прикладного алгоритму.
Проблема проектування набору команд Виконавця як опису властивостей і методів відповідної предметної області відіграє центральну роль у теорії і практиці алгоритмізації. Саме їй присвячені практично всі наукові дослідження і навчальні курси з програмування.
Сукупності даних, які оброблює алгоритм, прийнято називати структурами даних (Виконавця). Структури даних (способи опису упорядкованих даних) впливають на ефективність алгоритму, а також на простоту його розуміння і програмної реалізації. Структури даних є головними будівельними блоками, з яких формуються алгоритми. Алгоритмічні структури даних повинні, з одного боку, адекватно описувати ту предметну область, над якою визначається Виконавець, з іншого боку – ефективно відображатися в універсальні структури даних (наприклад, у структуру комп'ютерної пам'яті). Ці в якомусь ступені суперечливі вимоги приводять до наступного, більш формального розуміння терміна «структура даних».
Структура даних складається з трьох основних компонентів:
· Набір предметно-орієнтованих операцій для обробки специфічних типів абстрактних об'єктів описуваної предметної області.
· Структура пам'яті, у якій зберігаються дані, що описують абстрактні об'єкти.
· Інтерпретація (реалізація) кожної з операцій у термінах структури пам'яті.
Перший компонент визначення – набір операцій над абстрактними об'єктами – називається абстрактним типом даних (АТД). Другий і третій компоненти разом утворюють реалізацію структури даних.
АТД визначає, що робить структура даних – які операції вона підтримує, не розкриваючи, як вони виконуються.
Приклад 1.7. АТД Планіметрія (виконавець Геометр)
Примітивні типи об'єктів: точка, пряма, коло.
Примітивні операції:
Пряма: (точка, точка) à пряма
l = Пряма(A, B) визначає пряму l, що проходить через точки A, B
Коло:(точка, точка) à коло
o = Коло(A, B)визначає колооз центром у точціА,що проходить черезточкуВ.
Коло:(точка, точка, точка) à коло
o = Коло(A, B, C)визначає колооз центром у т.А,побудоване розчином циркуля з ніжками, встановленими у B, C.
Точка(пряма, пряма) à точка
A = Точка(l, m) визначає точку А перетину прямих l і m
ПеретинКіл(коло, коло) à (точка, точка)
ПеретинКіл(o, p, A, B)визначає точки A, B перетину кіл o і p.
ПеретинПрямаКоло(пряма, коло) à (точка, точка)
ПеретинПрямаКоло (l, o, A, B)визначає точки A, B перетину прямої l і кола o.
З примітивних типів об'єктів АТД Планіметрія можна тепер будувати складені (похідні) типи. Наприклад тип трикутник можна визначити як трійку точок (вершин)
Трикутник = (точка, точка, точка)
З примітивних (основних) операцій АТД можна визначати похідні операції. Наприклад, операція
ParallelLine: (точка, пряма) à пряма,
результатом якої є пряма, що проходить через дану точку і паралельна даній прямій, може бути визначена через примітивні операції і використана потім в алгоритмах рішення задач на побудови. Відзначимо, що реалізацію (інтерпретацію) АТД можна здійснювати окремо, використовуючи структури даних, орієнтовані на структуру пам'яті комп'ютера.
Використання АТД приводить до застосування модульного підходу до алгоритмізації (програмування), тобто до практики розбивки алгоритму на окремі модулі (бібліотеки) з добре відпрацьованим інтерфейсом.
1.15. Структурне програмування
Опис алгоритмів у термінах структур даних і структур управління називають структурним програмуванням. Особливу роль у структурному програмуванні грають процедури і функції – основні семантичні одиниці проектованого алгоритму, які містять описи окремих підзадач, що мають самостійне значення. Процедури містять описи інтерпретацій (реалізацій) АТД. Тому структурний підхід називають також процедурним програмуванням.
Програмування управління здійснюється комбінуванням основних структур управління. Наприклад, комбінування розгалуження і повторення приводить до блок-схеми
В реальних мовах структурного програмування застосовують і інші управляючі структури, кожну з яких можна віднести до одного з трьох основних типів. Наприклад, у мові Pascal оператори вибору – умовний оператор, короткий умовний оператор, оператор варіанту; оператори повторення – оператор циклу з параметром, оператор циклу з передумовою, оператор циклу з післяумовою. Наявність додаткових управляючих структур породжує надмірність у виразних можливостях мови, що дозволяє робити програми більш природними.
Відзначимо, що оператор переходу Перейти_<N> (оператор Goto) не включений ні до списку основних, ні додаткових операторів управління. Це – не випадковість. Як ми бачили, безконтрольне застосування цього оператора приводить до того, що алгоритм втрачає властивості, зазначені вище. Тому структурне програмування іноді називають програмуванням без Goto.
Проблема проектування набору команд Виконавця як опису властивостей і методів відповідної предметної області відіграє центральну роль у теорії і практиці алгоритмізації. Саме їй присвячені практично всі наукові дослідження і навчальні курси з програмування.
1.16. Парадигма процедурного програмування
Основна ідея, методологія (парадигма) структурного підходу до визначення алгоритму може бути виражена «формулою» Н.Вирта:
АТД + Структури управління = Алгоритми
Алгоритми + Структури даних = Програми.
Незважаючи на всю різноманітність форм представлення інформації та операцій її перетворення, які використовує людина у своїй діяльності, виявилось можливим створення універсального Виконавця, система команд якого дозволяє промоделювати будь-яку іншу систему команд. Таким Виконавцем є комп’ютер.
2. КОМП’ЮТЕРИ І ПРОГРАМИ
2.1. Комп’ютер як універсальний Виконавець
На рис. 2.1 представлена блок-схема комп’ютеру.

Рис 2.1. Блок-схема ЕОМ.
2.1.1. Зовнішні пристрої комп’ютера
Пристрої введення інформації призначені для введення інформації в комп’ютер. Пристрої введення перетворюють інформацію з форми, призначеної для користувача, у форму, призначену для збереження та обробки в комп’ютері – у двоїстий код. Найбільш поширені пристрої введення – клавіатура, сканер, “миша”, та інші.
Пристрої виведення інформації призначені для виведення інформації (результатів) у формі, призначеній для користувача – у виді чисел, текстів, малюнків і т.п.
Характерними для персонального комп’ютеру пристроями виведення є монітор (дисплей), принтер, плотер.
Зовнішні запам’ятовуючі пристрої (ЗЗП) призначені для тривалого (при вимкнутому комп’ютері) збереження інформації. У теперішній час найбільш поширені накопичувачі на гнучких магнітних дисках (НГМД), накопичувачі на твердих магнітних дисках (НМД), накопичувачі на магнітних стрічках (НМС).
Узгодження сигналів, якими обмінюються пристрої комп’ютера у процесі роботи, здійснюють інтерфейсні блоки (контролери). Інтерфейсний блок – це сукупність апаратних і програмних засобів, які підтримують процес обміну даними між пристроями комп’ютеру, різними по швидкодії, рівню сигналів, засобу кодування інформації і таке інше.
2.1.2. Центральні пристрої комп’ютера
Ядро комп’ютера складають так звані центральні пристрої – центральний процесор і оперативний запам’ятовуючий пристрій (ЦП і ОЗП).
Центральні пристрої призначені для оперативного зберігання та перетворення інформації. Сукупність центральних пристроїв об’єднана в системний блок.
Вся інформація, необхідна для виконання алгоритму – початкові, проміжні і вихідні дані, а також сам алгоритм, зберігається в ОЗП у закодованому виді.
ОЗП представляє собою сукупність спеціальних комірок, кожна з яких призначена для збереження двоїстого коду інформації фіксованого обсягу. Кожна комірка пам’яті має свій номер, який називається адресою. У сучасних персональних комп’ютерах (ПК) комірка ОЗП зберігає 1 байт інформації – 8 двоїстих цифр, які називаються бітами.
Характерною особливістю (ОЗП) є те, що доступ до даних, які там зберігаються, здійснюється за їх адресами. Час доступу до даного не залежить від адреси комірки, в якій воно зберігається. Тому ОЗП називають пам’яттю з прямим (випадковим) доступом. Розміром (об’ємом) ОЗП називають кількість її комірок. Розмір ОЗП виражають у байтах, кілобайтах (Кb) і мегабайтах (Мb). 1 кілобайт = 1024 байта, 1 мегабайт = 1024 кілобайта. І дані, і команди як правило, займають у ОЗП декілька підряд адресованих байтів.
Центральний процесор – пристрій, призначений для виконання алгоритмів, які зберігаються в ОЗП у виді набору команд. Кожний центральний процесор має свою систему команд Виконавця. Система команд реального процесора містить десятки і сотні команд, і її вивчення – предмет окремого навчального курсу. Ми розглянемо лише основні принципи побудови машинної мови.
2.1.3. Поняття про машинну мову
Набір команд процесора містить:
o арифметико-логічні команди – команди арифметичних дій над двоїстими числами і логічних дій на двоїстими векторами;
o команди управління – команди переходу, розгалужень, повторень, і деякі інші команди;
o команди пересилання даних – команди, за допомогою яких обмінюються даними ОЗП і ЦП;
o команди введення-виведення даних – команди, за допомогою яких обмінюються даними ЦП і зовнішні пристрої.
Кожна команда містить код операції, яку вона виконує і інформацію про адреси даних, над якими ця операція виконується. Крім цього, команда (безпосередньо – команди керування і опосередковано – інші команди) містить інформацію про адресу команди, яка буде виконуватися наступною. Таким чином, будь-яка послідовність команд, яка розміщена в ОЗП, фактично представляє собою алгоритм, записаний в системі команд процесора – машинну програму.
Найбільш поширеною зараз є схема комп’ютеру з загальною шиною. Загальна шина – це центральна інформаційна магістраль, яка зв’язує зовнішні пристрої з центральним процесором. Вона складається з шини даних, шини адреси і шини управління. Шина даних призначена для обміну даними між ОЗП і зовнішніми пристроями. По шині адреси передаються адреси даних. Ця шина односпрямована. Шина управління служить каналом обміну управляючими сигналами між зовнішніми пристроями і центральним процесором.
Таким чином, мова процесора – це набір команд, кожна з яких описує деяку елементарну дію по перетворенню інформації, яка представлена у двоїстому коді. Універсальне використання двоїстого коду представлення інформації самих різноманітних форм приводить до того, що програма рішення навіть достатньо простої задачі містить сотні машинних команд. Написати таку програму, використовуючи машинні команди, дуже непросто навіть кваліфікованому програмісту. Реальні програми складаються з десятків і сотень тисяч машинних команд. Тому будь-яка технологія проектування програми повинна опиратися на заходи, характерні для людського мислення, оперувати звичними для людини поняттями з тієї предметної області, якій належить задача.
Іншими словами, програміст (проектувальник алгоритмів) повинен мати можливість сформулювати свій алгоритм мовою звичних понять; потім спеціальна програма повинна виразити ці поняття за допомогою машинних засобів, – здійснити переклад (трансляцію) тексту алгоритму на мову машини.
Ця необхідність і привела до появи мов програмування високого рівня як мов запису алгоритмів, які призначені для виконання на комп’ютері.
2.2. Мови програмування високого рівня
Мови програмування високого рівня грають роль засобу зв’язку між програмістом і машиною, а також між програмістами. Ця обставина накладає на мову багато обов’язків:
1.Мова повинна бути близькою до тих фрагментів природних мов, які забезпечують конкретну предметну область діяльності людини; (Мова, яка орієнтована на ділові сфери використань, повинна містити поняття, які використовуються у цьому виді діяльності: рахунок, база даних і т.п.).
2.Всі засоби мови повинні бути формалізовані у такому степені, щоб їх можна було реалізувати як машинні програми;
(наприклад, речення “Знайти документ Х у базі Y” повинно генерувати програму в машинній мові, яка здійснює потрібний пошук).
3.Мова програмування не тільки підтримує предметно-орієнтовну діяльність , але і стимулює її розвиток (поняття бази даних, обчислювальної мережі привело до революції у діловій діяльності).
4.Мова програмування – дещо більше, ніж засіб опису алгоритмів: він несе в собі систему понять, на основі яких людина може обдумувати свої задачі, і нотацію, за допомогою якої він може виразити свої розуміння з приводу рішення задачі.
Вивчаючи нову мову програмування, краще всього до неї відноситися, як до будь-якої іншої іноземної мови: засоби мови приймати як дані від Бога, навіть якщо вони нам здаються незрозумілими, поганими або непотрібними.
2.2.1. Коротка історія розвитку мов програмування
Ідея мови програмування з’явилась так само давно, як і універсальні обчислювальні машини – на межі 40-50 років. Вже на перших кроках їх експлуатації виявилися недоліки використання машинного коду, визначились методи усунення або зменшення цих недоліків: використання бібліотек стандартних програм, імен замість адрес, попереднього розподілу пам’яті і т.п.
Великий вплив на наступні розробки виявила мова Fortran, створена у IBM під керівництвом Дж. Бекуса (1954-57 р.р.). У той же час М.Г.Хоппер (Ramington-Rand Univac) і її група розробили мову обробки комерційної інформації Flow-Matic. М.Г.Хоппер належить термін “компілятор”. Таку назву мала її перша програма, яка транслювалась.
Перші виробничі мови програмування з’явились на межі 50-60 років, знаменуючи собою нову епоху у розвитку обчислювальних машин і методів обробки інформації. Ці мови високого рівня були реалізовані на перших комп’ютерах 2-го покоління.
Ось деякі дати:
1957 р. Fortran США, ІВМ, Дж. Бекус: по суті перша широко застосовувана мова, орієнтована на науково-інженерні і чисельні задачі.
1960 р. Cobol США, Об’єднаний комітет виробників та користувачів ЕОМ: мова для комерційних задач.
1960 р. Algol-60. Поліпшений варіант мови Algol-58, Європа, США, міжнародна робоча група: універсальна мова, пращур мови Pascal і багатьох інших мов європейського стилю.
1965 р. BASIC Дж. Кемені, Т.Куртц, США, Дармутський коледж: мова для починаючих.
1969 р. Logo С.Пейперт, США, Массачусетський технологічний інститут: мова для дітей.
1966 р. PL-1 група ІВМ, США: Багатоцільова мова для систем колективного користування.
1968 р. Algol-68. Європа, міжнародна робоча група: європейська відповідь на PL-1.
1970 р. Pascal Н. Вірт, Швейцарія, федеральний інститут технології, Цюрих: мова для навчання спеціалістів в області інформатики.
1959 р. Lisp Дж.Маккарті, США, Массачусетський технологічний інститут: мова функціонального програмування.
1972 р. Prolog А.Колмєрое і його колеги з лабораторії Штучного інтелекту, Марсельський університет, Франція: мова логічного програмування, що завоювала широку популярність як мова для задач обробки баз знань.
1972-75 р.р. С і його розвиток С++. Д.Керніган, Д.Річі, Б.Страустрап, АТ & Т Bell Lab.,: мови системного програмування, які отримали широке розповсюдження завдяки своїй ефективності і підтримці ведучих компаній - розробників програмного забезпечення.
1975 р. Modula - 2 Н. Вірт, Розвиток мов Pascal і Modula для системного програмування.
Перші мови програмування несли у собі явно виражені ознаки орієнтації на структуру комп’ютеру. Вважалось, що програми, написані ними, призначені для виконання на комп’ютері. (Fortran – програми до цих пір пишуть на спеціальних бланках, орієнтованих на перфорацію. Ще одна яскраво виражена ознака машинної орієнтації – мітки і оператор GOTO.)
В результаті теоретичного осмислення процесів, які відбувалися у програмуванні, був вироблений так званий структурний підхід до написання програм, а для його реалізації розроблені такі мови, як Pascal, Modula - 2. Ідеологи структурного підходу вважають, що комп’ютери призначені для виконання програм, а не програми – для виконання на комп’ютері.
Перенесення акцентів з комп’ютеру на програми ще більш яскраво виявилось у появі принципово нових стилів програмування – функціонального програмування (Lisp), логічного програмування (Prolog), алгебраїчного програмування (Reduce, APS).
У цих мовах центральну роль грають не процедури обробки даних, а співвідношення між даними, які повинні виконуватись у процесі виконання програми. Тому ці мови, на відміну від процедурних (вказівних, імперативних), отримали назву декларативних (описових ).
2.2.2. Про історію розвитку методів проектування програм
Як створювати великі комп'ютерні програми? Фахівець початку 50-х років на це питання відповів би так: “Потрібно використовувати бібліотеки стандартних підпрограм”. Пізніше такий підхід стали називати машинно-орієнтованим. Машинно-орієнтоване програмування використовує уявлення про комп'ютерну програму як про послідовність машинних команд, що обробляє дані, розташовані в чарунках пам'яті комп'ютера
Машинно-орієнтовані мови програмування – мови асемблера – підтримують розподіл пам'яті під змінні – дані, позначені в програмі іменами, і використання підпрограм у якості основних програмних компонентів.
Програміст початку 60-х років указав би на необхідність використання мов програмування (Мови програмування високого рівня Фортран, Кобол, Алгол-60 з'явилися саме в цей час). Виявилося, що для створення великих програмних систем доцільно використовувати системи спеціальних понять, правил і рекомендацій, що формулюються як результат наукової точки зору на комп'ютерну програму. Дотримання таких понять і правил називають стилем програмування (підходом, методологією програмування).
Розробка і наукове обґрунтування різних стилів програмування – одна з основних задач теорії програмування. Виявилося, що мова програмування повинна відповідати стилю програмування. Найбільш розповсюдженим підходом став так називаний структурний підхід, підтримуваний процедурними мовами програмування (Паскаль, Модула-2, Сі й ін.).
Ключові поняття процедурного програмування – поняття структури даних, оператора і процедури (функції) як основної семантичної одиниці комп'ютерної програми, що описує алгоритм. Оскільки дані, об'єднані в структури, обробляються різними процедурами, сукупності семантично зв'язаних між собою процедур поєднуються в програмні модулі.
Спеціальні класи систем програмування створюються для застосування й інших стилів програмування, підтримуваних відповідними мовами програмування – логічного програмування (Prolog), функціонального програмування (Lisp, FP), алгебраїчного програмування (Reduce, Obj, Aplan).
Логічне програмування використовує точку зору на алгоритми, вироблену в математичній логіці. Дані логічних програм представлені фактами, що грають роль спеціальних аксіом відповідної предметної області, а алгоритми описуються у виді сукупності так званих правил логічного висновку. Таким чином, факти і правила висновку утворять спеціальну логічну теорію. Реалізацію висновку в цій логічній теорії називають машиною (логічного) висновку.
Функціональне програмування являє собою підхід, при якому алгоритм описується як алгоритмічно обчислювана функція. Описи програм-функцій здійснюються в термінах функціональних визначень, а основною операцією, що реалізує обчислення функціональної програми, є операція аплікації – застосування функції до аргументу.
Алгебраїчне програмування використовує представлення про алгоритми, вироблене абстрактною алгеброю. Як і при алгебраїчних обчисленнях, дані алгебраїчних програм представляються формулами (алгебраїчними виразами), а їхня обробка – перетвореннями цих формул (переписуваннями). Системи припустимих перетворень формул – даних відповідної предметної області є основними семантичними одиницями алгебраїчної програми. Сукупність правил побудови формул і правил перетворення формул визначає предметну область, що називають алгебраїчною системою.
Принципово важливим методологічним розходженням між процедурним стилем і логічним стилем опису алгоритмів є те, що процедурний стиль припускає опис алгоритму у виді послідовності кроків (дій), а логічний стиль – опис алгоритму як сукупності визначальних властивостей спеціальної предметної області.
Процедурний алгоритм імперативний – він наказує виконувати строго визначену послідовність дій.
Логічний алгоритм декларативний – він описує логічні властивості спеціальної предметної області.
Тому процедурний стиль програмування називають імперативним програмуванням, а логічний стиль – декларативним програмуванням.
Відзначимо, що і функціональне програмування, і алгебраїчне програмування є уточненнями декларативного програмування, оскільки вони надають програмісту спеціальні засоби опису предметних областей. Функціональне й алгебраїчне програмування можна також розглядати як різні варіанти реалізації логічного підходу в програмуванні, оскільки і функціональні визначення, і алгебраїчні перетворення є спеціальними формами логічного висновку.
Дослідження різних підходів до опису алгоритмів сформували загальні концепції, про які ми говорили вище, вже в 70-х роках. Тому освічений програміст 70-х років рекомендував би дотримувати не тільки (і не стільки) визначеної мови програмування, але визначеного стилю, адекватного предметній області і структурі проектованої програмної системи.
2.3. Основні етапи проектування програми
Процес проектування програми подібний процесам проектування складних систем. Ось його основні етапи:
* Постановка задачі і вибір її математичної моделі;
* Розробка алгоритму розв’язування задачі;
* Вибір апаратного обладнання і мови програмування;
* Написання програми;
* Налагодження і редагування;
* Контрольні випробування;
* Експлуатація.
Насправді проектування програми – не лінійний, а циклічний процес, на кожному кроці якого можливе повернення до будь-якого з попередніх кроків:
У теперішній час праця програміста у значній мірі регламентована спеціальними методиками, довідковими посібниками і стандартами. Розробники операційних систем і систем програмування велику увагу приділяють спеціальним пакетам програм, які автоматизують працю програміста. Але, не дивлячись на все, процес розробки програм все ще далекий від досконалості.
2.4. Технологія трансляції програм
Взагалі комп’ютер не розрахований на те, щоб розуміти LOGO, Pascal або інші мови програмування високого рівня. Апаратура розпізнає і виконує тільки машинну мову, програма на якій являє собою не більш ніж послідовність двоїстих чисел.
Поява мов програмування була пов’язана з осмисленням того факту, що переклад алгоритму, написаного “майже” природною мовою, на машинну мову може бути автоматизований і, отже, покладений на плечі машини. Тут важливо розрізняти мову і її реалізацію. Сама мова – це система запису, яка регламентується набором правил, що визначають його лексику і синтаксис. Реалізація мови – це програма, яка перетворює цей запис у послідовність машинних команд у відповідності з прагматичними і семантичними правилами, визначеними у мові.
Існують два основних засоби реалізації: компілятори і інтерпретатори.
Компілятори транслюють весь текст програми, написаний мовою програмування, у машинний код у ході одного безперервного процесу. При цьому створюється повна програма у машинних кодах, яку потім можна виконувати без участі компілятора.
Інтерпретатор у кожний момент часу розпізнає і виконує по одному реченню (оператору) програми, за ходом справи перетворюючи речення, яке оброблюється у машинну команду. Різниця між компілятором і інтерпретатором подібна різниці між синхронним перекладом усної мови і письмовим перекладом тексту.
У принципі будь-яка мова може мати і компілятор, і інтерпретатор, однак у більшості випадків кожна мова має засіб реалізації, якому віддають перевагу. Напевно, така перевага – дещо більше, ніж данина традиції. Вибір визначений самою мовою. Fortran, Pascal, Modula-2 в основному компілюють. Такі мови як Logo, Fort майже завжди інтерпретують. BASIC і Lisp широко використовується в обох формах. Кожний з цих засобів має як свої переваги, так і недоліки:
Основні переваги компіляції:
Швидкість виконання готової програми;
Незалежність програми від системи реалізації;
Основні недоліки компіляції:
Деякі незручності, які перевіряються програмістом при написанні і налагодженні великих програм;
Порівняно великий об’єм пам’яті, який займає компілятор в ОЗП;
2.5. Поняття про систему програмування
Розглянемо послідовність змін, що відбуваються з програмою під час виконання (у процесі компіляції).
Текст програми, який написаний мовою програмування, називається вихідним модулем. Достатньо складні програми можуть складатися з кількох модулів, взаємодіючих один з одним. Вихідний модуль – це вхідний потік для програми-компілятора, яка
* Здійснює лексичний аналіз вхідного потоку [блок лексичного аналізу];
* Здійснює синтаксичний аналіз вхідного потоку [блок синтаксичного аналізу];
* Генерує машинний код, який є перекладом вихідного модуля на мову комп’ютера в умовних адресах [генератор коду].
В результаті цих перетворень на виході отримується об’єктний модуль.
Навіть якщо ми маємо справу з одним вихідним модулем, для успішного виконання програми необхідно “зв’язати” її з деякими іншими програмами (наприклад, з стандартними процедурами введення-виведення, які реалізовані у мові). Ці функції виконує програма – редактор зв’язків. Вихідний потік цієї програми називають завантаженим модулем.
Сучасна технологія застосовування комп’ютера потребує, щоб виконуючу програму можна було розміщувати в довільному місці ОЗП. Тому і завантажений модуль написаний в умовних адресах. Розміщенням завантаженого модуля в пам’ять займається програма – завантажувач. Як правило, програми, які щойно написані, містять безліч помилок. Помилки бувають:
а) синтаксичні і лексичні (виявляються на етапах лексичного і синтаксичного аналізу). Наприклад, помилка у := sos(x) замість у:= cos(x) – лексична, а помилка в операторі if х < 0 then y:= 0; else у:= 1 - синтаксична.
б) семантичні ( виявляються на етапі налагодження). Наприклад, помилка в операторі присвоювання – ділення на нуль: х:= у; z:= 1/ (х - у).
в) логічні (виявляються на етапі контрольних випробувань). До логічних ми відносимо такі помилки, в результаті яких програма не виконує того, що ми від неї чекаємо. Для автоматизації процесу пошуку і усунення семантичних і частково логічних помилок використовуються спеціальні програми, які називають налагоджувачами.
Процес перетворення тексту вихідного модуля в модуль, який виконується, можна зобразити схематично (рис 2.4.):
Звичайно в склад системи програмування включають власний текстовий редактор, інші сервісні програми. Для керування роботою будь-яких частин системи програмування використовують керуючу програму, яку називають оболонкою.
Таким чином, для роботи в мові програмування використовуються спеціальні пакети програм, які називають системами програмування (СП). У склад СП входять:
* оболонка;
* текстовий редактор;
* компілятор;
* редактор зв’язків;
* завантажувач;
* налагоджувач;
* бібліотеки стандартних процедур і функцій;
* сервісні програми.
3. МОВА ПРОГРАМУВАННЯ ПАСКАЛЬ
Мова програмування Паскаль (Pascal) розроблена видатним швейцарським ученим і педагогом в області програмування Н. Віртом. Попереднє повідомлення з’явилось в 1968 р. В 1971 році запрацював перший компілятор переглянутої версії, яка набула статус стандарту.
Паскаль призначався для навчальних цілей – для викладання основ програмування студентам – майбутнім спеціалістам в області інформатики. Дуже швидко мова завоювала популярність не тільки в середовищі викладачів і студентів, але й серед професіоналів завдяки своїй компактності, гнучкості, старанній розробці концепції.
Існуючі сьогодні реалізації мови, зберігши його стандарт як ядро, володіють потужними додатковими засобами, що сприяє широкому використанню мови.
3.1. Алфавіт мови
В мові використовуються:
Латинські букви (великі і маленькі), знак підкреслення “_”
Цифри 0,...,9
Математичні символи +, -, *, /, <, >, =
Роздільники: ; “ ’ . : ^
Дужки ( ) [ ] { }
Інші символи (що використовуються для друку): букви національних алфавітів, !, ?, \, ...
У різних версіях можуть використовуватися різні набори символів. Зараз широко використовується набір символів коду ASCII (American Standard Code for Information Interchange).
Цей код передбачає розширення для національних алфавітів, символів псевдографіки, які можуть змінюватись від версії до версії.
3.2. Концепція даних
Дані є загальне поняття для всього того, з чим оперує комп’ютер. Мови програмування дозволяють нам абстрагуватись від деталей представлення даних на машинному рівні перш за все за рахунок введення поняття типу даних.
У мові Pascal представляються числа і рядки.
Цілі числа записуються в десятковій системі числення: 137, -56, +26.
Дійсні числа використовують також десяткову нотацію, причому ціла частина відокремлюється від дробової не комою, а точкою. Для позначення порядку числа в якості роздільника використовується буква Е. Наприклад, -5.1Е14 означає -5.1, помножене на 10 у степені 14 (-5,1*1014). Порядки можуть бути і від’ємними: 6.74Е-8, -56.89Е-10.
Послідовності символів в лапках, називаються рядками. Якщо у рядок треба включити лапки, то замість них записують двоє лапок:
’ рядок з символів ’, ’ апостроф ’ ’ у слові ’
В мові дуже старанно в відповідності з концепцією структурного програмування пророблено поняття типу даних. Існують так звані прості (елементарні) типи, які або визначені як стандартні, або визначаються програмістом. Визначений також механізм описання і використання складних типів з більш простих як з базових.
3.3. Імена та їх застосування
Іменем в мові називається послідовність (латинських) букв, знака підкреслення “_” і цифр, що починається з букви або знака підкреслення. Хоча імена можуть бути будь-якої довжини, в реалізації кількість значущих символів в імені може бути обмежено. У стандарті мові імена розрізняються за першими восьми символами. Це означає, що імена VeryLongNumber, VeryLongCardinal у стандарті мови позначають (іменують) один і той же об’єкт. Крім цього, мова не розрізняє великих і маленьких букв. Тому імена Sin, SIN, sin не розрізняються.
Імена використовуються для позначення констант, типів, змінних, процедур і функцій. Наприклад:
Pi, Сonstant - імена констант;
x, y1, y2, Counter - імена змінних;
Integral, MaxMin - імена процедур;
Man, Color, WeekDay - імена типів;
Деякі імена визначені наперед. Наприклад:
Sin - ім’я для позначення функції синус;
Read - ім’я для позначення процедури читання;
Вони називаються стандартними. Всі інші імена вибираються програмістом на його погляд. Однак, для того, щоб програма краще читалась, рекомендується вибирати імена, що несуть інформацію про названий об’єкт.
Нажаль, практично всі реалізації мови допускають використання тільки латинських букв в іменах, тому програми не так зрозумілі неангломовним користувачам, як цього хотілось би.
3.4. Структура Pascal-програми
Програма на мові Pascal складається з заголовку і блоку. Блок називають тілом програми. Заголовок програми відділений від тіла крапкою з комою. Крапка, що стоїть після блоку, служить ознакою завершення програми. Таким чином, програма має вид:
програма
Відзначимо, що малюнок, приведений вище, більш точно, наочно і коротко визначає поняття програми, ніж попередній текст. Тому в подальшому ми, наслідуючи традицію, що йде від автора мови, будемо застосовувати саме такий спосіб означень мовних конструкцій, який називають мовою синтаксичних діаграм.
3.5. Поняття про лексику, прагматику, синтаксис і семантику мови програмування
Будь-яка мова програмування схожа з природними мовами. Як і природна мова, вона має свій алфавіт, словник, знаки пунктуації (роздільники), за допомогою яких можна утворювати більш складні мовні конструкції, подібні реченням природної мови. Словник мови програмування складається з чисел, слів і деяких інших символів. Елементи цього словника називають лексемами. Приклади лексем:
394, -5678, 12.456, 67.5е8 - числа; Integer, Cos, MaxInt - імена; (, ) - дужки.
Мова програмування містить набір правил побудови лексем. Сукупність цих правил називається лексикою мови. Лексичні правила для чисел, рядків і імен наведені вище.
Оскільки текст будь-якої програми є послідовність лексем, основна задача лексичного аналізу – перевірка правильності написання і ідентифікація лексем в цьому тексті. Кожна лексема має свою інтерпретацію (смисл). Так, послідовність цифр, розмежована точкою, інтерпретується як дійсне число в десятинній нотації, а Cos – як ім’я функції. Сукупність інтерпретацій лексики мови називається її прагматикою.
Правила утворення більш складних конструкцій мови називаються синтаксичними. Сукупність синтаксичних правил утворює синтаксис мови програмування. Одне з синтаксичних правил – правило описання заголовку програми – наведено вище.
Також , як і лексеми, інші конструкції мови інтерпретуються як дії або описання. Наприклад, оператор присвоювання х := х+2 має смисл “скласти значення змінної х з числом 2 і результат інтерпретувати як (нове) значення цієї ж змінної”. Сукупність інтерпретацій синтаксичних правил називається семантикою мови. Можна сказати, що вивчення мови програмування полягає у вивченні його синтаксису і семантики.
3.6. Синтаксичні діаграми як засіб визначення мови програмування
Правила побудови синтаксичних діаграм пояснимо на прикладі діаграми заголовку програми: