История языка C / C + +. Пример использования

По этому сложился таковой статус языка С? Исторически этот язык неотделим от операционной системы Unix, которая в наши деньки переживает свое 2-ое рождение. 60-е годы были эрой становления операционных систем и языков программирования высочайшего уровня.

В тот период для каждого типа компов независимо разрабатывались ОС и компиляторы, а часто даже свои языки программирования (вспомним, к примеру, PL / I). В то же время, общность возникающих при всем этом заморочек уже стала тривиальной. Ответом на понимание этой общности стала попытка сделать универсальную мобильную операционную систему, а для этого пригодился более универсальный и мобильный язык программирования. Таким языком стал С, а Unix стала первой ОС, фактически стопроцентно написанной на языке высочайшего уровня.

Тесноватая связь с Unix отдала языку С таковой полигон для обкатки, которого не было в то время ни у 1-го другого языка. Задачка системного программирования по праву числились в то время самыми сложными в отрасли. В большинстве собственном они были так машинно-зависимыми, что многие вообщем не мыслили их решение по другому, чем на ассемблере. Языки высочайшего уровня предназначались для прикладного программирования и только очень ограниченно реализовывали функции, нужные для системных работ, при этом часто только для определенного типа машин.

Язык С вначале создавался так, чтоб на нем можно было писать системные задачки. Создатели С не стали разрабатывать абстрактную модель исполнителя языка, а просто реализовали в нем те способности, в каких больше всего нуждались практике программирования. Это сначала были средства конкретной работы с памятью, структурные конструкции управления и модульная организация программки. И на самом деле больше ничего в язык включено не было. Все другое было отнесено в библиотеку времени выполнения. Потому недоброжелатели другой раз отзываются о языке С как о структурном ассемблере. Но что бы они не болтали, подход оказался очень удачным. Благодаря ему был достигнут новый уровень по соотношению простоты и способностей языка.

Есть, вобщем, очередной фактор, определивший фуррор языка. Создатели очень искусно разделили в нем машинно-зависимые и независящие характеристики. Благодаря этому большая часть программ удается писать универсально — их работоспособность не находится в зависимости от архитектуры микропроцессора и памяти. Малочисленные же аппаратно-зависимые части кода можно локализовать в отдельных модулях. А пользуясь препроцессором, можно создавать такие модули, которые при компиляции на различных платформах будут порождать соответственный машинно-зависимый код.

Много споров вызвал синтаксис языка С. Примененные в нем приемы сокращения записи при неумеренном использовании в состоянии сделать программку полностью нечитаемой. Но, как гласил Дейкстра, <на любом языке можно написать фортрановскую программку> — средства не повинны в том, что их малограмотно употребляют. На самом же деле, предложенные в С сокращения синтаксиса соответствуют более нередко встречается на практике стереотипным ситуациям. Если считать сокращение идиомами для выразительного и малогабаритного представления таких ситуаций, то полезность от их становится бесспорной и тривиальной.

Итак, С появился как универсальный язык программирования. Но он не остался в этих рамках. К концу 80-х годов язык С, оттеснив Fortran с позиции фаворита, захватил массовую популярность посреди программистов в мире и стал употребляться в самых разных прикладных задачках. Большую роль тут сыграло распространение Unix (а означает и С) в институтской среде, где проходило подготовку новое поколение программистов.

Как и все языки, С равномерно совершенствовался, но большая часть усовершенствований не носило конструктивного нрава. Более значимым из их, пожалуй, следует считать введение серьезной спецификации типов функций, которая существенно повысила надежность межмодульных взаимодействия на С. Все такие усовершенствования были в Одна тыща девятьсот восемьдесят девять году закреплены в эталоне ANSI который и доныне определяет язык С.

Но если все так ясно, то почему же еще продолжают употребляться все другие языки, что поддерживает их существование? Ахиллесовой пятой языка С стало то, что он оказался очень низкоуровневым для тех задач, которые поставили на повестку денька 90-е годы. При этом у этой препядствия есть два нюанса. С одной стороны, в язык были интегрированы очень низкоуровневые средства — сначала это работа с памятью и адресная математика. Недаром смена разрядности микропроцессоров очень болезненно отражается на многих С-программах. С другой стороны, в С недостает средств высокоуровневых — абстрактных типов данных и объектов, полиморфизма, обработки исключений. Как следствие, в программках на С техника реализации задачки нередко доминирует над ее содержательной стороной.

1-ые пробы поправить эти недочеты стали предприниматься еще сначала 80-х годов. Уже тогда Бьерн Страуструп в AT & T Bell Labs стал разрабатывать расширение языка С под условным заглавием «С с классами>. Стиль ведения разработки полностью соответствовал духу, в каком создавался и сам язык С, — в него вводились те либо другие способности с целью сделать более комфортной работу определенных людей и групп. 1-ый коммерческий транслятор нового языка, получившего заглавие C + + появился в Одна тыща девятьсот восемьдесят три году. Он представлял собой препроцессор, который передавал программку в код на С. Но фактическим рождением языка можно считать выход в Одна тыща девятьсот восемьдесят 5 году книжки Страуструпа. Конкретно отныне C + + начинает набирать всемирную известность.

Главное нововведение C + + — механизм классов, что дает возможность определять и использовать новые типы данных. Программер обрисовывает внутреннее представление объекта класса и набор функций-методов для доступа к этому представлению. Одной из священных целей при разработке C + + было рвение прирастить процент повторного использования уже написанного кода. Концепция классов предлагала для этого механизм наследования. Наследование позволяет создавать новые (производные) классы с расширенным представлением и измененными способами, не затрагивая при всем этом скомпилированный код начальных (базисных) классов. Вкупе с тем наследование обеспечивает один из устройств реализации полиморфизма — базисной концепции объектно-ориентированного программирования, согласно которой, для выполнения монотипной обработки разных типов данных может употребляться один и тот же код. Фактически, полиморфизм — тоже один из способов обеспечения повторного использования кода.

Введение классов не исчерпывает всех новаций языка C + +. В нем реализованы настоящий механизм структурной обработки исключений, отсутствие которого в С существенно затрудняло написание надежных программ, механизм шаблонов — утонченный механизм макрогенерации, глубоко интегрированный в язык, открывает очередной путь к повторно применяемых кода, и почти все другое.

Таким макаром, генеральная линия развития языка была ориентирована на расширение его способностей методом введения новых высокоуровневых конструкций при сохранении как может быть полной сопоставимости с ANSI С. Естественно, борьба за увеличение уровня языка шла и на втором фронте — те же классы позволяют при грамотном подходе прятать низкоуровневые операции, так что программер практически перестает конкретно работать с памятью и системно-зависимыми сущностями. Но речь не содержит устройств, вынуждающих разработчика верно структурировать программку, а создатели не выпустили никаких периодических советов по использованию его достаточно утонченных конструкций. Не позаботились они вовремя и о разработке стандартной библиотеки классов, реализующей более распространенные структуры данных.

Все это привело к тому, что многие разработчики обязаны были сами изучить лабиринты языковой семантики и без помощи других искать удачно работающие идиомы. Так, к примеру, на первом шаге развития языка многие создатели библиотек классов стремились выстроить единую иерархию классов с общим базисным классом Object. Эта мысль была взята из Smalltalk — 1-го из более узнаваемых объектно-ориентированных языков. Но она оказалась совсем нежизнеспособной в C + + — кропотливо обмысленные иерархии библиотек классов оказывались негибкими, а работа классов — неочевидной. Для того чтоб библиотеками классов можно было воспользоваться, их приходилось поставлять в начальных текстах.

Возникновение темплетный класс и совсем опровергло это направление развития. Наследованием стали воспользоваться исключительно в тех случаях, когда требовалось порождение спец версии имеющегося класса. Библиотеки стали состоять из отдельных классов и маленьких несвязанных вместе иерархий. Но на этом пути стало понижаться повторное внедрение кода, потому что в C + + нереально полиморфное внедрение классов из независящих иерархий. Повсеместное же применение Темплете ведет к недопустимому росту объема скомпилированного кода — не будем забывать, темплеты реализуются способами макрогенерации.

Один из тяжелейших недочетов C + +, унаследованный им от синтаксиса С, состоит в доступности компилятору описания внутренней структуры всех использованных классов. Как следствие, изменение внутренней структуры представления какого-нибудь библиотечного класса приводит к необходимости перекомпиляции всех программ, где эта библиотека употребляется. Это очень ограничивает разработчиков библиотек в части их модернизации, ведь, выпуская новейшую версию, они должны сохранять двоичную сопоставимость с предшествующей. Эта самая неувязка принуждает многих профессионалов считать, что C + + непригоден для ведения огромных и сверхбольших проектов.

И все таки, невзирая на перечисленные недочеты и даже на неготовность эталона языка (это после пятнадцати с излишним лет использования!), C + + остается одним из более фаворитных языков программирования. Его сила сначала в фактически полной сопоставимости с языком С. Благодаря этому программерам C + + доступны все выработки, выполненные на С. При всем этом C + + даже без использования классов привносит в С ряд так принципиальных дополнительных способностей и удобств, что многие пользуется им просто как усовершенствованным С.

Что касается объектной модели C + +, то пока программка не стала очень большой (сотки тыщ строк), ею полностью можно воспользоваться. Наметившаяся в ближайшее время тенденция перехода к компонентного программного обеспечения только увеличивает позиции C + +. При разработке раздельно взятых компонент недочеты C + + еще не появляются, а связывание компонент в работающую систему делается уже не на уровне языка, а на уровне операционной системы.

В свете всего произнесенного перспективы C + + не смотрятся сумрачными. Хотя и монополия на рынке языков программирования ему не светит. Пожалуй, с уверенностью можно утверждать только то, что очередной модернизации-расширения этот язык не переживет. Недаром, когда появилась Java, на нее направили настолько пристальное внимание. Язык, близкий по синтаксису к C + +, а означает, кажущийся знакомым многим программерам, был избавлен от более возмутительных недочетов C + +, унаследованных им с 70-х годов. Но не похоже, чтоб Java управлялась с возложенной на нее некими ролью <убийцы C + +>.

Особенная роль языков C / C + + в современном программировании фактически лишает смысла приведение определенных адресов в Вебе, где можно отыскать материалы по ним.