Рейтинг користувача: 3 / 5

Активна зіркаАктивна зіркаАктивна зіркаНеактивна зіркаНеактивна зірка
 

Розділ 1. Види програмування

1.1. Машинні та високорівневі мови програмування

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

Мова програмування − це формалізована мова, призначена для описування алгоритмів розв’язування задач на ЕОМ. Мова програмування дає змогу записати алгоритм у термінах, зрозумілих компілятору, який перекладає його на зрозумілу для процесора машинну мову.

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

Електронні схеми кожного комп’ютера можуть розпізнавати та виконувати обмежений набір простих команд. Перед виконанням усі програми повинні бути перетворені у послідовність таких команд:

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

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

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

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

Інтепретатор зчитує програму по одному рядку і одразу ж виконує машинні інструкції, що містяться у цьому рядку, а компілятор зчитує програму повністю і лише після цього перетворює її в об’єктний модуль, тобто у вигляд, який безпосередньо може виконати комп’ютер. Об’єктний модуль ще називають двійковим (бінарним) або машинним кодом.

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

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

За рівнем абстракції розрізняють мови програмування низького та високого рівнів.

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

На відміну від мов програмування низького рівня, мови програмування високого рівня є набагато простішими у розумінні та зручнішими у написанні коду. Програма, написана такою мовою, взаємодіє з апаратними ресурсами через засоби операційної системи, тому вона потребує подальшого перекладу у машинний код. Для такого перекладу використовуються програми-транслятори.

Використання мов високого рівня порівняно з використанням асемблера має ряд таких переваг []:

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

1.2. Парадигми програмування

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

Основними парадигмами програмування є декларативне та імперативне. Декларативне програмування описує, який результат необхідно отримати, замість опису послідовності дій для отримання цього результату. Імперативне програмування описує процес отримання результатів як послідовність інструкцій зміни стану програми.

До декларативної парадигми належать функційне та логічне програмування, а до імперативної – структурне, процедурне, модульне (об’єктне), об’єктно-орієнтоване програмування [].

1.3. Системне програмування

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

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

Операційна система (ОС) – це програмне забезпечення, що реалізує зв’язок між прикладними програмами й апаратними засобами комп’ютера [].

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

1.4. Структурне та процедурне програмування

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

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

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

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

1.5. Модульне та об’єктно-орієнтоване програмування

Зі зростанням обсягу програм і складності даних з’явилася проблема структурної організації даних, яку частково вирішило модульне (об’єктне) програмування.

Основна ідея модульності полягає у забезпеченні доступу до даних і оперування ними незалежно від способу їхнього конкретного кодування у пам’яті комп’ютера. Дані разом із функціями їхнього опрацювання вбудовують (інкапсулюють) в окрему одиницю програми – модуль.

Модулі мають дві головні риси. По-перше, вони об’єднують структури даних з алгоритмами їхнього опрацювання. По-друге, у них відокремлено специфікацію від реалізації інкапсульованих у модулі конструкцій, і це перетворює модуль на абстрактний тип даних [].

Логічне об’єднання даних та операцій над ними є головною ідеєю об’єктно-орієнтованої методології, яка забезпечила подолання труднощів процедурного програмування.

Об’єктно-орієнтоване програмування (ООП) – це технологія програмування, яка ґрунтується на понятті класів, об’єктів та успадкуванні елементів базових класів похідними класами.

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

Об’єктно-орієнтована методологія орієнтована на колективне розроблення великих програмних систем групою програмістів і складається з об’єктно-орієнтованого аналізу, проектування та програмування.

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

Об’єктно-орієнтоване проектування полягає у формуванні класів, об’єктів та відношень між ними на основі атрибутів (характеристик) та операцій (дій) виділених концептуальних сутностей.

Принципами об’єктно-орієнтованого проектування є:

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

Об’єктно-орієнтовані мови (ООМ) поділяють на дві групи: чисті та гібридні.

Чисті ООМ, до яких належать Objective C, Java, C#, Ruby, Action Script 3, у повній мірі підтримують концепцію ООП. У цих мовах усе розглядається як елементи певних класів і у програмі не можна оперувати з глобальними даними або функціями, що не належать класам.

Гібридні ООМ, такі як Object Pascal, C++, Perl, є більш універсальними, оскільки реалізують засоби процедурного та об’єктно-орієнтованого програмування. Процедурне програмування використовується для економного використання ресурсів комп’ютера та побудови швидкодіючих програм, однак вимагає більших затрат часу для створення проекту програми. ООП забезпечує зменшення часу розроблення та кращу керованість програмного проекту, особливо при його колективній розробці, необхідному супроводі та  модифікації при експлуатації. Необгрунтоване поєднання обох засобів в одній програмі може призвести до зменшення надійності її роботи [].

1.6. Функційне програмування

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

Функція є базовим елементом функційного програмування. Функції використовуються для всього, навіть для простих обчислень. Змінні також заміняються функціями. У функційному програмуванні змінні є синонімами виразів, їх не можна змінювати, тобто у кожну змінну значення можна записати лише один раз. Функційні програми можуть зберігати стан, але вони використовують для цього не змінні, а функції. За рахунок такого підходу немає потреби спеціально опрацьовувати “deadlocks” або “race conditions”, тому функційне програмування дуже добре вирішує питання паралелізму і розподілених обчислень [].

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

Функції першого класу забезпечують зберігання функції в змінних. Функції вищого порядку дають змогу приймати як аргумент функції та повертати інші функції. Функції вищого порядку ще називають лямбда-функції. Чисті функції не змінюють жодних даних, вони залежать тільки від своїх параметрів і повертають тільки свій результат. Замикання забезпечує збереження певних даних у функції та робить їх доступними лише для особливої функції повернення. Незмінний стан забезпечує механізм, що забороняє зміну жодного зі станів [].

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

Найвідомішими мовами функційного програмування є XQuery/XSLT, Haskell, LISP, Erlang, JavaScript‎, Python, Scala та Clojure.

(Для ознайомлення з повним текстом статті необхідно залогінитись)