Сьогодні ми з Вами вивчимо основні концепції програмування для основної маси мов програмування. Для опису основних принципів програмування, ми будемо використовувати нашу спеціальну псевдо мову програмування, тобто мову, яка буде нам зрозуміла і яка буде абстрактно описувати механізми інших мов. Слід розуміти, що переважна більшість інженерів, які проектують свої мови програмування, входять до однієї групи людей: отримують ступені в університетах, які мають схожі програми навчання і опираються на одні і ті ж принципи. Тому можна виділити основні концепції практично усіх мов програмування. До них віднесемо:
  • структури даних;
  • оператори вибору;
  • цикли
  • додаткові можливості мови

Структури даних

Структури даних це практично основна концепція для програми. Дійсно, навіщо нам програма, яка не оперує даними? Чи може вона бути корисною? Навіть прості програми обов’язково будуть мати в собі якісь дані. Пам’ятаєте програму з попередньої статті? Якщо б не існувало даних, Ви б не змогли вивести на екран це усім відоме "Привіт, Світ", цей рядок символів - також дані. Отже в усіх високорівневих мовах присутні вбудовані типи даних. До типів даних відносять:
  • цілочисельний тип;
  • дійсний тип (число з дробною частиною)
  • символьний тип
Щоб утримувати які-небуть дані певного типу в Вашій програмі, необхідно оголосити змінну даного типу (для строго типізованих мов програмування, в скриптовій мові сценаріїв JavaScript, наприклад, не потрібно вказувати тип для нової змінної). Якщо Ви маєте змінну певного типу - Ви можете присвоїти їй відповідні дані. Кожен з даних типів, може мати декілька своїх представників у мові. Наприклад, для цілочисельного типу можна оголосити змінну, яка може приймати тільки числа від 0 до 255, число 256 в ній зберегти вже неможливо; але можна оголосити таку змінну цілочисельного типу, що у ній можна зберігати мільядрди значень. Це в основному зроблено для економії пам’яті. Для кожного з цих типів, як вже було сказано, можна оголосити змінну. Змінна це такий об’єкт у системі, який має своє власне унікальне ім’я і виділену пам’ять, у відповідності для потужності даного типу. Потужність типу - це кількість значень, які може вмістити в собі змінна даного типу. Для нашої псевдо мови програмування, щоб оголосити змінну певного типу, ми можемо використовувати наступний запис: [тип] [ім’я] [тип] це потрібний нам тип змінної, наприклад "цілочисельний", а [ім’я] це відповідно унікальне ім’я змінної, в межах однієї програми або підпрограми. Отже, наприклад, якщо ми бажаємо оперувати змінною, яка містить тільки цілі значення чисел, нам, на нашій псевдо мові, необхідно написати наступне: ціле моє_ім’я; Для отримання змінної дійсного типу, нам необхідно записати наступне: дійсне моє_ім’я_2; Хоча слід пам’ятати, що практично усі мови програмування виконані на англійській, тут українська використовується для зручності і розуміння (також слід звернути увагу на апострофи, які не можна використовувати в іменах змінних). Окрім одного значення, яке прив’язується до одного ім’я змінної, ми можемо оголосити змінну, яка буде в стані утримувати в собі багато значень, але мати тільки одне ім’я (група значень, пов’язаних одним ім’ям). Такі змінні називаються масивами і можуть мати довільну довжину (але не безкінечну). Доступ до кожного значення масиву виконується за допомогою його ім'я (наприклад, моє_ім’я) і індексу елемента починаючи з нуля (тобто елемент за індексом 0 являється першим елементом, а елемент за індексом 1 - другим, запам'ятайте це). Прикладом використання певного значення масиву може бути проілюстровано наступним чином: моя_змінна_2 = моя_змінна_1 [2] ; У даному псевдокоді змінній під назвою "моя_змінна_2" присвоюється значення третього елемента масиву "моя_змінна_1" (пам'ятайте, що обрахунок починається з нуля). Найчастіше індекс елементу масиву вказується в квадратних дужках, що і було зображено у прикладі. Окрім вбудованих типів даних, на подобі цілочисельного типу або дійсного, у кожній мові також існують додаткові механізми визначення власних типів даних, які базуються на даних простих типах. Оскільки дана тема, все таки, сильно залежить від мови, ми поговоримо про них, коли я буду описувати найпопулярніші з мов.

Оператори вибору

Оператори вибору являються дуже корисним механізмом. Вони дають можливість нам перевіряти певні умови і діяти відповідно до них. Оператори вибірки користуються спеціальною математикою - булевою алгеброю, тому, якщо Ви ще з нею не знайомі, варто познайомитись з нею зараз. Загальний вигляд операторів вибірки полягає у наступному: якщо правильна (певна умова) виконати операції даного блоку; а якщо ні виконати операції цього блоку. Наприклад, ми можемо уявити собі наступний код: якщо (2=2) сказати "Привіт"; в іншому випадку сказати "До побачення"; В даному випадку програма перевірить чи дорівнює число 2 числу 2 і виконає дії по результату виконання умови, тобто програма ніколи не виведе на екран (або не "скаже") повідомлення "До побачення", тому що очевидно, що 2 завжди дорівнює 2. Існують і інші оператори вибору, але через те, що у кожній мові вони представляються по різному, ми не будемо тут їх розглядати.

Цикли

В повсякденному житті ми часто чуємо про цикли: цикли дня і ночі, цикли місяця, життєві цикли, цикли сну і активності, і багато інших. Отже ми інтуїтивно розуміємо саму суть циклу - багаторазове повторення певних дій. Програмісти в цьому розумінні також не вигадували нічого нового і в програмуванні цикли також мають те саме значення. І так само, як в реальному житті, цикли також являються дуже корисними, особливо, коли Ви маєте справу з масивами даних. Сам цикл можна представити у наступній формі (у нашому псевдокоді): повторити дані дії; поки дійсна (умова) Це цикл з післяумовою, а цикл з передумовою виглядає в основному наступним чином: поки дійсна (умова) повторити дані дії; Основна відмінність між даними циклами полягає у тому, що дій циклу з післяумовою виконуються хочаб один раз, а дії у циклі з передумовою можуть не виконуватися жодного разу. Існує також і третій тип циклу, але ми поговорим про нього, коли будемо вивчати конкретну мову програмування. Ми можемо поглянути приклад використання циклу у наступному псевдокоді ціле моя_змінна_1 = 1 ; поки дійсно (моя_змінна_1 <= 10) повторити сказати моя_змінна_1 ; моя_змінна_1 = моя_змінна_1 + 1 ; У даному коді ми спочатку оголошуємо цілочисельну змінну під назвою "моя_змінна_1" і присвоюємо їй значення одиниці. Далі у нас присутній цикл, який перевіряє чи значення змінної "моя_змінна_1" менше або дорівнює десяти. Якщо умова правильна, значить виконається дія у циклі (у нашому випадку "сказати моя_змінна_1", що виведе її значення на екран і після цього додасть до значення змінної одиницю).

Додаткові можливості мови

Окрім базових механізмів, на подобі вбудованих типів, операторів вибірки і циклів, сучасні мови реалізовують додаткові можливості. Прикладом додаткових можливостей може виступати концепція функцій. Функціями являються частини коду програми, які часто у ній використовуються, і які недоцільно кожного разу наново описувати в коді. Іншим прикладом такої можливості являються класи, які використовуються в об'єктно-орієнтованих мовах програмування на подобі C++ і Java. Звичайно, що можна було б обійтись і без них, але в такому випадку написання програм перетворилося на кошмар. Представте собі програму, яка описана тільки у термінах вбудованих типів, циклів і операторів вибірки, особливо, якщо вона займає кілька мільйонів рядків коду. Класи, функції і інші можливості мови, допомагають писати програми, які будуть набагато зрозуміліші для інших програмістів, і відповідно організовують код у логічні блоки, які можна в майбутньому повторно використати. При вивчені будь-якої мови програмування, слід завжди звертати на її особливості. Наприклад у мові С++ існують два оператори, які збільшують значення цілочисельної змінної на одиницю, тобто вони додають до змінної один і записують нове значення у ту саму змінну. Ці два оператори: пост-інкремент (змінна++) і перед-інкремент (++змінна). Різниця між ними полягає у тому, що пост-інкремент спочатку повертає значення змінної, а потім інкрементує (тобто, збільшує значення на одиницю) його, а перед-інкремент спочатку інкрементує значення змінної, а потім повертає це нове значення. Тобто вирази "змінна1 = змінна2++;" і "змінна1 = ++змінна2;" присвоїть змінній "змінна1" зовсім різні значення. І такі речі слід пам'ятати, оскільки Ви будете уникати можливі семантичні помилки і головний біль від довгої відладки вашої програми. Тому слід якомога більше і глибше вивчати вашу улюблену мову, щоб збільшити якість Ваших програм і швидкість їх написання. Окрім того, на ранніх стадіях вивчення мови, слід писати програми для командної оболонки. Такі програми зазвичай являються простішими ніж програми, які призначені для використання віконних елементів, оскільки робота з віконною системою може вимагати не один додатковий рядок коду і використання не однієї функції. Це дозволить сконцентруватися на поточній частині мови і не дасть Вам ще більш заплутатись в складному, так і не зрозумівши простого.