🎧 New: AI-Generated Podcasts Turn your study notes into engaging audio conversations. Learn more

матеріали лекцій 4-18.pdf

Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Full Transcript

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

Тема 1. Вступ до програмування. Комп’ютери розуміють тільки дуже обмежений набір інструкцій і щоб змусити їх щось зробити, потрібно чітко сформулювати завдання, використовуючи ці ж інструкції. Програма (або «додаток», «програмне забезпечення», «софт») — це набір інструкцій, які вказують комп’ютеру, що йому потрібно зробити. Фізична частина комп’ютера, яка виконує ці інструкції, називається «залізом» або апаратною частиною (наприклад: процесор, материнська плата, оперативна пам’ять тощо). Машинна мова Процесор комп’ютера не здатен розуміти мови програмування (такі як C++, Java, Python і т.д.) напряму. Дуже обмежений набір інструкцій, які розуміє процесор, називається машинним кодом (або «машинною мовою»). Організація даних інструкцій виходить за рамки цього уроку, але варто відзначити наступні дві речі: По-перше, кожна команда (інструкція) складається тільки з двох цифр: 0 або 1. Ці числа називаються бітами (скор. від англ. «binary digit») або двійковим кодом. Наприклад, ось команда машинної мови архітектури x86: 10110000 01100001. По-друге, кожен набір бітів трансформується процесором в інструкції для виконання певного завдання (наприклад, порівняти два числа між собою або перемістити вказане число в певну комірку пам’яті). Різні типи процесорів зазвичай мають різні набори інструкцій, тому інструкції, які працюватимуть на процесорах Intel цілком ймовірно, що не працюватимуть на процесорах Xenon (які використовуються в ігрових консолях Xbox). Раніше, коли комп’ютери тільки починали масово поширюватися, програмісти писали більшість програм тільки на машинній мові, що було дуже незручно, важко і займало набагато більше часу, ніж зараз. Мова Асемблера Оскільки програмувати на машинній мові є специфічним задоволенням, то програмісти винайшли мову Асемблера. У цій мові кожна команда ідентифікується коротким ім’ям (а не набором одиниць з нулями), і змінними можна управляти через їх імена. Таким чином, писати/читати код стало набагато легше. Проте процесор все рівно не здатен розуміти мову асемблера напряму. Цю мову також потрібно перекладати в машинний код. Асемблер — це транслятор (перекладач), який перекладає код, написаний на мові асемблера, в машинну мову. Перевагою Асемблера є його ефективність (а саме швидкість виконання) і він досі використовується, коли швидкість виконання має вирішальне значення. Причина даної переваги полягає в тому, що код, написаний на мові асемблера, адаптується до кожного конкретного процесора окремо. Програми, адаптовані під один процесор, не будуть працювати з іншим. Крім того, для того, щоб програмувати на Асемблері, потрібно знати дуже багато не дуже читабельних інструкцій для виконання навіть простих завдань. Наприклад, ось команда, яка записана вище, але вже на мові асемблера: mov al, 061h Високорівнені мови програмування Для вирішення проблем читабельності коду і надмірної складності були розроблені високорівневі мови програмування. C, C++, Pascal, Java, JavaScript і Perl відносяться до високорівневих мов програмування, однією з основних властивостей яких є можливість запуску на різних архітектурах процесорів. Програми високорівневих мов програмування також повинні бути перекладені в машинну мову перед їх виконанням процесором. Є два варіанта перекладу в машинну мову: компіляція, яка виконується компілятором; інтерпретація, яка виконується інтерпретатором. Компілятор — це програма, яка зчитує код і створює автономну (здатну працювати незалежно від іншого апаратного або програмного забезпечення) виконувану програму, яку процесор здатен зрозуміти напряму. При запуску програми весь її код повністю компілюється, а потім створюється виконуваний файл і вже при повторному запуску цієї програми компіляція (другий раз) не виконується. Процес компіляції можна зобразити наступним чином: Інтерпретатор — це програма, яка виконує код напряму, без його попередньої компіляції в виконуваний файл. Інтерпретатори більш гнучкі, але менш ефективні, так як процес інтерпретації виконується повторно при кожному новому запуску програми. Процес інтерпретації можна зобразити наступним чином: Будь-яка мова програмування може або компілюватися, або інтерпретуватися. Однак, такі мови, як C, C++ і Pascal — компілюються, в той час як “скриптові” мови програмування, такі, як Perl і JavaScript — інтерпретуються. Деякі мови програмування (наприклад, Java) можуть як компілюватися, так і інтерпретуватися. Переваги високорівневих мов програмування Перевага №1: Легше писати/читати код. Ось вищенаведена команда, але вже на мові C++: а = 97; Перевага №2: Потрібно менше інструкцій для виконання завдань. У мові C++ ви можете зробити щось на зразок наступного в одному рядку: а = Ь * 2 + 5; В мові асемблера вам довелося б використати 5 або 6 інструкцій. Перевага №3: Вам не потрібно турбуватися про такі деталі, як завантаження змінних в регістри процесора. Компілятор або інтерпретатор бере це на себе. Перевага №4: Високорівневі мови програмування підходять під різні архітектури (але є один нюанс): Нюанс полягає в тому, що більшість платформ, такі як Microsoft Windows, мають свої власні специфічні функції, за допомогою яких писати код набагато легше. Але ціна цьому — кросплатформність, тому що функції, специфічні для однієї платформи, цілком ймовірно, що не працюватимуть на іншій платформі. Тема 2. Введення в мови програмування С і С++ Перед C++ був C. Мова програмування C (вимовляється як “Сі”) була розроблена в 1972 році Деннісом Рітчі в Bell Telephone Laboratories в якості системної мови програмування, тобто мови для написання операційних систем. Основним завданням Рітчі було створення мінімалістичної мови програмування, яка легко компілюється, надає ефективний доступ до пам’яті, відносно швидко виконується і на якій можна було б писати ефективний код. Таким чином була розроблена високорівнена мова програмування С, яка багато в чому відноситься до низькорівневих мов програмування, при цьому залишаючись незалежною від платформ, на яких виконується. В результаті, мова C стала настільки ефективною і гнучкою, що в 1973 році Денніс Рітчі і Кен Томпсон переписали більше половини операційної системи UNIX, використовуючи цю мову. Більшість попередніх операційних систем були написані на мові асемблера, але на відміну від Ассемблера, де програми пишуться під конкретні процесори, відмінна кросплатформність мови C дозволила перекомпілювати операційну систему UNIX на інші типи комп’ютерів, прискорюючи її популяризацію. Мова C і операційна система UNIX тісно пов’язані між собою, і популярність першої частково пов’язана з успіхом другої. В 1978 році Брайан Керніган і Денніс Рітчі опублікували книгу під назвою “Мова програмування Сі”. Ця книга, більш відома як “K&R” (перші букви з прізвищ авторів), стала стандартом і своєрідною інструкцією до мови С. Коли в проектах потрібна була максимальна кросплатформність, то програмісти дотримувалися рекомендацій, описаних в “K&R”, оскільки більшість компіляторів на той час були реалізовані згідно зі стандартами, описаними в цій же книзі. У 1983 році Американський національний інститут стандартів (скор. “ANSI” від англ. “American National Standards Institute”) сформував комітет для встановлення офіційного стандарту мови C. Завершили вони в 1989 році, випустивши стандарт C89, більш відомий як ANSI C. У 1990 Міжнародна організація по стандартизації (скор. “ISO” від англ. “International Organization for Standardization”) прийняла ANSI C (з невеликими змінами). Ця версія C стала відома як C90. Після цього всі компілятори адаптувалися під вимоги ANSI C/C90 і програми, в яких потрібна була максимальна кросплатформність, писалися уже згідно з вказаними стандартами. У 1999 році комітет ANSI випустив нову версію мови C, яка отримала назву C99. Вона перейняла багато особливостей, які вже були реалізовані в компіляторах (у вигляді різних розширень) або в C++. Мова програмування C++ Мова програмування C++ (вимовляється як «Сі плюс плюс») була розроблена Б’ярном Страуструпом в Bell Telephone Laboratories в 1979 році в якості доповнення до мови C. Вона додала безліч нових функціональних можливостей в мову С, однією з яких було об’єктно-орієнтованість даної мови. Щодо об’єктно-орієнтованого програмування (ООП) і його відмінностей від традиційних методів програмування ми поговоримо на відповідних уроках. Мова C++ була схвалена комітетом ISO в 1998 році і потім знову в 2003 році (під назвою C++03). Потім були наступні оновлення версій (раз в 3 роки), котрі додали ще більше функціональних можливостей: C++11 в 2011 році; C++14 в 2014 році; C++17 в 2017 році; С++20 в 2020 році. Філософія мов програмування С і С++ Філософію мов програмування С і C++ можна визначити виразом “довіряти програмісту”. Наприклад, компілятор не заважатиме вам зробити щось нове (що має сенс), але також не заважатиме вам зробити щось таке, що може призвести до збою. Це одна з головних причин, чому так важливо знати те, що можете робити в С/C++, так і те, що ви не повинні робити. Тема 3. Введення в розробку програмного забезпечення Перед написанням і виконанням нашої першої програми, ми повинні зрозуміти, з чого взагалі складається розробка програмного забезпечення на мові програмування C++. Проілюструємо процес розробки програмного забезпечення (скор. “ПЗ”): Крок №1: Визначте проблему, яку потрібно вирішити Цей крок називається «Що?». Тут ви повинні зрозуміти, що ж саме ви хочете, щоб ваша програма виконувала. Цей крок може бути як найпростішим, так і найскладнішим. Все, що вам потрібно — це чітко сформулювати головну ідею вашої програми. Тільки після цього ви зможете перейти до наступного кроку. Ось декілька прикладів виконання кроку №1: “Я хочу написати програму, яка буде вираховувати середнє арифметичне переданих їй чисел.” “Я хочу написати програму, в якій буде 2D-лабіринт, по якому користувач зможе пересуватися.” “Я хочу написати програму, яка аналізуватиме ціни акцій на біржах і прогнозуватиме скачки цін на акції вгору чи вниз.” Крок №2: Визначте, як ви вирішуватимете проблему Тут ми відповідаємо на запитання «Як?». Як саме ми вирішуватимемо проблему з кроку №1? Цим кроком досить часто нехтують при розробці програмного забезпечення. Справа в тому, що способів вирішення проблеми може бути багато, тільки от деякі з цих способів можуть бути хорошими, деякі погані, а деякі просто жахливі. Ви повинні навчитися розрізняти якість пропонованих рішень. Дуже часто можна спостерігати ситуацію, коли у програміста виникає ідея і він відразу ж сідає за стіл програмувати. Як ви вже могли б здогадатися, такий сценарій далеко не завжди призводить до хороших рішень і хорошого коду. Як правило, більшість хороших рішень мають наступні характеристики: простота; наявність документації (з інструкціями і коментарями); модульність: будь-яка частина програми може бути повторно використана або змінена пізніше без впливу на інші частини коду; надійність: наявність системи обробки помилок і екстрених випадків. Коли ви відразу ж починаєте програмувати після виникнення геніальної ідеї, ви сідаєте за стіл і думаєте, що зробите це, ось це і ще ось це. Таким чином ви приймаєте рішення, які дозволять вам швидше виконати поставлене завдання. Однак це може призвести до того, що ви отримаєте програму, яку пізніше буде важко модифікувати, підтримувати або взагалі отримаєте десятки (якщо не сотні) помилок на етапі компіляції. Згідно з законом Парето, програміст витрачає близько 20% часу на написання програми і близько 80% часу на її відлагодження (виправлення помилок) або підтримку (додання нових функціональних можливостей). Тому цілком логічно, що краще витратити додатковий час на обдумування кращого способу вирішення проблеми перед фактичним написанням коду, ніж потім витрачати решту 80% часу на пошук та виправлення помилок. Крок №3: Напишіть програму Для того, щоб написати програму, вам необхідно мати знання вибраної вами мови програмування та середовище розробки. Програму можна написати, використовуючи будь-який редактор, навіть той ж Блокнот в Windows або текстовий редактор Vi в Unix. Проте рекомендується використовувати середовище розробки. Редактор типового програміста, як правило, має наступні особливості, які полегшують процес програмування: Нумерація рядків. Ця функція надзвичайно корисна при відлагодженні програми, коли компілятор повідомляє нас про наявність помилок. Типова помилка компіляції складається з “помилка” і “№ рядка“, де ця помилка сталася, наприклад: “помилка перевизначення змінної x, рядок 80“. Без нумерації рядків шукати той самий 80-й рядок коду було б трохи важко, чи не так? Підсвічування синтаксису. Підсвічування синтаксису змінює колір різних частин програми і коду, що покращує сприйняття як цілої програми, так і окремих її частин. Спеціальний шрифт. В звичайних шрифтах дуже часто виникає плутанина через певні символи, коли незрозуміло, що саме знаходиться перед вами. Наприклад, цифра 0 чи буква O, цифра 1 чи буква l (нижній регістр L), чи, можливо, буква I (верхній регістр i). Ось саме в таких випадках і потрібен спеціальний шрифт, в якому можна чітко відрізнити дані символи, запобігаючи випадкове використання одного символу замість іншого. Файли з вашими програмами на мові C++ слід називати name.cpp, де name замінюється назвою вашої програми, а розширення.cpp повідомляє компілятору (і вам також), що це вихідний файл коду, який містить інструкції на мові програмування C++. Слід звернути увагу, що деякі програмісти використовують розширення.cc замість.cpp, але рекомендується використовувати саме.cpp. Також варто відзначити, що програми в C++ можуть складатися з декількох.cpp- файлів. Хоча більшість програм, які ви створюватимете, не будуть надто великими, у вашій подальшій практиці ви матимете змогу навчитися писати програми, які складатимуться з десятків, якщо не з сотень окремих.cpp-файлів. Крок №4: Виконайте компіляцію програми Для того, щоб виконати компіляцію програми, нам потрібен компілятор. Робота компілятора складається з двох частин: Перевірка програми на відповідність правилам мови C++ (перевірка синтаксису). Якщо вона буде невдалою, то компілятор повідомить вас про помилки, які потрібно буде виправити. Конвертація кожного вихідного файлу з кодом в об’єктний файл (або “об’єктний модуль”) на машинній мові. Об’єктні файли, як правило, називаються name.o або name.obj, де name повинне бути таке ж, як і назва вашого вихідного.cpp-файлу. Якщо ваша програма складається з трьох.cpp-файлів, то компілятор згенерує 3 об’єктних файли. Варто зазначити, що такі операційні системи як Linux і macOS мають вже вбудований компілятор C++, який називається g++. Для компіляції файлів з командного рядка за допомогою g++ вам необхідно написати наступне: g++ -c file1.cpp file2.cpp file3.cpp Таким чином ми створили file1.o, file2.o и file3.o. -c означає “тільки скомпілювати”, тобто створити.o (об’єктні) файли. Також є і інші компілятори для Linux, Windows та інших операційних систем. Крок №5: Виконайте лінкінг програми (з’єднайте об’єктні файли) Лінкінг — це процес зв’язування всіх об’єктних файлів, що генеруються компілятором, в єдину виконувану програму, яку ви потім зможете запустити (виконати). Це можна зробити за допомогою програми, яка називається лінкер (або “компоновщик”). Крім об’єктних файлів, лінкер також підключає файли зі Стандартної бібліотеки С++ (або будь-якої іншої бібліотеки, яку ви використовуєте). Сам по собі мова С++ є досить невеликою та простою. Проте до неї підключається велика бібліотека додаткових функцій, які можуть використовувати ваші програми, і ці функції знаходяться в Стандартній бібліотеці C++. Наприклад, якщо ви хочете вивести що- небудь на екран, то у вас в коді повинна бути спеціальна команда, яка повідомить компілятору, що ви плануєте використати функцію виведення інформації на екран зі Стандартної бібліотеки C++. Після того, як лінкер закінчить з’єднувати всі об’єктні файли (за умови, що не буде помилок), ви отримаєте виконуваний файл. Знову ж таки, щоб зв’язати.o-файли, які ми створили вище в Linux або в macOS, ми можемо скористатися g++: g++ -o prog file1.o file2.o file3.o Команда -o повідомляє g++, що ми хочемо отримати виконуваний файл з іменем prog з наступних файлів: file1.o, file2.o і file3.o. При бажанні, компіляцію і лінкінг можна об’єднати в один крок: g++ -o prog file1.cpp file2.cpp file3.cpp Результатом виконання стане виконуваний файл з іменем prog. Крок №6: Виконайте тестування та відлагодження програми Ось саме тут і починаються веселощі! Ви вже можете запустити виконуваний файл і подивитися, чи все працює так як треба. Якщо ні, то настав час для відлагодження вашої програми. Зверніть увагу, що для виконання кроків №3-№6 вам знадобиться спеціальне програмне забезпечення. Хоча ви можете використовувати окремі програми на кожному з цих кроків, середовище розробки (скор. “IDE” від англ. “Integrated Development Environment”) об’єднує всі ці програми в собі. Зазвичай з IDE ви отримуєте редактор коду з нумерацією рядків і підсвічуванням синтаксису, а також компілятор та лінкер. А коли вам потрібно буде виконати відлагодження програми, то ви зможете використати вбудований відлагоджувач. Крім того, IDE має ще ряд інших корисних можливостей: доповнення коду, система контролю версій тощо. Тема 4. Структура програм Комп’ютерна програма — це послідовність інструкцій, які повідомляють комп’ютеру, що йому потрібно зробити. Стейтменти Cтейтмент (англ. “statement”) — це найбільш поширений тип інструкцій у програмах. Це і є та сама найменша незалежна одиниця в мові програмування С++. Стейтмент в програмуванні — це те ж саме, що і “речення” в українській мові. Ми використовуємо речення для того, щоб виразити якусь думку/ідею. У C++ ми пишемо стейтменти, щоб виконати якесь завдання. Всі стейтменти в C++ закінчуються крапкою з комою. Є дуже багато різних видів стейтментів в C++. Переглянемо найбільш поширені з них: int x; x = 5; std::cout

Use Quizgecko on...
Browser
Browser