Контакти

§1 Загальні відомості про мову. Етапи проектування програми. Моделі життєвого циклу програм. Історія мови си Коли була створена мова з

Мова програмування C++

Останнє оновлення: 28.08.2017

Мова програмування С++ представляє високорівневу мовну програмування загального призначення зі статичною типізацією, що підходить для створення найрізноманітніших додатків. На сьогоднішній день С++ є однією з найпопулярніших та найпоширеніших мов.

Своїм корінням він сягає мови Сі, який був розроблений в 1969-1973 роках в компанії Bell Labs програмістом Деннісом Рітчі (Dennis Ritchie). На початку 1980-х років датський програміст Бьорн Страуструп (Bjarne Stroustrup), який на той час працював у компанії Bell Labs, розробив С++ як розширення до мови Сі. Практично спочатку C++ легко доповнював мову Си деякими здібностями об'єктно-орієнтованого програмування. І тому сам Страуструп спочатку називав його як "C with classes" ("Сі з класами").

Згодом нова мова стала набирати популярності. До нього були додані нові можливості, які робили його не просто доповненням до Сі, а новою мовою програмування. У результаті "Сі з класами" було перейменовано на С++. І з тих по обидві мови стали розвиватися незалежно одна від одної.

З є потужною мовою, успадкувавши від Сі багаті можливості по роботі з пам'яттю. Тому нерідко С++ знаходить своє застосування у системному програмуванні, зокрема, при створенні операційних систем, драйверів, різних утиліт, антивірусів тощо. До речі, ОС Windows переважно написана на С++. Але лише системним програмуванням застосування цієї мови не обмежується. С++ можна використовувати у програмах будь-якого рівня, де важливі швидкість роботи та продуктивність. Нерідко він застосовується до створення графічних додатків, різних прикладних програм. Також особливо часто його використовують для створення ігор з багатою насиченою візуалізацією. Крім того, останнім часом набирає хід мобільний напрямок, де С++ теж знайшов своє застосування. І навіть у веб-розробці також можна використовувати С++ для створення веб-додатків або якихось допоміжних сервісів, які обслуговують веб-програми. Загалом С++ - мова широкого користування, якою можна створювати практично будь-які види програм.

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

На відміну від Сі мова C++ дозволяє писати додатки в об'єктно-орієнтованому стилі, представляючи програму як сукупність взаємодіючих між собою класів та об'єктів. Що полегшує створення великих додатків.

Основні етапи розвитку

У 1979-80 роках Бьорн Страуструп розробив розширення до мови Сі - "Сі з класами". У 1983 мову було перейменовано на С++.

У 1985 році була випущена перша комерційна версія мови С++, а також перше видання книги "Мова програмування C++", яка представляла перший опис цієї мови за відсутності офіційного стандарту.

У 1989 була випущена нова версія мови C++ 2.0, яка включала низку нових можливостей. Після цього мова розвивалася відносно повільно аж до 2011 року. Але при цьому в 1998 році була зроблена перша спроба стандартизації мови організацією ISO (International Organiztion for Standartization). Перший стандарт отримав назву ISO/IEC 14882:1998 або скорочено C++98. Надалі у 2003 було видано нову версію стандарту C++03.

У 2011 році було видано новий стандарт C++11, який містив безліч додавань та збагачував мову С++ великою кількістю нових функціональних можливостей. Після цього у 2014 році було випущено невелике додавання до стандарту, відоме також як C++14. І ще один ключовий реліз мови намічений на 2017 рік.

Компілятори та середовища розробки

Для розробки програм на С++ необхідний компілятор - він транслює вихідний код мовою С++ виконуваний файл, який можна запускати. Але зараз є дуже багато різних компіляторів. Вони можуть відрізнятися за різними аспектами, зокрема щодо реалізації стандартів. Базовий список компіляторів для С++ можна переглянути у вікіпедії. Рекомендується для розробки вибирати ті компілятори, які розвиваються та реалізують усі останні стандарти. Так, протягом усього керівництва переважно використовуватиметься вільно розповсюджуваний компілятор g++, розроблений у рамках проекту GNU.

Також для створення програм можна використовувати вбудовані середовища розробки IDE, такі як Visual Studio, Netbeans, Eclipse, Qt і т.д.

Мова С та UNIX

Мова програмування З(читається "Сі") створено на початку 70-х років, коли Кен Томпсон та Денніс Рітчі з Bell Labs розробляли операційну систему UNDC. Спочатку вони створили частину компілятора З, потім використовували її для компіляції решти компілятора Зі, нарешті, застосували отриманий компілятор для компіляції UNIX. Операційна система UNIX спочатку поширювалася у вихідних кодах Зсеред університетів та лабораторій, а одержувач міг відкомпілювати вихідний код мовою Зв машинний код за допомогою відповідного компілятора З.

Поширення вихідного коду зробило операційну систему UNIX унікальною; Програміст міг змінити операційну систему, а вихідний код міг бути перенесений з однієї апаратної платформи на іншу. Сьогодні стандарт POSIX визначає стандартний набір системних викликів UNIX, доступних у З, які мають бути реалізовані у версіях UNIX, які є POSIX-сумісними. З була третьою мовою, яку розробили Томсон і Рітчі в процесі створення UNIX; першими двома були, зрозуміло, Аі В.

C мобільна мова асемблера

Порівняно з більш ранньою мовою - BCPL, мова Збув покращений шляхом додавання типів даних певної довжини. Наприклад, тип даних int міг застосовуватися створення змінної з певним числом бітів (зазвичай 16), тоді як тип даних long міг використовуватися створення цілої змінної з великою кількістю бітів (зазвичай 32). На відміну від інших мов високого рівня, Зміг працювати з адресами пам'яті безпосередньо за допомогою покажчиків та посилань. Оскільки Ззберіг здатність прямого доступу до апаратного забезпечення, його часто відносять до мов середнього рівня або жартома називають "мобільною мовою асемблера".

С - структурна мова програмування

Що стосується граматики та синтаксису, то Зє структурною мовою програмування. У той час як багато сучасних програмістів мислять у категоріях класів та об'єктів, програмісти на Здумають у категоріях процедур та функцій. В Зможна визначити власні абстрактні типи даних, використовуючи ключове слово struct . Аналогічно можна описувати власні цілі типи (перерахування) та давати інші назви існуючим типам даних за допомогою ключового слова typedef. В цьому сенсі Зє структурною мовою із зародками об'єктно-орієнтованого програмування.

Стандартизація мови С

Широке поширення мови Cна різних типах комп'ютерів (іноді званих апаратними платформами) призвело, на жаль, до багатьох варіацій мови. Вони були схожі, але несумісні один з одним. Це було серйозною проблемою для розробників програм, які потребували написання сумісних програм, які можна було б виконувати на кількох платформах. Стало ясно, що потрібна стандартна версія C. У 1983р. ANSI (Американський Національний Комітет Стандартів) сформував технічний комітет X3J11 для створення стандарту мови C(щоб "забезпечити недвозначне та машинно-незалежне визначення мови"). У 1989 році стандарт був затверджений. ANSI поєднався з ISO (Міжнародною Організацією Стандартів), щоб стандартизувати Cу міжнародному масштабі; спільний стандарт був опублікований у 1990 році та названий ANSI/ISO 9899:1990. Цей стандарт удосконалюється і досі підтримується більшістю фірм розробників компіляторів.

Народження С++

Бьорн Страуструп вивільнив об'єктно-орієнтований потенціал Зшляхом перенесення можливостей класів Simula 67в З. Спочатку нова мова носила ім'я "З класами" і тільки потім стала називатися C++. Мова C++досяг популярності, будучи розробленим у Bell Labs, пізніше він був перенесений в інші індустрії та корпорації. Сьогодні це одна з найпопулярніших (і авторитетних) мов програмування у світі. C++успадковує як добрі, так і погані сторони З.

Одкровення Бьорна Страуструп

Б'єрн Страуструп: "Я вигадав C++, записав його первісне визначення та виконав першу реалізацію. Я вибрав та сформулював критерії проектування C++, розробив його основні можливості та відповідав за долю пропозицій щодо розширення мови у комітеті зі стандартизації C++", - пише автор найпопулярнішої мови програмування. - "Мова C++багатьом завдячує мові C, і мова Cзалишається підмножиною мови C++(але в C++ усунуто кілька серйозних проломів системи типів C). Я також зберіг кошти C, які досить низькорівневі, щоб справлятися з найбільш критичними системними завданнями. Мова C, своєю чергою багатьом зобов'язаний своєму попереднику, BCPL; до речі, стиль коментарів // був узятий у C++із BCPL. Іншим основним джерелом натхнення була мова Simula67. Концепція класів (з похідними класами та віртуальними функціями) була запозичена з нього. Засоби перевантаження операторів та можливість розміщення оголошень у будь-якому місці, де може бути записана інструкція, нагадує Algol68. "

Чому С++

Назва C++вигадав Рік Массітті. Назва вказує на еволюційну природу переходу до нього від C. "++" - це операція збільшення C. Трохи коротше ім'я C+є синтаксичною помилкою; крім того, вона вже була використана як ім'я зовсім іншої мови. Знавці семантики Cзнаходять, що C++гірше ніж ++C. Назви Dмова не отримав, оскільки він є розширенням C і в ньому не робиться спроб зцілюватися від проблем шляхом викидання різних особливостей.

Навіщо був потрібний С++

Спочатку мова програмування C++був розроблений, щоб автору та його друзям не доводилося програмувати на асемблері, C чи інших сучасних мовах високого рівня. Основним його призначенням було зробити написання хороших програм більш простим та приємним для окремого програміста. Плану розробки C++на папері ніколи не було; проект, документація та реалізація рухалися одночасно. Зрозуміло, зовнішній інтерфейс C++був написаний на C++. Ніколи не існувало "Проекту C++" та "Комітету з розробки C++". Тому C++розвивався і продовжує розвиватись у всіх напрямках, щоб справлятися зі складнощами, з якими стикаються користувачі, а також у процесі дискусій автора з його друзями та колегами.

Справжній об'єктно-орієнтований C++

В мовою С++повністю підтримуються принципи об'єктно-орієнтованого програмування, включаючи три кити, на яких воно стоїть: інкапсуляцію, успадкування та поліморфізм. Інкапсуляція в С++підтримується за допомогою створення нестандартних (користувацьких) типів даних, які називаються класами. Мова С++підтримує успадкування. Це означає, що можна оголосити новий тип даних (клас), що є розширенням існуючого.

Хоча мова програмування С++справедливо називають продовженням Зта будь-яка працездатна програма мовою Зпідтримуватиметься компілятором С++, при переході від Здо С++був зроблений дуже суттєвий стрибок. Мова С++вигравав від своєї спорідненості з мовою Зпротягом багатьох років, оскільки багато програмістів виявили, що для того, щоб повною мірою скористатися перевагами мови С++їм потрібно відмовитися від деяких своїх колишніх знань і придбати нові, а саме: вивчити новий спосіб концептуальності та вирішення проблем програмування. Перед тим як починати освоювати С++, Страуструп та більшість інших програмістів, які використовують С++вважають вивчення мови Знеобов'язковим.

Мова програмування C++в даний час вважається пануючою мовою, що використовується для розробки комерційних продуктів, 90% ігор пишуться С++із застосуванням DirectX.

Література

Джерела:

  • Х.М.Дейтел, П.Дж.Дейтел "Як програмувати на C++"
  • Бьорн Страуструп "Мова програмування C++. 3-тє видання."
  • Симон Робінсон, Оллі Корнес, Джей Глінн та ін. "C# для професіоналів"
  • Джесс Ліберті "Освій самостійно С++ за 21 день"
  • Станіслав Горнаков "DirectX, уроки програмування на С++"

C++ (читається сі-плюс-плюс) - компілювана, статично типізована мова програмування загального призначення, на якій можна створювати програми будь-якого рівня складності.
Більше 20 років ця мова знаходиться в трійці найпопулярніших мов програмування. (У цьому можна переконатись, відвідавши сайт TIOBE).
Мова виникла на початку 1980-х років, коли співробітник фірми Bell Labs Бйорн Страуструп вигадав ряд удосконалень до мови C під власні потреби.

Bjarne Stroustrup – творець мови C++

Страуструп вирішив доповнити мову C можливостями, що є у мові Симула. Мова C, будучи базовою мовою системи UNIX, на якій працювали комп'ютери Bell, є швидкою, багатофункціональною та переносимою. Страуструп додав до нього можливість роботи з класами та об'єктами. В результаті практичні завдання моделювання виявилися доступними для вирішення як з точки зору часу розробки (завдяки використанню Симула-подібних класів), так і з точки зору часу обчислень (завдяки швидкодії C).
Ось як про це говорить сам розробник мови:



У 1998 був опублікований перший стандарт мови, відомий як C++98, розроблений комітетом зі стандартизації. C++ продовжує розвиватись, щоб відповідати сучасним вимогам. Одна з груп, що розробляють мову C++ та направляють комітету зі стандартизації C++ пропозиції щодо її покращення - це Boost, яка займається, у тому числі, удосконаленням можливостей мови шляхом додавання до неї особливостей метапрограмування. Останній стандарт вийшов у 2017 році та носить найменування С++17. Наступний стандарт не змусить довго чекати і з'явиться, як очікують, у 2020 році.
Ніхто не має прав на мову C++, він є вільним. У березні 2016 року в Росії було створено робочу групу РГ21 С++. Група була організована для збору пропозицій до стандарту C++, надсилання їх до комітету та захисту на загальних зборах Міжнародної організації зі стандартизації.
С++ - це мультипарадигмальний мову (від слова парадигма - стиль написання комп'ютерних програм), що включає широкий спектр різних стилів та технологій програмування. Часто його відносять до об'єктно-орієнтованих мов, але, власне кажучи, це не так. У процесі роботи розробник отримує абсолютну свободу у виборі інструментів для того, щоб завдання, яке вирішується за допомогою того чи іншого підходу, було вирішено максимально ефективно. Інакше кажучи, З++ не змушує програміста дотримуватися лише одного стилю розробки програми (наприклад, объектно-ориентированного).
C++ має багату стандартну бібліотеку, яка включає поширені контейнери і алгоритми, введення-виведення, регулярні висловлювання, підтримку багатопоточності та інші можливості. C++ вплинув на багато мов програмування, у тому числі: Java, C#, D. Оскільки C++ належить сімейству мов заснованих на синтаксисі мови Сі, то можна легко освоїти й інші мови програмування цієї родини: JavaScript, PHP, Perl, Objective-C та багато інших. . ін, у тому числі, і сама батьківська мова – Сі. ()
За час існування за мовою С++ закріпилися стійкі міфи, які легко спростовуються (див. тут: Частина1 і Частина2)

Історія мови та виходу стандартів

1983

Творець мови – Бйорн Страуструп, Співробітник Bell Labs, представив ранню версію мови C++ ("Сі з класами")

1985

Перший комерційний випуск C++, мова набуває сучасної назви

1986

Видання першого видання The C++ Programming Language - книги, присвяченої C++, яку написав Бйорн Страуструп

1998

Ратифіковано міжнародний стандарт мови C++: ISO/IEC 14882:1998 "Standard for the C++ Programming Language"

2003
2005

Випущено звіт Library Technical Report 1 (TR1). Не будучи офіційно частиною стандарту, звіт описував розширення стандартної бібліотеки, які мають бути включені до наступної версії мови C++

2011

Вихід нового стандарту – C++11 або ISO/IEC 14882:2011; новий стандарт включив доповнення в ядрі мови та розширення стандартної бібліотеки, у тому числі більшу частину TR1

2014

Вихід стандарту C++14 (International Standard ISO/IEC 14882:2014(E) Programming Language C++); C++14 можна розглядати як невелике розширення над C++11, що містить в основному виправлення помилок та невеликі покращення

2017

Вихід нового стандарту – C++1z (C++17). Цей стандарт вніс багато змін та доповнень. Наприклад, до складу STD увійшли бібліотеки стандарту C11, файлової системи, заснована на boost::filesystem, більшість експериментальної бібліотеки TS I.

2020

C++20 - неофіційна назва стандарту ISO/IEC мови програмування C++, який очікується після C++17. Чернетка стандарту N4800.

Філософія С++

У книзі «Дизайн та еволюція C++» (2007) Бйорн Страуструп описує принципи, яких він дотримувався при проектуванні C++ (наводяться скорочення):

  • Отримати універсальну мову зі статичними типами даних, ефективністю та переносимістю мови C.
  • Безпосередньо та всебічно підтримувати безліч стилів програмування.
  • Дати програмісту свободу вибору, навіть якщо це дасть можливість вибирати неправильно.
  • Максимально зберегти сумісність із C, тим самим уможливлюючи легкий перехід від програмування на C.
  • Уникнути різночитань між C і C++: будь-яка конструкція, допустима в обох мовах, повинна в кожному з них позначати те саме і призводити до однієї і тієї ж поведінки програми.
  • Уникати особливостей, які залежать від платформи чи не є універсальними.
  • "Не платити за те, що не використовується" - ніякий мовний засіб не повинен призводити до зниження продуктивності програм, які його не використовують.
  • Не вимагати надто ускладненого середовища програмування.

C та C++

Синтаксис C++ успадкований від мови C. Хоча, формально, однією з принципів C++ залишається збереження сумісності з мовою C, фактично групи зі стандартизації цих мов не взаємодіють, а внесені ними зміни як корелюють, а й нерідко принципово суперечать одне одному ідеологічно. Так, елементи, які нові стандарти C додають в ядро, стандарті C++ є елементами стандартної бібліотеки і в ядрі взагалі відсутні, наприклад, динамічні масиви, масиви з фіксованими межами, засоби паралельної обробки. Як вважає Страуструп, об'єднання розробки цих двох мов принесло б велику користь, але воно навряд чи можливе з політичних міркувань. Так що практична сумісність між C і C++ поступово втрачатиметься.
У цьому прикладі, залежно від компілятора, буде виведено або “C++”, або “C”:

Програма 9.1

#include int main() ( printf("%s\n", (sizeof("a") == sizeof(char)) ? "C++" : "C"); return 0; )

Пов'язано це про те, що символьні константи C мають тип int , а C++ - тип char , але розміри цих типів різняться.

Моделі життєвого циклу програми

Життєвий циклПрограмне забезпечення - це період часу, який починається з моменту прийняття рішення про необхідність створення програмного продукту і закінчується в момент його повного вилучення з експлуатації. Цей цикл - процес побудови та розвитку програмного забезпечення (ПЗ). Існує кілька моделей життєвого циклу.
Каскадна модельжиттєвого циклу (англ. waterfall model) було запропоновано 1970 р. Уинстоном Ройсом. Вона передбачає послідовне виконання всіх етапів проекту у строго фіксованому порядку. Перехід на наступний етап означає повне завершення робіт на попередньому етапі. Вимоги, визначені на стадії формування вимог, суворо документуються у вигляді технічного завдання та фіксуються на весь час розробки проекту. Кожна стадія завершується випуском повного комплекту документації, достатньої для того, щоб технологія могла бути продовжена іншою командою розробників.
Етапи проекту відповідно до каскадної моделі:

  1. формування вимог;
  2. Проектування;
  3. Реалізація;
  4. Тестування;
  5. Впровадження;
  6. Експлуатація та супровід.

У каскадній моделі перехід від однієї фази проекту в іншу передбачає повну коректність результату попередньої фази. У великих проектах цього досягти практично неможливо. Тому така модель придатна лише розробки невеликого проекту. (Сам У. Ройс не дотримувався даної моделі та використав модель ітераційну).
Ітераційна модель
Альтернативою каскадної моделі є модель ітеративної та інкрементальної розробки (англ. iterative and incremental development, IID), що отримала від Т. Гілба у 70-ті роки. назва еволюційної моделі Модель IID передбачає розбиття життєвого циклу проекту на послідовність ітерацій, кожна з яких нагадує «міні-проект», включаючи всі процеси розробки щодо створення менших фрагментів функціональності, в порівнянні з проектом в цілому. Мета кожної ітерації – отримання працюючої версії програмної системи, що включає функціональність, визначену інтегрованим змістом усіх попередніх та поточної ітерації. Результат фінальної ітерації містить усю необхідну функціональність продукту. Таким чином, із завершенням кожної ітерації продукт отримує приріст – інкремент – до його можливостей, які, отже, розвиваються еволюційно.


Різні варіанти ітераційного підходу реалізовані у більшості сучасних методологій розробки:

Процес розробки - Rational Unified Process (RUP)

Rational Unified Process (RUP)(Раціональний уніфікований процес) – методологія розробки програмного забезпечення, яка підтримується компанією Rational Software (IBM). У методології даються рекомендації з усіх етапів розробки: від моделювання бізнесу до тестування та здачі в експлуатацію готової програми. В якості мови моделювання використовується мова Unified Modelling Language (UML).
Повний життєвий цикл розробки продукту складається з чотирьох фаз, кожна з яких включає одну або кілька ітерацій.

  • Початкова стадія (Inception)
  • Визначення масштабів проекту та обсягу необхідних ресурсів. Визначаються основні вимоги, обмеження та ключова функціональність продукту. Оцінюються ризики. Планування процесів. При завершенні початкової фази оцінюється досягнення етапу життєвого циклу мети (англ. Lifecycle Objective Milestone), яке передбачає угоду зацікавлених сторін про продовження проекту.

  • Уточнення (Elaboration)
  • Документування вимог. Проектування, реалізація та тестування архітектури, що виконується. Уточнення термінів та вартості. Зниження основних ризиків. Успішне виконання фази розробки означає досягнення етапу життєвого циклу архітектури (Lifecycle Architecture Milestone).

  • Побудова (Construction)
  • У фазі «Побудова» відбувається реалізація більшої частини функціональності продукту: дизайн програми завершено, вихідний код написано. Фаза Побудова завершується першим зовнішнім релізом системи та віхою початкової функціональної готовності (Initial Operational Capability).

  • Впровадження (Transition)
  • У фазі "Впровадження" створюється фінальна версія продукту і передається від розробника до замовника. Це включає програму бета-тестування, навчання користувачів, а також визначення якості продукту. Якщо якість не відповідає очікуванням користувачів або критеріям, встановленим у фазі Початок, фаза Впровадження повторюється знову. Виконання всіх цілей означає досягнення віхи готового продукту (Product Release) та завершення повного циклу розробки.



"Інформаційна технологія. Системна та програмна інженерія. Процеси життєвого циклу програмних засобів». Цей стандарт прийнятий Федеральним агентством з технічного регулювання та метрології РФ та аналогічний міжнародному стандарту ISO/IEC 12207:2008. Цей стандарт, встановлює загальну структуру процесів життєвого циклу програмних засобів, яку можна орієнтуватися у програмній промисловості. Стандарт не пропонує конкретної моделі життєвого циклу. Його положення є спільними для будь-яких моделей життєвого циклу, методів та технологій створення ПЗ. Він описує структуру процесів життєвого циклу, не конкретизуючи, як реалізувати чи виконати дії та завдання, включені до цих процесів.

Презентація до уроку
Теми повідомлень
  • Фонд вільного програмного забезпечення (FSF)
  • Вільні ліцензії ПЗ
  • FreeSoftware та Open Source
  • Історія розвитку мов програмування
  • Історія виникнення мови C. C та C++
  • Історія
  • Критика C++
  • Історія UNIX
  • Спіральна модель життєвого циклу ПЗ
  • UML (англ. Unified Modeling Language – уніфікована мова моделювання)
  • Microsoft Solutions Framework
  • IDE для програмування на C/C++ у Windows
  • Компілятори C/C++
  • Створення консольної програми у Windows
Запитання
  1. Чому каскадна модель розробки програмного забезпечення не застосовується у великих проектах?
  2. У чому різниця між каскадною та ітераційною моделями розробки?
  3. Перерахуйте стадії розробки програмного забезпечення в методології Rational Unified Process (RUP)

C++ компілюється мову програмування загального призначення, поєднує властивості як високорівневих, і низькорівневих мов програмування. У порівнянні з його попередником, мовою програмування Cі, найбільшу увагу приділено підтримці об'єктно-орієнтованого та узагальненого програмування. Назва «мова програмування C++» походить від мови програмування C, в якій унарний оператор ++ позначає інкремент змінної.

Мова програмування C++ широко використовується розробки програмного забезпечення. А саме створення різноманітних прикладних програм, розробка операційних систем, драйверів пристроїв, а також відео ігор і багато іншого. Він був створений на початку 1980-х років, Бьорном Страуструп. Він вигадав ряд удосконалень до мови програмування C, для потреб. тобто. спочатку не планувалося створення мови програмування С++.

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

Ім'я мови, що у результаті, походить від оператора унарного постфіксного інкременту C++ (збільшення значення змінної на одиницю). Ім'я C+ не було використане тому, що є синтаксичною помилкою C і, крім того, це ім'я було зайнято іншою мовою. Мова також не була названа D, оскільки «є розширенням C і не намагається усувати проблеми шляхом видалення елементів C».

Переваги мови:

1. Масштабованість. Мовою C++ розробляють програми для різних платформ і систем.

2. Можливість роботи на низькому рівні з пам'яттю, адресами, портами.

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

4. Кросплатформенність. Доступні компілятори для великої кількості платформ, мовою C++ розробляють програми для різних платформ і систем.

5. Ефективність. Мова спроектована так, щоб дати програмісту максимальний контроль над усіма аспектами структури та порядку виконання програми.

Недоліки мови:

1. Наявність безлічі можливостей, що порушують принципи типобезпеки призводить до того, що в С++ програми можуть легко зафарбуватися помилка.

2. Погана підтримка модульності. Підключення інтерфейсу зовнішнього модуля через препроцесорну вставку файлу заголовка (#include) серйозно уповільнює компіляцію, при підключенні великої кількості модулів.

3. Мова C++ є складним вивчення і компіляції.

4. Деякі перетворення типів неінтуїтивні. Зокрема, операція над беззнаковим та знаковим числами видає беззнаковий результат.

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

Завдяки чому склався такий статус мови С? Історично ця мова невіддільна від операційної системи Unix, яка в наші дні переживає своє друге народження. 60-ті роки були епохою становлення операційних систем та мов програмування високого рівня. У той період для кожного типу комп'ютерів незалежно розроблялися ОС і компілятори, а нерідко навіть мови програмування (згадаймо, наприклад, PL/I). У той же час, спільність проблем, що виникають при цьому, вже стала очевидною. Відповіддю на усвідомлення цієї спільності стала спроба створити універсальну мобільну операційну систему, а для цього знадобилася не менш універсальна та мобільна мова програмування. Такою мовою став С, а Unix стала першою ОС, практично повністю написаною мовою високого рівня.

Тісний зв'язок з Unix дав мови З такого полігону для обкатки, якого не було на той час жодної іншої мови. Завдання системного програмування по праву вважалися тоді найскладнішими у галузі. Здебільшого вони були настільки машинно-залежними, що багато хто взагалі не мислив їх рішення інакше, ніж на асемблері. Мови високого рівня призначалися для прикладного програмування і дуже обмежено реалізовували функції, необхідних системних робіт, причому найчастіше лише певного типу машин.

Мова З самого початку створювалася так, щоб на ній можна було писати системні завдання. Творці С не стали розробляти абстрактну модель виконавця мови, а просто реалізували в ньому ті можливості, яких найбільше потребували практики системного програмування. Це насамперед були засоби безпосередньої роботи з пам'яттю, структурні конструкції управління та модульна організація програми. І насправді більше нічого в мову включено не було. Решта було віднесено до бібліотеки часу виконання. Тому недоброзичливці іноді відгукуються про мову С як структурний асемблер. Але що б вони не говорили, підхід виявився дуже вдалим. Завдяки йому було досягнуто нового рівня щодо співвідношення простоти та можливостей мови.

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

Багато суперечок викликав синтаксис мови С. Застосовані в ньому прийоми скорочення запису при непомірному використанні можуть зробити програму абсолютно нечитаною. Але, як говорив Дейкстра, - кошти не винні в тому, що їх використовують безграмотно. Насправді ж, запропоновані в З скорочення синтаксису відповідають стереотипним ситуаціям, що найчастіше зустрічаються на практиці. Якщо вважати скорочення ідіомами для виразного та компактного уявлення таких ситуацій, то користь від них стає безумовною та очевидною.

Отже, З виник як універсальна мова системного програмування. Але він не залишився у цих рамках. До кінця 80-х років мова С, відтіснивши Fortran з позиції лідера, завоювала масову популярність серед програмістів у всьому світі і стала використовуватися в різних прикладних завданнях. Чималу роль тут відіграло поширення Unix (а отже, і С) в університетському середовищі, де проходило підготовку нове покоління програмістів.

Як і всі мови, З поступово вдосконалювався, але більшість удосконалень не мало радикального характеру. Найбільш суттєвим з них, мабуть, слід вважати запровадження суворої специфікації типів функцій, яка значно підвищила надійність міжмодульної взаємодії на С. Всі такі удосконалення були в 1989 закріплені в стандарті ANSI який і досі визначає мову С.

Але якщо все так безхмарно, то чому ще продовжують використовуватися всі інші мови, що підтримує їх існування? Ахіллесовою п'ятою мови С стало те, що він виявився надто низькорівневим для тих завдань, які поставили на порядок денний 90-ті роки. Причому ця проблема має два аспекти. З одного боку, в мову були вбудовані дуже низькорівневі засоби - насамперед це робота з пам'яттю та адресна арифметика. Недарма зміна розрядності процесорів дуже болісно відбивається на багатьох С-програмах. З іншого боку, в З бракує засобів високорівневих - абстрактних типів даних та об'єктів, поліморфізму, обробки винятків. Як наслідок, у програмах на З техніка реалізації завдання часто домінує над її змістовною стороною.

Перші спроби виправити ці недоліки почали робити ще на початку 80-х років. Вже тоді Бьорн Страуструп у AT&T Bell Labs став розробляти розширення мови під умовною назвою. Стиль ведення розробки цілком відповідав духу, у якому створювався і саму мову С, - в нього вводилися ті чи інші можливості з метою зробити більш зручною роботу конкретних людей та груп. Перший комерційний транслятор нової мови, що отримав назву C++, з'явився в 1983 році. Він був препроцесор, транслировавший програму в код на З. Проте фактичним народженням мови вважатимуться вихід 1985 року книги Страуструпа. Саме з цього моменту C++ починає набирати всесвітньої популярності.

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

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

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

Все це призвело до того, що багато розробників змушені були самі досліджувати лабіринти мовної семантики і самостійно відшукувати успішні ідіоми. Так, наприклад, на першому етапі розвитку мови багато творців бібліотек класів прагнули побудувати єдину ієрархію класів із загальним базовим класом Object. Ця ідея була запозичена зі Smalltalk - однієї з найвідоміших об'єктно-орієнтованих мов. Однак вона виявилася абсолютно нежиттєздатною в C++ - старанно продумані ієрархії бібліотек класів виявлялися негнучкими, а робота класів - неочевидною. Щоб бібліотеками класів можна було користуватися, їх доводилося постачати у вихідних текстах.

Поява темплетних класів взагалі спростувала цей напрямок розвитку. Наслідуванням стали користуватися лише у випадках, коли вимагалося породження спеціалізованої версії наявного класу. Бібліотеки стали складатися з окремих класів та невеликих незв'язаних один з одним ієрархій. Однак на цьому шляху стало знижуватися повторне використання коду, так як у C++ неможливе поліморфне використання класів із незалежних ієрархій. Повсюдне застосування темплетів веде до неприпустимого зростання обсягу скомпилированного коду - не забуватимемо, темплети реалізуються методами макрогенерації.

Один з найважчих недоліків C++, успадкований ним від синтаксису, полягає в доступності компілятору опису внутрішньої структури всіх використаних класів. Як наслідок, зміна внутрішньої структури представлення якогось бібліотечного класу призводить до необхідності перекомпіляції всіх програм, де ця бібліотека використовується. Це сильно обмежує розробників бібліотек у частині їхньої модернізації, адже, випускаючи нову версію, вони повинні зберігати двійкову сумісність із попередньою. Саме ця проблема змушує багатьох фахівців вважати, що C++ непридатний для ведення великих та надвеликих проектів.

І все ж, незважаючи на перераховані недоліки і навіть на неготовність стандарту мови (це після п'ятнадцяти років використання!), C++ залишається однією з найбільш популярних мов програмування. Його сила насамперед у практично повній сумісності з мовою С. Завдяки цьому програмістам C++ доступні всі напрацювання, виконані на С. При цьому C++ навіть без використання класів привносить у С ряд настільки важливих додаткових можливостей та зручностей, що багато хто користується ним просто як покращеним С .

Що стосується об'єктної моделі C++, то поки ваша програма стала дуже великою (сотні тисяч рядків), нею цілком можна користуватися. Наметившаяся останнім часом тенденція початку компонентного програмного забезпечення лише посилює позиції C++. При розробці окремо взятих компонентів недоліки C++ ще виявляються, а зв'язування компонентів у діючу систему виробляється не так на рівні мови, але в рівні операційної системи.

У світлі всього сказаного перспективи C++ не виглядають похмурими. Хоча монополія на ринку мов програмування йому не світить. Мабуть, з упевненістю можна стверджувати лише те, що ще однієї модернізації-розширення ця мова не переживе. Недарма, коли з'явилася Java, на неї звернули таку пильну увагу. Мова, близька за синтаксисом до C++, а значить, що здається знайомим багатьом програмістам, був позбавлений найбільш кричущих недоліків C++, успадкованих ним з 70-х років. Однак не схоже, щоб Java справлялася з деякою роллю, що покладається на неї.

Особлива роль мов C/C++ у програмуванні практично позбавляє сенсу приведення конкретних адрес в Інтернеті, де можна знайти матеріали за ними. Таких місць просто забагато. Однак, якщо цікаво докладніше ознайомитися з еволюцією C++, то почніть із невеликої статті http://citforum.syzran.ru/programming/prg96/76.shtml.

Олександр Сергєєв, [email protected]
Стаття із журналу BYTE/Росія, Березень 2000

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

Лістинг 1. З

1 #include /* Підключаємо функції введення-виводу */ 2 3 void main(void) 4 ( 5 int М; /* Масив з 10 цілих, рахунок з 0 */ 6 int N; 7 for (N=0; N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Проходимо масив у зворотному */ 12 if (M[N]%2) /* порядку та виводимо непарні */ 13 printf("%d\n", M[N]); 14 )

  • Рядок 3.У C/C++ виконання програми завжди починається з функції main.
  • Рядки 7 та 11.У заголовку циклу через точку з комою вказуються початкова установка, умова продовження та правило перерахунку параметра циклу. Операції ++ і -/- - найвідоміші зі скорочень мови С, що означають інкремент і декремент змінної, тобто збільшення та зменшення значення на одиницю.
  • Рядок 8.Функція scanfвводить за форматом, заданим першим параметром, значення змінних, адреси яких задані іншими параметрами. Тут адреса, куди вводиться значення, обчислюється за допомогою адресної арифметики, до адреси розташування масиву Мдодається зміщення на Nелементів. Той самий ефект можна отримати, записавши &M[N].
  • Рядок 12.Операція % обчислює залишок від розподілу. Умова оператора ifвважається виконаним, якщо чисельне значення виразу відрізняється від нуля.
  • Рядок 13.Функція printf- друк за форматом діє аналогічно scanf, але замість адрес їй передаються значення, що підлягають висновку.
1 #include 2 3 template class Array 4 ( 5 public: Array (T Size=1) : M (new T), N(Size), n(0) () 6 Array (void) ( delete M;) 7 T Count (void) const ( return n; ) 8 T operator (int i) const ( return M[i]; ) 9 void Add (Т Data);10 private: 11 T* М; - розподілено;n - використано 13); 14 15 template void Array ::Add(T Data) 16 ( if (N-n) // Якщо використано все розподілене 17 ( int* P = new T; // місце, розподілимо більше 18 for (int i=0; i A; // Масив цілих змінного розміру 28 while (1) // Нескінченний цикл 29 ( int N; 30 cin >> N; // cin - стандартний потік введення 31 if (cin.eof()) break; // Вихід із циклу по кінцю файлу 32 A.Add(N); // Додаємо введене число масив 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // Проходимо по масиву 35 if ( A[N]%2) 36 cout<, і звільнить пам'ять
  • Рядки 3-13.Оголошується темплетний клас Аррайз параметром Т. Він є масивом змінного розміру об'єктів типу Т. Звичайно, в нашому завданні немає потреби використовувати темплетний клас. Проте хотілося продемонструвати, як у C++ створюється поліморфна структура даних, здатна працювати з будь-яким типом елементів.
  • Рядок 5.Конструктор класу. У ньому ініціалізується уявлення об'єкта. Наприклад, у полі Мзаноситься адреса блоку пам'яті, замовленого операцією new T.
  • Рядок 8.Приклад перевантаження операції. Функція operatorбуде викликатись, коли квадратні дужки з'являтимуться праворуч від об'єкта класу Array.
  • Рядок 9.Ця функція є основною у реалізації. Вона додає елементи масив, розширюючи його за необхідності. Оскільки вона складніша за інших, її визначення винесено з опису класу. Функції, описані в тілі класу, реалізуються в C++ не виклик, а inline-підстановкою. Це прискорює роботу програми, хоч збільшує її розмір.
  • Рядки 15-24.Визначення функції Аrrау::Add(T)(Між іншим, це її повне ім'я).
  • Рядок 27.Створюємо об'єкт типу Array. Темплет Аггаупараметризується типом int.


Сподобалась стаття? Поділіться їй