C (мова програмування)
Матеріал з Вікіпедії — вільної енциклопедії.
Парадигма: | імперативна (процедурна) |
---|---|
Дата розробки: | 1972 |
Дизайнер: | Деніс Рітчі |
Розробник: | Деніс Рітчі та Bell Labs |
Система типізації: | статична, слабка |
Основні реалізації: | GCC, MSVC, Borland C, Watcom C |
Діалекти: | ObjC, C++ |
Під впливом від: | B (BCPL,CPL), Algol68, Assembler, Pascal |
Вплинула на: | awk, csh, C++, ObjC, BitC, D, Concurrent C, Java, Javascript |
C — універсальна, процедурна, імперативна мова програмування, розроблена у 1972 році Денісом Рітчі у Bell Telephone Laboratories для використання з операційною системою UNIX. З тих пір її версії з'явилися для багатьох інших операційних систем, і наразі С є однією з найбільш поширених мов програмування. C також здійснив великий вплив на інші мови програмування, особливо на C++, котра спочатку проектувалася, як розширення для С. Найчастіше використовується для написання системного програмного забезпечення, хоча, досить часто на ній пишуть і прикладне програмне забезпечення.
Зміст |
[ред.] Філософія
С — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У резальтаті, код С придатний для більшості системного програмного забезпечення, котре традиційно писалося на амемблері.
Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана програма на С може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтроллерів до суперкомп'ютерів.
[ред.] Характеристика
Як заснована на ALGOL'і мова програмування, С має наступні характеристики:
- Процедурна парадигма програмування, із засобами для структурного програмування
- Лексично змінний контекст і рекурсія
- Статична система типів, яка захищає від багатьох беззмістовних дій
- Різнорідні типи даних, які дозволяють зв'язаним між собою елеменам даних комбінуватися і керуватися, як одне ціле
- Маленький набір (близько 30) зарезервованих ключових слів
C також має наступні специфічні властивості:
- Слабка типізація — наприклад, символи можуть використовуватися, як цілі числа (подібно до асемблера)
- Низькорівненвий доступ до оперативної пам'яті через машинні адреси та вказівники
- Вказівники на функції дозволяють динамічний поліморфізм
- Індексування масивів, як вторинне поняття, визначається у термінах арифметичної операції над покажчиками
- Стандартизований препроцесор C для макроозначення, включення файлу з джерельним кодом, умовної трансляції, і т.д.
- Проста, маленька мова база, з я якої до бібліотек винесено багато існуючих можливостей, на кшталт, математичних функцій та функцій роботи з файлами
- Відмова від добре встановлених логічних з'єднань and та or, і заміна їх && та ||, котрі
- Були розроблені для того, щоб зробити побітові операції (& та |) синтаксично відмінними — її попередник, мова В використовує & та | для обох операцій
- Ніколи не оцінюють правильний операнд, якщо результат може бути визначено тим, що зліва (мінімальна оцінка)
- С популяризував спірне рішення звільнити знак = для здійснення операції присвоєння, замінивши його на == (отримав у спадок від В)
С відчуває брак наступних можливостей, котрі мають інші мови програмування:
- Відсутність нескалярних операцій, на зразок копіювання масивів або рядків.
- Відсутність автоматичного керування пам'яттю (збір сміття)
- Відсутня перевірка меж масиву
- Відсутність напів-динамічних масивів аж до С99
- Відсутність синтаксису для масивів, на зразок А..В, котрі використовують, як старіші, так і новіші мови програмування
- Відсутність вкладених функцій (хоча, дана можливість забезпечується деякими компіляторами, на приклад, GCC)
- Відсутність обробки виключних ситуацій
- Відсутність рудиментарної підтримки модульного програмування
- Відсутність статичного поліморфізму у формі перевантаження функцій або операторів
- Відсутність підтримки об'єктно-орієнтованого програмування
- Відсутність вбудованої підтримки багатозадачності та роботи з мережами, хоча ці можливості забезпечуються популярними бібліотеками
- Відсутність стандартних бібліотек для роботи з графікою та деяких інших бібліотек для прикладного програмування
Незважаючи на відсутність великої кількості можливостей, мова була добре прийнята, оскільки дозволяли швидко створювати компілятори для нових платформ. Відносно низькорівнева природа мови надає програмістам можливість якісного контролю роботи програми, дозволяючи оптимізовувати їх під конкретні завдання. Це дозволяє кодові ефективно працювати на дуже обмеженому апаратному забезпеченні, як то вбудовані системи, котрі сьогодні мають на стільки високу функціональність завдяки первинному використанню мови С.
Чимало відсутніх можливостей доступні через використання сторонніх бібліотек. Більшість об'єктно-орієнтованих функцій включають спеціальний вказівник "цей", який посилається на поточний об'єкт. Передаючи цей вказівник в якості аргументу функції у С, ті ж функціональні можливості можуть бути використані у С. Для прикладу, у C++ можна було написати:
stack->push(val);
у той час, як у С це виглядалок приміром, як:
push(stack, val);
де аргумент stack у С є вказівником на стуктуру (struct), котра є еквівалентною даному вказівнику у С++, котрий є вказівником на об'єкт.
[ред.] Історія
[ред.] Рання розробка
Початковий ектам розробки С відбувся у стінах AT&T 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 функції;
- Functions returning struct or union types (rather than pointers)
- Assignment for struct data types
- Визначник const, котрий робив об'єкт доступним лише для читання
- Нумеровані типи
Велика кількість доповнень і відсутність стандартної бібліотеки, разом із великою популярністю мови, створили потребу у негайній стандартизації.
[ред.] ANSI C
В останні роки 1970-х, C випередла BASIC, і стала найпопулярнішою мікрокомп'ютерною мовою програмування. Протягом 1980-х, її прийняли тако для використання з IBM ПК, і її популярність почала зростати досить стрімкими темпами. У той же час, Бярн Страуструп та інші працівники 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" по суті, позначають одну мову.
[ред.] C99
Після процесу стандартизації ANSI, специфікація мови C протягом якогось часу залишилася відносно статичною, тоді як C++ продовжувала еволюціонувати, у значній мірі завдяки своїм власним зусиллям по стандартизації. Нормативна Поправка 1, створила новий стандарт для мови C у 1995, але лише для того, щоб виправити деякі деталі стандарту C89 і додати обширнішу підтримки міжнародних наборів символів. Проте, стандарт піддався подальшому перегляду в кінці 1990-х, привівши до публікації ISO 9899:1999 у 1999 році. Цей стандарт зазвичай іменують, як "C99". Він був прийнятий, як стандарт ANSI у березні 2000.
Стандарт C99 ввів декілька нових особливостей, багато з яких вже були реалізовані у декількох компіляторах:
- Вкладане функції
- Змінні можуть оголошуватися будь де (як у C++)
- Введено декілька нових типів даних, зокрма, long long int, явний логічний (булевий) тип даних, і комплексний тип для преставлення комплексиних чисел
- Масиви зі змінними довжинами
- Підтримка коротких, однорядкових коментарів, що починаються з
//
, як у BCPL та C++ - Нові бібліотечні функції, як наприклад
snprintf
- Нові заголовочні файли, як то
stdbool.h
таinttypes.h
- Вдосконалена підтримка стандарту IEEE для роботи з плаваючою крапкою
- Складені друкарські помилки...
C99 сумісний з C90, однак, має деякі відмінності; зокрема, декларація, яка відчуває недолік специфікатора типу більше явно не приймається за int
. Комітет стандартів вирішив, що більш важливо, щоб компілятори діагностували неуважне упущення специфікатора типу, ніж мовчки обробляли код. На практиці, компілятори, ймовірно, діагностують упущення, але і приймають на себе int і продовжують переклад програми.
GCC та інші компілятори C наразі підтримують багато з нових можливостей C99. Проте, вони меншою мірою підтримуються компіялторами таких компаній, як Microsoft і Borland, котрі зосередилися переважно на C++, з тих пір, як C++ забезпечує подібну функціональність в іноді несумісних шляхах.
[ред.] Використання
Одним із наслідків високої акцептації та ефективності С є те, що компілятори, бібліотеки та інтерпретатори багатьох інших високорівневих мов програмування виконуються у С.
С використовується, як проміжна мова деякими високорівневими мовами програмування. Це здійснюється одним із двох наступним способів:
- Emit C source code, and one or more other representations: машинний код, об'єктний код, та/або двійковий код. Наприклади, деякі діалекти Lisp (Lush).
- Emit C source code only, and no other representation. Приклади: Eiffel, Sather; Esterel.
Джерельний код С передається компілятору С, котрий видає завершений машинний або двійковий код. Це зроблено задля набуття мобільності (компілятори мови С існують майже для усіх платформ) і уникання необхідності розвитку специфічних для машини генераторів команд.
[ред.] Бібліотеки
Мова програмування С використовує бібліотеки, як основний спосіб свого розширення. У С, функція — набір функцій, котрі містяться в одному файлі. Кожна бібліотека, за звичай має заголовочний файл, в якому містяться прототипи функцій, присутніх у бібілотеці, котра може використовуватися, а також деклації спеціальних типів даних і макро-символів, котрі використовують ці функції. Для того, щоб програма використовувала бібліотеку, заголовочний файл цієї бібілотеки повинен бути оголошений вгорі джерельного файлу, і бібліотека повинна бути злінкованою до програми, що у багатьох випадках вимагає спеціальної опції для компілятора (наприклад, -lmath).
Загальною бібліотекою С є стандартна бібліотека С, котра вказана у ISO та ANSI C стандартах, і розповсюджується з кожним сучасним компілятором мови С.
Іншим загальним набором функцій стандартної бібліотеки С є ті, що використовуються додатками. проектувалися вони для UNIX-подібних систем, у першу чергу, для забезпечення інтерфейсу до ядра. Ці функції деталізуються у різноманітних стандартах, на кшталт POSIX та Single UNIX Specification.
З тих пір, як С набула великої популярності, для неї було написано чимало інших бібліотек. Бібліотеки часто пишуться на С, оскільки компілятори C ґенерують ефективний об'єктний код; пізніше програмісти створюють інтерфейси до бібліотек таким чином, що ті можуть використовуватися високорівневими мовами, на кшталт Java, Perl та Python.
[ред.] Критика
Не дивлячись на її велику популярність, С часто критикується. Двома основними широкими класами, що підпадають під критику є: бажані дії, яких дуже важко досягти використовуючи С, і не бажані дії, які дуже легко випадково здійснити використовуючи С. Коротко кажучи, ефективне використання С вимагає від програміста більше навиків, досвіду та зусиль, ніж це потрібно для деяких інших мов програмуання.
[ред.] Пов'язані мови
Коли об'єктно-орієнтовані мови стали популярними, C++ і Objective-C були двома різними продовженнями C, що забезпечено об'єктно-орієнтованим здібностям. Обидві мови спочатку виконувалися, як препроцесори — джрелеьний код переводився на C, а потім компілювася компілятором C.
[ред.] С++
Мова програмування C++ розроблена на основі С, і була отримана у наслідок додавання Бярном Страуструпом до неї об'єктно-орієнтованої функціональності із C-подібним синтаксисом.
[ред.] Objective-C
Objective-C — дуже "тонкий" шар над С, який дозволяє об'єктно-орієнтоване програмування використовуючи гібрид динамічної/статичної парадигми типів. Основу синтаксису Objective-C склав синтаксис мови С, однак, синтаксис для його об'єктно-орієнтованих можливостей був запозичений у Smalltalk. Objective-C та C++ відрізняються своєю філософією — для більшої інформації, читайте відповідні статті.
[ред.] Дивіться також
- B
- BitC
- C++
- D
- Objective-C