Эволюция.сом Мова програмування Сі++: етапи еволюції та сучасний

07.09.2015

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

Перші версії мови програмування Сі++ (тоді він називався «Сі з класами») були розроблені на початку 80-х років Бьярном Страуструпом, співробітником знаменитої AT&T Bell Labs, де раніше були розроблені такі шедеври програмування, як операційна система UNIX та мови програмування Сі.

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

За основу був узятий популярний в середовищі професійних розробників мова програмування Сі. Першими засобами, якими був розширений Сі, стали засоби підтримки абстракції даних і об’єктно-орієнтованого програмування.

Як це прийнято в AT&T, опис нової мови не було опубліковано відразу. Першими його користувачами стали самі співробітники Bell Labs. У 1993 вперше була реалізована комерційний транслятор, і сам язик був названий «С++», що можна (маючи на увазі операцію инкрементирования мови Сі) трактувати як збільшений або розширений мова Сі.

Першим транслятором мови був препроцесор cfront, що транслює програму на Сі++ в еквівалентну програму на Сі. І лише в кінці 80-х років були реалізовані прямі транслятори, які не використовують Сі в якості проміжного мови. Піонером серед таких трансляторів став GNU CC.

Якщо не вважати документацію до транслятору cfront, першою книгою з описом мови стала «The C++ Programming Language» (Addison-Wesley, 1985), перекладена на російську мову і видана в 1991 році (Страуструп Б. Мова програмування С++. М. Радіо і Зв’язок, 1991).

З цього моменту почалося бурхливе поширення і створення численних реалізацій.

Модель реалізації ООП була частково запозичена з мови програмування Simula67 і орієнтувалася в основному на можливість ефективної реалізації на обчислювальних машинах зі стандартною архітектурою. Деякі можливості мови Simula були відхилені, так як, на думку автора Сі++, підштовхували розробника до поганого стилю програмування. Так, у перших версіях Сі++ повністю була відсутня можливість динамічної ідентифікації типу об’єкта (run-time type identification, rtti). Основні концепції підтримки ООП в Сі++ були викладені Страуструпом у статті «What is Object Oriented Programming».

C 1985 року в мову були введені нові можливості: множинне і віртуальне спадкування, шаблони функцій і класів, обробка виняткових ситуацій. Кардинально змінена семантика спільного використання оператора new, змінено синтаксис для вкладених класів.

З моменту опублікування і до цього моменту мова постійно вдосконалювався і розвивався. Важливим етапом в його розвитку стала публікація у 1990 році докладного і досить суворого опису мови. Скорочено цю книгу часто називають ARM. Фактично одночасно з цим почалася стандартизація мови.

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

2. Історія стандартизації

Об’єднаний ANSI-ISO (ANSI X3J16; ISO WG21/N0836) комітет почав функціонувати в кінці 1989 року. Метою його роботи є створення єдиного стандарту для мови Сі++ і його бібліотечних коштів. За основу проекту стандарту було взято опис мови, дане в ARM, і книга.

У роботі об’єднаного комітету, що функціонує і донині, значне місце займає вивчення (з наступним прийняттям або відмовою від) можливих змін тексту проекту стандарту, а також уточнення різних правил мови. Дозволимо собі нагадати, що безпосередній попередник Сі++ — мова Сі пройшов успішно процес стандартизації. Робота по стандартизації завершилася у 1989 році, і стандартизований варіант зараз відомий під ім’ям ANSI Сі.

Робота по стандартизації Сі++ ускладнювалася тим, що мова тривалий час був відкритий для розширень. Самі формулювання правил ARM були недостатньо суворі й часто потребували уточнення. Сі++ став досить громіздким мовою (порівнянним хіба що з мовою Ada), і жодна людина зараз не в змозі точно пам’ятати всі деталі і тонкощі.

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

Спочатку планувалося, що остаточна редакція проекту стандарту буде опублікована у 1994 році. Ці терміни були безнадійно провалено. Можна сказати, що останні 3 роки процес стандартизації постійно знаходиться в стані «2 роки до завершення». Так, згідно з поточним розкладом міжнародний стандарт Сі++ повинен бути опублікований в кінці 1998 року, під що автори статті не вірять. Навіть теперішні, на рідкість докладні і громіздкі формулювання семантичних правил і обмежень мови явно не дотягують до математичної строгості і залишають простір для різних трактувань.

У ранніх версіях проекту стандарту не було розділу, що описує стандартні бібліотеки. Не було описів бібліотеки і ARM. У той же час реалізація бібліотеки потокового вводу/виводу, запропонована Andrew Koenig, була повторена в декількох реалізаціях і стала стандартом «де-факто». У 1993-1994 роках у проекті стандарту було введено близько семи нових розділів опису бібліотеки.

Принципово важливою подією в історії розвитку стандарту стандартної бібліотеки стало включення бібліотеки STL (Standard Template Library) розробленою нашим колишнім співвітчизником, співробітником Hewllet-Packard Олександром Степановим. У своїй статті про історію STL він згадує, що спочатку прагнув використовувати в Сі++ тільки можливості шаблонів, аналогічні родовим (generic) пакетів та процедурами мови Ada, але після обговорень з Страуструпом існуючих можливостей Сі++ змінив свою думку. Комітет з стандартизації пішов назустріч цим двом гуру, аж до того, що в семантику шаблонів були внесені зміни. Цим був створений цікавий прецедент в історії мов програмування: не бібліотека написана для мови, а сама мова зазнав змін під впливом бібліотеки, причому розроблена не автором мови.

Згідно з розкладом роботи комітету по стандартизації, проект стандарту прийнятий у квітні 1995 року, був запропонований для публічного обговорення і зроблений доступний користувачам Internet. Стверджується, що з цього моменту ніяких серйозних змін у текст стандарту вноситися не буде. Передбачалося, що у вересні 1996 року нова редакція проекту стандарту буде винесена на публічне обговорення, але не так давно цей етап був перенесений на кінець року.

3. Сучасний стан мови

Наведемо побіжний опис нових можливостей мови, введених з моменту публікації ARM і до публікації проекту стандарту в квітні 1995р.

Наведені нові ключові слова-синоніми для операцій (and, and_eq, bitand, bitor, compl, not, or, or_eq, xor, xor-equ).

В мові з’явився булевский тип даних bool та літерали цього типу true і false.

З’явився механізм просторів імен (namespace), що полегшує спільну реалізацію проектів групами програмістів і дозволяє уникати проблем при використанні декількох бібліотек (ключові слова і using namespace).

Нове ключове слово explicit дозволяє заборонити небажане використання конструкторів як функцій перетворення типів.

Змінені синтаксис і семантика для зміни прав доступу до членів класів. Новий механізм дозволяє використовувати єдиний синтаксис для членів використання просторів імен і членів класів. При цьому дещо змінилися правила вибору найбільш підходящої з набору спільно використовуваних функцій (на основі використання ключового слова using).

Доданий механізм явного використання rtti (включає операцію з ключовим словом typeid і клас type_info стандартної бібліотеки).

Додані нові і скориговані старі способи явного перетворення типів (static_cast, dynamic_cast, const_cast і reinterpret_cast).

Додана нова операція new[], парна до операції delete[]; для операцій new і delete змінена семантика висловлення розміщення з метою більш безпечної обробки виняткових ситуацій в конструкторах. Стандартна операція new тепер не може повернути значення 0 у випадку недостачі пам’яті або помилки, а генерує виняткову ситуацію. Старий варіант, який повертає 0, доступний програмістові тільки з явною вказівкою.

Оголошення змінних тепер можливі не тільки в заголовку for-циклу, але і в операторах if, while, do-while, switch.

Більш точно визначений час життя тимчасових об’єктів у виразі. Тепер час їх життя обмежено повним вираженням, а не кінцем поточного блоку, як сказано в ARM.

Повністю перероблено визначення шаблонів в Сі++. Тепер вже можна сказати, що шаблони Сі++ є лише злегка замаскованими синтаксичними підстановками. Для них обов’язковий синтаксичний розбір і контроль семантики (у максимально можливій мірі). Неоднозначність всередині тіл шаблонів, що викликаються невідомою природою типових параметрів, явно вирішуються за допомогою ключового словом typename.

Допускаються шаблонні функції-члени нешаблонных класів, вкладені шаблонні класи і шаблони — параметри шаблонів.

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

Перечислимый тип (enum) остаточно утвердився як самостійний тип, який не є ні одним з цілочисельних типів. Тепер дозволено спільне використання функцій, засноване на цьому розходженні; константа 0 перечислимого типу більше не вважається цілочисельним 0, заборонено її неявне перетворення до вказівного типу.

Послаблено обмеження на тип, повертається операцією ->. Тепер це може бути довільний тип.

Додано (на рідкість безглузде) ключове слово mutable, що дозволяє допускати зміну членів об’єкта константного класу.

Більш детально деякі з цих змін розглянуті в статті.

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

І, нарешті, кілька зауважень з приводу тривалих дискусій на теми кшталт «Що краще — Сі чи Сі++» або «чи Сі++ мовою ООП».

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

Марно критикувати Сі++ за недостатньо неповну або «неправильну» підтримку ООП. Сі++ цілком вкладається у формулювання парадигми ООП, дану Страуструпом. Сі++ не є єдиною мовою ООП і має право на свої недоліки і своєрідність.

Зараз ООП явно підтримується в декількох мовах програмування, у багатьох не так як Сі++, і розробник має можливість вибору (так, чудово спроектований об’єктно — орієнтована мова Ada95 вже стандартизований). Постійні закиди на адресу Сі++ за «неправильне» розуміння ООП здаються абсолютно безглуздими. Навіть такі стовпи ООП, як Греді Буч і Роберт Мартін визнають, що Сі++ є цілком слушним і непоганим інструментом ООП.

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

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

Сі++ допускає використання в декількох варіантах. По-перше, він містить мова програмування Сі, точніше, його стандартизований діалект ANSI C майже цілком. При цьому Сі++ має більш потужними і строгими правилами перевірки типів. Програміст може використовувати лише частина можливостей Сі++, не стикаючись при цьому з неприємностями, пов’язаними з неповним знанням мови (тобто сприймати Сі++ як «покращений» Сі). Можна використовувати тільки механізм класів і спадкування, не користуючись можливостями узагальненого (generic) програмування, заснованого на шаблонах. Нарешті, багатьом розробникам сподобалася можливість обробки виняткових ситуацій, що не залежить від інших механізмів мови. Взяті разом, ці можливості пропонують розробнику сучасний, досить гнучкий і потужний мова програмування високого рівня з підтримкою ООП.

Думаємо, Сі не потребує захисту. Принаймні, останні 20 років показали, що він є виключно гнучким і продуктивним мовою, придатним для системного програмування, так і для створення додатків широкого спектру. Чому Сі має такий успіх. Перш за все тому, що замість створення «чистого» мови Керниган і Річі створили мову, який можна використовувати. І в цьому вони досягли успіху.

Чому успішний Сі++. З тієї ж причини.

Короткий опис статті: мова програмування с++ Перші версії мови програмування Сі++ (тоді він називався «Сі з класами») були розроблені на початку 80-х років Бьярном Страуструпом, співробітником знаменитої AT&T Bell Labs, де раніше були розроблені такі шедеври програмування, як операційна система UNIX та мови програмування Сі ІТ, Мова програмування Сі++, етапи еволюції, сучасний стан

Джерело: Эволюция.com — Мова програмування Сі++: етапи еволюції та сучасний стан

Також ви можете прочитати