Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
конспект 1 модуль СР 2012.doc
Скачиваний:
78
Добавлен:
19.02.2016
Размер:
3.1 Mб
Скачать

Частина I

ОСНОВИ ПРОГРАМУВАННЯ

Наприкінці XVIII сторіччя (1795) французькій математик М.Проні, якому уряд доручив організувати розв’язування комплексу завдань, пов’язаних із переходом на метричну систему мір, уперше у світі розробив технологію обчислень, що передбачала поділ праці математиків [19]. Він поділив увесь колектив, який мав виконувати зазначений комплекс завдань, на три групи. Перша, що складалася з висококваліфікованих математиків, розробляла відповідні методи обчислень. Головна вимога до цих методів полягала в тому, щоб за їх допомогою будь-які обчислювальні операції можна було звести до виконання чотирьох арифметичних дій: додавання, віднімання, множення і ділення. Друга група математиків визначала послідовність арифметичних дій і вихідні дані, необхідні для їх виконання. Виконувати цю послідовність арифметичних дій поручалось третій групі. Такий поділ праці дав змогу істотно прискорити здобуття результатів і підвищити їх надійність.

Англійський учений Чарльз Беббідж побачив у технології обчислень, запропонованій М. Проні, головні складові аналітичної (обчислювальної) машини, проект якої він розробив упродовж 1836 – 1848 років [36]. Саме ця машина стала механічним прототипом електро-обчислювальної машини (ЕОМ), яка з’явилася сторіччям пізніше. В аналітичній машині було передбачено п’ять тих самих, що й у сучасній ЕОМ, типів пристроїв: процесор, пам'ять, пристрій керування, пристрій вводу та пристрій виводу. Програма виконання обчислень так само, як вихідні дані й результати обчислень, записувалась на перфокартах. Автоматичне виконання програми обчислень забезпечувалось пристроєм керування. Механічний принцип побудови пристроїв, а також застосування десяткової системи числення, що перешкоджало створенню простої елементної бази, не дали змоги Ч. Беббіджу повністю реалізувати машину. У 1842 році італієць Л.Менабреа (згодом – професор прикладної математики, генерал, прем’єр міністр Італії) опублікував опис аналітичної машини Беббіджа італійською мовою, а англійський математик Ада Лавлейс, дочка поета Дж. Байрона, переклала цей опис із власними примітками та написала програми обчислень на машині Беббіджа [19,36]. Аду вважають першим програмістом світу. На її честь названо одну з найпотужніших мов програмування – Ada.

Дж. Буль розбив алгебру логіки (алгебра Буля, або бульова алгебра), яка знайшла застосування у проектуванні схем, з яких складається ЕОМ. Схеми використовують двійкову систему числення. Американський учений К.Шеннон в 1936 році поєднав математичну логіку з двійковою системою числення та теорією електричних кіл, заклавши основи апаратної складової обчислювальних засобів.

Через 63 роки після смерті Ч. Беббіджа в 1937 році К. Цузе (Німеччина) створив механічну машину, подібну до машини Беббіджа, яка використовувала двійкову систему числення [9].

У 1944 році вчений Гарвардського університету Г. Айкен створив першу у США (тоді вважалось першу у світі) релейно-механічну цифрову обчислювальну машину МАРК-1 [19,22]. За своїми структурними характеристиками вона поступалась машині К. Цузе, істотно відрізняючись від неї за розмірами (довжина 17м., а висота 2,5м.; маса – 5т.), і складалась майже з 500 тис. механічних деталей. Машина К. Цузе займала площу 2м2.

Наприкінці 1945 року в Пенсільванському університеті (США) було закінчено створення обчислювальної машини, названої ЕНIAK, продуктивність якої в 1000 раз перевищувала продуктивність машини МАРК-1. Керівниками роботи були Дж. Маучлі, Дж. Еккерт.

У червні 1946 року Дж. Нейман, Г. Голдстайн і А. Беркс у Прінстонському інституті перспективних досліджень (США) склали звіт „Попереднє обговорення логічного конструювання електронного обчислювального пристрою”, який містив розгорнутий і докладний опис принципів побудови ЕОМ. Того самого року звіт було поширено на літній сесії Пенсільванського університету. Викладені у звіті принципи, як склалося з часом були фундаментальними і зводилися до наступного:

  • машини на електронних елементах мають працювати у двійниковій системі числення;

  • програма, так само як і дані має розміщуватися в запам’ятовувальному пристрої, що має достатню місткість та відповідні швидкості вибірки й запису команд програми;

  • програма, так само як і дані, з якими оперує машина, записується в двійниковому коді.

  • проміжні результати обчислень та вихідні дані можуть розміщуватись у тому самому запам’ятовувальному пристрої, що й програма;

  • числова форма запису програми дає змогу машині виконувати операції з величинами, якими закодовано команди програми;

  • труднощі фізичної реалізації запам’ятованого пристрою, швидкодія якого відповідає швидкості роботи логічних схем обчислювального пристрою спонукають до ієрархічної організації пам’яті;

  • арифметичний пристрій машини конструюється на основі схем, що виконують операцію додавання, при цьому створювати спеціальні пристрої для виконання інших операцій немає сенсу.

Перелічені принципи роботи ЕОМ, які сформулював Дж.Нейман на підставі узагальнення досвіду побудови обчислювальних машин, дали змогу зробити крок від теоретичних основ до практики побудови реальних універсальних ЕОМ. Про важливість здобутих результатів свідчить те, що загальні принципи та архітектура ЕОМ, функціонування якої відповідає цим принципам було названо нейманівськими (див. рис. 1.1).

Рис. 1.1. Архітектура комп’ютера за Нейманом

Отже, як нейманівська архітектура, так і архітектура сучасних ЕОМ ґрунтується на таких трьох загальних принципах:

  1. програмного керування (Ч. Беббідж) – ЕОМ працює під керуванням програми, утвореної із команд, які, у свою чергу, складаються з операційної (зазначає, що робити) та адресної (зазначає, із чим робити) частин;

  2. послідовного виконання команд програми (Ч. Беббідж) – команди програми виконуються одна за одною починаючи з тієї, котру зазначено як першу, і до останньої команди програми або команди „зупинитися”; команди можуть виконуватись паралельно на машинах паралельного типу;

  3. збережуваної в пам’яті програми (Дж. Нейман) – програма, так само як і дані, зберігається в пам’яті ЕОМ.

Реалізація третього принципу дає змогу будувати універсальні (незалежні від виконуваних програм) ЕОМ.

В 1947 році М. Уїлкс (Англія) створив першу ЕОМ, яка мала нейманівську архітектуру і базувалася на вказаних трьох принципах [19]. В 1950 році С.О. Лебедев (СРСР) створив подібну ЕОМ.

Розділ 1. Комп’ютерні програми та програмування

Справжній початок робіт у галузі електронної обчислювальної техніки в континентальній Європі датується 1946 роком, коли в Києві академік АН УРСР С.О.Лебедєв розпочав дослідження зі створення ЕОМ і програм для них. Роботи проводились у Феофаніі, що під Києвом, у лабораторії обчислювальної техніки Інституту електротехніки АН УРСР, очолю вальної С.О. Лебедєвим. Наприкінці 1950 року запрацювала перша в СРСР і континентальній Європі ЕОМ, яка дістала назву Малая Электронная Счетная Машина (МЭСМ). У її будові було реалізовано загальні принципи і архітектуру Неймана. Мову високого рівня і програми для цієї ЕОМ розробляла К.Л.Ющенко, яка вважається першим програмістом у колишньому СРСР.

Перші експерименти на МЭСМ показали, що підготовка задачі до розв’язування на ЕОМ становить самостійну проблему, яка стала предметом систематичного вивчення на семінарі з програмування, організованому в 1950 році під керівництвом члена-кореспондента АН СРСР Л.А.Люстерника.

У 1952 році в колишньому СРСР з’явилася відома праця М. Уїлкса, Д. Уїлера та С. Гілла, яка містила перший опис інтегрованої системи програмного забезпечення та метод бібліотечних підпрограм, що були встановлені на побудованої в 1947 році М.Уїлксом першої в Європі ЕОМ [68].

У 1951 році С.О. Лебедевим було виготовлено другу машину - Большая Электронная Счетная Машина (БЭСМ), а з 1952-го року почалась її дослідна експлуатація [55].

ВЕСМ

У 1953 році було організовано перший у колишньому СРСР відділ програмування, який упродовж першого року очолював О.А. Ляпунов.

Роком раніше у Московському державному університеті кафедру обчислювальної математики було реорганізовано з метою підготовки прикладних математиків для роботи з ЕОМ. Завідувачем кафедри став академік С.Л. Соболев. Випускники кафедри 1953-54 навчального року стали першим поколінням фахівців, які називали себе програмістами.

У 1955 році було створено Обчислювальний центр АН СРСР, директором якого став академік А.О. Дородніцин.

Після переїзду С.О. Лебедєва з Києва до Москви директор Інституту математики АН УРСР Б.В. Гнєденко створив обчислювальну лабораторію, куди було переведено групу працівників цього Інституту. Через кілька років зазначену лабораторію очолив В.М. Глушков. На її базі в 1957 році було створено Обчислювальний центр АН УРСР, що перетворився згодом на Інститут кібернетики АН УРСР (зараз Інститут кібернетики на ім’я В.М.Глушкова НАНУ).

Зауважимо, що О.А. Ляпунов розглядав програму як дискретну послідовність операторів, які класифікував наступним чином: арифметичні оператори (оператори на основі присвоювання), що діють на дані; логічні оператори (як обчислення логічних відношень, так і передавання відношення); оператори модифікації, що діють на інші оператори. Текст програми складався з двох частин: схеми програми (символьне подання операторів із зазначенням передавання управління та класифікації операторів) та специфікації операторів, яка визначає їхній конкретний зміст.

Методологію, яку А.І.Китов назвав операторним методом програмування, описав О.А. Ляпунов у першому в колишньому СРСР навчальному курсі програмування, прочитаному в Московському державному університеті на ім’я М.Ломоносова під назвою „Принципи програмування” [8]. Зазначений метод дав поштовх до створення теорії схем програми та забезпечив появу в колишньому СРСР перших трансляторів.

    1. Програма

Програма – це опис обчислень. Обчислення – це дії (послідовність дій), здійснення яких доручається деякому виконавцеві. Виконавці можуть бути різними, але кожний із них неодмінно має розуміти програму. В основу опису зазначених дій покладено поняття алгоритму [47]. Мета обчислень – дістати результат. Основними об’єктами обчислень, а також результатом є значення. Значення – це конкретний елемент програми, який в обчисленнях замінює зміну. Програма зазвичай описує багато обчислень. Залежно від конкретних значень виконавець здійснює те чи інше обчислення з багатьох.

    1. Комп’ютерна програма

Якщо виконавець програми – комп’ютер (ЕОМ), то вона називається комп’ютерною. Комп’ютер – це „рутинний” пристрій тому дуже важливо, щоб комп’ютерна програма містила точні вказівки стосовно того, які виконувати обчислення і як виконувати. Ці вказівки складають так званий алгоритм – послідовність виконання дій при рішенні задачі. Алгоритм повинен мати наступні властивості [47]:

  • кінцевість – повинен закінчуватися після виконання кінцевої кількості дій;

  • визначеність – кожна дія повинна біти точно визначена;

  • ввід – повинен мати деяку кількість вхідних значень;

  • вивід – повинен мати деяку кількість вихідних значень;

  • ефективність – всі дії повинні бути простими, так що їх можна виконати за кінцевий термін за допомогою олівця і паперу.

Тому подання алгоритму, покладене в основу опису дій програми, має бути якомога точнішим і конструктивнішим.

Оскільки комп’ютер – це ще й математична машина, то для подання алгоритму було розроблено багато математичних способів [11]. Проте незалежно від способу подання алгоритму комп’ютерній програмі притаманні такі властивості:

  • закінченість опису обчислень – повна докладність і визначеність опису обчислень;

  • масовість обчислень – орієнтація на зміну значень;

  • форма програми – текст.

Засіб запису програми – спеціальна мова, яка називається мова програмування.

Далі наведено приклади програм, написаних мовами програмування Pascal та С.

Pascal:

begin

fx := LEFT;

while fx <=RIGHT do

begin

if fx <= 2.0

then

fy := fun_1 (fx)

else

fx := fun_2 (fx);

fx := fx + TABUL;

end;

end.

C:

float fun1(float farg)

{

float fltemp;

fltemp=0.

int ni;

for (ni = 1; ni <= 5; ni = ni + 1)

ftemp = ftemp + sqrt((farg + ni)/ni);

return ftemp;

}

Державний стандарт визначає комп’ютерну програму (computer program), як послідовність інструкцій, котрі може виконувати ЕОМ.

    1. Програмування

Процеси, пов’язані з написанням комп’ютерних програм, називають програмними здійснення цих процесів – програмуванням. У найзагальнішому вигляді програмування – це послідовне виконання трьох таких процесів:

  1. складання схеми програми – узагальнений опис обчислень за допомогою спеціальних засобів (мови специфікацій) – псевдокоди, блок-схеми або формальні (математичні) мови;

  2. складання тексту програми – точний опис обчислень за допомогою спеціального засобу (мова програмування) із використанням схеми програми;

  3. налагодження програми – виконання програми з використанням спеціально підібраних значень, що має на меті пошук і усунення дефектів – результатів помилок, яких припустилися в ній при реалізації перших двох процесів.

Два ключеві об’єкти беруть участь у програмуванні – програміст і мова програмування.

Програміст – це спеціально підготовлений фахівець, який знає одну чи кілька мов специфікацій і програмування, а також уміє виконувати програмні процеси.

Мова програмування – це штучна знакова система, призначена для запису комп’ютерних програм. Як і будь-яка знакова система, мова програмування задається синтаксисом – множиною правил, що визначають вигляд речень мови, і семантикою – множиною правил, що визначають операційне значення речень мови. Кожна мова програмування за допомогою синтаксису та семантики описує деякого носія мови, котрим ця мова визначається однозначно. Носій мови – це основа перекладачів (трансляторів), які перекладають програми з мови програмування мовою виконавця (комп’ютера).

Теоретичну основу мов програмування становлять алгоритмічні мови (засоби запису алгоритмів) [9]. При цьому припустимі набори операторів мов програмування перевищують мінімальні набори необхідні для їхньої алгоритмічної універсальності, що пояснюється практичною орієнтацією мов програмування.

    1. Програми як системи

В контексті інженерії програмного забезпечення комп’ютерну програму доцільно розглядати конструктивно. Це можна робити зокрема за допомогою системного аналізу [56].

Комп’ютерну програму можна розглядати як систему, якщо вона має такі властивості: цілісність і членованість, наявність зв’язків, наявність організації, наявність інтегральної характеристики.

Властивість цілісність і членованість полягає в тому, що, з одного боку, програма – це цілісна конструкція, а з другого, в її складі можна розрізняти окремі компоненти. Компоненти – це такі частини програми, які в даній програмі на певному рівні її розгляду не підлягають подальшому поділу. Поза програмою компоненти набувають властивостей, що мають загальносистемне значення, і тоді властивості називаються системозначущими. Потрапляючи у програму, компонент набуває властивостей, які мають значення тільки в даній програмі, і такі властивості називаються системовизначними. Наприклад, компонент, що обчислює tg(x) (системозначуща властивість), увійшовши до складу програми керування польотом деякого об’єкта, може обчислювати значення деформації (зсуву) шарів плоского тіла (системовизначна властивість).

Завдяки властивості цілісності та членованості компонент або програму можна розглядати як єдине ціле, але таке, що складається з компонентів, що взаємодіють.

Властивість наявність зв’язків полягає в існування двох типів зв’язків: стійких зв’язків між компонентами програми (перший тип), які за своєю силою переважають зв’язки цих компонентів з компонентами, що не входять до даної програми (другий тип). Зв’язки першого типу називають зв’язувальними (cohesion). Такими зв’язками поєднуються компоненти, що містяться всередині іншого компоненту або програми. Зв’язки другого типу називають сполученими (coupling). Зв’язками останнього типу поєднуються компоненти даної програми з іншими компонентами та програмами. Мета, якої потрібно досягати під час створення програми, полягає в тому, щоб мінімізувати кількість сполучених зв’язків і зробити якомога „сильнішими” зв’язувальні зв’язки. Наявність зв’язувальних зв’язків дає підстави говорити про межу компоненту або програми (там де вони послаблюються), а отже, і про зовнішнє середовище компоненту або програми – сукупність компонентів, які не належать компоненту або програмі, але пов’язані з ними і чинять на них певний вплив. Цей вплив інтерпретується як надходження у компонент або програму вхідних значень (впливів) і отримання з компоненту або програми вихідних значень (результату) (рис. 1.2). Частину межі, скрізь яку здійснюється передача впливу і отримання результату називають інтерфейсом компоненту або програми.

Рис.1.2 Програма (компонент) і зв’язки

Властивість наявність організації полягає у взаємозалежному поводженні компонентів програми завдяки їх упорядкованості у просторі за рахунок зв’язуваних зв’язків, які можуть бути управляючими та інформаційними.

Унаслідок установлення зв’язків формується структура компоненту або програми, а функції компонентів програми трансформуються у функцію програми. Функції і як наслідок, програма можуть бути корисними, позбавленими користі та шкідливими.

Корисність програми як одна з її властивостей визначається відповідністю функції та конструкції програми вимогам, що висуваються до неї.

Властивість наявності інтегральної характеристики полягає в тому, що існує властивість – інтегральна – характеристика, притаманна програмі загалом, але не притаманна жодному з її компонентів зокрема. Тому програма не зводиться до простої сукупності її компонентів, а розчленовуючи програму на компоненти і вивчаючи лише їх окремо не можна зрозуміти інтегральної характеристики програми. Інтегральна характеристика має прояв скоріш за все через функцію програми.

1.5. Класифікація програм

Існує підхід запропонований М. Леманом згідно з яким усі комп’ютерні програми можна поділити на три типи: S (Specification), P (Problem) і E (Еnvironment) [14].

S-програма – це така програма, функція якої відома й визначена однозначно специфікацією задачі. Наприклад, програма, що малює прямокутник на екрані в заданій області або програма, що обчислює функцію області зміни значень. Місце S-програми в реальному світі ілюструє рис. 1.3. При цьому постановка задачі, програма та її розв’язання пов’язані із зовнішнім світом, проте такий зв'язок випадковий.

Для S-програм характерна повна визначеність вихідної задачі, вимог і значень, а тому S-програми після створення не змінюються. А якщо S-програма змінюється, то зміни не повинні порушити відповідності вхід/вихід, оскільки інакше вона розв’язуватиме іншу задачу, і це буде інша програма.

Рис. 1.3 Місце S-програми в реальному світі

Р-програма – це така програма яка розв’язує задачу, що не має точної постановки. Тому специфікація задачі та розв’язання наближені, уособлюючи абстрактну модель реальної ситуації, і після порівняння з вимогами реального світу уточнюватимуться через зміну програми. Проте це буде не нова, а стара програма. Місце Р-програми в реальному світи ілюструє рис. 1.4.

Рис. 1.4. Місце Р-програми в реальному світі

Прикладом є програма що обчислює прогноз погоди. У такій програмі результати розрахунків порівнюються з реальними даними про погоду, а методи прогнозування вдосконалюються зі змінною самої програми.

Е-програма – це програма, яка розв’язує таку задачу, що потребує її присутності в контексті реального світу. У процесі використання Е-програми в реальному світі становлення до неї зазвичай змінюється і постає потреба змінити програму. При цьому змінена Е-програма, так само як і Р-програма, не буде новою програмою. Прикладом такої програми являється програма керування тренажером для реального об’єкту. Місце Е-програми в реальному світи ілюструє рис. 1.5.

Зазначені відмінності між типами програм є принциповими й можуть впливати на стосунки між замовником програми і виконавцем – розробником, вибір типу життєвого циклу або обсяг фінансування. Наприклад, формуючу стосунки із замовником розробник залежно від типу програми (у разі Р- і Е-програм) має передбачити у проекті неодмінні зміни програм.

Рис. 1.5 Місце Е-програми в реальному світі

Зазвичай Рі Е програми називають програмами-застосуваннями, або комп’ютерними застосуваннями, або програмними системами.

1.6. Питання для самоперевірки

  1. Поясніть загальні принципи роботи сучасної ЕОМ і наведіть структурну схему ЕОМ за Нейманом.

  2. Дайте визначення програми, комп’ютерної програми.

  3. Які властивості притаманні комп’ютерній програмі.

  4. Що таке програмування? Хто такий програміст?

  5. Дайте визначення мови програмування.

  6. Які властивості має програма як система?

  7. Наведіть класифікацію програм. Дайте характеристику S - P - та E-програм.

  8. Що таке інтерфейс програми?

  9. Як утворюється межа програми?

  10. Поясність особливості двох типів зв’язків, які притаманні програмі.

  11. Назвіть англійського вченого який вперше запропонував обчислювальну машину.

  12. Назвіть першого програміста у світі.

  13. Наведіть коли, де, і ким було створено першу ЕОМ в Європі.

  14. Наведіть коли, де, і ким було створено першу ЕОМ в континентальній Європі.

  15. Наведіть положення класифікування операторів О. А. Ляпуновим.

  16. Назвіть першого програміста в колишньому СРСР.

  17. Наведіть приклад алгоритму.