Історія мови C / C + +. Приклад використання

За цим склався такий статус мови З? Історично ця мова невіддільний від операційної системи Unix, яка в наші дні переживає своє друге народження. 60-і роки були ерою становлення операційних систем і мов програмування високого рівня.

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

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

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

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

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

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

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

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

Перший проби поправити ці недоліки стали робитися ще спочатку 80-х років. Вже тоді Бьерн Страуструп в AT & T Bell Labs став розробляти розширення мови С під умовною назвою «З з класами>. Стиль ведення розробки повністю відповідав духу, в якому створювався і сама мова С, — в нього вводилися ті або інші здібності з метою зробити більш комфортною роботу певних людей і груп. Перший комерційний транслятор нової мови, що отримав назву C + + з’явився в Одна тисяча дев’ятсот вісімдесят три року. Він являв собою препроцесор, який передавав програмку в код на С. Але фактичним народженням мови можна вважати вихід в Одна тисяча дев’ятсот вісімдесят п’ять році книжки Страуструпа. Конкретно відтепер 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 + + в сучасному програмуванні фактично позбавляє сенсу приведення певних адрес в Інтернеті, де можна відшукати матеріали по ним.