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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



ВСТУП

 

 

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

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


1 ОСОБЛИВОСТІ МОВИ ПРОГРМУВАННЯ СІ

 

 

Історія мови

 

 

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

Б'ярн Страуструп якось написав про неї: «С робить так, щоб вам було легко вистрілити собі в ногу» Іншими словами, Сі дозволяє здійснення низки операцій, котрі часто є не бажаними, а тому чимало помилок у коді не виявляється компілятором, і не можуть бути очевидними під час виконання. Якщо під час програмування та підтримки програмного забезпечення не дотримуватись низки суворих правил, пізніше може виникнути немало проблем зі швидкодією, стабільністю та безпекою програмного забезпечення. (Хоча, виною подібних проблем найчастіше є програмісти, оскільки, Сі сама по собі забезпечує низький рівень захисту).

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

У відповідь на критику мови Cі, як сильно типізованої мови, Керніган та Рітчі, послались на основу філософії дизайну Cі: «Тим не менш, Cі зберігає основний принцип, який передбачає, що програмісти добре знають, що вони роблять, і вимагає лише, щоб вони чітко давали компіляторові знати про свої наміри».

 

 

Основні поняття мови

 

 

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

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

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

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

- просту мовну базу, з якої винесені в бібліотеки багато істотні можливості, начебто математичних функцій або функцій управління файлами;

- орієнтацію на процедурне програмування, що забезпечує зручність застосування структурного стилю програмування;

- систему типів, що охороняє від безглуздих операцій;

- використання препроцесора для, наприклад, визначення макросів і включення файлів з вихідним кодом;

- безпосередній доступ до пам'яті комп'ютера через використання покажчиків;

- мінімальне число ключових слів;

- передачу параметрів у функцію за значенням, а не за посиланням (при цьому передача за посиланням емулюється за допомогою покажчиків);

- покажчики на функції і статичні змінні

- області дії імен;

- структури та об'єднання - визначені користувачем збірні типи даних, якими можна маніпулювати як одним цілим;

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

- автоматичне управління пам'яттю;

- підтримка об'єктно-орієнтованого програмування (при цьому перші версії C + + генерували код програми на мові Сі);

- замикання;

- вкладені функції (існують компілятори мови Сі реалізують цю функцію, наприклад компілятор GNU);

- поліморфізм функцій і операторів;

- вбудована підтримка багатозадачності і мережі

- функції вищого порядку

- каррінг.

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

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

 

 

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;).

 

 

Коментарі і типи даних

 

 

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

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

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

 

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

 

 

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

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

- Статичний виділення пам'яті: простір для об'єктів створюється в сегменті даних програми в момент компіляції; час життя таких об'єктів збігається з часом життя цього коду. Зміна таких об'єктів веде до так званого в стандарті "невизначеному поведінки" (англ. undefined behaviour). На практиці ця операція приводить до помилки часу виконання.

- Автоматичне виділення пам'яті: об'єкти можна зберігати в стеку; ця пам'ять потім автоматично звільняється і може бути використана знову, після того, як програма виходить з блоку, що використовує його.

- Динамічне виділення пам'яті: блоки пам'яті потрібного розміру можуть запитуватися під час виконання програми за допомогою бібліотечних функційmalloc, realloc, calloc і free з області пам'яті, званої купою. Ці блоки звільняються і можуть бути використані знову після виклику для них функціїfree.

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

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

 

 

ДИНАМІЧНИЙ РОЗПОДІЛ ПАМ'ЯТІ

Системи двійників

 

 

Система двійників (buddy system) – підхід до динамічного розподілу пам’яті, який дає змогу рідше розбивати на частини більші блоки для виділення пам’яті під блоки меншого розміру, знижуючи цим зовнішню фрагментацію. Вона містить у собі два алгоритми: виділення та вивільнення пам’яті. Розглянемо найпростішу бінарну систему двійників (binary buddy system).

У разі використання цієї системи пам’ять розбивають на блоки, розмір яких є степенем числа 2: 2К, L £ К £ U, де 2L – мінімальний розмір блоку; 2U – максимальний розмір блоку (він може бути розміром доступної пам’яті, а може бути й меншим).

Алгоритм виділення пам’яті

Опишемо принцип роботи алгоритму виділення пам’яті:

- Коли надходить запит на виділення блоку пам’яті розміру М, відбувається пошук вільного блоку підходящого розміру (такого, що 2К-1 £ М £ 2К). Якщо блок такого розміру є, його виділяють. У разі відсутності блоку такого розміру беруть блок розміру 2К+1 ділять навпіл на два блоки розміру 2К і перший із цих блоків виділяють; другий залишається вільним і стає двійником (buddy) першого. Робота алгоритму на цьому завершується.

- За відсутності блоку розміром 2К+1 беруть найближчий вільний блок, більший за розміром від М, наприклад блок розміру 2К+N. Він стає поточним блоком. Якщо немає жодного блоку, більшого за М, повертають помилку.

- Після цього починають рекурсивний процес розподілу блоку. На кожному кроці цього процесу поточний блок ділиться навпіл, два отриманих блоки стають двійниками один одного, після цього перший із них стає поточним (і ділиться далі), а другий залишають вільним і надалі не розглядають. Для блоку розміру 2K+N процес завершують через N кроків поділу отриманням двох блоків розміру 2К. Перший із цих блоків виділяють, другий залишають вільним. Внаслідок поділу отримують N пар блоків-двійників.

Для ілюстрації цього алгоритму наведено приклад на рисунку 2.4.

Припустимо, що в системі є вільний блок розміром 512 Кбайт (1) і надійшов запит на виділення блоку на 100 Кбайт (блоку А).

Ділимо блок на два по 256 Кбайт, з них перший робимо поточним, а другий залишаємо його двійником (2). Після цього знову ділимо перший блок на два по 128 Кбайт. Це – потрібний розмір, тому виділяємо для А перший із цих блоків, а другий залишаємо його двійником (3). Тепер маємо один вільний блок на 128 Кбайт (двійник виділеного блоку) і один – на 256 Кбайт. У результаті для блоку А виділено 128 Кбайт.

Тепер надходить запит на виділення блоку на 30 Кбайт (блоку В). У цьому разі найближчим за розміром більшим вільним блоком буде блок на 128 Кбайт; система розділить його на два двійники по 64 Кбайт (4), а потім перший з них – на два по 32 Кбайт. Це – потрібний розмір, тому для В буде виділено перший із цих блоків, а другий залишать його двійником (5). У результаті для блоку В виділено 32 Кбайт.

Нарешті, надходить запит на виділення блоку на 200 Кбайт (блоку С). У цьому разі є підходящий блок на 256 Кбайт, тому його негайно виділяють (6).

Алгоритм вивільнення пам’яті

Алгоритм вивільнення пам’яті використовує утворення двійників у процесі виділення пам’яті (насправді двійниками можуть вважатися будь-які два суміжні блоки однакового розміру).

- Заданий блок розміру 2К вивільняють.

- Коли цей блок має двійника і він вільний, їх об’єднують в один блок удвічі більшого розміру 2К+1.

- Якщо блок, отриманий на кроці 2, має теж двійника, їх об’єднують у блок розміру 2К+2.

- Цей процес об’єднання блоків повторюють доти, поки не буде отримано блок, для якого не знайдеться вільного двійника.

Розглянуто, як вивільняється пам’ять у наведеному раніше прикладі.

- Спочатку вивільнимо пам’ять з-під блоку В. Для нього є вільний двійник, тому їх об’єднують в один блок розміру 64 Кбайт.

- Для цього блоку також є вільний двійник (див. (4)), і їх теж об’єднують у блок розміру 128 Кбайт (7).

- Тепер вивільняють пам’ять з-під блоку С. Він вільних двійників не має, тому об’єднання не відбувається (8).

- Нарешті вивільняють пам’ять з-під блоку А. Його об’єднують із двійником у блок розміру 256 Кбайт, але в того теж є вільний двійник (вивільнений з-під С), його об’єднують з тим; у результаті знову виходить один вільний блок на 512 Кбайт (9).

 

Рисунок 2.4 Система двійників

Цей підхід за продуктивністю випереджає інші алгоритми динамічного розподілу, він особливо ефективний для великих масивів пам’яті. Головним його недоліком є значна внутрішня фрагментація (як можна помітити, у наведеному прикладі було виділено на 86 Кбайт пам’яті більше, ніж потрібно), тому для розподілу блоків малого розміру частіше використовують інші підходи, зокрема розглянуті раніше методи послідовного пошуку або ізольованих списків вільних блоків.

 

 

Охорона праці

ВСТУП

 

 

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

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


1 ОСОБЛИВОСТІ МОВИ ПРОГРМУВАННЯ СІ

 

 

Історія мови

 

 

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

Б'ярн Страуструп якось написав про неї: «С робить так, щоб вам було легко вистрілити собі в ногу» Іншими словами, Сі дозволяє здійснення низки операцій, котрі часто є не бажаними, а тому чимало помилок у коді не виявляється компілятором, і не можуть бути очевидними під час виконання. Якщо під час програмування та підтримки програмного забезпечення не дотримуватись низки суворих правил, пізніше може виникнути немало проблем зі швидкодією, стабільністю та безпекою програмного забезпечення. (Хоча, виною подібних проблем найчастіше є програмісти, оскільки, Сі сама по собі забезпечує низький рівень захисту).

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

У відповідь на критику мови Cі, як сильно типізованої мови, Керніган та Рітчі, послались на основу філософії дизайну Cі: «Тим не менш, Cі зберігає основний принцип, який передбачає, що програмісти добре знають, що вони роблять, і вимагає лише, щоб вони чітко давали компіляторові знати про свої наміри».

 

 

Основні поняття мови

 

 

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

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

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

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

- просту мовну базу, з якої винесені в бібліотеки багато істотні можливості, начебто математичних функцій або функцій управління файлами;

- орієнтацію на процедурне програмування, що забезпечує зручність застосування структурного стилю програмування;

- систему типів, що охороняє від безглуздих операцій;

- використання препроцесора для, наприклад, визначення макросів і включення файлів з вихідним кодом;

- безпосередній доступ до пам'яті комп'ютера через використання покажчиків;

- мінімальне число ключових слів;

- передачу параметрів у функцію за значенням, а не за посиланням (при цьому передача за посиланням емулюється за допомогою покажчиків);

- покажчики на функції і статичні змінні

- області дії імен;

- структури та об'єднання - визначені користувачем збірні типи даних, якими можна маніпулювати як одним цілим;

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

- автоматичне управління пам'яттю;

- підтримка об'єктно-орієнтованого програмування (при цьому перші версії C + + генерували код програми на мові Сі);

- замикання;

- вкладені функції (існують компілятори мови Сі реалізують цю функцію, наприклад компілятор GNU);

- поліморфізм функцій і операторів;

- вбудована підтримка багатозадачності і мережі

- функції вищого порядку

- каррінг.

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

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

 

 

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;).

 

 

Коментарі і типи даних

 

 

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

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

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

 

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

 

 

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

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

- Статичний виділення пам'яті: простір для об'єктів створюється в сегменті даних програми в момент компіляції; час життя таких об'єктів збігається з часом життя цього коду. Зміна таких об'єктів веде до так званого в стандарті "невизначеному поведінки" (англ. undefined behaviour). На практиці ця операція приводить до помилки часу виконання.

- Автоматичне виділення пам'яті: об'єкти можна зберігати в стеку; ця пам'ять потім автоматично звільняється і може бути використана знову, після того, як програма виходить з блоку, що використовує його.

- Динамічне виділення пам'яті: блоки пам'яті потрібного розміру можуть запитуватися під час виконання програми за допомогою бібліотечних функційmalloc, realloc, calloc і free з області пам'яті, званої купою. Ці блоки звільняються і можуть бути використані знову після виклику для них функціїfree.

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

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

 

 

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

 

 

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

 


ДИНАМІЧНИЙ РОЗПОДІЛ ПАМ'ЯТІ



Поделиться:


Последнее изменение этой страницы: 2016-08-06; просмотров: 520; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.15.112.69 (0.11 с.)