You are on page 1of 24

Основні структурні елементи

мов програмування

«Є лише два типи мов програмування:


ті, які люди постійно критикують, і
ті, які ніхто не використовує…»
Б’ярне Страуструп
Структура мови програмування

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

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

Мовна граматика складається з двох розділів: синтаксичного (задає правила і способи


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

Синтаксис мови описується в основному за допомогою метамов, основу яких складають


металінгвістичні формули.
В літературі часто використовуються так звані синтаксичні діаграми, але однією з найбільш
поширених метамов є нотація Бекуса-Наура (БНФ, англ. BNF – Backus-Naur form) та її
удосконалений варіант – розширена нотація Бекуса-Наура (РБНФ, англ. EBNF - extended Backus-
Naur form). Існує ще й доповнена нотація Бекуса-Наура (ДБНФ, англ. ABNF - augmented Backus-
Naur form).
Синтаксичні конструкції, описані у форматі БНФ, РБНФ та інших схожих
нотацій, дуже часто використовуються для опису синтаксису мов
програмування, команд операційної оболонки, командного рядка тощо.
Опис правил мови програмування

Синтаксичні діаграми – це графічне представлення правил мови, наприклад:


Опис правил мови програмування
В той час як для БНФ (РБНФ) як символьного представлення характерні такі позначення:
< > - обмежувач об’єкта (елемента, виразу) для підстановки певного значення /в РБНФ зазвичай
обмежувач не використовується/
::= - роздільник об’єкта та його означення (читається «визначене як») /в РБНФ зазвичай
виткористовується символ рівності =/
[ ] - «умовне входження», тобто необов'язковий елемент, який може бути відсутній
| - «або», означає варіативність використання визначених елементів
{} - «повторення», означає повторюваний елемент, який може застосовуватись 1 або більше разів
кінцеві символи або символьні набори, що позначають елементарні одиниці (термінальні елементи),
записуються без обмежувачів /в РБНФ зазвичай пишуться в подвійних лапках/

Наприклад, визначення числа можна записати набором певних правил.


БНФ:
<Число> ::= <Знак> <Цифровий ряд> [.<Цифровий ряд>]
<Знак> ::= + | -
<Цифровий ряд> ::= <Цифра> | <Цифра> <Цифровий ряд>
<Цифра> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
РБНФ (класичний варіант):
Число = Знак Цифровий_ряд [. Цифровий_ряд]
Знак = "+" | "-"
Цифровий_ряд = Цифра | Цифра Цифровий_ряд
Цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" Джон Бекус Пітер Наур
Структура мови програмування

В загальному вигляді теоретична формула мови має вигляд:


Алгоритмічна мова = Словниковий фонд (алфавіт, морфологія) + Граматика (синтаксис, семантика)

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

В свою чергу множину символів, слів, виразів та інших елементів можна представити з наборів
окремих підмножин:

Усі перераховані конструкції є окремими елементами мови, які не здатні описати закінчену думку. Для
опису закінченої думки використовуються речення і текст, тобто група, набір взаємопов’язаних речень, що
дозволяють передавати визначений зміст. Речення задає опис певної частини обчислювального процесу.
Весь обчислювальний процес описується за допомогою ряду операторів чи виразів, поєднання яких
утворює закінчений текст програми, що є в свою чергу записом алгоритму.
Вступ до мови С++ Б’ярне
Страуструп
(1950)
C++ (Сі-плюс-плюс) – це мова програмування високого рівня з
підтримкою кількох парадигм програмування: об'єктно-орієнтованої,
процедурної, структурної, модульної та інших.
Розроблена данським програмістом Б’ярне Страуструпом (англ.
Bjarne Stroustrup) під час його роботи в американській компанії AT&T
Bell Laboratories у 1979 році та початково отримала назву «Сі з
Деніс
класами», тому що базується на мові програмування С з певними
Рітчі
удосконаленнями, але все ж більшість програм на С працюватимуть і з (1941-2011)
компілятором С++. Згодом у 1984 році Страуструп перейменував мову
на C++ (назва запропонована Ріком Масситті).
До речі мова C (Сі) була розроблена у 1972 році американцем Денісом Рітчі в Кен
тій самій Bell Telephone Laboratories (колишня назва Bell Labs), який є також Томпсон
(1943)
одним із розробників операційної системи Unix. А сама мова С є нащадком
мови B (Бі), розробленої тим самим Денісом Річі та Кеном Томпсоном у 1969
році. А мова B заснована на концепціях мови BCPL (Basic Combined
Programming Language), яка була розроблена в 1966 вченим з Кембриджського
університету Мартіном Річардсом. Мартін
Річардс
Мова С++, як і С, мала великий вплив на інші мови програмування, наприклад (1940)
Java та C#.
Вступ до мови С++
Мова С++ вперше стандартизована і описана стандартом
ISO/IEC 14882:1998, хоча використовувалась вже з 1985 року в
навчальних та комерційних цілях, а комітет ANSI C++ (American
National Standards Institute - Американський інститут
національних стандартів) був заснований у 1989 році.
Найбільш актуальним є стандарт ISO/IEC 14882:2020, наступим
заплановано випуск у 2023 році.

Хронологія прийнятих стандартів мови:


1998 рік : стандарт ISO/IEC 14882:1998, неофіційна назва C++98
2003 рік : стандарт ISO/IEC 14882:2003, неофіційна назва C++03
2011 рік : стандарт ISO/IEC 14882:2011, неофіційна назва C++11, C++0x
2014 рік : стандарт ISO/IEC 14882:2014, неофіційна назва C++14, C++1y
2017 рік : стандарт ISO/IEC 14882:2017, неофіційна назва C++17, C++1z
2020 рік : стандарт ISO/IEC 14882:2020, неофіційна назва C++20, C++2a
Вступ до мови С++
Ще за першим стандартом мова складається з двох основних частин: так званого ядра мови і
стандартної бібліотеки. Стандартна бібліотека включає велику кількість окремих елементів, які
включаються в програму опціонально. Стандартна бібліотека С++ включає стандартну бібліотеку
С з невеликими змінами, які роблять її відповіднішою до мови С++, а також стандартну
бібліотеку шаблонів (STL, Standard Template Library), яка до включення в стандарт С++ була
сторонньою розробкою. Стандарт мови не називає її «STL», оскільки ця бібліотека стала
невіддільною частиною мови, проте багато людей досі використовують цю назву, щоб відрізняти
її від решти частини стандартної бібліотеки (потоків введення-виведення, математичних функцій
тощо).

С++ продовжує розвиватися, щоб відповідати сучасним вимогам. Наприклад, одна з груп, що
займаються мовою С++ в її сучасному вигляді і направляють комітету зі стандартизації С++
поради з її поліпшення, - це Boost. Взагалі, такі сторонні проекти, що розробляють бібліотеки
Boost, Loki, POCO, ACE, Qt впливають на саму мову і її розвиток, відповідно в нових стандартах є
елементи цих бібліотек, хоча їх можна вільно використовувати як надбудову до стандартного С+
+ при практичному програмуванні.
Вступ до мови С++
На рисунку показано в
графічному стилі структуру
мови С++ з позначенням
актуальних і вже виключених
елементів мови, включених
та сторонніх проєктів,
значимих для розвитку мови
імен тощо.

Структура мови С++


у «географічному» форматі
на 2017 рік
Алфавіт мови С++

Основою лексики та синтаксису мови є алфавіт – скінчений набір символів (Character


Set), що дозволені для використання у тексті програм.

До алфавіту мови С++ належать:


• значущі символи:
- великі та малі літери латинського алфавіту a-z, A-Z;
- десяткові цифри 0-9;
- символ підкреслення _;
• розділові символи (пробіл /space/, табуляція /tab/, переведення рядка /enter/);
• спеціальні символи + - * / % = > < ! & | ~ ^ . , : ; ? \ $ # ' " ( ) [ ] { }
Інші символи, включаючи літери кирилиці, не використовуються для побудови базових елементів
мови, але можуть застосовуватись для визначення даних (у символьних чи рядкових константах) та для
пояснення коду (у коментарях).
Деякі компілітори мови дозволяють працювати з юнікодом, тобто допускають використання в якості значущих
символів алфавіту будь-які символи (кириличні, ієрогліфи, текстографічні тощо), але це не є стандартом мови і
зазвичай не рекомендується.
Алфавіт мови С++

Якщо задіяти правила синтаксичного опису за розширеною нотацією Бекуса-Наура,


то можна пописати алфавіт мови С++ наступним чином:
Алфавіт = Значущий символ | Розділовий символ | Спеціальний символ
Значущий символ = Літера | Цифра | "_"
Розділовий символ = Пробіл | Табуляція | Переведення рядка
Спеціальний символ = "+" | "-" | "*" | "/" | "%" | "=" | ">" | "<" | "!" | "&" | "|" | "~" | "^" | "." | "," | ":"
| ";" | "?" | "\" | "$" | "#" | " ' " | "“" | "(" | ")" | " [" | "]" | "{" | "}"
Літера = "a" | "b" | … | "z" | "A" | "B" | … | "Z"
Цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
Звісно, правило для літер наведене у скороченій формі – в нормальному форматі всі
значення (так звані, термінальні символи) вказуються у повному обсязі. Хоча можна
спростити набір введенням проміжних правил, наприклад:
Літера = Маленька літера | Велика літера
Маленька літера = Голосна маленька літера | Приголосна маленька літера
Велика літера = Голосна велика літера | Приголосна велика літера
Голосна маленька літера = "a" | "e" | "i" | "o" | "u" | "y"
і так далі
Лексеми мови С++

З символів алфавіту складаються лексичні одиниці мови - слова (в мові


програмування – лексеми або токени /Tokens/), вся множина яких називається
словником мови.

У мові С++ розрізняють такі лексеми:


- лексеми спеціальних символів /Special Symbols Tokens/:
* пунктуатори /Puntuators/;
* оператори /Operators/;
- зарезервовані слова /Keywords/;
- ідентифікатори /Identifiers/;
- неіменовані константи (літерали) /Literals/;
- коментарі /Сomments/;
- директиви препроцесора /Directives/.
Лексеми мови С++

Лексеми спеціальних символів складаються зі спецсимволів і можуть бути як


односимвольними, так і дво-, і трисимвольними:
- односимвольні, наприклад: ! = + * & ;
- двосимвольні, наприклад: == && /= ++ ;
- трисимвольні, наприклад: >>= <<= .

Директиви препроцесора починаються зі знаку #, який повинен бути найпершим


символом рядка. Це спеціальні команди для препроцесора – програми, яка обробляє
ці директиви.
Приклади директив:
#include
#define
#ifndef
Лексеми мови С++

Зарезервовані (ключові, службові) слова є складовою частиною мови, мають чітко


визначений зміст, а їх призначення не може змінюватися.
Наприклад: const, static, for, typedef тощо.

За смисловим навантаженням службові слова поділяються на такі основні групи:


- специфікатори типів – char, int, long, typedef, short, float, double, enum, struct,
union, signed, unsigned, void та інші;
- квалифікатори типів та класів пам’яті – const, volatile, extern, static та інші;
- оператори та спеціальні ідентифікатори – for, while, do, if, else, switch, case,
continue, goto, break, return, default, sizeof та інші;
- модифікатори, набір яких залежить від компілятора.
Лексеми мови С++

Перелік ключових слів мови С++, включно з версією С++20:

alignas (C++11) consteval (C++20) for protected try


alignof (C++11) constexpr (C++11) friend public typedef
and constinit (C++20) goto register typeid
and_eq const_cast if reinterpret_cast typename
asm continue inline return union
auto decltype (C++11) int short unsigned
bitand default long signed using
bitor delete mutable sizeof virtual
bool do namespace static void
break double new static_assert (C++11) volatile
case dynamic_cast noexcept (C++11) static_cast wchar_t
catch else not struct while
char enum not_eq switch xor
char16_t (C++11) explicit nullptr (C++11) template xor_eq
char32_t (C++11) export operator this
class extern or thread_local (C++11)
compl false or_eq throw
const float private true
Лексеми мови С++

Ідентифікатори – це лексичні одиниці, які використовується як ім'я елементу мови


програмування. Ідентифікатори поділяються на стандартні та користувача.

Стандартні ідентифікатори задають імена вбудованих у мову функцій-підпрограм та


констант. Відмінність зарезервованих слів від стандартних ідентифікаторів в першу
чергу полягає в тому, що ідентифікатори можна перевизначити, тобто використати їх
на власний розсуд, а не так, як це визначено в мові С++.
Наприклад:
sqrt eof cout RAND_MAX

Ідентифікатори користувача задаються програмістом для позначення (ідентифікації)


елементів програми: іменованих констант, змінних, типів, програм, підпрограм, класів,
модулів тощо. Назви таких ідентифікаторів придумує програміст, але слід зважати, що
існують певні правила запису ідентифікаторів в програмному коді.
Лексеми мови С++

Правила і рекомендації запису ідентифікаторів:


1) ідентифікатор може складатися лише зі значущих символів: літер, цифр та знаку
підкреслення, тобто неприпустимі пробіли та спеціальні символи;
2) ідентифікатор починається лише літерою або знаком підкреслення, тобто не може
починатися з цифри;
3) при іменуванні ідентифікаторів розрізняється регістр символів (великі і маленькі
літери);
4) ім’я ідентифікатора не може співпадати з ключовими словами;
5) ідентифікатор може мати довільну довжину, але значущими є лише перші N
символів (кількість залежить від реалізації, компілятора);
6) рекомендовано не використовувати на початку ідентифікатора знак підкреслення,
а також два підряд знаки підкреслення, тому що дуже часто такі ідентифікатори
використовують розробниками мови та компіляторів для внутрішніх цілей (прихованих
ключових слів та інших елементів даних).
Лексеми мови С++

Якщо задіяти правила синтаксичного опису за розширеною нотацією Бекуса-Наура,


то комбінований опис перших трьох правил і останньої рекомендації може виглядати
наступним чином:
Ідентифікатор = Літера { [ Літера | Цифра | "_" ] }

Приклади ідентифікаторів користувача:


x my_id
Y1 MY_ID
Vasya My_id
Zminna_3 My_Id різні ідентифікатори
x_max My_ID
MyNewValue my_ID
_3xyz MY_id

! не виконується рекомендація 6
Лексеми мови С++

Неіменовані константи (літерали) – це певні конкретні значення різного типу:


- числа:
* цілі (integer literals);
* дійсні (float literals);
- символи (characters literals);
- рядки (string literals);
- логічні константи (boolean literals).

Наприклад:
13 - цілочислений літерал
-3.295 - дійсний числовий літерал
'у' - символьний літерал
"рядок" - рядковий літерал
TRUE - логічний літерал
Лексеми мови С++
Коментарі – це пояснення до програми, що записуються між парними тегами-лексемами з
спецсимволів /* */ (обмежувальний коментар) або після одинарного тега-лексеми з спецсимволів // до
кінця рядка (рядковий коментар). Коментарі ігноруються компілятором і не впливають на програму, але
полегшують розуміння тексту програми.
Правила запису коментарів:
- коментар можу бути записаний в будь-якому місці коду програми, якщо не розриває лексему;
- не допускається вкладеність обмежувальних коментарів, але рядкові коментарі можуть бути
вкладені в обмежувальний.
Приклади:
// це рядковий коментар
/* це обмежувальний коментар, записаний в одному рядку */
/*
це обмежувальний коментар,
записаний у кількох рядках
*/
/*
це обмежувальний коментар, записаний у кількох рядках
// це рядковий коментар в межах обмежувального коментаря
*/
Корисні ресурси по С++
Для вивчення та використання мови С++ дуже корисними будуть такі ресурси:
1) Уроки програмування на С++. URL: https://acode.com.ua/uroki-po-cpp/
2) Мова програмування C++. URL: http://cpp.dp.ua/
3) Основы программирования на языках Си и C++ для начинающих. URL: http://cppstudio.com/
4) Основи програмування на С ++ для початківців. URL: https://purecodecpp.com/uk/
5) LearnCpp.com. Tutorials to help you master C++ and object-oriented programming. URL:
https://www.learncpp.com (англійською)
6) C++ Tutorial. URL: https://www.cprogramming.com/tutorial/c++-tutorial.html (англійською)

Ресурси з довідковою інформацією:


1) C++ Language. URL: http://www.cplusplus.com/doc/tutorial/ (англійською)
2) C++ reference. URL: https://en.cppreference.com/w/ (англійською) [ російськомовний варіант -
https://ru.cppreference.com/w/ ]
3) C++ language documentation. URL: https://docs.microsoft.com/en-us/cpp/cpp/?view=msvc-170 (англійською)
[ російськомовний - Документация по языку C++. URL:
https://docs.microsoft.com/ru-ru/cpp/cpp/?view=msvc-170 ]
Посилання

1 Tokens in C++ (Keywords, Identifiers, Constants, Strings, Operators, Special Symbols). URL:
https://data-flair.training/blogs/tokens-in-cpp/

2 Алфавіт, лексеми, синтаксис мови. URL: http://cpp.dp.ua/alfavit-leksemy-syntaksys-movy/

3 Алфавит С++. Литералы. Идентификаторы. URL: http://inf-w.ru/?page_id=3509

4 Мова програмування С/С++. Основні поняття. URL:


https://www.e-olymp.com/uk/blogs/posts/26

5 Карта С++17. URL: http://alenacpp.blogspot.com/2017/02/17.html

6 Расширенная форма Бэкуса-Наура (РБНФ). URL: https://divancoder.ru/2017/06/ebnf/

You might also like