031.1 Урок 1
Сертифікат: |
Основи веброзробки |
---|---|
Версія: |
1.0 |
Розділ: |
031 Розробка програмного забезпечення та вебтехнології |
Тема: |
031.1 Основи розробки програмного забезпечення |
Урок: |
1 з 1 |
Вступ
Для того, щоб задати алгоритм роботи найперших комп’ютерів потрібно було виконати багато виснажливої роботи з підключення кабелів до розеток, по суті заново зібрати комп’ютер. Тому незабаром вчені в галузі інформатики почали безперервний пошук простих способів вказати комп’ютеру, що йому робити. Цей розділ дає початкові поняття про інструменти програмування. Обговорюються ключові способи, за допомогою яких текстові інструкції, записані мовою програмування, представляють завдання, які хоче виконати програміст, а також інструменти, які перетворюють цю програму на іншу форму, програму написану машинною мовою, яку вже може виконувати комп’ютер.
Note
|
В цих матеріалах терміни програма і застосунок будуть взаємозамінними. |
Вихідний код
Зазвичай під час розробки застосунку програміст виконує опис завдання у вигляді тексту, який називається вихідним кодом. Вихідний код ретельно визначається мовою програмування, яка представляє те, що може робити комп’ютер у високорівневій абстракції, яка зрозуміла для людини. Також були розроблені інструменти, які дають змогу як програмістам, так і не професійним програмістам описувати свої думки візуально, але написання вихідного коду все ще є переважаючим способом програмування.
Подібно до того, як природна мова має іменники, дієслова та конструкції для структурованого вираження ідей, слова та розділові знаки в мові програмування є символічним представленням операцій, які будуть виконуватися на комп’ютері.
У цьому сенсі вихідний код не дуже відрізняється від будь-якого іншого тексту, у якому автор використовує усталені правила природної мови для спілкування з читачем. У випадку з вихідним кодом «читач» є машиною, тому текст не може містити неоднозначності чи протиріччя, навіть тих, які здаються очевидними.
І, як і будь-який текст, у якому детально обговорюється певна тема, вихідний код також має бути добре структурований і логічно організований під час розробки складних програм. Дуже прості програми та навчальні приклади можуть бути збережені в кількох рядках одного текстового файлу, який містить весь вихідний код програми. Більш складні програми можна розділити на тисячі файлів, кожен з яких може містити тисячі рядків.
Вихідний код професійних застосунків має бути організований по різних папках, зазвичай пов’язаних з певною метою. Програма чату, наприклад, може бути організована у двох папках: одна містить файли коду, який обробляє передачу та отримання повідомлень мережею, та інша папка, яка містить файли, що відповідають за створення інтерфейсу та реакцію на дії користувача. Дійсно, зазвичай застосунок має багато папок і підпапок з файлами вихідного коду, призначеного для дуже конкретних завдань.
Більше того, вихідний код не завжди ізольований у власних файлах, де все написано однією мовою. У вебзастосунках, наприклад, HTML-документ може мати вбудований код JavaScript, щоб покращити документ додатковою функціональністю.
Редактори коду та IDE
Різноманітність способів написання вихідного коду може лякати. Тому багато розробників користуються перевагами інструментів, які допомагають при написанні та тестуванні програм.
Файл вихідного коду – це просто текстовий файл. Таким чином, його можна редагувати у будь-якому текстовому редакторі, незалежно від того, наскільки це просто. Щоб було легше відрізняти вихідний код від звичайного тексту, кожна мова використовує розширення імені файлу: .c
для мови C, .py
для Python, .js
для JavaScript тощо. Універсальні редактори часто розуміють вихідний код популярних мов програмування достатньо добре, і можуть додавати курсив, кольори та відступи, щоб зробити код зрозумілим.
Не кожен розробник готовий редагувати вихідний код у редакторі загального призначення. Інтегроване середовище розробки (IDE, Integrated Development Environment) надає текстовий редактор разом із інструментами, які допомагають програмісту уникнути синтаксичних помилок та очевидних невідповідностей. Ці редактори особливо рекомендовані для менш досвідчених програмістів, але досвідчені програмісти також їх використовують.
Популярні IDE, такі як Visual Studio, Eclipse і Xcode, інтелектуально стежать за тим, що вводить програміст, часто пропонуючи слова для використання (автозавершення) і перевіряючи код в режимі реального часу. IDE можуть навіть запропонувати автоматичне відлагодження та тестування для виявлення проблем щоразу, коли змінюється вихідний код.
Деякі більш досвідчені програмісти вибирають менш інтуїтивно зрозумілі редактори, такі як Vim, які пропонують більшу гнучкість і не вимагають встановлення додаткових пакунків. Ці програмісти використовують зовнішні, автономні інструменти, для додавання функцій, які вбудовані, коли ви використовуєте IDE.
Підтримка коду
Незалежно від того, використовується IDE чи окремі інструменти, важливо використовувати якусь систему контролю версій (VCS, Version Control System). Вихідний код постійно розвивається, тому що необхідно виправляти недоліки та вносити покращення. Неминучим наслідком цієї еволюції є те, що виправлення та покращення можуть заважати іншим частинам застосунків у великій базі коду. Інструменти контролю версій, такі як Git, Subversion і Mercurial, записують усі зміни, внесені до коду, а також інформацію про те, хто вносив ці зміни, що дає змогу відстежувати та в кінцевому результаті провести відновлення після невдалої модифікації.
Крім того, інструменти контролю версій дають змогу кожному розробнику в команді працювати над копією файлів вихідного коду, не заважаючи роботі інших програмістів. Після того, як нові версії вихідного коду будуть готові та протестовані, інші члени команди можуть вносити виправлення або покращення до однієї копії.
Git, найпопулярніша система контролю версій на сьогодні, що дає змогу підтримувати багато незалежних копій сховища різними людьми, які діляться своїми змінами за бажанням. Однак, незалежно від того, використовують децентралізовану чи централізовану систему контролю версій, більшість команд підтримують одне надійне сховище, на вихідний код і ресурси якого можна покладатися. Кілька онлайн-сервісів пропонують сховище для репозиторіїв вихідного коду. Найпопулярнішими з цих сервісів є GitHub і GitLab, але також варто згадати GNU проєкти Savannah.
Мови програмування
Існує велика різноманітність мов програмування; кожне десятиліття з’являються нові. Кожна мова програмування має свої правила і рекомендована для певних цілей. Хоча мови демонструють поверхневі відмінності в синтаксисі та ключових словах, що насправді відрізняє мови, це глибокі концептуальні підходи, які вони представляють, відомі як парадигми.
Парадигми
Парадигми визначають передумови, на яких базується мова програмування, особливо щодо того, як має бути структурований вихідний код.
Розробник виходить із парадигми мови програмування, щоб сформулювати завдання, які має виконувати машина. Ці завдання, передусім, символічно виражаються словами та синтаксичними конструкціями, які пропонує ця мова.
Мова програмування є процедурною, коли інструкції, представлені у вихідному коді, виконуються в послідовному порядку як сценарій фільму. Якщо вихідний код розділений на функції або підпрограми, основна програма дбає про послідовність виклику функцій.
Наступний код є прикладом процедурної мови. Написаний на C, він визначає змінні для представлення сторони, площі та об’єму географічних фігур. Значення змінної side
призначається в main()
, яка є функцією, що викликається під час виконання програми. Змінні area
та volume
обчислюються в підпрограмах square()
та cube()
, які передують основній функції:
#include <stdio.h>
float side;
float area;
float volume;
void square(){ area = side * side; }
void cube(){ volume = area * side; }
int main(){
side = 2;
square();
cube();
printf("Volume: %f\n", volume);
return 0;
}
Порядок дій, визначений у main()
, визначає послідовність станів програми, що характеризується значеннями змінних side
, area
, і volume
. Приклад завершується відображенням значення volume
оператором printf
.
З іншого боку, парадигма об’єктно-орієнтованого програмування (ООП, OOP – Object-Oriented Programming) має своєю основною характеристикою поділ стану програми на незалежні підстани. Ці підстани та пов’язані з ними операції є об’єктами, які називаються так тому, що вони мають більш-менш незалежне існування в програмі, а ще вони мають конкретні цілі.
Окремі парадигми не обов’язково обмежують тип завдання, яке може виконувати програма. Код з попереднього прикладу можна переписати відповідно до парадигми ООП мовою C++:
#include <iostream>
class Cube {
float side;
public:
Cube(float s){ side = s; }
float volume() { return side * side * side; }
};
int main(){
float side = 2;
Cube cube(side);
std::cout << "Volume: " << cube.volume() << std::endl;
return 0;
}
Функція main()
все ще присутня. Але тепер є нове слово, class
, яке вводить визначення об’єкта. Визначений клас під назвою Cube
містить власні змінні та підпрограми. В ООП змінну також називають атрибутом (attribute), а підпрограму — методом (method).
Пояснення всього коду C++ у цьому прикладі виходить за памки цього розділу. Тут для нас важливо те, що Cube
містить атрибут side
та два методи. Метод volume()
обчислює об’єм куба.
Можна створити кілька незалежних об’єктів з одного класу, а класи можуть складатися з інших класів.
Майте на увазі, що ті самі функції можна записати по-різному і що приклади в цьому розділі занадто спрощені. C і C++ мають набагато більш складні функції, які дозволяють створювати набагато складніші та практичніші конструкції.
Більшість мов програмування не нав’язують суворо одну парадигму, але дозволяють програмістам вибирати різні аспекти тієї чи іншої парадигми. JavaScript, наприклад, об’єднує в собі аспекти різних парадигм. Програміст може розкласти всю програму на функції, які не мають спільного стану одна з одною:
function cube(side){
return side*side*side;
}
console.log("Volume: " + cube(2));
Хоча цей приклад подібний до процедурного програмування, зверніть увагу, що функція отримує копію всієї інформації, необхідної для її виконання, і завжди видає той самий результат для того самого параметра, незалежно від змін, які відбуваються поза областю дії цієї функції. Ця парадигма, яка називається функціональною, знаходиться під сильним впливом математичного формалізму, де кожна операція є самодостатньою.
Інша парадигма охоплює декларативні мови, які описують стани, у яких ви хочете, щоб система перебувала. Декларативна мова може визначати, як досягти зазначених станів. SQL, універсальну мову запитів до баз даних, іноді називають декларативною мовою, хоча насправді вона займає унікальну нішу в пантеоні мов програмування.
Не існує універсальної парадигми, яку можна було б прийняти в будь-якому контексті. Вибір мови також може бути обмежений тим, які мови підтримуються платформою або середовищем виконання, де буде використовуватися програма.
Наприклад, вебзастосунок, який використовуватиметься браузером, має бути написаний на JavaScript, мовою, яка універсально підтримується браузерами. (Можна використати кілька інших мов, оскільки вони забезпечують конвертори для створення JavaScript.) Тож для браузера, який іноді називають client side або front end вебзастосунку, розробник повинен буде використовувати парадигми, дозволені в JavaScript. Серверна сторона або back end застосунку, що обробляє запити від браузера, зазвичай програмується іншою мовою; PHP є найбільш популярним для цієї мети.
Незалежно від парадигми, кожна мова має попередньо вбудовані бібліотеки функцій, які можна включити до коду. Математичні функції, на зразок тих, які проілюстровані в прикладі коду, не потрібно впроваджувати з нуля, оскільки мова вже має функцію, готову до використання. Наприклад, JavaScript надає об’єкт Math
з найбільш поширеними математичними операціями.
Ще більш спеціалізовані функції зазвичай доступні від постачальника мови або сторонніх розробників. Ці додаткові бібліотеки ресурсів можуть бути у формі вихідного коду; тобто в додаткових файлах, які включені у файл, де вони будуть використовуватися. У JavaScript вбудовування здійснюється за допомогою import from
:
import { OrbitControls } from 'modules/OrbitControls.js';
Цей тип імпорту, де вбудований ресурс також є файлом вихідного коду, найчастіше використовується в так званих інтерпретованих мовах. Компільовані мови дають змогу, серед іншого, включати попередньо скомпільовані машинною мовою функції, тобто скомпільовані бібліотеки. Наступний розділ пояснює відмінності між цими типами мов.
Компілятори та інтерпретатори
Як ми вже знаємо, вихідний код — це символічне представлення програми, яку для запуску необхідно перекласти на машинну мову.
Інакше кажучи, є два можливі способи зробити такий переклад: попередньо конвертувати вихідний код для майбутнього виконання або конвертувати код безпосередньо в момент його виконання. Мови першого типу називаються компільованими мовами, а мови другого типу називаються інтерпретованими мовами. Деякі інтерпретовані мови передбачають компіляцію як опцію, яка швидше запускатиме програму.
У компільованих мовах існує чітке розмежування між вихідним кодом програми та самою програмою, яка буде виконуватися комп’ютером. Після компіляції програма зазвичай працюватиме лише на тій операційній системі та платформі, для яких її було скомпільовано.
В інтерпретованій мові сам вихідний код розглядається як програма, а процес перетворення на машинну мову прозорий для програміста. Для мов інтерпретації прийнято називати вихідний код script (скрипт або сценарій). Інтерпретатор перекладає сценарій на машинну мову для системи, на якій він працює.
Компіляція і компілятори
Мова програмування C є одним із найвідоміших прикладів компільованої мови. Найбільшою перевагою мови C є її гнучкість і продуктивність. На мові C можна програмувати як високопродуктивні суперкомп’ютери, так і мікроконтролери для побутової техніки. Іншими прикладами популярних компільованих мов є C++ і C# (C sharp). Як випливає з їх назв, ці мови отримали натхнення від C, але містять функції, що підтримують об’єктно-орієнтовану парадигму.
Одна й та сама програма, написана на C або C++, може бути скомпільована для різних платформ, що вимагає незначних змін або зовсім не змінює вихідний код. Саме компілятор визначає цільову платформу програми. Існують як специфічні для платформи компілятори, так і міжплатформні компілятори, такі як GCC (що означає GNU Compiler Collection), які можуть створювати двійкові програми для багатьох різних архітектур.
Note
|
Існують також інструменти, які автоматизують процес компіляції. Замість безпосереднього виклику компілятора програміст створює файл із зазначенням різних кроків компіляції, які мають виконуватися автоматично. Традиційним інструментом, який використовується для цієї мети, є |
Процес компіляції не завжди створює двійкову програму машинною мовою. Існують компільовані мови, які створюють програму у форматі, який зазвичай називають bytecode. Як і сценарій, байт-код не є мовою для певної платформи, тому для нього потрібна програма-інтерпретатор, яка транслює його в машинну мову. У цьому випадку програма-інтерпретатор називається просто runtime.
Мова Java використовує такий підхід, тому скомпільовані програми, написані на Java, можна використовувати в різних операційних системах. Незважаючи на свою назву, Java не пов’язана з JavaScript.
Байт-код ближче до машинної мови, ніж вихідний код, тому його виконання, як правило, відбувається порівняно швидше. Оскільки під час виконання байт-коду все ще відбувається процес перетворення, важко отримати продуктивність, еквівалентну програмі, яка скомпільована машинною мовою.
Інтерпретація та інтерпретатори
У мовах інтерпретації, таких як JavaScript, Python і PHP, програму не потрібно попередньо компілювати, що полегшує її розробку та модифікацію. Замість його компіляції сценарій виконується іншою програмою, яка називається інтерпретатором. Зазвичай інтерпретатор мови називається на честь самої мови. Інтерпретатором сценарію Python, наприклад, є програма під назвою python
. Інтерпретатором JavaScript найчастіше є браузер, але скрипти також можуть виконуватися програмою node
поза браузером. Оскільки скрипт перетворюється на двійкові інструкції кожного разу, коли виконується, то програма, написана інтерпретованою мовою, як правило, повільніша, ніж еквівалентна, написана компільованою мовою.
Ніщо не заважає одній програмі мати компоненти, написані різними мовами. За потреби ці компоненти можуть обмінюватися даними через взаємозрозумілий інтерфейс прикладного програмування (API, Application Programming Interface).
Мова Python, наприклад, має сучасні досконалі можливості аналізу даних і табуляції даних (обробки даних з організацією їх у таблицю). Розробник може вибрати Python для написання частин програми, які займаються цими аспектами, та іншу мову, наприклад C++, для виконання більш важкої числової обробки. Цю стратегію можна застосувати, навіть якщо немає API, який забезпечує прямий зв’язок між двома компонентами. Код, написаний на Python, може генерувати файл в такому форматі, щоб його могла використовувати програма, наприклад, написана на C++.
Хоча можна написати майже будь-яку програму будь-якою мовою, розробник повинен обрати ту, яка найбільше відповідає меті застосунку. При цьому ви отримуєте вигоду від повторного використання вже перевірених і добре задокументованих компонентів.
Вправи до посібника
-
Програми якого типу можна використовувати для редагування вихідного коду?
-
Який інструмент допомагає інтегрувати роботу різних розробників в одній базі коду?
Дослідницькі вправи
-
Припустимо, ви хочете написати браузерну 3D-гру. Вебзастосунки та ігри програмуються на JavaScript. Хоча можна написати всі графічні функції з нуля, продуктивніше використовувати для цього готову бібліотеку. Які бібліотеки сторонніх виробників надають можливості для 3D-анімації в JavaScript?
-
Які інші мови, окрім PHP, можна використовувати на серверній стороні вебзастосунку?
Підсумки
Цей урок охоплює основні концепції розробки програмного забезпечення. Розробник повинен бути обізнаний щодо важливих мов програмування та сценарію правильного використання для кожної з них. Цей урок охоплює наступні концепції та процедури:
-
Що таке вихідний код.
-
Редактори вихідного коду та відповідні інструменти.
-
Процедурна, об’єктно-орієнтована, функціональна та декларативна парадигми програмування.
-
Характеристики компільованих та інтерпретованих мов.
Відповіді до вправ посібника
-
Програми якого типу можна використовувати для редагування вихідного коду?
Цілком логічно, будь-яку програму, що надає можливість редагування звичайного тексту.
-
Який інструмент допомагає інтегрувати роботу різних розробників в одній базі коду?
Система контролю версій вихідного коду, на кшталт Git.
Відповіді до дослідницьких вправ
-
Припустимо, ви хочете написати браузерну 3D-гру. Вебзастосунки та ігри програмуються на JavaScript. Хоча можна написати всі графічні функції з нуля, продуктивніше використовувати для цього готову бібліотеку. Які бібліотеки сторонніх виробників надають можливості для 3D-анімації в JavaScript?
Існує багато варіантів бібліотек 3D-графіки для JavaScript, такі як threejs і BabylonJS.
-
Які інші мови, окрім PHP, можна використовувати на серверній стороні вебзастосунку?
Будь-яка мова, яку підтримує серверний HTTP-застосунок, яка використовується на сервері. Деякі приклади: Python, Ruby, Perl і звісно JavaScript.