|
Article on other languages:
|
Мо́ва праграмава́ння C (вымаўляецца: Сі́) — стандартызаваная імператыўная мова праграмавання, створаная на пачатку 1970-х гадоў Кенам Томпсанам і Дэнісам Рычы для аперацыйнай сістэмы UNIX. Потым яна была перанесеная на іншыя аперацыйныя сістэмы, і зараз з'яўляецца адной з найбольш часта выкарыстоўваемых моў праграмавання. C часта ўхваляюць за яе эфектыўнасць, і гэта адна з самых папулярных моў сістэмнага праграмавання, хоць з яе дапамогай можна пісаць і іншыя праграмы. Яна часта выкарыстоўваецца пры вывучэнні інфарматыкі, хоць стваралася не для пачаткоўцаў.
Асноўныя рысыАглядC — адносна мінімалістычная мова праграмавання, бліжэйшая да апаратнага забеспячэння і мовы асэмблера, чым іншыя мовы праграмавання высокага ўзроўню. Сапраўды, C часам называюць «партуемым асэмблерам», паказваючы яго адрозненні ад моў праграмавання нізкага ўзроўню, напрыклад, асэмблера: код на C можна скампіляваць і выканаць на амаль любым камп'ютэры, а код на асэмблеры можна выконваць толькі на той мадэлі камп'ютэра, для якой ён напісаны. Таму C называюць мовай сярэдняга ўзроўню. Пры стварэнні C асноўнай мэтай было стварэнне працэдурнай мовы праграмавання, якая дазволіла б пісаць праграмы з меншай колькасцю памылак, аднак не ствараючы дадатковых праблем для аўтараў кампілятараў дадатковымі складанымі рысамі мовы. Такім чынам, у C ёсць такія важныя рысы:
Рысы іншых моў, якіх не хапае ў C:
Хоць спіс адсутных у C зручных канструкцый доўгі, іх адсутнасць дапамагла прыняць C, бо кампілятары для новых платформ пісаліся хутчэй, і праграмістам лягчэй зразумець, што робіць той ці іншы код, і кантраляваць яго. Таму код на C часта выконваецца хутчэй за код на іншых мовах праграмавання. Яшчэ адна з прычын шырокага выкарыстання C палягае ў тым, што шмат кампілятараў, бібліятэк і інтэрпрэтатараў іншых высокаўзроўневых моў часта ствараюцца на C. Прыклад «hello, world»Гэта простая праграма ўпершыню з'явілася ў першая рэдакцыі K&R і стала стандартнай уводнай праграмай у большасці падручнікаў па праграмаванню, незалежна ад мовы. Гэта праграма выводзіць «hello, world» у стандартны вывад, звычайна, ў тэрмінал ці на дысплей. main() { printf("hello, world\n"); } Прыведзеная вышэй праграма нармальна скампілюецца на большасці сучасных кампілятараў. Аднак пры кампіляцыі згодна стандарту ANSI C будзе выдадзена некалькі папярэджанняў. Акрамя таго, код не скампілюецца, калі кампілятар дакладна выконвае стандарт C99, бо вяртаемае значэнне не будзе лічыцца значэннем тыпа #include <stdio.h> int main(void) { printf("hello, world\n"); return(0); } Аналіз кожнага радка праграмы: #include <stdio.h> Першы радок праграмы з'яўляецца дырэктывай прэпрацэсара, int main(void) Наступны радок паказвае, што ствараецца функцыя пад назвай
{
Тут фігурныя дужкі паказваюць пачатак аб'яўлення коду функцыі
printf("hello, world\n");
Гэты радок выклікае — выконвае код і вяртаецца да далейшага выканання праграмы — функцыю з назвай
return(0);
Гэты радок заканчвае выкананне функцыі } Гэта фігурная дужка паказвае канец кода функцыі ТыпыТыпы ў C падобныя да тыпаў іншых паслядоўнікаў мовы ALGOL, такіх як Pascal, хоць яны і шмат у чым адрозніваюцца. Ёсць тыпы для цэлых лічбаў розных памераў, знакавых і бяззнакавых, лікаў з плаваючай коскай, літар, пералічэнняў ( C вельмі часта выкарыстоўвае указальнікі і вельмі просты тып спасылак для захавання адрасоў памяці. Гэты адрас можна змяніць з дапамогай аператара прысвойвання ці арыфметыкі указальнікаў. Падчас выканання указальнік з'яўляецца адрасам у памяці, а пад час кампіляцыі — адрасам і тыпам дадзеных, што дазваляе праверыць частку выразаў з указальнікамі падчас кампіляцыі. Указальнікі выкарыстоўваюцца ў C для розных мэтаў. Тэкставыя радкі звычайна прадстаўленыя як указальнік на масіў сімвалаў. Дынамічнае выдзяленне памяці, якое апісана ніжэй, выконваецца з дапамогай указальнікаў. Нулявы указальнік мае спецыяльную мэту і паказвае, што аб'ект, на які ён паказвае, не знаходзіцца ў памяці. Іх зручна выкарыстоўваць у спецыяльных выпадках, напрыклад для запісу указальніку на наступны аб'ект у канцы спісу. Выкарыстанне памяці, на які ўказвае нулявы ўказальнік, прыводзіць да непрадбачаных вынікаў. Указальнікі на тып Масівы ў C — з фіксаванай даўжынёй, якая вядома пад час кампіляцыі (праўда, у C99 былі дададзены масівы зменнай даўжыні); на практыцы, гэта не вельмі вялікая праблема, бо C дазваляе выдзяленне блокаў памяці любой даўжыні падчас работы праграмы з дапамогай стандартнай бібліятэк і выкарыстанне іх у якасці масіваў. У адрозненні ад іншых моў, у C масівы рэалізаваныя як указальнікі: як звычайны адрас у памяці і тып дадзеных. Таму няма ніякіх праверак на перавышэнне індэксам масіву яго рэальнай даўжыні. У C таксама ёсць падтрымка шматмерных масіваў. Семантычна гэтыя масівы выглядаюць як масівы масіваў, аднак фізічна яны захоўваюцца як адзін аднамерны масіў з прырахатаванымі адрасамі. C часта выкарыстоўваецца ў нізкаўзроўневым сістэмным праграмаванні, дзе можа ўзнікнуць неабходнасць разглядаць цэлы лік як адрас у памяці, лік з плаваючай коскай двайной дакладнасці як цэлы лік ці адзін тып указальнікаў як іншы. Для такіх выпадкаў у C есць пераўтварэнне тыпаў (type casting), з дапамогай якога выконваецца няяўны перавод аднаго значэння ў іншае. Звычайна, выкарыстанне пераўтварэнняў зніжае бяспеку, якая звычайна даецца сістэмай тыпаў. Захаванне дадзеныхАдной з найбольш важных функцый мовы праграмавання з'яўляецца прадстаўленне магчымасцяў для кіравання памяццю і аб'ектамі, што ў ёй захоўваюцца. У C ёсць тры спосабы атрымаць памяць для аб'ектаў:
Кожны з тыпаў выдзялення памяці выкарыстоўваецца ў розных выпадках і мае свае плюсы і мінусы. Напрыклад, статычнае выдзяленне памяці не патрабуе спецыяльных выклікаў працэдур, пры аўтаматычным выдзяленні кампілятар зменіць толькі адну сістэмную зменную, а для дынамічнага выдзялення памяці патрэбна шмат коду як з боку праграміста, так і з боку кампілятара. Аднак памяць стэку звычайна вельмі абмежаваная у параўнанні з памяццю купы, і толькі з дапамогай дынамічнага выдзялення памяці можна выдзяліць блок памяці, памер якога невядомы на этапе кампіляцыі. У большасці праграм на С выкарыстоўваюцца ўсе тры варыянты. Лепей выкарыстоўваць аўтаматычнае і статычнае выдзяленне памяці там, дзе гэта магчыма, бо пры іх выкарыстанні выдзяленне памяці робіць кампілятар і праграмісту не трэба пісаць код для выдзялення і вяртання памяці, які часта прыводзіць да памылак. Аднак, нажаль, памер шматлікіх структур дадзеных змяняецца падчас выканання праграмы; для выкарыстання аўтаматычнага і статычнага выдзялення патрэбна ведаць памер падчас кампіляцыі, таму ў шматлікіх сітуацыях (напрыклад, пры стварэнні масіваў са зменнай даўжынёй) трэба выкарыстоўваць дынамічнае выдзяленне памяці. СінтаксісУ адрозненні ад моў тыпу Fortran 77, у C праграміст можа выкарыстоўваць прагалы і пераводы радкоў там, дзе пажадае. Каментары знаходзяцца або паміж сімваламі ПраблемыЕсць папулярны выраз: «З дапамогай C лёгка стрэліць ва ўласную нагу». [1] Інакш кажучы, C дазваляе шмат аперацый, якія, як правіла, непажаданыя, таму шмат памылак праграмістаў не вызначаюцца кампілятарам ці нават пад час выканання. Гэта прыводзіць да непрадбачаных паводзінаў праграмы і "дзірак" пры выкананні. Дыялект C Cyclone вырашае частку гэтых праблем. З аднаго боку, праверкі на адсутнасць такіх памылак вельмі памяншалі хуткасць выканання праграмы ў той час, калі C ствараўся. З другога боку, аўтары хацелі зрабіць C як мага болей эфектыўнай і гнуткай; чым больш магутная мова, тым складней пісаць праграмы з яе дапамогай. Частка праверак выконваецца знешнімі інструментамі. Выдзяленне памяціАдна з праблем C палягае ў тым, што дынамічна выдзеленыя аб'екты не ініцыялізуюцца; яны зберагаюць тое, што знаходзілася з памяці да іх. Гэтыя значэнні амаль немагчыма прадбачыць, бо яны змяняецца не толькі на розных камп'ютэрах, але нават пры розных запусках праграмы ці розных выкліках адной функцыі. Таму, калі праграма выкарыстоўвае неініцыялізаваныя дадзеныя, вынік прадбачыць немагчыма. Большасць сучасных кампілятараў папярэджваюць пра гэтую праблему ў частцы выпадкаў, аднак поўнасцю гэта зрабіць немагчыма. Яшчэ адной праблемай з'яўляецца тое, што памяць з купы нельга выкарыстоўваць ізноў, пакуль праграміст не верне яе функцыяй УказальнікіУказальнікі з'яўляюцца адной з найбольшых крыніц небяспекі; яны не правяраюцца, таму яны могуць указваць на любы аб'ект любога тыпу, у тым ліку код, і могуць мяняць гэты аб'ект, што прывядзе да непрадбачаных вынікаў. Хоць большасць указальнікаў указваюць на бяспечныя месцы, іх можна змясціць з дапамогай арыфметыкі указальнікаў, памяць, на якую яны ўказваюць, можа быць вернутай, выкарыстанай паўторна ці неініцыялізаванай, ці можна прысвоіць указальніку любое значэнне з дапамогай пераўтварэння тыпаў. Яшчэ адной праблемай указальнікаў з'яўляецца тое, што ў C дазволена вольна пераўтвараць адзін тып указальнікаў у іншы. У іншых мовах гэтыя праблемы вырашаюцца выкарыстаннем болей абмежаваных тыпаў спасылак. МасівыХоць у C ёсць падтрымка статычных масіваў, у ім не выконваецца праверка правільнасці індэксу масіву. Таму можна звярнуцца да шостага элементу масіву з пяці элементаў, і невядома, да чаго гэта прывядзе. Гэта называецца перапаўненнем буферу. Перапаўненне буферу з'яўляецца крыніцай шматлікіх дзірак пры выкананні ў праграмах на C. З іншага боку, праверка індэксу прыводзіць да змяншэння хуткасці выканання праграм, асабліва ў вылічэннях, і, як лічыцца, не суадносіцца з мінімалістычнымі ідэямі C. Шматмерныя масівы патрэбныя ў лічбавых алгарытмах (у асноўным іх выкарыстоўваюць у лінейнай алгебры) для захоўвання матрыц. Іх рэалізацыя ў C нязручная і ў цэлым не вельмі падыходзіць для рэалізацыі гэтай задачы. Гэта праблема апісаная ў кнізе Numerical Recipes in C, Chap. 1.2, page 20 ff (read online). У гэтай кнізе ёсць вырашэнне гэтай праблемы, хоць яно і дастаткова вялікае. Функцыі са зменнай колькасцю аргументаўЯшчэ адной праблемай з'яўляюцца функцыі, якія прымаюць зменную колькасць аргументаў. У адрозненні ад большасці функцый C, яны не маюць прататыпаў, таму праверка правільнасці іх аргументаў, як правіла, не выконваецца, ды і немагчымая без дадатковай інфармацыі. Вынік перадачы няслушнага тыпу дадзеных прадбачыць немагчыма, і часта ён прыводзіць да аварыйнага заканчэння работы праграмы. Акрамя таго, функцыям са зменнай колькасцю параметраў нельга перадаваць нулявыя указальнікі. Праверка правільнасці тыпаў функцый са зменнай колькасцю аргументаў залежыць выключна ад якасці рэалізацыі, аднак шмат якія сучасныя кампілятары выконваюць праверку тыпаў пры выкліках функцыі СінтаксісСінтаксіс C часта капіруецца ў іншых мовах праграмавання, аднак часта кажуць, што ён з'яўляецца адным з слабейшых пунктаў мовы. Сярод праблемаў сінтаксісу C наступныя:
Праблемы падтрымкіЕсць таксама і іншыя праблемы ў C, якія не напрамую выклікаюць памылкі, аднак замінаюць праграмісту стварыць надзейную, падтрымліваемую, маштабуемую сістэму. Сярод такіх праблем ёсць наступныя:
Знешнія інструменты для праверкіДля дапамогі праграмістам на 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, былі наступныя:
Часта лічаць, што K&R C — самая базавая частка мовы, якую кампілятар мае падтрымліваць. Шмат год, нават пасля стварэння ANSI C, гэтая версія мовы лічыцца найбольш партуемай, бо не ўсе кампілятары падтрымліваюць ANSI C, а адносна добра напісаны код на K&R C таксама правільны і для ANSI C. У гэтай рэалізацыі C трэба аб'яўляць толькі тыя функцыі, якія вяртаюць значэнне не тыпу 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 і некаторымі іншымі. Сярод іх наступныя:
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++) і болей прасунуты прэпрацэсар. ANSI C зараз падтрымліваецца амаль усімі шырока распаўсюджанымі кампілятарамі. Большасць коду, які пішацца сёння, заснаваная на ANSI C. Любая праграма, напісаная толькі на стандартным C гарантавана выконваецца на любой платформе з рэалізацыяй C. Аднак шмат праграм пішуцца толькі для нейкай адной платформы, бо які (i) выкарыстоўваюць нестандартныя бібліятэкі, напрыклад для вываду графікі, (ii) нейкія кампілятары выкарыстоўваюць не ANSI C ці яго паслядоўнікаў у стандартным рэжыме, ці (iii) праграма апіраецца на канкрэтныя тыпы даных і парадак байтаў. Вы можаце выкарыстоўваць макрас #if __STDC__ extern int getopt(int,char * const *,const char *); #else extern int getopt(); #endif Часам выкарыстоўваецца C99Пасля працэсу стандартызацыі ANSI, мова C пэўны час захоўвалася адносна нязменнай, калі мова C++ развівалася далей. (У 1995 годзе была створана Нарматыўная папраўка 1, аднак гэтую версію не часта згадваюць.) Аднак у канцы 1990-х стандарт быў перагледжаны, што прывяло да публікацыі ISO 9899:1999 у 1999 годзе. Гэты стандарт, як правіла, называюць C99. Ён быў прыняты як стандарт ANSI ў сакавіку 2000 года. Сярод новых магчымасцей C99 ёсць наступныя:
Зацікаўленасць у падтрымцы новых магчымасцей С99 розная. Калі GCC і некалькі іншых кампілятараў зараз падтрымліваюць большасць магчымасцей C99, кампілятары ад Microsoft і Borland — не, і, здаецца, гэтыя кампаніі не зацікаўленыя ў даданні такой падтрымкі. Адносіны з C++Мова праграмавання C++ была створаная на аснове C. Аднак не кожная праграма на C з'яўляецца вернай праграмай на C++. Паколькі дзве гэтыя мовы развіваліся паасобку, колькасць несумяшчальнасцяў паміж дзвюма мовамі пастаянна павялічвалася [2]. Апошні перагляд C, C99, стварыў шмат канфліктуючых характарыстык. Адрозненні прыводзяць да складнасці пісаць праграмы і бібліятэкі, якія можна правільна скампіляваць на C і С++ і збіваюць тых, хто праграмуе на абедзвюх мовах. Акрамя таго, вельмі складана пераносіць рысы адной мовы ў другую. Б'ярнэ Строўструп, стваральнік C++, неаднаразова паўтараў [3], што несумяшчальнасць паміж C і C++ павінна быць як мага меньшай, каб павялічыць inter-operability паміж гэтымі мовамі. Аднак існуе пункт гледжання, што, паколькі C і C++ — розныя мовы, сумяшчальнасць паміж імі зручная, але не абавязковая.
Далейшае чытанне
У СецівеC
C99
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net