C (мова праграмавання)
Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі.
Гэта — накід артыкула. Вы можаце дапамагчы Вікіпэдыі, напісаўшы яго, для гэтага націсьніце спасылку «Рэдагаваць». |
Мо́ва праграмава́ння C (вымаўляецца: Сі́) — стандартызаваная імператыўная мова праграмавання, створаная на пачатку 1970-х гадоў Кенам Томпсанам і Дэнісам Рычы для аперацыйнай сістэмы UNIX. Потым яна была перанесена на іншыя аперацыйных сістэмы і зараз з'яўляецца адной з найбольш часта выкарыстоўваемых моў праграмавання. C часта хваляць за яе эфектыўнасць, і гэта адна з самых папулярных моў сістэмнага праграмавання, хоць з яе дапамогай можна пісаць і іншыя праграмы. Яна часты выкарыстоўваецца пры вывучэнні інфарматыцы, хоць стваралася не для пачаткоўцаў.
Зьмест |
[рэдагаваць] Асноўныя рысы
[рэдагаваць] Агляд
C — адносна мінімалістычная мова праграмавання, больш блізкая да апаратнага забеспячэння і мовы асэмблера, чым іншыя мовы праграмавання высокага ўзроўню. Сапраўды, C часам называюць «партуемым асэмблерам», паказваючы яго адрозненні ад моў праграмавання нізкага ўзроўню, напрыклад, асэмблера: код на C можна скампіляваць і выканаць на амаль любым камп'ютэры, а код на асэмблеры можна выконваць толькі на той мадэлі камп'ютэра, дзеля якой ён напісаны. Таму C называюць мовай сярэдняга ўзроўню.
Пры стварэнні C асноўнай мэтай было стварэнне працэдурнай мовы праграмавання, якая дазволіла б пісаць праграмы з меншай колькасцю памылак, аднак не ствараючы дадатковых праблем для аўтараў кампілятараў дадатковымі складанымі рысамі мовы. Такім чынам, у C ёсць такія важныя рысы:
- Простую моўную базу, у якой важныя функцыі кшталту матэматычных і файлавых рэалізуюцца з дапамогай бібліятэк
- Факусіроўка на парадыгме працэдурнага праграмавання, з магчымасцямі праграмавання ў структурным стылі
- Простая сістэма тыпаў, якая не дапускае шмат аперацый, якія не маюць сэнсу
- Выкарыстанне мовы прэпрацэсара C для, напрыклад, стварэння макрасаў ці уключэння частак коду
- Нізкаўзроўневы доступ да памяці праз выкарыстанне указальнікаў
- Невялікая колькасць ключавых слоў
- Параметры функцый заўсёды перадаюцца па значэнню, а не па спасылцы
- Указальнікі на функцыі, з дапамогай якіх ствараецца простая форма і полімарфізму
- Вобласці дзеяння зменных
- Структуры (запісы), ці ствараемыя праграмістам састаўныя тыпы дадзеных (
struct
), якія дазваляюць камбінаваць і кіраваць звязанай інфармацыяй як адзіным цэлым
Рысы іншых моў, якіх не хапае ў C:
- Бяспечнасць тыпаў
- Аўтаматычная зборка смецця
- Класы ці аб'екты з пэўнымі паводзінамі
- Прасунутая сістэмы тыпаў
- Укладзеныя функцыі
- Універсальнае праграмаванне
- Перагрузка аператараў
- Уключаная падтрымка шматпатокавасці і камп'ютэрных сетак
Хоць спіс адсутных у C зручных канструкцый доўгі, іх адсутнасць дапамагла прыняць C, бо кампілятары для новых платформ пісаліся хутчэй і праграмістам лягчэй зразумець, што робіць той ці іншы код і кантраляваць яго. Таму код на C часта выконваецца хутчэй за код на іншых мовах праграмавання.
Яшчэ адна з прычын шырокага выкарыстання C палягае ў тым, што шмат кампілятараў, бібліятэк і інтэрпрэтатараў іншых высокаўзроўневых моў часта ствараюцца на C.
[рэдагаваць] Прыклад «hello, world»
Гэта простая праграма ўпершыню з'явілася ў першая рэдакцыі K&R і стала стандартнай уводнай праграмай у большасці падручнікаў па праграмаванню, незалежна ад мовы. Гэта праграма выводзіць «hello, world» у стандартны вывад, як правіла ў тэрмінал ці на дысплей.
main() { printf("hello, world\n"); }
Прыведзеная вышэй праграма нармальна скампілюецца на большасці сучасных кампілятараў. Аднак пры кампіляцыі згодна стандарту ANSI C будзе выдадзена некалькі папярэджанняў. Акрамя таго, код не скампілюецца, калі кампілятар дакладна выконвае стандарт C99, бо вяртаемае значэнне не будзе лічыцца значэннем тыпа int
пры адсутнасці іншага. Усё гэта можна выправіць, дадаў некалькі невялікіх змен у арыгінальную праграму:
#include <stdio.h> int main(void) { printf("hello, world\n"); return(0); }
Аналіз кожнага радка праграмы:
#include <stdio.h>
Першы радок праграмы з'яўляецца дырэктывай прэпрацэсара, #include
. Гэты тэкст паказвае, што прэпрацэсару — першай праграме, якая абрабляе зыходны файл пры кампіляцыі — трэба замяніць гэты радок на названы ў ім файл. У гэтым выпадку гэта загаловачны файл, stdio.h
, які апісвае стандартныя функцыі ўводу і вываду. Вуглавыя скобкі навокал stdio.h
паказваюць, што файл трэба шукаць у дырэкторыі, названай як шлях пошуку загаловачных файлаў.
int main(void)
Наступны радок паказвае, што ствараецца функцыя пад назвай main
. Функцыя main
мае асобае значэнне ў праграмах на C. Калі выконваецца праграма, першай выклікаецца функцыя main(). Слова int
паказвае, што вяртаемае значэнне — значэнне, якой будзе вырахавана ў функцыі main
— з'яўляецца цэлай лічбай (integer). Частка кода (void)
паказвае, што функцыя main
не прымае ніякіх аргументаў пад час яе выкліку.
{
Тут фігурныя скобкі паказваюць пачатак аб'яўлення кода функцыі main
.
printf("hello, world\n");
Гэты радок выклікае — выконвае код і вяртаецца да далейшага выканання праграмы — функцыю з назвай printf
, якая аб'яўлена ў загаловачным файле stdio.h
. У гэтым выкліку функцыі printf
перадаецца адзін аргумент, радок тэксту "hello, world\n". Камбінацыя сімвалаў "\n" называецца escape-паслядоўнасцю і ператвараецца на сімвал EOL (end-of-line, канец радку), які пераводзіць курсор у тэрмінале на пачатак новага радка. Функцыя printf
вяртае значэнне тыпу int
, аднак мы яго не выкарыстоўваем, таму не пішам ніякага коду для яго апрацоўкі.
return(0);
Гэты радок заканчвае выкананне функцыі main
з вяртаемым значэннем 0.
}
Гэта фігурная скобка паказвае канец кода функцыі main
.
[рэдагаваць] Тыпы
Тыпы ў C падобны да тыпаў іншых паслядоўнікаў мовы ALGOL, такіх як Pascal, хоць яны і шмат у чым адрозніваюцца. Ёсць тыпы для цэлых лічбаў розных памераў, знакавых і бяззнакавых, лічбаў з плаваючай коскай, літар, пералічэнняў (enum
), структур (struct
) і аб'яднанняў (union
), з дапамогай якіх можна зберагаць даныя некалькі тыпаў (але нельга зберагаць дадзеныя двух розных тыпаў адначасна).
C вельмі часта выкарыстоўвае указальнікі і вельмі просты тып спасылак для зберагання адрасоў памяці. Гэты адрас можна змяніць з дапамогай аператара прысвойвання ці арыфметыкі указальнікаў. Пад час выканання указальнік уяўляе адрас у памяці, а пад час кампіляцыі — адрас і тып дадзеных, што дазваляе праверыць частку выразаў з указальнікамі пад час кампіляцыі. Указальнікі выкарыстоўваюцца ў C для розных мэт. Тэкставыя радкі звычайна прадстаўлены як указальнік на масіў сімвалаў. Дынамічнае выдзяленне памяці, якое апісана ніжэй, выконваецца з дапамогай указальнікаў.
Нулявы указальнік мае спецыяльную мэту і паказвае, што аб'ект, на які ён паказвае, не знаходзіцца ў памяці. Іх зручна выкарыстоўваць у спецыяльных выпадках, напрыклад пры запісу указальніку на наступны аб'ект у канцы спісу. Выкарыстанне памяці, на які ўказвае нулявы ўказальнік прыводзіць да непрадбачаных рэзультатаў. Указальнікі на тып void
таксама існуюць, і паказваюць на аб'ект невядомага тыпу. Яны звычайна выкарыстоўваюцца ва ўніверсальным праграмаванні. Размер аб'екта, на які яны ўказваюць, невядомы, таму іх можна пераўтварыць на ўказальнікі любога іншага тыпу.
Масівы ў C — з фіксаванай даўжынёй, якая вядома пад час кампіляцыі (праўда, у C99 былі дададзены масівы зменнай даўжыні); на практыцы, гэта не вельмі вялікая праблема, бо C дазваляе выдзяленне блокаў памяці любой даўжыні пад час работы праграмы з дапамогай стандартнай бібліятэк і выкарыстанне іх у якасці масіваў. У адрозненні ад іншых моў, у C масівы рэалізаваныя як указальнікі: як звычайны адрас у памяці і тып дадзеных. Таму няма ніякіх праверак на перавышэнне індэксам масіву яго рэальнай даўжыні.
У C таксама ёсць падтрымка шматмерных масіваў. Семантычна гэтыя масівы выглядаюць як масівы масіваў, аднак фізічна яны зберагаюцца як адзін аднамерны масіў з прырахатаванымі адрасамі.
C часта выкарыстоўваецца ў нізкоўзроўневым сістэмным праграмаванні, дзе можа ўзнікнуць неабходнасць разглядаць цэлы лік як адрас у памяці, лічбу з плаваючай коскай двайной дакладнасці як цэлы лік ці адзін тып указальнікаў як іншы. Для такіх выпадкаў у C есць пераўтварэнне тыпаў (type casting), з дапамогай якога выконваецца няяўны перавод аднога значэння ў іншае. Звычайна, выкарыстанне пераўтварэнняў зніжае бяспеку, якая звычайна даецца сістэмай тыпаў.
[рэдагаваць] Зберагання даных
Адной з найбольш важных функцый мовы праграмавання з'яўляецца прадастаўленне магчымасцей для ўпраўлення памяццю і аб'ектамі, што ў ёй зберагаюцца. У C ёсць тры спосабы атрымаць памяць для аб'ектаў:
- Статычнае выдзяленне памяці: месца для аб'екта выдзяляецца дваічна пад час кампіляцыі; гэтыя аб'екты існуюць пад час усяго існавання праграмы
- Аўтаматычнае выдзяленне памяці: часовыя аб'екты можна зберагаць у стэку, і месца, якое выкарыстоўваецца імі, аўтаматычна вяртаецца пасля таго, як заканчваецца выкананне блоку, дзе яны выкарыстоўваліся
- Дынамічнае выдзяленне памяці: праграміст можа запрасіць блок памяці пажаданага размеру пад час выканання праграмы з дапамогай функцый
malloc()
,realloc()
, іfree()
з рэгіёну памяці, які называецца купай; гэты блокі можна выкарыстоўваць зноў, пасля таго як праграміст вярнуў іх выклікам функцыіfree()
Кожны з тыпаў выдзялення памяці выкарыстоўвуецца ў розных выпадках і мае свае плюсы і мінусы. Напрыклад, статычнае выдзяленне памяці не патрабуе спецыяльных вызаваў працэдур, пры аўтаматычным выдзяленні кампілятар зменіць толькі адну сістэмную зменную, а для дынамічнага выдзялення памяці патрэбна шмат коду як з боку праграміста, так і з боку кампілятара. Аднак памяць стэку звычайна вельмі абмежавана за памяць купы, і толькі з дапамогай дынамічнага выдзялення памяці можна выдзяліць блок памяці, памер якога невядомы на этапе кампіляцыі. У большасці праграм на С выкарыстоўвуюцца ўсі тры варыянта.
Лепей выкарыстоўваць аўтаматычнае і статычнае выдзяленне памяці там, дзе гэта магчыма, бо пры іх выкарыстанні выдзяленне памяці робіць кампілятар і праграмісту не трэба пісаць код для выдзялення і вяртання памяці, што часта прыводзіць да памылак. Аднак, на жаль, размер шматлікіх структур дадзеных змяняецца пад час выканання праграмы; для выкарыстання аўтаматычнага і статычнага выдзялення патрэбна ведаць памер пад час кампіляцыі, таму ў шматлікіх сітуацыях (напрыклад, пры стварэнні масіваў са зменнай даўжынёй) трэба выкарыстоўваць дынамічнае выдзяленне памяці.
[рэдагаваць] Сынтаксіс
У адрозненні ад моў тыпу Fortran 77, у C праграміст можа выкарыстоўваць прабелы і пераводы радкоў там, дзе ён жадае. Каментары знаходзяцца або паміж сімваламі /*
і */
, або (у C99) пасля //
на канца радка.
[рэдагаваць] Праблемы
Есць папулярная фраза: «З дапамогай C лёгка выстраліць ва ўласную нагу». [1] Інакш кажучы, C дазваляе шмат аперацый, якія, як правіла, не пажаданы, таму шмат памылак праграмістаў не вызначаюцца кампілятарам ці нават пад час выканання. Гэта прыводзіць да непрадбачаных паводзін праграмы і "дзірак" пры выкананні. Дыялект C Cyclone вырашае частку гэтых праблем.
З аднаго боку, праверкі на адсутнасць такіх памылак вельмі змяншалі хуткасць выканання праграмы ў той час, калі C ствараўся. З другога боку, аўтары хацелі зрабіць C як мага болей эфектыўнай і гібкай; чым больш магутная мова, тым складней пісаць праграмы з яе дапамогай. Частка праверак выконваецца знешнімі інструментамі.
[рэдагаваць] Выдзяленне памяці
Адна з праблем C палягае ў тым, што дынамічна выдзеленыя аб'екты не ініцыялізуюцца; яны зберагаюць тое, што знаходзілася з памяці да іх. Гэта значэнне амаль немагчыма прадбачыць, бо яно змяняецца не толькі на розных камп'ютэрах, але нават пры розных запусках праграмы ці розных выкліках адной функцыі. Таму, калі праграма выкарыстоўвае неініцыялізаваныя дадзеныя, рэзультаты прадбачыць немагчыма. Большасць сучасных кампілятараў папераджаць пра гэту праблему ў частцы выпадкаў, аднак поўнасцю гэта зрабіць немагчыма.
Яшчэ адной праблемай з'яўляецца тое, што памяць з купы нельга выкарыстоўваць занава да таго часу, калі праграміст вярне яе функцыяй free()
. Таму, калі праграміст забудзе вярнуць памяць, праграма працягне выдзяляць яе, і усё болей і болей памяці будзе выкарыстоўвацца. Гэта называецца ўцёк памяці. Праўда, ёсць магчымасць наперад вярнуць памяць і выкарыстоўваць яе далей, аднак сістэмы выдзялення памяці можа заняць яе яшчэ раз, што прывядзе да зусім непрадбачаных паводзін. Гэтыя праблемы вырашаны ў мовах ў аўтаматычнай зборкай смецця.
[рэдагаваць] Указальнікі
Указальнікі з'яўляюцца адной з найбольшых крыніц небяспекі; яны не правяраюцца, таму яны могуць указваць на любы аб'ект любога тыпу, у тым ліку код, і могуць мяняць гэты аб'ект, што прывядзе да непрадбачаных рэзультатаў. Хоць большасць указальнікаў указваюць на бяспечныя месцы, іх можна змясціць з дапамогай арыфметыкі указальнікаў, памяць, на якую яны ўказваюць, можна вернутай, выкарыстанай паўторна ці неініцыялізаванай, ці можна прысвоіць указальніку любое значэнне з дапамогай пераўтварэння тыпаў. Яшчэ адной праблемай указальнікаў з'яўляецца тое, што ў C дазволена вольна пераўтвараць адзін тып указальнікаў у іншы. У іншых мовах гэтыя праблемы вырашаюцца выкарыстаннем болей абмежаваных тыпаў спасылак.
[рэдагаваць] Масівы
Хоць у C ёсць падтрымка статычных масіваў, у ім не выконваецца праверка правільнасці індэксу масіву. Таму можна звярнуцца да шостага элементу масіву з пяці элементаў, і невядома, да чаго гэта прывядзе. Гэта называецца перапаўнення буферу. Перапаўнення буферу з'яўляецца крыніцай шматлікіх дзірак пры выкананні ў праграмах на C. З іншага боку, праверка індэксу прыводзіць да змяншэння хуткасці выканання праграм, асабліва ў вылічэннях, і, як лічыцца, не суадносіцца з мінімалістычнымі ідэямі C.
Шматмерныя масівы патрэбны ў лічбавых алгарытмах (у асноўным іх выкарыстоўваюць у лінейнай алгебры) для зберагання матрыц. Іх рэалізацыя ў C не зручная і ў цэлым не вельмі падыходзіць для рэалізацыі гэтай задачы. Гэта праблема апісана ў кнізе Numerical Recipes in C, Chap. 1.2, page 20 ff (read online). У гэтай кнізе ёсць вырашэнне гэтай праблемы, хоць яно і дастаткова вялікае.
[рэдагаваць] Функцыі са зменнай колькасцю аргументаў
Яшчэ адной праблемай з'яўляюцца функцыі, якія прымаюць зменную колькасць аргументаў. У адрозненні ад большасці функцый C, яны не маюць прататыпаў, таму праверка правільнасці іх аргументаў, як правіла, не выконваецца, ды і не магчыма без дадатковай інфармацыі. Рэзультат перадачы нявернага тыпа дадзеных прадбачыць немагчыма, і часта ён прыводзіць да аварыйнага заканчэння работы праграмы. Акрамя таго, функцыям са зменнай колькасцю параметраў нельга перадаваць нулявыя указальнікі.
Праверка правільнасці тыпаў функцый са зменнай колькасцю аргументаў залежыць выключна ад якасці рэалізацыі, аднак шматлікія сучасныя кампілятары выконваюць праверку тыпаў пры выкліках функцыі printf
і папераджаюць пры памылковым спісе аргументаў. Аднак не ўсе выклікі printf
можна праверыць статычна, бо радок фармату можна ствараць пад час выканання, таму нават не ўсе гэтыя функцыі можна праверыць.
[рэдагаваць] Сінтаксіс
Сінтаксіс C часта капіруецца ў іншых мовах праграмавання, аднак часта кажуць, што ён з'яўляецца адной з слабейшых кропак мовы. Сярод праблемаў сінтаксісу C наступныя:
- Прататыпы функцыі, якія на самой справе дазваляюць любы набор параметраў, што пав'язана з адсутнасцю прататыпаў у K&R C
- Не вельмі ясныя прыярытэты аператараў, напрыклад, у аператара
==
большы прыярытэт, чым у аператараў&
і|
у выразах кшталту:x & 1 == 0
(што пераўтвараецца ў:x & (1 == 0)
). - Выкарыстанне аператара
=
, які ў матэматыцы азначае роўнасьць, для абазначэння прысвойвання, што прыводзіць да неправільных прысвойванняў у праверках. Выкарыстанне аператара=
для прысвойвання было ідэяй Рычы, які адзначыў, што прысвойванне выконваецца часцей за праверку на роўнасьць. - Адсутнасць бінарных аператараў для складаных аб'ектаў, у асаблівасці для аперацый над радкамі літар, што робіць праграмы, якія шмат ужываюць такія тыпы, вельмі складанымі для чытаньня.
- Частае выкарыстанне сімвалаў пунктуацыі, нават там, дзе гэта не вельмі зразумела, — напрыклад, выкарыстанне
&&
і||
заместand
іor
. - Не інтуітыўны сінтаксіс аб'яўлення тыпаў (некаторыя элементы - прэфіксныя, некаторыя - постфіксныя, да таго ж яны маюць розныя прыярэтэты, што часам патрабуе ўважліва ставіць дужкі, каб атрымаць жаданы тып), асабліва аб'яўленняў указальнікаў на функцыі.
[рэдагаваць] Праблемы падтрымкі
Есць таксама і іншыя праблемы ў C, якія не напрамую выклікаюць памылкі, аднак мяшаюць праграмісту стварыць надзейную, падтрымліваемую, маштабуемую сістэму. Сярод такіх праблем ёсць наступныя:
- Крохкая сістэма імпарту аб'яўленняў (
#include
), заснаваная на ўключэнні тэксту, што вельмі моцна павялічвае час кампіляцыі. - Слабыя сістэмы тыпаў, пры якой можна скампіляваць адназначна памылковыя праграмы.
[рэдагаваць] Знешнія інструменты для праверкі
Для дапамогі праграмістам на C былі створаны праграмы, якія дапамагаюць пазбегнуць памылак у многіх выпадках. Аўтаматычная праверка зыходнага кода дапамагае незалежна ад мовы праграмавання, і для C існуюць такія праграмы, напрыклад Lint. Звычацна Lint выкарыстоўваецца для праверкі коду пры першым напісанні праграмы, і праграма кампілюецца пасля праверкі. Таксама ёсць бібліятэкі для правекі індэксаў масіваў і абмежанай формы зборкі смецця, аднак яны не з'яўляюцца часткай стандартнай бібліятэкі C.
Трэба разумець, што нават такія інструменты не могуць дапамагчы заўсёды. Заўдзякі гібкасці мовы, шмат тыпаў памылак у C, сярод якіх памылкі, звязаныя з функцыямі са зменнай колькасць аргументаў, выхад за межы масіва ці нявернае выдзяленне памяці, немагчыма праверыць поўнасцю. Аднак нават у гэтых выпадках можна праверыць найбольш тыпічныя памылкі.
[рэдагаваць] Гісторыя
[рэдагаваць] Раннія распрацоўкі
Распрацоўка C пачалася ў AT&T Bell Laboratories паміж 1969 і 1973 гадамі; згодна з Рычы, найбольшая частка мовы была створана ў 1972 годзе. Мову назвалі C, бо шмат яе рыс яна пераняла з болей ранняй мовы B.
Дакладна невядома, адкуль пайшла назва «B»: ад мовы праграмавання Кена Томпсана BCPL ці ад яго ж мовы Bon, названай на чэсць яго жонкі Боні.
Існуе шмат міфаў як адносна ідэі C, так і адносна звязанай з ёй аперацыйнай сістэмы UNIX.
У 1973 годзе мова C была ўжо дастаткова магутнай, каб напісаць на ёй большую частку ядра UNIX, якое была перапісана з мовы асэмблера PDP-11/20. Гэта было адно з першых ядзер аперацыйнай сістэмы, напісанае не на асэмблеры (раней былі створаны сістэма Multics на PL/I, TRIPOS на BCPL і MCP (Master Control Program) для Burroughs B5000 на мове ALGOL у 1961 годзе).
[рэдагаваць] K&R C
У 1978, Дэніс Рычы і Браян Керніган апублікавалі першую рэдакцыю кнігі The C Programming Language. Гэта кніга, вядомая сярод праграмістаў на C як K&R, выкарыстоўвалася шмат год як нефармальная спецыфікацыя мовы. Версія C, апісаная ў гэтай кнізе, часта называецца K&R C. (У другой рэдакцыі кнігі апісваецца стандарт ANSI C, інфармацыя пра які змешчана унізе.)
Сярод рыс мовы, уведзеных у K&R C, былі наступныя:
- тып дадзеных
struct
- тып дадзеных
long int
- тып дадзеных
unsigned int
- Аператар
=+
быў заменены на+=
, і так далей (=+
ствараў памылкі для лексічных аналізатараў; напрыклад,i =+ 10
ў параўнанні зi = +10
).
Часта лічаць, што K&R C — самая базавая частка мовы, якую кампілятар мае падтрымліваць. Шмат год, нават пасля стварэння ANSI C, гэтая версія мовы лічыцца найбольш партуемай, бо не ўсе кампілятары падтрымліваюць ANSI C, а адносна добра напісаны код на K&R C таксама правільны і для ANSI C.
У гэтай рэалізацыі C трэба аб'яўляць толькі тыя функцыі, якія вяртаюць значэнне не тыпа int
. Функцыя без папярэдняга аб'яўлення лічылася функцыяй, якая вяртае значэнне тыпа int
. Прыклад выкліку з папярэднім аб'яўленням:
long int SomeFunction();
int CallingFunction() {
long int ret; ret = SomeFunction();
}
Прыклад выкліку без папярэдняга аб'яўлення:
int SomeOtherFunction() {
return 0;
}
int CallingFunction() {
int ret; ret = SomeOtherFunction();
}
У прататыпах функцый K&R не было інфармацыі пра аргументы функцыі, таму большасць кампілятараў таго часу не выконвала праверку тыпаў параметраў, хоць частка кампілятараў папярэджвалі пра выклік функцыі з нявернай колькасцю аргументаў.
Пасля публікацыі K&R C да мовы былі дададзены некалькі «неафіцыйных» дапаўненняў, якія падтрымліваліся кампілятарамі ад AT&T і некаторымі іншымі. Сярод іх наступныя:
- функцыі
void
і тып дадзеныхvoid *
- функцыі, што вяртаюць тыпы
struct
іunion
- магчымасць выкарыстоўваць назвы палей
struct
некалькі разоў у розных тыпах - прысвойванне тыпаў дадзеных
struct
- ключавое слова
const
для аб'ектаў прызначаных толькі для чытання - стандартная бібліятэка C, функцыянальнасць якой была амаль аднолькавай у большасці кампілятараў
- пералічэнні
- тып
float
адзінарнай дакладнасці
[рэдагаваць] ANSI C і ISO C
У пачатку 1970-х C пачаў замяняць BASIC на пазіцыі вядучай мовы праграмавання для мікракамп'ютэраў. У 1980-х ён быў перанесены на IBM PC і яго папулярнасць пачала хутка павялічвацца. У той жа час Б'ярн Страўструп і іншыя людзі з Bell Laboratories пачалі работу па даданню аб'ектна-арыентованых канструкцый у C. Мова, якую яны стварылі, C++, цяпер з'яўляецца найбольш часта выкарыстоўваемай мовай праграмавання для аперацыйнай сістэмы Microsoft Windows; C застаецца болей папулярнай у свеце UNIX. Яшчэ адной мовай на аснове C стала Objective-C, якая таксама дадае аб'ектна-арыентованае праграмаванне ў C. Зараз яна не так папулярна, як C++, аднак яна выкарыстоўвалася для распрацоўкі праграм Cocoa для Mac OS X.
У 1983 годзе Амерыканскі нацыянальны інстытут стандартаў (American National Standards Institute, ANSI) сфрамміраваў камітэт, X3J11, для стварэння спецыфікацыі C. Пасля доўгага працэсу гэты стандарт быў створаны ў 1989 годзе і ратыфікованы як ANSI X3.159-1989 «Programming Language C». Гэту версію мовы звычайна называюць ANSI C. У 1990 годзе стандарт ANSI C (з некалькімі невялікімі зменамі) быў прыняты Міжнароднай арганізацыяй стандартызацыі (International Organization for Standardization, ISO) як ISO/IEC 9899:1990.
Адной з мэт працэсу стандартызацыі ANSI C было стварэнне надмноства K&R C, якое б уключала шмат неафіцыйных дапаўненняў. Камітэт стандартаў таксама дадаў некалькі новых магчымасцей, такіх як прататыпа функцый (узятыя з C++) і болей прасунуты прэпрацэсар.
ANCI C зараз падтрымліваецца амаль усімі шырока распаўсюджанымі кампілятарамі. Большасць кода, які пішацца сёння, заснаваная на ANSI C. Любая праграма, напісаная толькі на стандартным C гарантавана выконваецца на любой платформе з рэалізацыяй C. Аднак шмат праграм пішуцца толькі для нейкай адной платформа, бо які (i) выкарыстоўваюць нестандартныя бібліятэкі, напрыклад для вываду графікі, (ii) нейкія кампілятары выкарыстоўваюць не ANSI C ці яго паслядоўнікаў у стандартным рэжыме, ці (iii) праграма апіраецца на канкрэтныя тыпы даных і парадак байт.
Вы можаце выкарыстоўваць маркас __STDC__
, каб падзяліць код на часткі ANSI і K&R.
#if __STDC__ extern int getopt(int,char * const *,const char *); #else extern int getopt(); #endif
Часам выкарыстоўваецца #if __STDC__
, як у кодзе вышэй, ці #ifdef __STDC__
, бо нейкія кампілятары ўсталёўваюць __STDC__
роўнай нулю, каб паказаць адсутнасць ANSI compliance.
[рэдагаваць] C99
Пасля працэсу стандартызацыі ASCI, мова C пэўны час захоўвалася адносна нязменнай, калі мова C++ развівалася далей. (У 1995 годзе была створана Нарматыўная папраўка 1, аднак гэтую версію ня часта згадваюць.) Аднак у канцы 1990-х стандарт быў перагледжаны, што прывяло да публікацыі ISO 9899:1999 у 1999 годзе. Гэты стандарт, як правіла, называюць C99. Ён быў прыняты як стандарт ANSI ў сакавіку 2000 года.
Сярод новых магчымасцей C99 ёсць наступныя:
- inline-функцыі (код якіх пры кампіляцыі ўстаўляецца на месца выкліку)
- зменныя можна аб'яўляць у любым месцы (як у C++), а не толькі пасля іншага аб'яўлення ці на пачатку of acompound statement
- некалькі новых тыпаў дадзеных, у тым ліку
long long int
, тып дадзеных boolean і тыпcomplex
для рэалізацыі complex numbers - масівы са зменнай даўжынёй
- падтрымка аднарадковых каментарыяў, якія пачынаюцца з
//
, як у BCPL ці C++, якія і раней падтрымліваліся шматлікімі кампілятарамі C як дапаўненне - некалькі новых функцый у стандартнай бібліятэцы, такіх як
snprintf()
- некалькі новых загаловачных файлаў, такіх як
stdint.h
Зацікаўленасць у падтрымцы новых магчымасцей С99 розны. Калі GCC і некалькі іншых кампілятараў зараз падтрымліваюць большасць магчымасцей C99, кампілятары ад Microsoft і Borland — не, і, здаецца, гэтыя кампаніі не зацікаўлены ў дабаўленні такой падтрымкі.
[рэдагаваць] Адносіны з C++
Мова праграмавання C++ была створана на аснове C. Аднак не кожная праграма на C з'яўляецца вернай праграмай на C++. Так як дзве гэтых мовы развіваліся асобна, колькасць incompatibilities паміж дзвюма мовамі пастаянна павялічвалася [2]. Апошні перагляд C, C99, стварыў шмат канфліктуючых характарыстык. Адрозненні прыводзяць да складнасці пісаць праграмы і бібліятэкі, якія можна правільна скампіляваць на C і С++ і збіваюць тых, хто праграмуе на абедзвюх мовах. Акрамя таго, вельмі складна пераносіць рысы адной мовы ў другую.
Б'ярн Страўструп, стваральнік C++, неаднаразова паўтараў [3], што несумяшчальнасць паміж C і C++ павінна быць як можна меньшай, каб павялічыць inter-operability паміж гэтымі мовамі. Аднак існуе пункт гледжання, што, паколькі C і C++ — розныя мовы, сумяшчальнасць паміж імі зручная, але не абавязковая.
У C99 з'явілася шмат магчымасцей, якія ўпершыню з'явіліся ў C++. Сярод іх наступныя:
- Аб'яўлення прататыпаў функцый
- Ключавое слова
inline
- Неабходнасць аб'яўлення ўсіх тыпаў вяртаемых значэнняў, у тым ліку тыпа "int"
[рэдагаваць] Далейшае чытанне
- Brian Kernighan, Dennis Ritchie: The C Programming Language. Also known as K&R — The original book on C.
- 1st, Prentice Hall 1978; ISBN 0-131-10163-3. Pre-ANSI C.
- 2nd, Prentice Hall 1988; ISBN 0-131-10362-8. ANSI C.
- ISO/IEC 9899. The official C:1999 standard, along with defect reports and a rationale.
- Samuel P. Harbison, Guy L. Steele: C: A Reference Manual. This book is excellent as a definitive reference manual, and for those working on C compilers. The book contains a BNF grammar for C.
- 4th, Prentice Hall 1994; ISBN 0-133-26224-3.
- 5th, Prentice Hall 2002; ISBN 0-130-89592-X.
- Derek M. Jones: The New C Standard: A Cultural and Economic Commentary, Addison-Wesley, ISBN 0-201-70917-1, online material
- Robert Sedgewick: Algorithms in C, Addison-Wesley, ISBN 0-201-31452-5 (Part 1–4) and ISBN 0-201-31663-3 (Part 5)
- William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in C (The Art of Scientific Computing), ISBN 0-521-43108-5
[рэдагаваць] Знешнія спасылкі
[рэдагаваць] C
- comp.lang.c Frequently Asked Questions
- The Development of the C Language by Dennis M. Ritchie
- Programming in C (document collection at Lysator)
- International Obfuscated C Code Contest
- Programming C at Wikibooks
- The New C Standard: An economic and cultural commentary — an unpublished book about "detailed analysis of the International Standard for the C language"
- ISO/IEC 9899 (pdf)
[рэдагаваць] C99
- Open source development using C99 — Is your C code up to standard? by Peter Seebach
- Are you Ready For C99?
- Article "Incompatibilities Between ISO C and ISO C++" by David R. Tribble