Книга: Искусство программирования для Unix
17.1.1. Ранняя история С
17.1.1. Ранняя история С
Язык С родился в 1971 году как язык системного программирования для PDP-11-варианта Unix и основывался на раннем интерпретаторе языка В, разработанного Кеном Томпсоном. Язык В, в свою очередь, был смоделирован с базового языка общего программирования (Basic Common Programming Language — BCPL), разработанного в Кембриджском университете в 1966–1967 годах[137].
Первоначальный C-компилятор Денниса Ритчи (который часто называли "DMR" по инициалам его создателя) обслуживал сообщество, быстро разрастающееся вокруг операционной системы Unix версий 5, 6 и 7. От шестой версии С языка произошла версия С компании Whitesmiths, повторная реализация, которая стала первым коммерческим C-компилятором и ядром IDRIS, первого клона Unix. Однако самые современные реализации С смоделированы на основе "переносимого C-компилятора" (Portable С Compiler — PCC) Стивена Джонсона (Steven С. Johnson), который дебютировал в седьмой версии и полностью заменил компилятор DMR как в ветви System V, так и в BSD-версиях четвертого поколения.
В 1976 году в шестой версии С были представлены объявления typedef
, union
и unsigned int
. Также подверглись изменениям утвержденный синтаксис для инициализации переменных и некоторые составные операторы.
Оригинальным описанием языка С была книга Брайана Кернигана и Денниса Ритчи "The С Programming Language", которую также называли "Белой книгой" [42]. Она была опубликована в 1978 году, в том же году появился C-компилятор Whitemiths.
Белая книга описывала усовершенствованную шестую версию языка С с одним значительным исключением, которое касалось обработки общедоступных переменных. Первоначально Ритчи намеревался смоделировать правила С с COMMON- объявлений языка FORTRAN, основываясь на теоретическом соображении, что любая машина, способная поддерживать FORTRAN, будет готова к использованию С. В модели с общим блоком общедоступная переменная может быть объявлена несколько раз; идентичные объявления объединяются компоновщиком. Однако два ранних варианта С (для мэйнфреймов Honeywell и IBM 360) работали на машинах с очень ограниченной общей памятью или примитивным компоновщиком, или имели оба недостатка. Таким образом, компилятор Version 6 С был перенесен в боле строгую модель определения (которая требовала максимум одно определение любой заданной общедоступной переменной и ключевого слова extern
, задающего на нее ссылки), описанную в [42].
Это решение было отменено в C-компиляторе, который поставлялся с Version 7, после выяснения того, что большое количество существующего исходного кода зависело от более свободных правил. Под давлением обратной совместимости закончилась неудачей еще одна попытка перестроиться (в версии System V Release 1 1983 года), перед тем как в 1988 году в проекте стандарта ANSI (ANSI Draft Standard) окончательно установились правила определения. Общий блок внешних переменных до сих пор является общепризнанным отклонением от стандарта.
В седьмой версии С была введена конструкция enum
, а значения struct
и union
интерпретировались как объекты первого класса, которые можно назначать, передавать в качестве аргументов и возвращать из функций (вместо передачи по адресу).
Другим главным изменением в V7 было то, что Unix-объявления структур данных теперь документировались в файлах заголовков и подключались. В предыдущих версиях Unix структуры данных (например, для каталогов) фактически печатались в руководстве, из которого программисты копировали их в свой код. Излишне говорить, что это было значительной проблемой для переносимости.
Версия System III С компилятора PCC (которая также поставлялась с BSD 4.1с) изменила обработку объявлений struct
так, чтобы члены с одинаковыми именами в различных структурах не конфликтовали. Также были внесены объявления void
и unsigned char
. Область действия extern-объявлений локальных для функций была ограничена данной функцией и более не включала всего следующего за ней кода.
В проекте стандарта ANSI С (ANSI С Draft Proposed Standard) были добавлены определения const
(для памяти только для чтения) и volatile
(для таких ячеек, как отображаемые на память регистры ввода/вывода, которые можно модифицировать асинхронно из потока управления программы). В целях применения к любому типу был обобщен модификатор типа unsigned
, а также добавлен идентификатор signed
. Был добавлен синтаксис для auto
-массива, инициализаторов структур, а также типов union
. Наиболее важно то, что были добавлены прототипы функций.
Самыми важными изменениями в раннем С был переход к определению и введение прототипов функций в проекте стандарта ANSI С. Язык по существу остается стабильным с тех пор, как в 1985 - 1986 годах копии рабочих документов комитета X3J11 по проекту стандарта довели намерения комитета до сведения разработчиков компиляторов.
Более подробно история раннего С описана создателем языка в статье [70].
- 17.1. Эволюция С
- Слишком ранняя критика
- История развития компьютеров (вместо пролога)
- Глава 3 Поучительная история
- Лекция 11. История запросов
- История SAP
- Заключительный аккорд: Краткая история книжного пиратства Бодо Балац
- 1. Краткая история разметки
- История вычислительной Вселенной
- Краткая история времени бренда
- Рассмотрим маркетинг в контексте. Психология, история и алхимия маркетинга
- История product placement