«Чертовски глупое решение»: история появления языка C
В том или ином виде, язык C повлиял на формирование практически каждого языка программирования, разработанного с 1980-х. Некоторые языки наподобие C++, C# и Objective C должны были стать прямыми наследниками C, а другие просто переняли и адаптировали его синтаксис. Программист, перешедший с Java, PHP, Ruby, Python или Perl, почти не испытает сложностей с пониманием простых программ на C, и в этом смысле C можно воспринимать как lingua franca программистов.
Однако C не возник из ниоткуда как единый монолит программирования. История C начинается в Англии, с коллеги Алана Тьюринга и программы, игравшей в шашки.
Боже, храни Короля
Кристофера Стрейчи называли «человеком, пищущим идеальные программы», как говорится в его длинном досье из журнала Annals of the History of Computing. Такую репутацию он заработал в Вычислительном центре Манчестерского университета в 1951 году. Стрейчи оказался там благодаря работе над компьютером университета Ferranti Mark I и знакомству с Аланом Тьюрингом из Королевского колледжа в Кембридже.
Стрейчи родился в 1916 году в британском семействе, обладавшем хорошими связями — его дядя, Литтон Стрейчи, был одним из основателей Группы Блумсбери, а его отец, Оливер Стрейчи, сыграл важную роль в операциях союзников по взлому кодов в обеих мировых войнах.
То, что Стрейчи стал признанным экспертом в программировании и компьютерных науках, стало бы неожиданностью для его преподавателей из частной школы и Кембриджского университета. Стрейчи всегда демонстрировал таланты к наукам, но редко применял их.
Если он и имел надежды на карьеру в сфере научных исследований, то им был нанесён серьёзный удар непримечательными результатами его выпускных экзаменов. Поэтому вместо этого во время Второй мировой войны Стрейчи работал в британской фирме по производству электроники, а позже стал школьным учителем, в конечном итоге оказавшись в одной из самых престижных частных школ Лондона Хэрроу.
В 1951 году у Стрейчи впервые появился шанс поработать с компьютерами — его познакомили с Майком Вуджером из Национальной физической лаборатории Великобритании. Потратив один день своих рождественских выходных на знакомство с Pilot ACE лаборатории, в свободное время в Хэрроу он разбирался с тем, как научить компьютер играть в шашки. По словам Мартина Кэмпбелла-Келли, ставшего в дальнейшем коллегой Стрейчи, «любой другой с бОльшим опытом и меньшей уверенностью был бы доволен просто таблицей из квадратов».
Первая попытка не принесла плодов: у компьютера Pilot ACE просто не было достаточно памяти для игры в шашки, но она показала один аспект интересов Стрейчи, который окажется важнейшим для разработки языков, впоследствии приведших к созданию C. Во времена, когда компьютеры в основном ценились за их способность быстрого решения уравнений, Стрейчи больше интересовала их способность выполнять логические задачи (как он позже признался в 1952 году на собрании Association for Computing Machinery).
Следующей весной он узнал, что в Манчестерском университете установили компьютер Ferranti Mark I. В этом университете помощником директора компьютерной лаборатории был Алан Тьюринг. Тьюринг написал учебник для программистов, и Стрейчи достаточно хорошо знал его по совместной работе в Кембридже, чтобы попросить один экземпляр.
В июле 1951 года Стрейчи довелось посетить Манчестер и обсудить лично с Тьюрингом его программу для шашек. Впечатлённый Тьюринг предложил в качестве первого шага написать программу, позволяющую Ferranti Mark I симулировать себя. Симулятор позволит программистам пошагово наблюдать за тем, как компьютер будет исполнять программу. Такая программа «трассировки» выявит части, в которых программа создаёт «узкие места» или работает неэффективно. В то время и память, и процессорные такты компьютера стоили целое состояние, поэтому это было важным аспектом программирования.
Написанная Стрейчи программа трассировки содержала более тысячи команд — на тот момент это была самая длинная программа, написанная для Ferranti Mark I. Проработав всю ночь, Стрейчи смог запустить её, а при завершении программа, по словам Кэмпбелла-Келли, воспроизводила гимн «Боже, храни Короля» через динамик компьютера.
Это достижение, реализованное любителем, привлекло внимание лорда Халсбери, директора-распорядителя Национальной корпорации по исследованиям и разработкам, который вскоре нанял Стрейчи, чтобы тот управлял правительственной работой по продвижению практических применений быстро развивающихся в британских университетах компьютерных наук.
Именно в этой должности он узнал о кембриджском проекте, которым занималось трио программистов по имени Дэвид.
Давид и ГолиафТитан
Вычислительный центр Кембриджского университета имел сильную ориентированность на обслуживание учёных. Первые компьютеры Лаборатории математики, EDSAC и EDSAC 2, стали доступны исследователям всего университета. Они писали программы, пробиваемые на бумажных лентах и вводимые в машину.
В вычислительном центре такие перфоленты прицеплялись к бельевым верёвкам и одна за другой выполнялись в рабочие часы. Такую очередь ожидающих программ стали называть «очередью заданий» (job queue), и этот термин до сих пор используется для описания гораздо более сложных способов упорядочивания вычислительных задач.
На отметке 6:55 можно увидеть «очередь заданий» EDSAC.
Всего спустя два года после ввода EDSAC 2 в эксплуатацию в университете осознали, что вскоре понадобится гораздо более мощная машина, и для решения этой задачи придётся покупать коммерческий мейнфрейм. Университет рассмотрел варианты IBM 7090 и Ferranti Atlas, но не мог позволить себе ни одну из этих машин. В 1961 году менеджер отдела Ferranti Питер Холл предложил совместно с Кембриджским университетом разработать урезанную версию компьютера Atlas. Кембридж получит его прототип под названием Titan, а Ferranti сможет продавать новый компьютер заказчикам, для которых Atlas слишком дорог.
Чтобы предоставлять вычислительные услуги остальной части университета, этому компьютеру понадобится и операционная система, и хотя бы один язык программирования высокого уровня.
Почти сразу же отказались от идеи расширения языка, разработанного для EDSAC 2. «В начале 1960-х обычно считалось так: „мы создаём новый компьютер, поэтому нам нужен новый язык программирования“», — вспоминал Дэвид Хартли в подкасте 2017 года. Вместе с Дэвидом Уилером и Дэвидом Бэрроном Хартли участвовал в первых этапах разработки нового языка программирования этого компьютера.
«Создание новой операционной системы было неизбежным», — рассказывал Хартли. «Мы думали, что у нас появилась возможность поэкспериментировать с новым языком. Оглядываясь назад, кажется, что это было чертовски глупым решением».
Морис Уилкс, руководивший проектом Titan, считал, что необходимость в новом языке программирования отсутствует. Основной предполагаемой задачей Titan было предоставление вычислительных услуг Кембриджскому университету, и для этого было бы оптимальнее как можно быстрее изготовить и запустить машину, оснастив её языком, который уже знаком пользователям.
Прежде чем одобрить предложение о разработке нового языка, Уилкс затребовал анализ существующих языков программирования. «Мы выбирали их очень тщательно», — вспоминает Хартли, — «чтобы он решил, что ни один язык не подходит». Примечательно, что рабочая группа, оценивавшая перспективы Fortran IV, даже не обратилась к пользователям Fortran из Кембриджа, которые могли рассказать о дополнительных возможностях, имеющихся в других разновидностях Fortran. Из-за этого, как вспоминает Хартли, группа была убеждена, что «мы можем спроектировать и разработать что-то значительно лучшее», однако спустя несколько лет эта затея окончилась провалом.
Трио подготовило к июню 1962 года статью, утверждавшую о необходимости нового языка, и, как говорит Хартли, «нам сошло это с рук».
Этот новый язык программирования назвали CPL (Cambridge Programming Language), и к 1963 году работа над ним уже активно велась. К программистам Кембриджа присоединились Джон Бакстон и Эрик Никсон из Лондонского университета, а аббревиатура CPL теперь стала означать Combined Programming Language. Проект рос, и Уилкс решил привлечь к его руководству Кристофера Стрейчи. Вскоре, по словам Кэмпбелла-Келли, связанные с проектом люди стали расшифровывать CPL как «Christopher’s Programming Language».
Группа работающих над языком исследователей встречалась в Кембридже или в Лондоне, а также в Лондонском университете, но иногда они собирались в мастерской кенсингтонского таунхауса, в котором Стрейчи жил со своей сестрой. Комната в задней части дома была уставлена викторианскими стульями, на полу лежали подушки, а стены были украшены портретами членов Группы Блумсбери, нарисованными одним из родственников Стрейчи. Именно там Стрейчи «устраивал приём при дворе», иногда одетый в домашний халат, и, как Дэвид Бэррон вспоминал несколько лет спустя, «мы спорили о том, как изменить мир к лучшему, а вечером расходились по домам».
К тому времени Дэвид Уилер перешёл на другие проекты, покинув пятёрку своих коллег: Хартли, Бэррона, Бакстона, Никсона и Стрейчи.
Хартли нравилось работать над CPL: «это на самом деле была довольно интересная работа», — вспоминает он. Собрания были довольно неформальными. «Мы очень горячо обсуждали разные темы и со временем начинали даже кидаться друг в друга бумажными самолётиками».
Группа начала со спецификаций ALGOL 60, поставив задачу написания «идеального» языка, который был бы практичен в использовании для разных пользователей, но в то же время эстетичен и эффективен.
Почти сразу же начались сложности с расстановкой приоритетов. Как говорил Дэвид Бэррон про Стрейчи, «для него было характерно отстаивать свою точку зрения по незначительным разногласиям с той же силой, что и по важным аспектам». Одним из таких незначительных разногласий было возражение Стрейчи против грамматики конструкций «IF … THEN … ELSE». «Я не могу позволить, чтобы моё имя было связано с рекомендацией использовать безграмотно неправильный английский», — такой, по воспоминаниям Хартли для Annals of the History of Computing, была его точка зрения. Стрейчи предпочитал «OR», что противоречило тому, как «OR» использовалось практически во всех остальных существующих языках. Тем не менее, его предпочтения победили, и в справочном руководстве по CPL «OR» используется там, где пользователи ожидали бы увидеть «ELSE».
Руководство по CPL, которое, естественно, можно найти онлайн.
Ценное время также было потрачено на разработку способа, позволяющего избежать использования звёздочки для обозначения операции умножения. В этом случае эстетические соображения привели к усложнениям, замедлившим реализацию практического языка программирования, поскольку пришлось разрабатывать сложные правила, позволяющие различать «3a», означающее «3 * a», и «3a» как имени переменной.
Тем временем пользователей Кембриджа всё больше раздражало отсутствие практического языка программирования для нового компьютера университета Atlas. Спецификации языка в основном были закончены, но компилятора ещё не существовало. Рабочая группа сделала CPL столь сложным, что первые попытки написания компилятора в машинном коде оказались невероятно неэффективными.
Начиная с раскрутки
В 1965 году Стрейчи уехал на несколько месяцев в Массачусетский технологический институт (MIT), а по возвращении занял должность директора Оксфордской группы по исследованию программирования. Тем временем в Кембридже к проекту CPL присоединился Мартин Ричардс. Он приступил к разработке урезанной версии CPL, с которой могли бы работать пользователи. Этому языку BCPL («B» от слова «Basic», «простой») нужен был эффективный компилятор.
Находясь в MIT, Стрейчи помог Мартину Ричардсу получить двухлетний академический отпуск в этом институте, и в 1966 году Ричардс взял BCPL с собой в Массачусетс, где смог поработать над компилятором.
BCPL — это «bootstrap»-язык, потому что его компилятор способен к самокомпиляции. По сути, небольшая часть компилятора BCPL написана на ассемблере или машинном коде, а остальная часть компилятора пишется на соответствующем подмножестве BCPL. Часть компилятора, написанная на BCPL, передаётся в ассемблерную часть, а получившуюся программу компилятора можно использовать для компиляции любой программы, написанной на BCPL.
Компиляторы с bootstrapping (раскруткой) значительно упрощают процесс портирования языка с одного компьютера или операционной системы на другую. Для того, чтобы компилятор мог запускаться на другом компьютере, достаточно переписать одну относительно небольшую часть компилятора, написанную в коде, специфичным для конкретного компьютера.
Пока Ричардс работал в MIT над компилятором BCPL, институт начал участвовать в проекте Multics совместно с Bell Labs и GE. Для поддержки проекта была создана сеть, соединяющая MIT и Bell Labs.
Хотя сетевое соединение между двумя организациями номинально предназначалась для упрощения работы над Multics, Кен Томпсон сообщил нам, что социально приемлемо было «бродить» по мейнфреймам MIT в поисках других проектов, и именно так он обнаружил код и документацию BCPL. Он скачал их на мейнфрейм Bell Labs и начал над ними работать. «Я искал тот язык, на котором можно делать нужные мне вещи», — вспоминает Томпсон. «Программирование в ту эпоху проприетарных операционных систем на огромных машинах было очень сложным занятием».
Примерно во время экспериментов Томпсона с BCPL корпорация Bell Labs вышла из консорциума Multics, а у кафедры компьютерных наук, на которой работал Томпсон, временно не осталось никаких компьютеров.
Когда она наконец получила компьютер, это был подержанный PDP-7, не особо мощный даже по стандартам той эры. Тем не менее, Томпсону удалось создать и запустить на этой машине первую версию Unix.
PDP-7 имел 8192 «слова» в памяти (слово в данном случае состояло из 18 бит — отрасль ещё не стандартизировала 8-битный «байт»). Unix занимал первые 4 тысяч слов, оставляя 4 тысячи для запуска программ.
Томпсон ужал свою копию BCPL (которая сама являлась CPL с урезанной функциональностью) чтобы она поместилась в свободные 4 тысячи слов памяти PDP-7. В процессе сжатия он заимствовал части языка, с которым столкнулся в студенчестве в Калифорнийском университете в Беркли. Этот язык SMALGOL был подмножеством ALGOL 60, предназначенным для работы на менее мощных компьютерах.
Язык, который Томпсон в результате использовал на PDP-7, был, по его собственному описанию «семантикой BCPL с большой частью синтаксиса SMALGOL», то есть он выглядел как SMALGOL и работал как BCPL. Поскольку этот новый язык состоял только из тех аспектов BCPL, которые Томпсон посчитал наиболее полезными и способными уместиться в ограничения PDP-7, он решил сократить название BCPL до просто «B».
Ранее Томпсон писал Unix для PDP-7 на ассемблере, но даже в 1969 году это был неидеальный способ создания операционной системы. На PDP-7 это сработало, потому что компьютер был довольно простым, а Томпсон писал операционную систему в основном для развлечения.
Любую операционную систему, которая должна была поддерживаться и обновляться несколькими программистами, а также работать на более сложном оборудовании того времени, нужно было писать на языке программирования высокого уровня.
Поэтому когда Bell Labs приобрела для кафедры в 1971 году PDP-11, Томпсон решил, что настало время переписать Unix на языке программирования высокого уровня. Он рассказывал об этом Брайану Кернигану на сцене VCF 2019.
В то же время Деннис Ритчи позаимствовал B и адаптировал его для работы на более мощных компьютерах. Одним из первых аспектов, которые он снова добавил в язык B, была возможность «типизации» переменных. Поскольку память PDP-7 состояла из 18-битных слов, B можно было упростить, обрабатывая каждую переменную или как одно слово памяти, или как последовательность слов, ссылка на которую указывалась её расположением в памяти системы. В языке не было десятичных чисел с фиксированной или плавающей запятой, целых чисел или строк. Как сказал Томпсон, «всё это были только слова».
Такой подход был эффективным на простой машине с очень малым объёмом памяти и небольшой базой пользователей, но в более сложных системах со сложными программами и множеством пользователей это могло привести к специфическим способам определения того, является ли переменная строкой или числом, а также к неэффективному использованию памяти.
Согласно второму изданию History of Programming Languages Томаса Бергина и Ричарда Гибсона, Ритчи назвал этот модифицированный язык NB («New B»). Он был установлен на мейнфреймах вычислительного центра в Мюррей-Хилл, который стал доступен пользователям через Bell Labs.
Естественно, когда Томпсон решил переписать Unix на ЯВУ, он начал с NB. Первые три попытки завершились провалом, и «из-за своей эгоистичности я винил в этом язык», вспоминал с усмешкой Томпсон на VCF.
После каждого провала Ритчи добавлял в NB возможности, которые казались нужными ему и Кену. Однажды он добавил структуры — переменные, хранящие множество отдельных значений связанным или «структурированным» образом, после чего Томпсон смог написать Unix на этом новом языке. Ритчи и Томпсон посчитали добавление структур, которых не было в B, SMALGOL, BCPL и CPL, достаточно значительным изменением, чтобы переименовать язык, и B превратился в C.
Жизнь под знаком C
Кристофер Стрейчи в 1955 году с Ferranti Mark 1 (также известным как Manchester Electronic Computer).
C сбежал из Bell Labs почти так же, как это произошло с Unix. Он способствовал тому, что PDP-11 быстро стал одним из наиболее успешных мини-компьютеров на рынке, однако наиболее привлекательной его делала цена Unix. Любой вычислительный центр с PDP-11 мог установить на него Unix по стоимости носителя и почтовой пересылки, а вместе с Unix поставлялся и C.
Присутствие C в таком большом количестве университетских городков стало, по мнению Томпсона, главной причиной его успеха. В письме он написал, что «из них выпустилось множество ребят, знавших C».
Дальнейшим стимулом успеха C стала публикация в 1978 году The C Programming Language Денниса Ритчи и Брайана Кернигана. Небольшая книга из 228 страниц стала даже по меркам того времени примечательно простой и доступной работой.
Широкое знание синтаксиса C повлияло на развитие многих последовавших за ним языков, мало похожих или вообще непохожих внутри на C. Скриптовые языки наподобие PHP и JavaScript содержат фрагменты обозначений программирования, которые Томпсон изначально разработал, чтобы уместить B в малый объём памяти PDP-7. Например, это операторы инкремента «++» и декремента «—«. Когда у тебя есть всего 4 тысячи слов для работы, сокращение «x=x+1» до «x++» экономит приличное количество места.
Томпсон никогда не полагал, что C получит такое широкое распространение. «Вокруг было множество совершенно разных, очень интересных и полезных языков», — рассказывал Томпсон. «Моё эстетическое чутьё подсказывало мне, что один язык не сможет покрыть все потребности во вселенной».
Как и Unix, язык C стал успехом, родившимся из провала. В обоих случаях программисты взяли лучшие части проектов, которые были обречены, потому что от них требовали слишком многого. Multics, породившая Unix, на пике своей популярности использовалась примерно лишь в 80 компьютерах, а CPL, который в конечном итоге привёл к созданию C, так и не был завершён и кембриджские исследователи забросили его в 1967 году.
Когда Кристофер Стрейчи организовал в Оксфорде группу по исследованию программирования, он сказал: «разделение работы на практическую и теоретическую искусственно и вредоносно».
И хотя CPL должен был сочетать в себе практические и теоретические стороны, в реализации он оказался слишком теоретическим. Рабочая группа, проектировавшая CPL, не пыталась программировать на CPL.
Однако пусть даже Стрейчи не смог достичь в CPL синтеза между теорией и практикой, его настрой определённо был правильным. «C был написан, чтобы писать Unix», — вспоминает Томпсон. А «Unix был написан, чтобы все мы могли писать программы».
На правах рекламы
Недорогие серверы для любых задач — это про наши эпичные серверы. Создайте собственный тариф в пару кликов, максимальная конфигурация — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.
Язык программирования C, стоит ли его изучать
Программирование
В статье рассказываем про язык программирования C: его создание, развитие, стоит ли его изучать, все плюсы и минусы.
Почти 40 лет назад, в 1972 году, Деннис Ричи создал абсолютно новый язык программирования. Он получил название Си (С), как продолжение существовавших на тот момент языка Би(В). В его основе лежали принципы и алгоритмы, опробованные на созданных еще в шестидесятых годах XX века языках «ALGOL» и «BCPL». Код на Си оказался настолько популярным, что только в 2021 году Python оттеснил его с первого места в рейтинге TIOBE.
Что такое язык Си
Уникальность нового языка программирования заключалась в использование компилятора. То есть исходный код с помощью программы преобразуется в объектный файл, который машина может прочитать напрямую. Ей для этого не требуется дополнительные оболочки и приложения.
«Отец Си» Деннис Ричи вряд ли ожидал, что его работа будет настолько востребована
Кроме того, язык программирования си относится к блочно-структурированным, с жестко заложенным алгоритмом исполнения:
- Включение файлов в программу на языке C.
- Объявления основного метода.
- Variable Declaration. Объявление переменной.
- Тело программы — операции, который выполняется в функциях. Здесь могут быть поиск, сортировка, печать на экране или другом устройстве вывода информации, передача данных по различным каналам.
- Return Statement. Оператор возврата, возвращает значение из переменной.
Уникальная особенность Си заключается в том, что он относится к низкоуровневым языкам программирования. К этой группе также относится Ассемблер и практически неиспользуемый сейчас Forth. Низкоуровневая означает, что в командах идет практически прямое обращение к машине, без использования посредников.
Образцы кода на Ассемблере сложно понять без долгой подготовки
Из этого вытекает еще одно важнейшее преимущество — низкие требования к ресурсам в сочетании с высокой производительностью. Но в тоже время есть серьезный недостаток, а именно — относительно сложная архитектура, высокие требования к качеству кода, сложность освоения новичками. Несмотря на обилие сред разработки и неплохой функционал, именно по этой причине Си начал терять лидерские позиции.
Споры о том, насколько низкоуровневым языком является СИ, не прекращаются до сих пор. Кто-то относит его к среднеуровневым, мотивируя это активным применением библиотек.
История создания, зачем понадобился Си
Изначально Деннис Ричи писал Си как язык для реализации зарождающейся на тот момент операционной системы Unix. Сперва эту задачу хотели реализовать на безтиповом BCPL, но это оказалось слишком сложно. Несколько улучшил ситуацию сотрудник Bell Labs Кен Томпсон, создав В. Но минимальное количество функции и утилит не позволяли вести полноценную и эффективную работу по написанию Unix.
Си стал продолжением Би, причем сперва использовался исключительно в стенах компании Nokia Bell Labs (AT&T). Только в 1978 году Брайан Керниган и Деннис Ричи выпустили книгу «Язык программирования C», которая на долгие годы стала настольной книгой разработчика.
Даже сейчас можно купить легендарную книгу, она до сих пор сохраняет актуальность
На C кроме Unix написаны Windows, Linux, Mac OS, Android, Oracle Database, MySQL, MS SQL Server и PostgresSQL, и даже разработчики Python применяют компиляторы и интерпретаторы, созданные на Си. Этот список бесконечен, благодаря универсальности C его применяют практически во всех отраслях и направлениях.
История IT-технологии хранит много забавных фактов. Так, операционная система Unix изначально называлась Unics (Uniplexed Information and Computing Service) как каламбур от её предшественника Multics (Multiplexed Information and Computer Services). А имя языка программирования С вообще ничего не означает, это просто следующая буква после B, его предшественника.
Синтаксис языка
Маленький индивидуальный блок в Си известен как C-токен. Токены — это либо ключевые слова, либо идентификаторы, константы, переменные или любой другой символ, который имеет какое-то значение на языке. Программу также можно назвать набором различных токенов. Следовательно, синтаксис языка определяет, как использовать эти токены вместе при написании кода.
Часть учебника с описанием синтаксиса
Программа на C состоит из команд процессора, функций, переменных, выражений и комментариев. Каждый оператор в обязательном порядке должен заканчиваться точкой с запятой, а пробел служит для разделения одной части оператора от другой. В то же время состоящая исключительно из пробелов строка называется пустой и полностью игнорируется компилятором.
Зарезервированные команды, которые нельзя использовать в качестве переменных
Есть целый набор ключевых слов, которые не могут быть использованы в качестве переменных. Из-за этого для знающих английский программирование в чем-то превращается в разговор с машиной на привычном языке, что значительно упрощает кодирование. Это было в чем-то революционным решением для 70-х годов прошлого века. Float, short, unsigned, for, continue — это часть ключевых слов, которые часто можно встретить внутри программы в качестве операторов. Не стоит забывать и про блочную структуру:
- каждый блок заключается в фигурные скобки;
- основой блока в программе является главная функция main();
- функцию main() можно вызвать из самой функции main(), что применяется для аварийного завершения в результате переполнения стека;
- программа может содержать несколько функций, каждая из которых имеет список параметров;
- C — это язык с учетом регистра, поэтому все инструкции должны быть написаны строчными буквами, и main – это не то же самое, что MAIN;
- все операторы должны заканчиваться точкой с запятой;
- пробелы используются для добавления пробелов и табуляций;
- вам не нужно беспокоиться об отступах.
Если мы забыли поставить точку с запятой в конце любого оператора на языке Си, это приведет к синтаксической ошибке. В этом случае компилятор выдает сообщение об ошибке «semicolon is expected».
Особенности C, его преимущества и недостатки
Есть два ключевых признака, служащих бесспорным доказательствах востребованности языка Си для начинающих и опытных программистов. Во-первых, несмотря на свою сорокалетнюю историю, он до сих пор остается популярным. Во-вторых, эта популярность до 2021 года держала его на вершинах рейтингов.
Почему язык программирования Си остается популярным
Независимо от того, с какого устройства вы сейчас читаете этот текст, оно в той или иной мере использует часть кода на Си. Его применяют любая операционная система, подавляющее большинство баз данных, 3D фильмы, ядро управления мобильными приложениями. Но и это не все.
Ошибки в работе АКПП обрабатываются на Си
Скорее всего ваша микроволновая печь, телевизор, автоматическая коробка передач в автомобиле, управление подушкой безопасностью имеют функции, запрограммированные на Си. Когда вы покупайте что-то в магазине, вы видите считыватель карты и кассовые аппараты. Их ПО так-же писалось программистами Си. Дело в том, что это переносимый язык ассемблера, который максимально приближен к машине и доступен для существующих архитектур процессоров.
Процессор не просто коробочка, им необходимо управлять
Уникальная особенность — возможность доступа к произвольным адресам памяти и арифметика указателей делают Си идеальным для системного программирования. Язык способен манипулировать произвольными адресами, поэтому он вне конкуренции при написании кода для микроконтроллера. Еще одно важнейшее преимущество заключается в небольшом размере кода. Те же самые программы на С++ как правило будут занимать вдвое больше место и требовать больше ресурсов.
Миром правят не масоны или тайные общества, им правят программисты на Си. Их работа везде.
Недостатки и причины потери лидерства Си
Основная причина ухода из лидера рейтингов заключается в том, что появились более эффективные инструменты для решения узкоспециализированных задач. Например, создание графического интерфейса с помощью Java или Python займет гораздо меньше времени и сил.
World Wide Web, клиентское и серверное программирование на альтернативных платформах тоже более эффективно чем на Си. Благодаря обилию фреймворков можно за считанные минуты сделать работу, которая на Си займет часы или даже дни. Это не микроконтроллер, в котором оптимизация производительности и машинных ресурсов играет ключевую роль.
В этой схеме Си проигрывает конкурентам по трудоемкости решения задач
Перевес популярности новых языков программирования создают появляющиеся учебные курсы. Порог входа в сферу высоких технологий становится значительно ниже, сюда приходит много новичков, готовых решать узкоспециализированные задачи. Для frontend и Backend просто не требуется глубоких знаний по архитектуре ядра.
Бытует мнение, что каждый программист, освоивший синтаксис и алгоритм Си, легко переучивается на другой язык. Это приводит к тому, что специалисты Си часто подбирают альтернативные инструменты для решения текущих задач. Поэтому растет популярность Python, C#, С++, Java.
Области применения, где Си остается вне конкуренции
Что бы мы ни говорили о росте или потери места в рейтинге, сейчас у Си просто отсутствуют конкуренты в отдельных отраслях. Так, часть микроконтроллеров можно запрограммировать на ассемблере, Си или С++, ну или Pascal. Других инструментов просто нет, разве что за исключением прямого машинного года для очень простых задач.
Примерно так выглядит код на Паскаль
При всех достоинствах ассемблера писать на нем код очень сложная и трудоемкая задача. Паскаль уже практически потерял свою актуальность, его характеристики устарели еще десять лет назад. То есть несмотря на якобы наличие огромного количества вариантов реальная альтернатива отсутствует. Правда, есть два наследника — С++ и C#. Поговорим о них подробнее.
Развитие линейки Си, сходства и противоречия между старым и новым
Если вы только задумываетесь о приходе в программировании, может вызвать сомнение присутствие трех очень похожих по названию языков — Си, Си шарп и С++. По своему функционалу они чем-то схожи, однако различия заставляют разработчиков дифференцировать их при реализации конкретных задач.
С#, успешный ребенок Microsoft
В 2008 году корпорация Microsoft сообщила о создании своего языка программирования C Sharp, или С#. В нем есть очень много похожих на Си конструкций, но также здесь есть часть элементов из Java и Паскаль. Это ни в коем случае не улучшенная копия предшественника, это абсолютно новый объектно-ориентированный язык.
Логика ООП, наглядное изображение
Считается, что это детище Microsoft, но это только часть правды. На самом деле свою роль в разработку и спонсирование внесли Intel и Hewlett-Packard. Да 2004 года это был продукт с закрытым исходным кодом. В 2004 был запущен бесплатный проект, с открытым кодом. Более того, в 2010 Microsoft выпустил бесплатный редактор Visual Studio code, компилятор Roslyn и унифицированные фреймворк .NET.
Благодаря выпуску большого количества библиотек С# смог быстро завоевать популярность среди разработчиков. Они позволяют:
- фильтровать данные и управлять базами с большими массивами информации;
- создавать переходы между Frontend и Backend частями веб-сайтов;
- быстро писать интерфейсы для мобильных и десктопных приложений;
- создавать графику, за что здесь отвечает популярнейший набор компонентов DirectX.
Встроенный движок для создания двухмерных и трехмерных игр Unity тоже пользуется огромным спросом у разработчиков. Библиотека ML.NET отлично справляется машинным обучением и управлением Big Data.
C++, прямой наследник
C++ считается универсальным языком программирования произвольной формы с учетом регистра, который поддерживает объектно-ориентированное, процедурное и универсальное написание кода. В нем есть все четыре столпа ООП — Наследование, Полиморфизм, Инкапсуляция и Абстракция.
Так выглядело большинство компьютеров в 1970 году
Его в 1990 году разработал программист AT&T (American Telephone & Telegraph) Бьярн Страуструп с целью добавить функции ООП в Си, при этом не проводя значительных изменений. Благодаря этому предполагалось, что любая корректная программа на Си будет корректно исполняться и на С++. В отличие от предшественника он точно относится к языкам среднего уровня, поскольку в него добавлены элементы высокоуровневых языков. Он относится к расширяем, и может легко адаптировать ввод новых функций.
Но стандарт C++ не определяет некоторые объекты, которые могут потребоваться для облегчения взаимодействия между двоичными файлами, созданными с помощью разных компиляторов, что вызывает некоторые технические проблемы. Да и в целом полной совместимости не получилось.
Почему С++ не смог вытеснить классический Си
Как оказалось, появление новых функций в С++ не отправило его предшественника в забытие. Эксперты говорят о том, что первая причина заключается в проблеме стабильности системы. К тому времени, как С++ уже набрал некоторую популярность, огромное количество устройств применяло классический Си. Несмотря на все старания разработчиков, они не смогли добиться абсолютной совместимости.
С++ оказался хорош, но не совершенен
Поэтому для корректной работы части приложений на новом коде требовалось переписать его целиком. Чтобы не случилось неожиданного деления на ноль в самый неподходящий момент.
Вторая причина тоже заключается в стабильности, но уже с другой точки зрения. Низкоуровневый Си оказался незаменим в системах, где требуется безупречная надежность. Пускай написать на нем код чуть сложнее, зато не возникнет неполадок из-за некорректного использования библиотек. Опять же, для решения одной и той же задачи программирования, на языке Си получится меньший по объему и требованиям к ресурсу результат. Для микроконтроллекторов с миллионными тиражами выпуска дополнительные усилия программистов легко окупаются даже минимальным улучшением производительности.
Стоит ли учить Си
Если перед вами стоит проблема выбора первого языка программирования, большинство советчиков в первую очередь порекомендуют обратить внимание на Python. Действительно, по нему есть огромное количество курсов и обучающих материалов. Скорее всего на втором месте в этом рейтинге окажется Java, по той же причине.
Правильный вопрос не «Стоит ли учить», а «Для чего учить»
Но ряд программистов уверены, что именно Си является лучшим вариантом для новичка. С технической точки зрения писать на нем сложнее, и обучение займет чуть больше времени. Но умение создавать чистый код позволяет получить фундаментальные знания, после которых не возникнет проблем с профессиональным развитием.
Самое поразительное, что даже популярные онлайн-курсы в России очень редко предлагают пройти обучение по Си. Запрос «курсы язык программирования С» в Google Search дает отсылки на программы по Python, C# или С++. Очень странно, ведь в самом авторитетном рейтинге от TIOBE Programming Community index до 2021 года язык Си занимал первое место.
Неужели придется искать самоучитель и заниматься без помощи наставников? На самом деле ситуация не настолько критичная. Есть отличные проекты, тот же МГТУ имени Н.Э. Баумана предлагает интересный вариант подготовки за 48 академических часов. Кроме того, в сети выложено в свободный доступ огромное количество руководств пользователя, и само сообщество Си как открытого проекта очень лояльно относится к начинающим.
И в заключение: работодатели крайне редко публикуют вакансии с требованием знания только одного языка программирования. Им нужны универсальные специалисты. И здесь разработчик с навыками кодирования на Си вне конкуренции. Если человек освоил низкоуровневый язык, ему гораздо проще получить дополнительную квалификацию. Изучить какую-то библиотеку совсем не сложно. Самое трудное — понять, как взаимодействуют различные элементы машинного кода. И здесь в программисты Си оказываются в числе лидеров.