Знаймо

Додати знання

приховати рекламу

Цей текст може містити помилки.

Сі (мова програмування)



План:


Введення

Сі ( англ. C ) - стандартизований процедурний мова програмування, розроблений на початку 1970-х років співробітниками Bell Labs Кеном Томпсоном і Деннісом Рітчі як розвиток мови Бі. Сі був створений для використання в операційній системі UNIX. З тих пір він був портовано на багато інших операційні системи і став одним з найбільш використовуваних мов програмування. Сі цінують за його ефективність. Він є самим популярним мовою для створення системного програмного забезпечення. Його також часто використовують для створення прикладних програм. Незважаючи на те, що Сі не розроблявся для новачків, він активно використовується для навчання програмування. В подальшому синтаксис мови Сі став основою для багатьох інших мов.

Для мови Сі характерні лаконічність, стандартний набір конструкцій управління потоком виконання, структур даних і великий набір операцій.


1. Особливості

1.1. Огляд

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

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

Сі (як і ОС UNIX, з якою він довгий час був пов'язаний) створювався програмістами і для програмістів, коло яких був би набагато ширше кола розробників мови. Незважаючи на це, область використання мови значно ширше завдань системного програмування.

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

Ось деякі особливості інших мов програмування, яких не має Сі:

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

Одним із наслідків високої ефективності і переносимості Сі стало те, що багато компілятори, інтерпретатори і бібліотеки інших мов високого рівня часто виконані на мові Сі.


1.2. Ключові слова

У С89 є 32 ключових слова:

auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

C99 додає п'ять нових:

_Bool
inline
_Complex
_Imaginary
restrict

1.3. Програма "Hello, World!"

Ця проста програма, яка з'явилася в першому виданні книги " Мова програмування Сі "Керніган та Рітчі, зазвичай є першою програмою більшості підручників Сі. Вона друкує повідомлення "Hello, World!" на стандартному пристрої виведення (яким, як правило, є монітор (дисплей), але може бути і файл, якесь пристрій або область в пам'яті, в залежності від того, як відображається стандартний пристрій виводу на даній платформі).

 main  (  )  {  printf  (  "Hello, World!  \ N  "  )  ;  } 

Незважаючи на те, що на більшості сучасних компіляторів ця програма може бути скомпільована, вона породжує кілька попереджень на компіляторах стандарту ANSI C. Крім того, цей код не буде компілюватися, якщо компілятор слід стандарту C99, так як в цьому випадку тип int більше не мається на увазі для випадків, коли тип в результаті функції не вказано (а оформлення функції main взагалі описано окремо). Ці повідомлення можна прибрати, якщо внести в цю програму кілька невеликих змін:

 # Include   int  main  (  void  )  {  printf  (  "Hello, World!  \ N  "  )  ;  return  0  ;  } 

У першому рядку програми розташована директива препроцесора # include, зустрівши яку, компілятор замінює її на повний текст файлу, на який вона посилається. В даному випадку цей рядок буде замінена стандартним заголовні файлом stdio.h. Кутові дужки вказують компілятору шукати файл stdio.h в каталозі стандартних заголовків файлів.

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

Наступний рядок "викликає" функцію printf. Включається заголовний файл stdio.h містить інформацію, що описує те, як потрібно викликати цю функцію. У даному прикладі цієї функції передається єдиний аргумент, що містить текстову рядок "Hello, World! \ N". Послідовність \ n транслюється в символ "новий рядок", який при відображенні відповідно позначає розрив рядка. Функція printf повертає значення типу int, яке повертає число надрукованих символів (у цьому прикладі повертається значення ігнорується).

Вираз return змушує програму припинити виконання функції (main в цьому випадку), повертаючи викликала функції значення, вказане після ключового слова return (тут 0). Так як поточна функція - це main, то викликають є код, який і запустив програму. Остання фігурна дужка позначає кінець визначення функції main. За стандартом C99, return 0 в main не обов'язково (відсутність return в main означає return 0;).


1.4. Коментарі

Текст, укладений у службові символи / * і * / (у цьому порядку), повністю ігнорується компілятором. Вкладення коментарів не допускається. Компілятори, сумісні зі стандартом C99, також дозволяють використовувати коментарі, що починаються з символів / / і закінчуються перекладом рядка

1.5. Типи

Система типів в Сі подібна типам в інших нащадках Алгол, таких, як Паскаль. У Сі є типи цілих чисел різних розмірів ( short int, long int), зі знаком ( signed) і без ( unsigned), чисел з плаваючою комою ( float, double), символів, що перераховуються типів (enum) і записів-структур (struct). Крім того, мова Сі пропонує тип об'єднання (union), за допомогою якого можна або зберігати в одному місці пам'яті різнорідні дані, не пересічні по часу існування (це дозволяє економити пам'ять), або звертатися до вмісту ділянки пам'яті, як до даних різних типів (що дозволяє змінювати тип-інтерпретацію даних , не міняючи самі дані).

У мові можливо перетворення типів, але воно не завжди відбувається автоматично. Тільки різні типи числових даних повністю сумісні один з одним. При такому перетворенні компілятор може видати тільки попередження. Щоб повністю убезпечити себе від помилок такого роду, можна використовувати програму lint [1].


1.6. Зберігання даних

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

У Сі є три різні способи виділення пам'яті ( класи пам'яті) для об'єктів:

  • Статичний виділення пам'яті: простір для об'єктів створюється в сегменті даних програми в момент компіляції; час життя таких об'єктів збігається з часом життя цього коду. Зміна таких об'єктів веде до так званого в стандарті "невизначеному поведінки" ( англ. undefined behaviour ). На практиці ця операція приводить до помилки часу виконання.
  • Автоматичне виділення пам'яті: об'єкти можна зберігати в стеку; ця пам'ять потім автоматично звільняється і може бути використана знову, після того, як програма виходить з блоку, що використовує його.
  • Динамічне виділення пам'яті: блоки пам'яті потрібного розміру можуть запитуватися під час виконання програми за допомогою бібліотечних функцій malloc, realloc, calloc і free з області пам'яті, званої купою. Ці блоки звільняються і можуть бути використані знову після виклику для них функції free.

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

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


1.7. Набір використовуваних символів

Мова Сі був створений вже після впровадження стандарту ASCII, тому використовує майже всі його графічні символи (немає тільки $ @ `). Більш старі мови змушені були обходитися більш скромним набором - так, Фортран, Лісп і Кобол використовували тільки круглі дужки (), а в Сі є і круглі (), і квадратні [], і фігурні {}. Крім того, в Сі розрізняються великі і малі літери, а більш старі мови використовували тільки великі.


2. Проблеми

Багато елементів Сі потенційно небезпечні, а наслідки неправильного використання цих елементів часто непередбачувані. Керніган каже: "Сі - інструмент, гострий, як бритва : з його допомогою можна створити і елегантну програму, і криваве місиво ". У зв'язку з порівняно низьким рівнем мови багато випадків неправильного використання небезпечних елементів не виявляються і не можуть бути виявлені ні при компіляції, ні під час виконання. Це часто призводить до непередбачуваного поведінці програми. Іноді в результаті неграмотного використання елементів мови з'являються уразливості в системі безпеки. Необхідно зауважити, що використання багатьох таких елементів можна уникнути.

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

Іншим потенційним джерелом небезпечних ситуацій служить механізм покажчиків. Покажчик може посилатися на будь-який об'єкт в пам'яті, включаючи і виконуваний код програми, і неправильне використання покажчиків може породжувати непередбачені ефекти і приводити до катастрофічним наслідкам. Наприклад, покажчик може бути неініціалізованих або, в результаті невірних арифметичних операцій над покажчиком, вказувати в довільне місце пам'яті; на деяких платформах робота з таким дороговказом може викликати апаратну зупинку програми, на незахищених же платформах це може привести до псування довільних даних у пам'яті, причому ця порча може проявитися в самі довільні моменти часу і набагато пізніше моменту псування. Також, область динамічної пам'яті, на яку посилається покажчик, може бути звільнена (і навіть виділена після цього під інший об'єкт) - такі покажчики називаються "висячими". Або, навпаки, після маніпуляцій з покажчиками на область динамічної пам'яті може не залишитися посилань, і тоді ця область, яка називається "сміттям" (garbage), ніколи не буде звільнена, що може призводити до "витоків пам'яті" в програмі. В інших мовах подібні проблеми намагаються вирішити введенням більш обмежених посилальних типів.

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

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

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

Для допомоги програмістам на Сі у вирішенні цих та багатьох інших проблем було створено велику кількість окремих від компіляторів інструментів. Такими інструментами є програми додаткової перевірки вихідного коду і пошуку поширених помилок, а також бібліотеки, що мають додаткові функції, що не входять в стандарт мови, такі як перевірка кордонів масивів або обмежена форма складання сміття.


3. Історія

3.1. Ранні розробки

Мова програмування Сі був розроблений в лабораторіях Bell Labs в період з 1969 по 1973 роки. Згідно Рітчі, найактивніший період творчості припав на 1972. Мова назвали "Сі" (C - третя буква латинського алфавіту), тому що багато його особливості беруть початок від старого мови " Бі "(B - друга літера латинського алфавіту). Існує кілька різних версій походження назви мови Бі. Кен Томпсон вказує на мову програмування BCPL, проте існує ще й мову Bon, також створений ним, і названий так на честь його дружини Бонні.

Існує кілька легенд, що стосуються причин розробки Сі і його відносини до операційної системи UNIX, включаючи такі:

  • Розробка Сі стала результатом того, що його майбутні автори любили комп'ютерну гру, подібну популярній грі Asteroids (Астероїди). Вони вже давно грали в неї на головному сервері компанії, який був недостатньо потужним і повинен був обслуговувати близько ста користувачів. Томпсон і Рітчи порахували, що їм не вистачає контролю над космічним кораблем для того, щоб уникати зіткнень з деякими каменями. Тому вони вирішили перенести гру на вільний PDP-7, що стоїть в офісі. Проте цей комп'ютер не мав операційної системи, що змусило їх її написати. Зрештою, вони вирішили перенести цю операційну систему ще й на офісний PDP-11, що було дуже важко, тому що її код був цілком написаний на асемблері. Було винесено пропозицію використати небудь високорівнева пристосованість мову, щоб можна було легко переносити ОС з одного комп'ютера на інший. Мова Бі, який вони хотіли спочатку задіяти для цього, виявився позбавлений функціональності, здатної використовувати нові можливості PDP-11. Тому вони і зупинилися на розробці мови Сі.
  • Найперший комп'ютер, для якого була спочатку написана UNIX, призначався для створення системи автоматичного заповнення документів. Перша версія UNIX була написана на асемблері. Пізніше для того, щоб переписати цю операційну систему, була розроблена мова Сі.

До 1973 мова Сі став досить сильний, і велика частина ядра UNIX, спочатку написана на асемблері PDP-11/20, була переписана на Сі. Це було одне з найперших ядер операційних систем, написане мовою, відмінному від асемблера; більш ранніми були лише системи Multics (написана на ПЛ / 1) і TRIPOS (написана на BCPL).


3.2. K & R C

В 1978 Рітчі і Керніган опублікували першу редакцію книги "Мова програмування Сі". Ця книга, відома серед програмістів як "K & R", служила багато років неформальній специфікацією мови. Версію мови Сі, описану в ній, часто називають "K & R C". (Друга редакція цієї книги присвячена більш пізнього стандарту ANSI C, описаного нижче.)

K & R ввів такі особливості мови:

  • структури (тип даних struct);
  • довге ціле (тип даних long int);
  • ціле без знака (тип даних unsigned int);
  • оператор + = і подібні йому (старі оператори = + вводили аналізатор лексики компілятора Сі в оману, наприклад, при порівнянні виразів i = + 10 і i = +10).

K & R C часто вважають найголовнішою частиною мови, яку повинен підтримувати компілятор Сі. Багато років навіть після виходу ANSI C, він вважався мінімальним рівнем, якого слід було дотримуватися програмістам, охочим добитися від своїх програм максимальної портативності, тому що не всі компілятори тоді підтримували ANSI C, а хороший код на K & R C був вірний і для ANSI C.

Після публікації K & R C у мову було додано кілька можливостей, підтримуваний компіляторами AT & T і деяких інших виробників:

  • функції, не повертають значення (з типом void) і покажчики, що не мають типу (з типом void *);
  • функції, які повертають об'єднання і структури;
  • імена полів даних структур в різних просторах імен для кожної структури;
  • присвоювання структур;
  • специфікатор констант (const);
  • стандартна бібліотека, що реалізує більшу частину функцій, введених різними виробниками;
  • Перечіслімий тип (enum);
  • дробове число одинарної точності (float).

3.3. ISO C

В кінці 1970-х років Сі почав витісняти Бейсік з позиції провідного мови для програмування мікрокомп'ютерів. В 1980-х роках він був адаптований для використання в IBM PC, що призвело до різкого зростання його популярності. У той же час Б'ярні Строуструп та інші в лабораторіях Bell Labs розпочали роботу по додаванню в Сі можливостей об'єктно-орієнтованого програмування. Мова, яку вони в підсумку зробили, C + +, в даний час є найпоширенішою мовою програмування. Сі залишається більш популярним в UNIX-подібних системах.

В 1983 Американський Національний Інститут Стандартизації (ANSI) сформував комітет для розробки стандартної специфікації Сі. Після закінчення цього довгого і складного процесу в 1989 він був нарешті затверджений як "Мова програмування Сі" ANSI X3.159-1989. Цю версію мови прийнято називати ANSI C або C89. В 1990 стандарт ANSI C був прийнятий з невеликими змінами Міжнародною Організацією по Стандартизації (ISO) як ISO / IEC 9899:1990.

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

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

  1. вони використовують нестандартні бібліотеки, наприклад, для графічних дисплеїв;
  2. вони використовують специфічні платформо-залежні засоби;
  3. вони розраховані на певне значення розміру деяких типів даних або на певний спосіб зберігання цих даних в пам'яті для конкретної платформи.

3.4. C99

Після стандартизації в ANSI специфікація мови Сі залишалася відносно незмінною протягом довгого часу, в той час як Сі + + продовжував розвиватися (в 1995 в стандарт Сі була внесена Перша нормативна поправка, але її майже ніхто не визнавав). Проте в кінці 1990-х років стандарт піддався перегляду, що призвело до публікації ISO 9899:1999 в 1999. Цей стандарт зазвичай називають "С99". У березні 2000 він був прийнятий і адаптований ANSI.

Ось деякі нові особливості С99:

  • підставляються функції (inline);
  • оголошення локальних змінних в будь-якому операторі програмного тексту (як в С + +);
  • нові типи даних, такі як long long int (для полегшення переходу від 32 - до 64-бітовим числах), явний булевий тип даних _Bool і тип complex для подання комплексних чисел;
  • масиви змінної довжини;
  • підтримка обмежених покажчиків (restrict);
  • іменована ініціалізація структур: struct { int x, y, z; } point = { .y=10, .z=20, .x=30 };
  • підтримка однорядкових коментарів, які починаються на / /, запозичених з C + + (багато компілятори Сі підтримували їх і раніше в якості доповнення);
  • кілька нових бібліотечних функцій, таких як snprintf;
  • кілька нових заголовних файлів, таких як stdint.h.

Інтерес до підтримки нових особливостей С99 в даний час змішаний. У той час як GCC [2], компілятор Сі від Sun Microsystems і деякі інші компілятори в даний час підтримують більшу частину нових особливостей С99, компілятори компаній Borland та Microsoft не роблять цього, причому схоже, що дві ці компанії і не думають їх додавати.


3.5. C11

8 грудня 2011 опублікований новий стандарт для мови Сі (ISO / IEC 9899:2011) [3]. Деякі можливості нового стандарту вже підтримуються компіляторами GCC [4] і Clang [5]. Основні зміни:

  • підтримка багатопоточності;
  • покращена підтримка Unicode;
  • узагальнені макроси (type-generic expressions, дозволяють статичну перевантаження);
  • анонімні структури та об'єднання (спрощують звернення до вкладеним конструкцій);
  • управління вирівнюванням об'єктів;
  • статичні затвердження (static assertions);
  • видалення небезпечної функції gets (на користь безпечної gets_s);
  • функція quick_exit;
  • специфікатор функції _Noreturn;
  • новий режим ексклюзивного відкриття файлу.

4. Зв'язок з C + +

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

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

Ось відмінності між цими мовами, існуючі на сьогодні:

  • inline - підставляються функції існують в глобальному просторі С + +, а в Сі - в просторі файлу (статичному просторі). Іншими словами, це означає, що в С + + будь-яке визначення підставляється функції (незалежно від перевизначення функцій) повинно відповідати правилом одного визначення, що вимагає того, щоб будь-яка підставляється функція була визначена тільки один раз. У Сі ж одна й та ж підставляється функція може бути визначена по-різному в різних компільованих файлах однієї програми.
  • На відміну від C + +, макрос bool в С99 вимагає включення відповідного заголовки stdbool.h. У стандарті C99 визначений власний тип логічних даних _Bool. Попередній стандарт Сі (C89) не визначав булевий тип взагалі, тому для цього часто використовувалися різні (а значить, несумісні) методи.
  • Символьні константи (укладені в одинарні лапки) за умовчанням мають: тип int в Сі і тип char в C + +. Тому в Сі справедливо рівність sizeof ('a') == sizeof (int), а в C + + - рівність sizeof ('a') == sizeof (char). [6]
  • Деякі нові можливості C99, в першу чергу, restrict, не включені в С + +.

Сі перейняв від C + + ряд особливостей:

  • прототипи оголошення функцій;
  • однорядкові коментарі, що починаються на / / і закінчуються символом перекладу рядка;
  • сильнішу перевірку типів, включаючи додавання типу void, специфікатора const і видалення прийняття за замовчуванням типу int в якості значення, що повертається.

5. Пріоритет операцій в Сі

Цитується за книгою "Мова програмування C" п'яте видання Семюел П. Харбісон, Гай Л. Стилл ISBN 5-9518-0048-X

Операції мови Сі, в порядку зниження пріоритету
Лексеми Операція Клас Пріоритет Асоціативність
імена, літерали прості лексеми первинний 16 немає
a [k] індекси постфіксной 16 зліва направо
f (...) виклик функції постфіксной 16 зліва направо
. прямий вибір постфіксной 16 зліва направо
-> опосередкований вибір постфіксной 16 зліва направо
+ + - позитивне і негативне прирощення постфіксной 16 зліва направо
(Ім'я типу) {init} складовою літерал (C99) постфіксной 16 зліва направо
+ + - позитивне і негативне прирощення префіксний 15 справа наліво
sizeof розмір унарний 15 справа наліво
~ побітове НЕ унарний 15 справа наліво
! логічне НЕ унарний 15 справа наліво
- + зміна знака, плюс унарний 15 справа наліво
& адреса унарний 15 справа наліво
* опосередкування (разименованія) унарний 15 справа наліво
(Ім'я типу) приведення типу унарний 14 справа наліво
* /% мультиплікативні операції бінарний 13 зліва направо
+ - адитивні операції бінарний 12 зліва направо
<< >> зрушення вліво і вправо бінарний 11 зліва направо
<> <=> = відносини бінарний 10 зліва направо
==! = рівність / нерівність бінарний 9 зліва направо
& побітове І бінарний 8 зліва направо
^ побітове виключає АБО бінарний 7 зліва направо
| побітове АБО бінарний 6 зліва направо
&& логічне І бінарний 5 зліва направо
| | логічне АБО бінарний 4 зліва направо
? : умова тернарних 3 справа наліво
= + = - = * = / =% = << = >> = & = ^ = | = присвоювання бінарний 2 справа наліво
, послідовна оцінка бінарний 1 зліва направо

6. Відомі компілятори мови Сі [7]


6.1. Компілятори на динамічні мови і платформи

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

Наступні проекти призначені для цих цілей:

  • Clue [8] - компілятор з ANSI Сі в Lua, Javascript, Perl, Java, Common Lisp.
  • Alchemy [9] - компілятор з Сі / C + + в ActionScript Virtual Machine (AVM2). Дозволяє використовувати Сі-бібліотеки в Flash - і Adobe AIR -додатках.
  • AMPC [10] - компілятор з Сі у віртуальну машину Java.
  • Emscripten [11] - компілятор з LLVM-байтокода (наприклад, отриманий з C + +) в JavaScript.

Примітки

  1. INTUIT.ru: Курс: Мова програмування ..: Лекція № 0: Анотація і введення - www.intuit.ru/department/pl/cpl/0/3.html
  2. Status of C99 features in GCC - gcc.gnu.org/link14
  3. ISO / IEC 9899:2011 - Information technology - Programming languages ​​- C - www.iso.org/iso/link13
  4. GCC 4.6 Release Series - Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) - gcc.gnu.org/gcc-4.6/changes.html # c
  5. LLVM 3.0 Release Notes - llvm.org/releases/3.0/docs/ReleaseNotes.html # subproj
  6. Annex 0: Compatibility. 1.2. C + + and ISO C - www.open-std.org/jtc1/sc22/open/n2356/diff.html # diff.iso. Working Paper for Draft Proposed International Standard for Information Systems - Programming Language C + + (2 грудня 1996). - Див 1.2.1p3 (параграф 3 в розділі 1.2.1). Статичний - www.webcitation.org/618HTMqKA з першоджерела 22 серпня 2011.
  7. Деякі компілятори йдуть в комплекті з компіляторами та інших мов програмування (включаючи C + +) або є складовою частиною середовища розробки програмного забезпечення.
  8. Проект Clue - cluecc.sourceforge.net на сайті SourceForge.net
  9. Adobe Labs - Alchemy - labs.adobe.com / technologies / alchemy /
  10. Axiomatic Solutions Sdn Bhd - www.axiomsol.com/
  11. Emscripten LLVM-to-JavaScript compiler - code.google.com / p / emscripten /

Література

  • Керніган Б., Рітчі Д. Мова програмування Сі = The C programming language. - 2-е изд. - М .: Вільямс, 2007. - С. 304. - ISBN 0-13-110362-8
  • Герберт Шилдт C: повне керівництво, класичне видання = C: The Complete Reference, 4th Edition. - М .: "Вільямс", 2010. - С. 704. - ISBN 978-5-8459-1709-6
  • Прата С. Мова програмування С: Лекції і вправи = C Primer Plus. - 1-е изд. - М .: Вільямс, 2006. - С. 960. - ISBN 5-8459-0986-4
  • Кочан С. Програмування на мові Сі = Programming in C. - 3-е изд. - М .: Вільямс, 2006. - С. 496. - ISBN 0-672-32666-3
  • Гукин Д. Мова програмування Сі для "чайників" = C For Dummies. - М .: Діалектика, 2006. - С. 352. - ISBN 0-7645-7068-4

Цей текст може містити помилки.

Схожі роботи | скачати

Схожі роботи:
Мова програмування
S (мова програмування)
J (мова програмування)
D (мова програмування)
R (мова програмування)
Oz (мова програмування)
Скретч (мова програмування)
Пролог (мова програмування)
SASL (мова програмування)
© Усі права захищені
написати до нас
Рейтинг@Mail.ru