История языка Си
Год | Стандарт Си |
---|---|
1972 | Рождение языка |
1978 | K&R C |
1989 | ANSI C (C89) |
1990 | ISO C (совпадает с C89) |
1999 | C99 |
2011 | C11 |
2017 | C17 (исправленный C11) |
2018 | C18 (совпадает с C17) |
Язык программирования Си разрабатывался в период с 1969 по 1973 годы в лабораториях Bell Labs. Согласно Ритчи, самый активный период творчества пришёлся на 1972 год. Язык назвали «Си» (C — третья буква английского алфавита), потому что многие его особенности берут начало от старого языка «Би» (B — вторая буква английского алфавита). Существует несколько различных версий происхождения названия языка Би. Кен Томпсон указывает на язык программирования BCPL, однако существует ещё и язык Bon, также созданный им. Ритчи предполагает, что название языка могло быть производным от имени жены Томпсона Бонни[1].
К 1973 году язык Си стал достаточно силён, и большая часть ядра UNIX, первоначально написанная на ассемблере PDP-11/20, была переписана на Си. Это было одно из самых первых ядер операционных систем, написанное на языке, отличном от ассемблера; более ранними были лишь системы Multics (написана на ПЛ/1) и TRIPOS (написана на BCPL).
Причины разработки
Существует несколько легенд, касающихся причин разработки Си и его отношения к операционной системе UNIX, включая следующие:
По одной легенде разработка Си стала результатом того, что его будущие авторы любили компьютерную игру, подобную популярной игре Asteroids (Астероиды)[источник не указан 457 дней]. Они уже давно играли в неё на главном сервере компании, который был недостаточно мощным и должен был обслуживать около ста пользователей. Томпсон и Ритчи посчитали, что им не хватает контроля над космическим кораблём для того, чтобы избегать столкновений с некоторыми камнями. Поэтому они решили перенести игру на свободный PDP-7, стоящий в офисе. Однако этот компьютер не имел операционной системы, что заставило их её написать. В конце концов, они решили перенести эту операционную систему ещё и на офисный PDP-11, что было очень тяжело, потому что её код был целиком написан на ассемблере. Было вынесено предложение использовать какой-нибудь высокоуровневый портируемый язык, чтобы можно было легко переносить ОС с одного компьютера на другой. Язык Би, который они хотели сначала задействовать для этого, оказался лишён функциональности, способной использовать новые возможности PDP-11. Поэтому они и остановились на разработке языка Си.
Существует и другая легенда. Первый компьютер, для которого была первоначально написана UNIX, предназначался для создания системы автоматического заполнения документов. Первая версия UNIX была написана на ассемблере. Позднее для того, чтобы переписать эту операционную систему, был разработан язык Си[источник не указан 457 дней].
K&R C
В 1978 году Брайан Керниган и Деннис Ритчи опубликовали первую редакцию книги «Язык программирования Си». Эта книга, известная среди программистов как «K&R», служила многие годы неформальной спецификацией языка. Версию языка Си, описанную в ней, часто называют «K&R C». Вторая редакция этой книги посвящена более позднему стандарту ANSI C, описанному ниже.
K&R ввёл следующие особенности языка:
- структуры (тип данных
struct
); - длинное целое (тип данных
long int
); - целое без знака (тип данных
unsigned int
); - оператор
+=
и подобные ему (старые операторы=+
вводили анализатор лексики компилятора Си в заблуждение, например, при сравнении выраженийi =+ 10
иi = +10
).
K&R C часто считают самой главной частью языка, которую должен поддерживать компилятор Си. Многие годы даже после выхода ANSI C он считался минимальным уровнем, которого следовало придерживаться программистам, желающим добиться от своих программ максимальной переносимости, потому что не все компиляторы тогда поддерживали ANSI C, а хороший код на K&R C был верен и для ANSI C.
После публикации K&R C в язык было добавлено несколько возможностей, поддерживаемых компиляторами AT&T и некоторых других производителей:
- функции, не возвращающие значение (с типом
void
), и указатели, не имеющие типа (с типомvoid*
); - функции, возвращающие объединения и структуры;
- имена полей данных структур в разных пространствах имён для каждой структуры;
- присваивания структур;
- спецификатор констант (
const
); - стандартная библиотека, реализующая большую часть функций, введённых различными производителями;
- перечислимый тип (
enum
); - дробное число одинарной точности (
float
).
Стандарты языка
ISO C
В конце 1970-х годов Си начал вытеснять Бейсик с позиции ведущего языка для программирования микрокомпьютеров. В 1980-х годах он был адаптирован для использования в IBM PC, что привело к резкому росту его популярности. В то же время Бьёрн Страуструп и другие в лабораториях Bell Labs начали работу по добавлению в Си возможностей объектно-ориентированного программирования. Язык, который они в итоге сделали, C++, оказал большое влияние на разработку ПО, но так и не смог сравняться по популярности[2] с Си, особенно в UNIX-подобных системах.
В 1983 году Американский национальный институт стандартов (ANSI) сформировал комитет для разработки стандартной спецификации Си. По окончании этого долгого и сложного процесса в 1989 году он был наконец утверждён как «Язык программирования Си» ANSI X3.159-1989. Эту версию языка принято называть ANSI C или C89. В 1990 году стандарт ANSI C был принят с небольшими изменениями Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990.
Одной из целей этого стандарта была разработка надмножества K&R C, включающего многие особенности языка, созданные позднее. Однако комитет по стандартизации также включил в него и несколько новых возможностей, таких, как прототипы функций (заимствованные из C++) и более сложный препроцессор.
ANSI C сейчас поддерживают почти все существующие компиляторы. Почти весь код Си, написанный в последнее время, соответствует ANSI C. Любая программа, написанная только на стандартном Си, гарантированно будет правильно выполняться на любой платформе, имеющей соответствующую реализацию Си. Однако большинство программ написано так, что они будут компилироваться и исполняться только на определённой платформе, потому что:
- они используют нестандартные библиотеки, например, для графических дисплеев;
- они используют специфические платформо-зависимые средства;
- они рассчитаны на определённое значение размера некоторых типов данных или на определённый способ хранения этих данных в памяти для конкретной платформы.
C99
После стандартизации в ANSI спецификация языка Си оставалась относительно неизменной в течение долгого времени, в то время как C++ продолжал развиваться (в 1995 году в стандарт Си была внесена Первая нормативная поправка, но её почти никто не признавал). Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «C99». В марте 2000 года он был принят и адаптирован ANSI.
Некоторые новые особенности C99:
- подставляемые функции (
inline
); - объявление локальных переменных в любом операторе программного текста (как в C++);
- новые типы данных, такие, как
long long int
(для облегчения перехода от 32- к 64-битным числам), явный булевый тип данных_Bool
и типcomplex
для представления комплексных чисел; - массивы переменной длины;
- поддержка ограниченных указателей (
restrict
); - именованная инициализация структур:
struct { int x, y, z; } point = { .y=10, .z=20, .x=30 };
- поддержка однострочных комментариев, начинающихся на
//
, заимствованных из C++ (многие компиляторы Си поддерживали их и ранее в качестве дополнения); - несколько новых библиотечных функций, таких, как
snprintf
; - несколько новых заголовочных файлов, таких, как
stdint.h
.
C11
8 декабря 2011 опубликован новый стандарт для языка Си (ISO/IEC 9899:2011)[3]. Основные изменения:
- поддержка многопоточности;
- улучшенная поддержка Юникода;
- обобщённые макросы (type-generic expressions, позволяют статичную перегрузку);
- анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
- управление выравниванием объектов;
- статичные утверждения (static assertions);
- удаление опасной функции
gets
(в пользу безопаснойgets_s
); - функция
quick_exit
; - спецификатор функции
_Noreturn
; - новый режим эксклюзивного открытия файла.
C18
Черновой вариант стандарта был представлен как C17 (ISO/IEC 9899:2017) в 2017 году[4]. В июне 2018 года стандарт был опубликован как C18 (ISO/IEC 9899:2018)[5][6]. Новый стандарт устраняет дефекты, замеченные в предыдущей версии, без добавления новых возможностей. Названия C17 и C18 обычно упоминаются как синонимы[6].
Примечания
- ↑ Ритчи Д. М. The Development of the C Language. Разделы «Introduction» и «History: the setting».
- ↑ Programming Community Index for April 2012 . Дата обращения: 2 февраля 2019. Архивировано 2 июля 2013 года.
- ↑ ISO/IEC 9899:2011 — Information technology — Programming languages — C . Дата обращения: 2 февраля 2019. Архивировано 27 декабря 2011 года.
- ↑ ISO/IEC. ISO/IEC9899:2017. Programming languages — C (2017). Дата обращения: 2 февраля 2019. Архивировано из оригинала 24 октября 2018 года.
- ↑ ISO/IEC 9899:2018 - Information technology -- Programming languages -- C . www.iso.org. Дата обращения: 2 февраля 2019. Архивировано 10 августа 2018 года.
- ↑ 1 2 Using the GNU Compiler Collection (GCC): C Dialect Options (англ.). gcc.gnu.org. Дата обращения: 3 декабря 2018. Архивировано 26 марта 2014 года.
Литература
- Ритчи Д. М. The Development of the C Language (англ.) // www.bell-labs.com : сайт. — 1993.