
- •Історія
- •Елементи Синтаксис
- •Типи даних
- •Класифікація мов програмування
- •Способи реалізації мов [ред.]
- •Процедури та функціі
- •Об'єктно-орієнтоване програмування
- •Семантика мов програмування
- •Мови програмування низького рівня
- •Переваги
- •Недоліки
- •Мови програмування високого рівня
- •П'ять поколінь мов програмування
- •П'яте покоління
- •Філософія
- •Мінімалізм
- •Характеристика
- •Відсутня функціональність
- •Історія Рання розробка
- •Стандарт c99
- •Стандарт c11
- •Використання
- •Бібліотеки
- •Критика
Відсутня функціональність
С має брак наступних можливостей, які є в інших мовах програмування, (хоча далеко не завжди брак деяких можливостей, наявних в якихось мовах, є недоліком):
Відсутність нескалярних операцій, на зразок копіювання масивів або рядків.
Відсутність автоматичного керування пам'яттю (збір сміття)
Відсутня перевірка меж масиву
Відсутність напів-динамічних масивів аж до С99
Відсутність синтаксису для масивів, на зразок А..В, котрі використовують, як старіші, так і новіші мови програмування
Відсутність вкладених функцій (хоча, ця можливість є з деякими компіляторами, наприклад GCC. Однак знову ж, є суперечливою сама потреба вкладених функцій.)
Відсутність обробки винятків
Відсутність рудиментарної підтримки модульного програмування
Відсутність статичного поліморфізму у формі перевантаження функцій або операторів
Відсутність підтримки об'єктно-орієнтованого програмування
Відсутність вбудованої підтримки багатозадачності та роботи з мережами, хоча ці можливості забезпечуються популярними бібліотеками
Відсутність стандартних бібліотек для роботи з графікою та деяких інших бібліотек для прикладного програмування
Ці моменти абсолютно не завадили мові бути добре прийнятою спеціалістами. Швидко були створені компілятори для різних платформ. А в значній мірі низькорівнева природа мови, надала програмістам можливість якісно контролювати роботу програм, дозволяючи оптимізувати їх під конкретні завдання. Це дозволило кодові ефективно працювати на дуже обмеженому апаратному забезпеченні, такому як вбудовані системи, що сьогодні мають таку високу функціональність завдяки початковому використанню мови С.
Можливості мови підвищуються у спосіб використання сторонніх бібліотек. Більшість об'єктно-орієнтованих функцій включають спеціальний вказівник «цей»(this у C++,Java), який посилається на поточний об'єкт. Передаючи цей вказівник в якості аргументу функції у С, ті ж функціональні можливості можуть бути використані у С. Для прикладу, у C++ можна написати:
stack->push(val);
у той час, як у С це виглядало б, приміром, так:
push(stack, val);
де аргумент stack у С є вказівником на структуру (struct), що є еквівалентною цьому вказівнику у С++, який є вказівником на об'єкт.
Історія Рання розробка
Початковий етап розробки Сі відбувся у стінах Bell Labs між 1969 та 1973 роками; Деніс Рітчі стверджує, що найбільш творчим був 1972 рік. Мову було названо «Сі» через те, що багато її можливостей було отримано від раніше створеної мови B.
Існує чимало легенд щодо походження мови Сі, і пов'язаної з нею операційної системи UNIX, серед них:
Розробка Сі стала результатом того, що його майбутні автори любили комп'ютерну гру, схожу на популярну гру Asteroids (Астероїди). Вони вже давно грали у неї на головному сервері компанії, який був недостатньо потужним, і повинен був обслуговувати близько ста користувачів. Томпсон і Рітчівирішилили, що їм не вистачає контролю над космічним кораблем для того, щоб уникати зіткнень з деякими каменями. Тому вони вирішили перенести гру на вільнийPDP-7, що стоїть в офісі. Проте цей комп'ютер не мав операційної системи, що змусило їх її написати. Врешті-решт, вони вирішили перенести цю операційну систему ще й на офісний PDP-11, що було дуже важко, оскільки її код був цілком написаний на асемблері. Було винесено пропозицію використати якусь високорівневу портативну мову, щоб можна було легко переносити ОС з одного комп'ютера на іншій. Мова B, яку вони спершу хотіли використати, виявилася позбавленою функціональності, здатної використовувати нові можливості PDP-11. Тому вони і зупинилися на розробці мови С.
Найперший комп'ютер, для якого була спочатку написана UNIX, призначався для створення системи автоматичного заповнення документів. Перша версія UNIX була написана на асемблері. Пізніше для того, щоб переписати цю операційну систему, була розроблена мова С.
До 1974 року мова С стала достатньо функціональною для того, щоб переписати на ній більшу частину ядра UNIX, котре спершу було написане на асемблері PDP-11. Це було перше ядро операційної системи реалізоване не на асемблері.
K&R C
У 1978 році Рітчі та Керніган опублікували першу редакцію книги «Мова програмування Сі». Ця книга, відома серед програмістів як «K&R». Описану у ній версію мови Сі, часто називають «K&R». Друга редакція цієї книги присвячена пізнішому стандарту ANSI C, описаному нижче.
K&R описує такі особливості мови:
Тип даних struct
Тип даних long int
Тип даних unsigned int
Оператор =- було змінено на -=, щоби позбутися семантичної двозначності створюваної конструкціями, на зразок i=-10, яка могла інтерпретуватися, як i =- 10 або i = -10
K&R часто вважають найголовнішою частиною мови, яку повинен підтримувати компілятор С. Багато років, навіть після виходу ANSI C, він вважався мінімальним рівнем, якого слід було дотримуватися програмістам, охочим добитися від своїх програм максимальної портативності, оскільки не всі компілятори тоді підтримували ANSI C, а код на K&R C був сумісним і з ANSI C.
У ранніх версіях C, лише функції, що повертають значення з типом відмінним від int повинні були бути оголошеними, якщо вони використовувалися перед визначенням функції; функції без попереднього оголошення повинні повертати лише ціле число.
Для прикладу: long int SomeFunction(); int OtherFunction();
int CallingFunction()
{
long int test1;
int test2;
test1 = SomeFunction();
if (test1 > 0) test2 = 0;
else test2 = OtherFunction();
return test2;
}
У цьому прикладі, як SomeFunction, так і OtherFunction були оголошені перед своїм використанням. У K&R оголошенням OtherFunction можна було знехтувати.
Оскільки декларація функцій у K&R C не включає ніякої інформації про аргументи функції, перевірка типу параметрів не виконується, хоча деякі компілятори видають попереджувальне повідомлення, якщо до локальної функції звертаються із неправильним числом аргументів, або якщо багаторазові виклики до зовнішньої функції використовувають різну кількість аргументів.
Наступні декілька років після публікації K&R C, до мови було додано декілька неофіційних можливостей (у той час, як офіційного нового стандарту не було), котрі підтримувалися компіляторами від AT&T та деяких інших постачальників. Серед них:
функції з типом результату void;
функції, що повертають значння типу struct або union (а не вказівник)
присвоєння для типу struct
Визначник const, котрий робив об'єкт доступним лише для читання
Перечислювані типи
Велика кількість доповнень і відсутність стандартної бібліотеки, разом із великою популярністю мови, створили нагальну потребу у стандартизації.
ANSI C
Наприкінці 1970-х, мова C випередила BASIC, і стала найпопулярнішою мовою програмування для мікрокомп'ютерів. Протягом 1980-х, її прийняли для використання в IBM PC, і її популярність почала зростати досить стрімкими темпами. У той же час, Бьярн Страуструп та інші працівники Bell Labs розпочали роботу над доданням об'єктно-орієнтованих конструкцій до C, що призвело до виникнення C++.
У 1983, Американський Національний Інститут Стандартів (ANSI) сформував комітет X3J11 для створення стандартної специфікації для мови C. У 1989, стандарт був ратифікований як ANSI X3.159-1989 «Мова Програмування C». Цю версію часто називають ANSI C, Стандартний C, або С89.
У 1990, стандарт (з декількома незначними модифікаціями) ANSI C ратифікувала Міжнародна Організація із Стандартизації (ISO), ISO/IEC 9899:1990. Цю версію іноді називають C90. Тому, терміни «C89» і «C90» по суті, позначають одну мову.
ANSI, як і інші інститути із стандартизації, більше самотужки не займається розвитком стандарту мови програмування С. Прийняття стандарту національними інститутами, як правило, відбувається протягом року після публікацію стандарту ANSI.
Одна з цілей процесу стандартизації мови С полягала у розробці надмножини над K&R C, яка включала б чимало неофіційних можливостей. Комітети зі стандартизації також додали чимало додаткових функцій, як то прототипи функцій (запозичені в C++), вказівники void, підтримку міжнародних наборів символів та мов і локалей, а також низку розширень для препроцесора. Синтаксис декларації параметрів також було розширено використовуючи запозичення з С++, хоча, інтерфейс K&R також допускається для збереження зворотної сумісності зі старим кодом.
C89 наразі підтримується усіма компіляторами С, і більшість існуючого коду написано на базі даного стандарту. Будь яка програма на писана на стандартній С, і без використання апаратно залежних засобів може бути скомпільована і запущена на будь якій операційній системі та апаратній архітектурі без будь яких обмежень ресурсів.