Керниган ричи язык си. Деннис ритчи - отец языка программирования с

Возможности 28.05.2019
Возможности

Brian W. Kernighan, Dennis M. Ritchie
The C programming Language
Second Edition
AT&T Bell Laboratories
Murray Hill, New Jersey
Prentice Hall PTR, Englewood Cliffs, New Jersey 07632
Б. Керниган, Д. Ритчи
Язык программирования Си
Издание 3-е, исправленное
Перевод с английского под редакцией Вс. С. Штаркмана
Невский Диалект, Санкт-Петербург 2001
УДК 681.3.06
ББК 24.4.9
К36
Перевод с английского Вик. С. Штаркмана, под редакцией Вс. С. Штаркмана.
Керниган Б., Ритчи Д.
К36 Язык программирования Си. \Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.
Книга широко известных авторов , разработчиков языка Си, переработанная и дополненная с учетом стандарта ANSI для языка Си, 2-е английское издание которой вышло в 1988 году, давно стала классикой для всех изучающих и/или использующих как Си, так и Си++. Русский перевод этой книги впервые был выпущен изд- вом "Финансы и статистика" в 1992 г. и с тех пор пользуется неизменным спросом читателей.
Для настоящего третьего русского издания перевод заново сверен с оригиналом, в него внесены некоторые поправки, учитывающие устоявшиеся за прошедшие годы изменения в терминологии, а так же учтены замечания, размещенные автором на странице http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html
Для программистов, преподавателей и студентов.
Издание подготовлено при участии издательства "Финансы и статистика"
ISBN 5-7940-0045-7 © 1998, 1978 by Bell Telephone Laboratories, Incorporated
ISBN 0-13-110362-8 {PBK}
1

ISBN 0-13-110370-9 (англ.) © "Невский Диалект", 2001
Введение
Си - универсальный язык программирования. Он тесно связан с системой UNIX, так как был разработан в этой системе, которая как и большинство программ, работающих в ней, написаны на Си. Однако язык не привязан жестко к какой-то одной операционной системе или машине. Хотя он и назван "языком системного программирования", поскольку удобен для написания компиляторов и операционных систем, оказалось, что на нем столь же хорошо писать большие программы другого профиля.
Многие важные идеи Си взяты из языка BCPL, автором которого является Мартин Ричардс. Влияние
BCPL на Си было косвенным - через язык B, разработанный Кеном Томпсоном в 1970 г. для первой системы UNIX, реализованной на PDP-7.
BCPL и B - "бестиповые" языки. В отличие от них Си обеспечивает разнообразие типов данных. Базовыми типами являются символы, а также целые и числа с плавающей точкой различных размеров. Кроме того, имеется возможность получать целую иерархию производных типов данных из указателей, массивов, структур и объединений. Выражения формируются из операторов и операндов. Любое выражение, включая присваивание и вызов функции, может быть инструкцией. Указатели обеспечивают машинно- независимую адресную арифметику.
В Си имеются основные управляющие конструкции, используемые в хорошо структурированных программах: составная инструкция ({. . .}), ветвление по условию (if-else ), выбор одной альтернативы из многих (switch ), циклы с проверкой наверху (while , for ) и с проверкой внизу (do ), а также средство прерывания цикла (break ).
В качестве результата функции могут возвращать значения базовых типов, структур, объединений и указателей. Любая функция допускает рекурсивное обращение к себе. Как правило, локальные переменные функции - "автоматические", т. е. они создаются заново при каждом обращении к ней.
Определения функций нельзя вкладывать друг в друга, но объявления переменных разрешается строить в блочно-структурной манере. Функции программы на Си могут храниться в отдельных исходных файлах и компилироваться независимо. Переменные по отношению к функции могут быть внутренними и внешними. Последние могут быть доступными в пределах одного исходного файла или всей программы.
На этапе препроцессирования выполняется макроподстановка в текст программы, включение других исходных файлов и условная компиляция.
Си - язык сравнительно "низкого уровня". Однако это вовсе не умаляет его достоинств, просто Си имеет дело с теми же объектами, что и большинство компьютеров, т. е. с символами, числами и адресами. С ними можно оперировать при помощи арифметических и логических операций, выполняемых реальными машинами.
В Си нет прямых операций над составными объектами, такими как строки символов, множества, списки и массивы. В нем нет операций, которые бы манипулировали с целыми массивами или строками символов,
хотя структуры разрешается копировать целиком как единые объекты. В языке нет каких-либо средств распределения памяти, помимо возможности определения статических переменных и стекового механизма при выделении места для локальных переменных внутри функций. Нет в нем "кучи" и "сборщика мусора". Наконец, в самом Си нет средств ввода-вывода, инструкций READ (читать) и WRITE
(писать) и каких-либо методов доступа к файлам. Все это - механизмы высокого уровня, которые в Си обеспечиваются исключительно с помощью явно вызываемых функций. Большинство реализованных Си- систем содержат в себе разумный стандартный набор этих функций.
В продолжение сказанного следует отметить , что Си предоставляет средства лишь последовательного управления ходом вычислений: механизм ветвления по условиям, циклы, составные инструкции,
2

подпрограммы и не содержит средств мультипрограммирования, параллельных процессов, синхронизации и организации сопрограмм.
Отсутствие некоторых из перечисленных средств может показаться серьезным недостатком ("выходит, чтобы сравнить две строки символов, нужно обращаться к функции?"). Однако компактность языка имеет реальные выгоды. Поскольку Си относительно мал, то и описание его кратко, и овладеть им можно быстро. Программист может реально рассчитывать на то, что он будет знать, понимать и на практике регулярно пользоваться всеми возможностями языка.
В течение многих лет единственным определением языка Си было первое издание книги "Язык программирования Си". В 1983 г. Институтом американских национальных стандартов (ANSI) учреждается комитет для выработки современного исчерпывающего определения языка Си. Результатом его работы явился стандарт для Си ("ANSI-C"), выпущенный в 1988 г. Большинство положений этого стандарта уже учтено в современных компиляторах.
Стандарт базируется на первоначальном справочном руководстве. По сравнению с последним язык изменился относительно мало. Одной из целей стандарта было обеспечить, чтобы в большинстве случаев существующие программы оставались правильными или вызывали предупреждающие сообщения компиляторов об изменении поведения.
Для большинства программистов самое важное изменение - это новый синтаксис объявления и определения функций. Объявление функции может теперь включать и описание ее аргументов. В соответствии с этим изменился и синтаксис определения функции. Дополнительная информация значительно облегчает компилятору выявление ошибок, связанных с несогласованностью аргументов; по нашему мнению, это очень полезное добавление к языку.
Следует также отметить ряд небольших изменений. В языке узаконены присваивание структур и перечисления, которые уже некоторое время широко используются. Вычисления с плавающей точкой теперь допускаются и с одинарной точностью. Уточнены свойства арифметики, особенно для беззнаковых типов. Усовершенствован препроцессор. Большинство программистов эти изменения затронут очень слабо.
Второй значительный вклад стандарта - это определение библиотеки, поставляемой вместе с Си- компилятором, в которой специфицируются функции доступа к возможностям операционной системы
(например чтения-записи файлов), форматного ввода-вывода, динамического выделения памяти, манипуляций со строками символов и т. д. Набор стандартных заголовочных файлов обеспечивает единообразный доступ к объявлениям функций и типов данных. Гарантируется, что программы, использующие эту библиотеку при взаимодействии с операционной системой, будут работать также и на других машинах. Большинство программ, составляющих библиотеку, созданы по образу и подобию "стандартной библиотеки ввода-вывода" системы UNIX. Эта библиотека описана в первом издании книги и широко используется в других системах. И здесь программисты не заметят существенных различий. Так как типы данных и управляющих структур языка Си поддерживаются командами большинства существующих машин, исполнительная система (run-time library), обеспечивающая независимый запуск и выполнение программ, очень мала. Обращения к библиотечным функциям пишет сам программист (не компилятор), поэтому при желании их можно легко заменить на другие. Почти все программы, написанные на Си, если они не касаются каких-либо скрытых в операционной системе деталей, переносимы на другие машины.
Си соответствует аппаратным возможностям многих машин, однако он не привязан к архитектуре какой- либо конкретной машины. Проявляя некоторую дисциплину, можно легко писать переносимые программы , т. е. программы, которые без каких-либо изменений могут работать на разных машинах.
Стандарт предоставляет возможность для явного описания переносимости с помощью набора констант, отражающих характеристики машины, на которой программа будет работать.
Си не является "строго типизированным" языком, но в процессе его развития контроль за типами был усилен. В первой версии Си хоть не одобрялся, но разрешался бесконтрольный обмен указателей и целых, что вызывало большие нарекания, но это уже давным-давно запрещено. Согласно стандарту теперь требуется явное объявление или явное указание преобразования, что уже и реализовано в хороших компиляторах. Новый вид объявления функций - еще один шаг в этом направлении. Компилятор теперь предупреждает о большей части ошибок в типах и автоматически не выполняет преобразования
3

данных несовместимых типов. Однако основной философией Си остается то, что программисты сами знают, что делают; язык лишь требует явного указания об их намерениях.
Си, как и любой другой язык программирования, не свободен от недостатков. Уровень старшинства некоторых операторов не является общепринятым, некоторые синтаксические конструкции могли бы быть лучше. Тем не менее, как оказалось, Си - чрезвычайно эффективный и выразительный язык, пригодный для широкого класса задач.
Книга имеет следующую структуру.
Глава 1
представляет собой обзор основных средств языка Си. Ее назначение - побудить читателя по возможности быстрее приступить к программированию, так как мы убеждены, что единственный способ изучить новый язык - это писать на нем программы. Эта часть книги предполагает наличие знаний по основным элементам программирования. Никаких пояснений того, что такое компьютер, компиляция или что означает выражение вида n=n+1 не дается. Хотя мы и пытались там, где это возможно, показать полезные приемы программирования, эта книга не призвана быть справочником ни по работе со структурами данных, ни по алгоритмам: когда оказывалось необходимым выбрать, на что сделать ударение, мы предпочитали сконцентрировать внимание на языке.
В главах 2-6 различные средства языка обсуждаются более подробно и несколько более формально, чем в главе 1; при этом по-прежнему упор делается на примеры, являющиеся законченными программами, а не изолированными фрагментами.
Глава 2
знакомит с базовыми типами данных, с операторами и выражениями. В главе 3
рассматриваются средства управления последовательностью вычислений: if-
else , switch , while , for и т.д. В главе 4
речь идет о функциях и структуре программы (внешних переменных, правилах видимости, делении программы на несколько исходных файлов и т. д.), а также о препроцессоре. В главе 5
обсуждаются указатели и адресная арифметика.
Глава 6
посвящена структурам и объединениям.
В главе 7
описана стандартная библиотека, обеспечивающая общий интерфейс с операционной системой. Эта библиотека узаконена в качестве стандарта ANSI, иначе говоря, она должна быть представлена на всех машинах, где существует Си, благодаря чему программы , использующие ввод- вывод и другие возможности операционной системы, без каких-либо изменений можно переносить с одной машины на другую.
Глава 8
содержит описание интерфейса между программами на Си и операционной системой UNIX, в частности описание ввода-вывода, файловой системы и распределения памяти. Хотя некоторые параграфы этой главы отражают специфику системы UNIX, программисты, пользующиеся другими системами, все же найдут в них много полезных сведений, включая определенный взгляд на то, как реализуется одна из версий стандартной библиотеки, и некоторые предложения по переносимости программ.
Приложение A
является справочником по языку. Строгое определение синтаксиса и семантики языка Си содержится в официальном документе стандарта ANSI. Последний, однако, более всего подходит разработчикам компилятора. Наш справочник определяет язык более сжато, не прибегая к педантично юридическому стилю, которым пользуется стандарт.
Приложение B
- сводка по содержимому стандартной библиотеки и предназначена скорее пользователям, чем реализаторам. В приложении C
приводится краткий перечень отличий от первой версии языка. В сомнительных случаях, однако, окончательным судьей по языку остается стандарт и компилятор, которым вы пользуетесь.
Глава 1. Обзор языка
1.1 Начнем, пожалуй
1.2 Переменные и арифметические выражения
1.3 Инструкция
for
1.4 Именованные константы
4

1.5 Ввод-вывод символов
1.5.1 Копирование файла
1.5.2 Подсчет символов
1.5.3 Подсчет строк
1.5.4 Подсчет слов
1.6 Массивы
1.7 Функции
1.8 Аргументы. Вызов по значению
1.9 Символьные массивы
1.10 Внешние переменные и область видимости
Глава 2. Типы, операторы и выражения
2.1 Имена переменных
2.2 Типы и размеры данных
2.3 Константы
2.4 Объявления
2.5 Арифметические операторы
2.6 Операторы отношения и логические операторы
2.7 Преобразования типов
2.8 Операторы инкремента и декремента
2.9 Побитовые операторы
2.10 Операторы и выражения присваивания
2.11 Условные выражения
2.12 Приоритет и очередность вычислений
Глава 3. Управление
3.1 Инструкции и блоки
3.2 Конструкция
if-else
3.3 Конструкция
else-if
3.4 Переключатель
switch
3.5 Циклы
while
и
for
3.6 Цикл
do
- while
3.7 Инструкции
break
и
continue
3.8 Инструкция
goto
и метки
Глава 4. Функции и структура программы
4.1 Основные сведения о функциях
4.2 Функции, возвращающие нецелые значения
4.3 Внешние переменные
4.4 Области видимости
4.5 Заголовочные файлы
4.6 Статические переменные
4.7 Регистровые переменные
4.8 Блочная структура
4.9 Инициализация
4.10 Рекурсия
4.11 Препроцессор языка Си
4.11.1 Включение файла
5

4.11.2 Макроподстановка
4.11.3 Условная компиляция
Глава 5. Указатели и массивы
5.1 Указатели и адреса
5.2 Указатели и аргументы функций
5.3 Указатели и массивы
5.4 Адресная арифметика
5.5 Символьные указатели функции
5.6 Массивы указателей, указатели на указатели
5.7 Многомерные массивы
5.8 Инициализация массивов указателей
5.9 Указатели против многомерных массивов
5.10 Аргументы командной строки
5.11 Указатели на функции
5.12 Сложные объявления
Глава 6. Структуры
6.1 Основные сведения о структурах
6.2 Структуры и функции
6.3 Массивы структур
6.4 Указатели на структуры
6.5 Структуры со ссылками на себя
6.6 Просмотр таблиц
6.7 Средство typedef
6.8 Объединения
6.9 Битовые поля
Глава 7. Ввод и вывод
7.1 Стандартный ввод-вывод
7.2 Форматный вывод (
printf
7.3 Списки аргументов переменной длины
7.4 Форматный ввод (
scanf
7.5 Доступ к файлам
7.6 Управление ошибками (
stderr
и
exit
7.7 Ввод-вывод строк
7.8 Другие библиотечные функции
7.8.1 Операции со строками
7.8.2 Анализ класса символов и преобразование символов
7.8.3 Функция
ungetc
7.8.4 Исполнение команд операционной системы
7.8.5 Управление памятью
7.8.6 Математические функции
7.8.7 Генератор случайных чисел
6

Глава 8. Интерфейс с системой UNIX
8.1 Дескрипторы файлов
8.2 Нижний уровень ввода-вывода (read и write)
8.3 Системные вызовы open, creat, close, unlink
8.4 Произвольный доступ (lseek)
8.5 Пример. Реализация функций fopen и getc
8.6 Пример. Печать каталогов
8.7 Пример. Распределитель памяти
Приложение A. Справочное руководство
A1. Введение
A2. Соглашения о лексике
A2.1. Лексемы (
tokens
A2.2. Комментарий
A2.3. Идентификаторы
A2.4. Ключевые слова
A2.5. Константы
A2.5.1. Целые константы
A2.5.2. Символьные константы
А2.5.3. Константы с плавающей точкой
A2.5.4. Константы-перечисления
A2.6. Строковые литералы
A3. Нотация синтаксиса
A4. Что обозначают идентификаторы
A4.1. Класс памяти
A4.2. Базовые типы
A4.3. Производные типы
A4.4. Квалификаторы типов
A5. Объекты и Lvalues
A6. Преобразования
A6.1. Целочисленное повышение
A6.2. Целочисленные преобразования
A6.3. Целые и числа с плавающей точкой
A6.4. Типы с плавающей точкой
А6.5. Арифметические преобразования
A6.6. Указатели и целые
A6.7. Тип
void
А6.8. Указатели на
void
A7. Выражения
A7.1. Генерация указателя
A7.2. Первичные выражения
A7.3. Постфиксные выражения
A7.3.1. Обращение к элементам массива
A7.3.2. Вызов функции
A7.3.3. Обращение к структурам
7

A7.3.4. Постфиксные операторы инкремента и декремента
А7.4. Унарные операторы
А7.4.1. Префиксные операторы инкремента и декремента
A7.4.2. Оператор получения адреса
A7.4.3. Оператор косвенного доступа
A7.4.4. Оператор унарный плюс
A7.4.5. Оператор унарный минус
A7.4.6. Оператор побитового отрицания
A7.4.7. Оператор логического отрицания
A7.4.8. Оператор определения размера
sizeof
A7.5. Оператор приведения типа
A7.6. Мультипликативные операторы
A7.7. Аддитивные операторы
A7.8. Операторы сдвига
A7.9. Операторы отношения
A7.10. Операторы равенства
A7.11. Оператор побитового
И
A7.12. Оператор побитового исключающего
ИЛИ
A7.13. Оператор побитового
ИЛИ
A7.14. Оператор логического
И
A7.15. Оператор логического
ИЛИ
А7.16. Условный оператор
A7.17. Выражения присваивания
A7.18. Оператор запятая
A7.19. Константные выражения
A8. Объявления
A8.1. Спецификаторы класса памяти
А8.2. Спецификаторы типа
A8.3. Объявления структур и объединений
A8.4. Перечисления
А8.5. Объявители
A8.6. Что означают объявители
A8.6.1. Объявители указателей
А8.6.2. Объявители массивов
А8.6.3. Объявители функций
A8.7. Инициализация
A8.8. Имена типов
А8.9. Объявление
typedef
A8.10. Эквивалентность типов
A9. Инструкции
A9.1. Помеченные инструкции
A9.2. Инструкция-выражение
A9.3. Составная инструкция
A9.4. Инструкции выбора
A9.5. Циклические инструкции
A9.6. Инструкции перехода
А10. Внешние объявления
A10.1. Определение функции
A10.2. Внешние объявления
8

A11. Область видимости и связи
A11.1. Лексическая область видимости
A11.2. Связи
A12. Препроцессирование
A12.1. Трехзнаковые последовательности
A12.2. Склеивание строк
А12.3. Макроопределение и макрорасширение
A12.4. Включение файла
A12.5. Условная компиляция
A12.6. Нумерация строк
A12.7. Генерация сообщения об ошибке
A12.8. Прагма
A12.9. Пустая директива
A12.10. Заранее определенные имена
A13. Грамматика
Приложение B. Стандартная библиотека
B1. Ввод-вывод:

B1.1. Операции над файлами
B1.2. Форматный вывод
B1.3. Форматный ввод
B1.4. Функции ввода-вывода символов
B1.5. Функции прямого ввода-вывода
B1.6. Функции позиционирования файла
B1.7. Функции обработки ошибок
B2. Проверки класса символа:

B3. Функции, оперирующие со строками:

B4. Математические функции:

B5. Функции общего назначения:

B6. Диагностика:

B7. Списки аргументов переменной длины:

B8. Дальние переходы:

B9. Сигналы:

B10. Функции даты и времени:

B11. Зависящие от реализации пределы:

и

Б.В. Керниган, Д.М. Ричи.

АННОТАЦИЯ

Язык “C”(произносится “си”) - это универсальный язык программирования, для которого характерны экономичность выражения, современный поток управления и структуры данных, богатый набор операторов. Язык “C” не является ни языком “очень высокого уровня”, ни “большим” языком, и не предназначается для некоторой специальной области применения. но отсутствие ограничений и общность языка делают его более удобным и эффективным для многих задач, чем языки, предположительно более мощные.

Язык “C”, первоначально предназначавшийся для написания операционной системы “UNIX” на ЭВМ DEC PDP-11, был разработан и реализован на этой системе Деннисом Ричи. Операционная система, компилятор с языка “C” и по существу все прикладные программы системы “UNIX” (включая все программное обеспечение, использованное при подготовке этой книги) написаны на “C”. Коммерческие компиляторы с языка “C” существуют также на некоторых других ЭВМ, включая IBM SYSTEM/ 370, HONEYWELL 6000, INTERDATA 8/32. Язык “C”, однако, не связан с какими-либо определенными аппаратными средствами или системами, и на нем легко писать программы, которые можно пропускать без изменений на любой ЭВМ, имеющей “C”-компилятор.

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

Настоящая книга не является вводным курсом в программирование; она предполагает определенное знакомство с основными понятиями программирования такими как переменные, операторы присваивания, циклы, функции. Тем не менее и новичок в программировании должен оказаться в состоянии читать подряд и освоиться с языком, хотя при этом была бы полезной помощь более опытного коллеги.

По нашему опыту, “C” показал себя приятным, выразительным и

разносторонним языком на широком множестве разнообразных программ. Его легко выучить, и он не теряет своих качеств с ростом опыта программиста. Мы надеемся, что эта книга поможет вам хорошо его использовать.

Вдумчивая критика и предложения многих наших друзей и коллег очень много добавили как для самой книги, так и для нашего удовольствия при ее написании. В частности, Майк Биапси, Джим Блю, Стью Фельдман, Доуг Мак-Илрой, Билл Рум, Боб Розин и Ларри Рослер тщательно прочитали множество вариантов. Мы также обязаны Элю Ахо, Стиву Борну, Дэву Двораку, Чаку Хэлею, Дебби Хэлей, Мариону Харрису, Рику Холту, Стиву Джонсону, Джону Машею, Бобу Митцу, Ральфу Мьюа, Питеру Нельсону, Эллиоту Пинсону, Биллу Плагеру, Джерри Спиваку, Кену Томпсону и Питеру Вейнбергеру за полезные замечания на различных этапах и Майку Лоску и Джо Осанна за неоценимую помощь при печатании книги.

Брайен В. Керниган Деннис М. Ричи

АННОТАЦИЯ.................................................................................................

ВВЕДЕНИЕ. ...........................................................................................

Учебное введение. ................................................................................

Hачинаем. ..............................................................................................

Переменные и арифметика. .................................................................

Оператор FOR. ......................................................................................

Набор полезных программ. .................................................................

Ввод и вывод символов. ..............................................................

Копирование файла. ....................................................................

Подсчет символов. .......................................................................

Подсчет строк. .............................................................................

Подсчет слов. ...............................................................................

Массивы. ...............................................................................................

Функции. ...............................................................................................

Аргументы - вызов по значению. ........................................................

Массивы символов. ..............................................................................

Область действия: внешние переменные. ..........................................

ТИПЫ, ОПЕРАЦИИ И ВЫРАЖЕНИЯ. .........................................

Имена переменных. ..............................................................................

Типы и размеры данных. .....................................................................

Константы. ............................................................................................

Символьная константа. ...............................................................

Константное выражение.............................................................

Строчная константа.....................................................................

Арифметические операции..................................................................

Операции отношения и логические операции...................................

Преобразование типов.........................................................................

Операции увеличения и уменьшения.................................................

Побитовые логические операции........................................................

Операции и выражения присваивания................................................

Условные выражения. ..........................................................................

Старшинство и порядок вычисления. .................................................

ПОТОК УПРАВЛЕНИЯ....................................................................

Операторы и блоки...............................................................................

IF - ELSE ................................................................................................

ELSE - IF ................................................................................................

Переключатель......................................................................................

Циклы - WHILE и FOR ........................................................................

Цикл DO - WHILE ................................................................................

Оператор BREAK .................................................................................

Оператор CONTINUE ..........................................................................

Оператор GOTO и метки.....................................................................

ФУНКЦИИ И СТРУКТУРА ПРОГРАММ. ...................................

Основные сведения. .............................................................................

Функции, возвращающие нецелые значения. ....................................

Еще об аргументах функций. ..............................................................

Внешние переменные. .........................................................................

Правила, определяющие область действия. .......................................

Область действия. ........................................................................

Статические переменные. ....................................................................

Блочная структура. ...............................................................................

Инициализация. ....................................................................................

Рекурсия. ...............................................................................................

4.11. Препроцессор языка “C”......................................................................

Включение файлов......................................................................

Макроподстановка......................................................................

УКАЗАТЕЛИ И МАССИВЫ............................................................

Указатели и адреса................................................................................

Указатели и аргументы функций.........................................................

Указатели и массивы.........................................................................

Адресная арифметика.......................................................................

Указатели символов и функции........................................................

Указатели - не целые. ........................................................................

Многомерные массивы. ....................................................................

Массивы указателей; указатели указателей....................................

Инициализация массивов указателей. .............................................

Указатели и многомерные массивы.................................................

Командная строка аргументов..........................................................

Указатели на функции.......................................................................

СТРУКТУРЫ. ..................................................................................

Основные сведения. ..........................................................................

Структуры и функции........................................................................

Массивы сруктур. ..............................................................................

Указатели на структуры. ...................................................................

Структуры, ссылающиеся на себя. ...................................................

Поиск в таблице. ................................................................................

...................................................................................................

Объединения. .....................................................................................

Определение типа..............................................................................

ВВОД И ВЫВОД..............................................................................

Обращение к стандартной библиотеке............................................

Стандартный ввод и вывод - функции GETCHAR и PUTCHAR ..

Форматный вывод - функция PRINTF .............................................

Форматное преобразование в памяти..............................................

Доступ к файлам................................................................................

Обработка ошибок - STDERR и EXIT .............................................

Ввод и вывод строк...........................................................................

Несколько разнообразных функций.................................................

Проверка вида символов и преобразования...........................

Функция UNGETC ...................................................................

Обращение к системе...............................................................

Управление памятью................................................................

ИНТЕРФЕЙС СИСТЕМЫ UNIX .................................................

Дескрипторы файлов.........................................................................

Низкоуровневый ввод/вывод - операторы READ и WRITE. .........

Открытие, создание, закрытие и расцепление (UNLINK). ............

Произвольный доступ - SEEK и LSEEK. ........................................

Пример - реализация функций FOPEN и GETC. ............................

Пример - распечатка справочников.................................................

Пример - распределитель памяти.....................................................

9. ПРИЛОЖЕНИЕ А:

СПРАВОЧНОЕ РУКОВОДСТВО ПО ЯЗЫКУ ‘C’ ....................

Введение.............................................................................................

Лексические соглашения..................................................................

10.1. Комментарии......................................................................................

10.2. Идентификаторы (имена) ..................................................................

10.3. Ключевые слова.................................................................................

10.4. Константы..........................................................................................

Целые константы......................................................................

Явные длинные константы......................................................

Символьные константы............................................................

Плавающие константы.............................................................

10.5. Строки................................................................................................

10.6. Характеристики аппаратных средств..............................................

Синтаксическая нотация...................................................................

Что в имене тебе моем? ....................................................................

Преобразования.................................................................................

Символы и целые...............................................................................

Типы FLOAT и DOUBLE ..................................................................

Плавающие и целочисленные величины.........................................

Указатели и целые.............................................................................

Целое без знака..................................................................................

Арифметические преобразования....................................................

Первичные выражения......................................................................

Унарные операции.............................................................................

«Язык С» Б.В. Керниган, Д.М. Ричи

15.3. Мультипликативные операции.........................................................

15.4. Аддитивные операции.......................................................................

15.5. Операции сдвига................................................................................

15.6. Операции отношения........................................................................

15.7. Операции равенства..........................................................................

15.8. Побитовая операция ‘и’ ....................................................................

Побитовая операция исключающего ‘или’ Выражение- .....................

исключающего-или: ..........................................................................

15.10. Побитовая операция включающего ‘или’ Выражение- ......................

включающего-или:.............................................................................

15.11.Логическая операция ‘и’ ...................................................................

15.12.Операция логического ‘или’ .............................................................

15.13.Условная операция............................................................................

15.14.Операция присваивания....................................................................

15.15.Операция запятая...............................................................................

Описания............................................................................................

16.1. Спецификаторы класса памяти........................................................

16.2. Спецификаторы типа.........................................................................

16.3. Описатели...........................................................................................

16.4. Смысл описателей.............................................................................

16.5. Описание структур и объединений..................................................

16.6. Инициализация..................................................................................

16.7. Имена типов.......................................................................................

16.8. TYPEDEF ...........................................................................................

Операторы..........................................................................................

17.1. Операторное выражение...................................................................

17.2. Составной оператор (или блок) ........................................................

17.3. Условные операторы.........................................................................

17.4. Оператор WHILE ...............................................................................

17.5. Оператор DO ......................................................................................

17.6. Оператор FOR ....................................................................................

17.7. Оператор SWITCH ............................................................................

17.8. Оператор BREAK ..............................................................................

17.9. Оператор CONTINUE .......................................................................

17.10. Оператор возврата............................................................................

17.11. Оператор GOTO ................................................................................

17.12. Помеченный оператор......................................................................

17.13. Пустой оператор...............................................................................

Внешние определения.......................................................................

Внешнее определение функции.......................................................

Внешние определения данных.........................................................

Правила, определяющие область действия.....................................

Лексическая область действия.........................................................

Область действия внешних идентификаторов................................

Строки управления компилятором...................................................

Замена лексем....................................................................................

Включение файлов............................................................................

Условная компиляция........................................................................

Неявные описания.............................................................................

Снова о типах.....................................................................................

22.1. Структуры и объединения.................................................................

22.2. Функции.............................................................................................

22.3. Массивы, указатели и индексация...................................................

22.4. Явные преобразования указателей...................................................

Константные выражения...................................................................

Соображения о переносимости........................................................

Анахронизмы.....................................................................................

Сводка синтаксических правил........................................................

Выражения.........................................................................................

Описания............................................................................................

Операторы составной-оператор: ......................................................

Внешние определения Программа: .................................................

Присваивание структуры..................................................................

Тип перечисления..............................................................................

Таблица изображений непечатных символов языка “C”................

0.1. ВВЕДЕНИЕ.

Язык “C” является универсальным языком программирования. Он тесно связан с операционной системой “UNIX” , так как был развит на этой системе

и так как “UNIX” и ее программное обеспечение написано на “C”. Сам язык, однако, не связан с какой-либо одной операционной системой или машиной;

и хотя его называют языком системного программирования, так как он удобен для написания операционных систем, он с равным успехом использовался при написании больших вычислительных программ, программ для обработки текстов и баз данных.

Язык “C” - это язык относительно “низкого уровня”. В такой характеристике нет ничего оскорбительного; это просто означает, что “C” имеет дело с объектами того же вида, что и большинство ЭВМ, а именно, с символами, числами и адресами. Они могут объединяться и пересылаться посредством обычных арифметических и логических операций, осуществляемых реальными ЭВМ.

В языке “C” отсутствуют операции, имеющие дело непосредственно с составными объектами, такими как строки символов, множества, списки или с массивами, рассматриваемыми как целое. Здесь, например, нет никакого аналога операциям PL/1, оперирующим с целыми массивами и строками. Язык не предоставляет никаких других возможностей распределения памяти, кроме статического определения и механизма стеков, обеспечиваемого локальными переменных функций; здесь нет ни “куч”(HEAP), ни “сборки мусора”, как это предусматривается в АЛГОЛЕ-68. Наконец, сам по себе “C” не обеспечивает никаких возможностей ввода-вывода: здесь нет операторов READ или WRITE и никаких встроенных методов доступа к файлам. Все эти механизмы высокого уровня должны обеспечиваться явно вызываемыми функциями.

Аналогично, язык “C” предлагает только простые, последовательные конструкции потоков управления: проверки, циклы, группирование и подпрограммы, но не мультипрограммирование, параллельные операции, синхронизацию или сопрограммы.

Хотя отсутствие некоторых из этих средств может выглядеть как удручающая неполноценность (“выходит, что я должен обращаться к функции, чтобы сравнить две строки символов?!”), но удержание языка в скромных размерах дает реальные преимущества. Так как “C” относительно мал, он не требует много места для своего описания и может быть быстро выучен. Компилятор с “C” может быть простым и компактным. Кроме того, компиляторы легко пишутся; при использовании современной технологии

можно ожидать написания компилятора для новой ЭВМ за пару месяцев и при этом окажется, что 80 процентов программы нового компилятора будет общей с программой для уже существующих компиляторов. Это обеспечивает высокую степень мобильности языка. Поскольку типы данных и стуктуры управления, имеющиеся в “C”, непосредственно поддерживаются большинством существующих ЭВМ, библиотека, необходимая во время прогона изолированных программ, оказывается очень маленькой. На PDP -11, например, она содержит только программы для 32-битового умножения и деления и для выполнения программ ввода и вывода последовательностей. Конечно, каждая реализация обеспечивает исчерпывающую, совместимую библиотеку функций для выполнения операций ввода-вывода, обработки строк и распределения памяти, но так как обращение к ним осуществляется только явно, можно, если необходимо, избежать их вызова; эти функции могут быть компактно написаны на самом “C”.

Опять же из-за того, что язык “C” отражает возможности современных компьютеров, программы на “C” оказываются достаточно эффективными, так что не возникает побуждения писать вместо этого программы на языке ассемблера. Наиболее убедительным примером этого является сама операционная система “UNIX”, которая почти полностью написана на “C”. Из 13000 строк программы системы только около 800 строк самого низкого уровня написаны на ассемблере. Кроме того, по существу все прикладное программное обеспечение системы “UNIX” написано на “C”; подавляющее большинство пользователей системы “UNIX”(включая одного из авторов этой книги) даже не знает языка ассемблера PDP-11.

Хотя “C” соответствует возможностям многих ЭВМ, он не зависит от какой-либо конкретной архитектуры машины и в силу этого без особых усилий позволяет писать “переносимые” программы, т.е. программы, которые можно пропускать без изменений на различных аппаратных средствах. В наших кругах стал уже традицией перенос программного обеспечения, разработанного на системе “UNIX”, на системы ЭВМ: HONEYWELL, IBM и INTERDATA. Фактически компиляторы с “C” и программное обеспечение во время прогона программ на этих четырех системах, по-видимому, гораздо более совместимы, чем стандартные версии фортрана американского национального института стандартов (ANSI). Сама операционная система “UNIX” теперь работает как на PDP-11, так и на INTERDATA 8/32. За исключением программ, которые неизбежно оказываются в некоторой степени машинно-зависимыми, таких как компилятор, ассемблер и отладчик. Написанное на языке “C” программное обеспечение идентично на обеих машинах. Внутри самой операционной системы 7000 строк программы, исключая математическое обеспечение языка ассемблера ЭВМ и управления операциями ввода-вывода, совпадают на 95 процентов.

Программистам, знакомым с другими языками, для сравнения и противопоставления может оказаться полезным упоминание нескольких

Деннис Ритчи – создатель языка программирования Cи. Он вместе с Кеном Томпсоном разработал Cи для создания операционной системы UNIX. «У Ньютона есть фраза о стоящих на плечах гигантов», – говорит Брайан Керниган. «Мы все стоим на плечах Денниса».

«Практически все в веб создано на основе – Cи и UNIX», – рассказал изданию Wired Роб Пайк (Rob Pike), легенда программирования. – «На языке Cи написаны браузеры. На ядре UNIX работает почти весь Интернет, и оно также написано на языке Си. Веб серверы – написаны на языке C. А если не на нем, то на Java или C++. А эти языки производные от Си. Python и Ruby также базируются на Cи. Я ручаюсь за то, что все сетевое оборудование работает на программах, написанных на С. Действительно трудно переоценить то, что, сколько всего в современной информационной экономике основано на работе Денниса».

«Недаром же Windows, когда-то написали на Cи, – добавляет он. А UNIX лежит и в основе настольной операционной системе Apple, Mac OS X и IOS. Эти системы установлены в iPhone и iPad».

Профессиональное становление

Деннис Макалистэр Ритчи (Dennis MacAlistair Ritchie) родился 9 сентября 1941 года. Его родной город – Бронксвилль, штат Нью-Йорк. Детство Денниса проходило в Нью-Джерси. Он окончил престижный американский ВУЗ - Гарвард. Особый интерес юного инженера вызвала местная компьютерная система Univac I. Там он получил степень бакалавра по физике и прикладной математике. После окончания обучения Ритчи устроился лаборантом в компьютерную лабораторию института MIT. Там он занимался поддержкой парка машин, а также разработкой софта.

Примерно в это же время он заинтересовался разработкой операционных систем для более компактных, настольных, компьютеров. (Тогда вычислительные машины «стандартного размера» занимали целые комнаты). MIT и General Electric поддержали его проект. Несмотря на отсутствие образования в области разработки ПО, для Денниса программирование никогда не было проблемой. Написание программ было для него подобно разгадыванию пазла.

В 1967 году Ритчи начал работать в лаборатории Bell Labs, где и сформировалась база для всех наиболее известных на сегодняшний день компьютерных изобретений. Но на тот момент Bell Labs был ведущим телекомпровайдером в стране.


Bell Labs

Начав работать в Bell Labs, Ритчи не стал фокусироваться на каком-то одном проекте: «Мне просто хотелось быть среди людей с разнообразным опытом и множеством идей. Поэтому я начал работать над несколькими проектами сразу, чтобы найти свой путь в профессии».

В компании Деннис начал работать с Кеннетом Томсоном, который присоединился к Bell Labs годом ранее, в 1966 году. Оба поняли, что «миниатюрные» настольные компьютеры будут набирать все большую популярность уже в начале 1970-х годов. Они также решили, что таким компьютерам необходим механизм, обеспечивающий управление аппаратными средствами компьютера, организующий работу с файлами и выполнение прикладных программ, осуществляющий ввод и вывод данных.

Так разработчики пришли к идее операционной системы. Изобретение языка Cи и роль Ритчи в разработке UNIX вместе с Кеном Томпсоном сделали его пионером современной вычислительной техники, как пишут в сети.

UNIX и Cи

Все началось в 1963 году, задолго до того, как Ритчи пришел в Bell Labs, – с проекта МАС (Multiple Access Computer, Machine-Aided Cognition, Man and Computer) начался как чисто исследовательский проект в MIT.

В рамках проекта МАС была разработана операционная система CTSS (Compatible Time-Sharing System). Во второй половине 60-х было создано несколько других систем с разделением времени, например, BBN, DTSS, JOSS, SDC и Multiplexed Information and Computing Service (MULTICS) в том числе.

Multics – совместная разработка MIT, Bell Telephone Laboratories (BTL) и General Electric (GE) по созданию ОС с разделением времени для компьютера GE-645. Последний компьютер под управлением Multics выключили 31 октября 2000 года.

Однако BTL отошел от этого проекта еще в начале 1969 года.

Кен Томпсон и Деннис Ритчи захотели продолжить работу самостоятельно. Томпсон работал над игрой Space Travel на GE-635. Ее написали сначала для Multics, а потом переписали на Фортране под GECOS на GE-635. Игра моделировала тела Солнечной системы, а игроку надо было посадить корабль куда-нибудь на планету или спутник.

Ни софт, ни железо этого компьютера не годились для такой игры. Томпсон искал альтернативу, и переписал игру под бесхозный PDP-7. Память была объемом 8К 18-битных слов, и еще был процессор векторного дисплея для вывода красивой для того времени графики.

Томпсон и Ритчи полностью вели разработку на кросс-ассемблере на GE и переносили код на перфолентах. Томпсону это активно не нравилось, и он начал писать ОС для PDP-7, начиная с файловой системы. Так появилась UNIX.

Ядро UNIX было написано на ассемблере, но вскоре Деннис и Кен поняли, что им необходим язык «более высокого уровня», который дал бы им больше контроля над всеми данными. Примерно в 1970 году, они попытались создать вторую версию ядра на языке Fortran, но результат не оправдал ожиданий. Тогда Ритчи предложил новый язык, основанный на создании Томпсона, известный как B(Би).

PDP-7 UNIX также положил начало высокоуровневому языку B, который создавался под влиянием языка BCPL. Деннис Ритчи сказал, что В - это Си без типов. BCPL помещался в 8 Кб памяти и был тщательно переработан Томпсоном. В постепенно вырос в С.


Изображение из книги «Язык Си»: M. Уэйт, С. Прата, Д. Мартин

В был интерпретируемым языком – то есть исходный код частями преобразовывался в машинный код в процессе выполнения специальной программой. Cи был компилируемым языком. Он переводился в машинный код, а затем непосредственно выполнялся в CPU. Но в те дни Cи считался языком высокого уровня. Он предоставил Ритчи и Томпсону больше гибкости, в которой они нуждались, и в то же время, выполнялся быстрее.

Первая версия языка Си не сильно отличалась от версии, которую мы знаем сегодня. Хотя она была чуть проще. Она предлагала структуры данных и «типы» переменных. И это то, что Ритчи и Томпсон использовали для создания их нового ядра UNIX. «Они создали C для того, чтобы написать программу», – говорит Пайк, который присоединился к Bell Labs спустя 10 лет. «А программу, которую они хотели написать, называлась ядро UNIX».

«Когда вы пишете большую программу как UNIX – вы должны управлять взаимодействиями между самыми разными компонентами: пользователями, файловой системой, дисками, выполнением программы, и для того, чтобы управлять этим эффективно, вы должны иметь хорошее представление о информации с которой работаете. Мы называем ее структурами данных», – говорит Пайк.

«Написать ядро без структуры данных, с таким же строением и совершенством, как ядро UNIX – было бы намного сложнее. Им необходим был способ группировки всех данных, а реализовать это в Fortran было не возможно».

В то время это был необычный способ написания операционной системы, и именно это позволило Ритчи и Томпсону, в конечном счете, перенести операционную систему на другие платформы, что они и сделали в конце 70-х. «Это открыло шлюзы для работы UNIX на любой платформе», – говорит Пайк. «Все это стало возможным благодаря Cи».

«Незримый король»

«Разработка языка программирования Cи стала огромным шагом вперед и правильным компромиссом … В Си нашелся правильный баланс, позволяющий писать на высоком уровне, что стало более продуктивным, а в нужный момент, можно было контролировать все что происходит», – рассказывает Билл Далли, главный научный сотрудник NVIDIA и Bell Professor of Engineering в Стэнфорде. «[Си ] задает тон в программировании в течение нескольких десятилетий».

Как уже отмечалось Пайком, структуры данных, которые Ритчи встроил в Cи, в конечном итоге, привели к объектно-ориентированной парадигме, используемой такими современными языками, как C++ и Java.

Революция началась в 1973 году, когда Ритчи опубликовал свою научную работу о языке, а спустя пять лет, вместе со своим коллегой Брайаном Керниганом выпустил книгу: «Язык программирования Cи». Ранее Керниган уже писал учебники по языку, и в какой-то момент, он убедил Денниса написать книгу с ним.

Пайк прочитал книгу, будучи студентом Торонтского университета. Он взял книгу, когда возвращался домой из-за болезни. «Этот справочник – образец ясности и четкости изложения по сравнению с недавно вышедшими справочниками. Он по праву является классикой», – говорит он. «Я прочитал его, когда лежал больной в постели, и он заставил меня забыть о болезни».

Как и многие студенты университета, Пайк уже программировал на этом языке. Си распространился по всем кампусам колледжа, поскольку в Bell Labs начали раздавать исходный код UNIX. Помимо всего операционная система дала толчок к развитию современного движения свободного программного обеспечения. Пайк не преувеличивает, когда говорит, что вклад Ритчи невозможно переоценить. И хотя Ритчи получил премию Тьюринга в 1983 году и Национальную медаль в области технологий в 1998 году, ему до сих пор не воздали должное.

Керниган и Пайк описывают Ритчи как необычайно скрытного человека. «Более 20 лет я проработал на противоположной стороне зала, и все же, считаю, что не знал его хорошо», – говорит Пайк.

Стив Джобс также был скрытным человеком, и его позиционирование на скрытности только усилило культ личности, окруживший его. Ритчи жил в совершенно иное время и работал в совершенно иных условиях в отличии от таких как Джобс. Возможно, поэтому Ритчи не был столь популярен.

«Джобс был зримым королем, а Ритчи, преимущественно, незримым королем», – так сказал Мартин Ринард, профессор электротехники и компьютерных наук Массачусетского технологического института и член Computer Science and Artificial Intelligence Laboratory.

«Гений Джобса состоит в том, что он имел вкус и создавал продукты, которыми люди хотели пользоваться. И он мог создавать вещи, которые, по-настоящему, нравились людям. Ритчи создал то, что технари смогли использовать для создания базовой инфраструктуры. Людям не обязательно ее видеть, несмотря на то, что они используют ее каждый день».

После UNIX

Основная проблема UNIX, с точки зрения ее же авторов, заключалась в том, что в силу своей архитектуры ОС не могла прозрачно приспособиться к значительно изменившемуся со времен ее разработки IT-миру. Проще говоря, UNIX умирала от собственных проблем, а все попытки приспособить ее к современным условиям приводили к усложнению ОС, введению множества разрозненных, сложных API, новых прослоек, сетевых протоколов, форматов данных, что сделало когда-то простую, продуманную, элегантную ОС тяжелым, неповоротливым и сложным в сопровождении комком кода.

Вспоминая успехи UNIX, Ритчи продолжал до самой смерти исследования в области операционных систем и языков программирования. Он внес значительный вклад в разработку операционных систем Plan 9 и Inferno, а также языка программирования Limbo.

Когда исследователи из Bell Labs поняли, что UNIX уже не исправить они решили начать с нуля и разработали новую, никак не связанную и несовместимую с UNIX, операционную систему с эксцентричным именем Plan 9.


Главная идея Plan 9 заключалась в том, чтобы довести концепцию «все есть файл» до логического триумфа и построить из синтетических файлов всю ОС (а если говорить конкретнее – представить все ресурсы операционной системы файлами). Причем сделать это так, чтобы к файлам имели доступ не только локальные приложения и пользователи, но и любой удаленный клиент. В результате появился файловый протокол 9P.
В 1995 году компания Lucent Technologies, новый владелец исследовательских лабораторий Bell Labs, перевела многих разработчиков Plan 9 в другую команду, которая занялась созданием операционной системы Inferno, построенной на базе Plan 9.

Руководство компании не без оснований полагало, что Plan 9, способная прозрачно и легко работать на компьютерах, организованных в распределенную вычислительную сеть, отлично покажет себя на маломощных мобильных устройствах и терминалах, которые в то время были просто обязаны перекладывать львиную долю своих функций на другие машины, чтобы обеспечить оптимальную производительность и удобство использования.

Кроме переносимости и производительности, Inferno обладает еще одной очень важной особенностью: наличием языка прикладного программирования Limbo, который был разработан с нуля специально для Inferno и существует только в рамках этой ОС. Его синтаксис во многом повторяет синтаксис Си, но имеет вкрапления из множества других языков.

Конец легенды

12 октября 2011 года Ритчи был найден мёртвым у себя дома в Нью-Джерси, где проживал в одиночестве. Первые новости о смерти сообщил его бывший коллега Роб Пайк: «Деннис Ритчи скончался в эти выходные у себя дома». Причина и точное время смерти остались неизвестными. Незадолго до этого он лечил рак простаты, также у него было больное сердце. Ритчи умер спустя неделю со смерти Стива Джобса, но в отличие от Джобса, смерть Ритчи была мало освещена в СМИ.

Деннис Ритчи - это человек создавший очень популярный язык программирования - "C", или как его еще называют - "Отец языка программирования С". Деннис родился 9 сентября 1941 года в Бронксвиле, штат Нью-Йорк. Его отец Алистер Ритчи работал системным инженером в Bell Labalatories.

Немного позже Ритчи с семьей переехали в Нью-Джерси, окончил высшую школу Саммита, затем получил степень бакалавра в Гарвардском университете, в области физики и математики в 1963, а потом Доктора философии математики в 1968.

Деннис - один из ключевых разработчиков ядра Unix, а также соавтор книги "Денис Ритчи Язык программирования С". Он работал с Кеном Томсоном, человеком, который написал оригинальный Unix. Позже он работал над языком Си вместе с Брайеном Керниганом, их вместе еще называли K & R - Керниган и Ритчи. Денис сделал очень большой вклад в Unix. Особенно в то, что Unix была портирована для различных платформ. Его идеи до сих пор живут в центре дизайна операционных систем практически во всех новых языках программирования и в каждом бите информации.

Карьера Ритчи

Деннис Ритчи начал свою карьеру в 1967 году - Bell Laboratories, центре вычислительных исследований. Это один из самых известных центров цифровых инноваций в мире, а также место где родился транзистор.

Джон Ким, президент Alcatel-Lucent Bell Labs, говорил:

Деннис хорошо относился к своим коллегам в Bell Labs, и нам его будет очень не хватать. Он по-настоящему вдохновлял всех нас. Не только своими многочисленными достижениями, а еще и потому что он был другом, изобретателем, скромным и милым человеком. Мы хотели бы выразить глубочайшие соболезнования семье Ритчи и всем кто каким-либо образом был с ним связан.

Unix

В Bell Labs Ритчи работал над проектом Multics. Эта то была операционная система, которая должна была совместить идею пакетной обработки и интерактивности. Программа запускалась из карточного стека, и программист, оператор или сам пользователь имел полный контроль над выполнением программы. Тогда Денис встретил Кена Томсона, который позже станет одним из главных сотрудников Ритчи:

Одной из очевидных вещей почему коммерческий успех Multics не состоялся было то что она очень сложна. В ней было слишком много всего - Деннис Ритчи

Вскоре Bell Labs перестали работать над Multics, но Ритчи и Кен решили не отказываться от идеи взаимодействия с пользователем, и начали работать над его приемником - Unix. Теперь это современная операционная система, ее распространение началось в 1973 году.

Язык программирования Си

Разнообразие компьютерных платформ семидесятых годов плохо отразилось на жизни создателей программного обеспечения. Им нужно было либо тратить время и энергию на создание своего программного обеспечения для различных новых платформ, либо ограничить свои программы работой только на одной платформе.

Оригинальное ядро Unix было написано на ассемблере, но Ритчи и Кен решили, что им нужен язык высокого уровня, чтобы получить больше контроля над всеми данными и операционной системой.

Они использовали BCPL (Basic Combined Programming Language) чтобы написать UNIX, сжали его до восьми килобайт и переименовали в B.

Потом Ритчи пошел еще дальше и разработал новый язык программирования, называемый С. Это была модернизация языка B, добавившая типы данных и новый синтаксис. B был интерпретируемым языком, для его выполнения была необходима прослойка между процессором и командами языка, Си же компилируемый. Он сначала переводится в машинный код, а затем уже выполняется непосредственно процессором.

UNIX - простая операционная система, но вы должны быть гением чтобы понять ее простоту. - Деннис Ритчи

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

Ритчи и Кен переписали UNIX на Си, и это дало ему возможность переносимости, а также дало возможность программистам использовать одну операционную систему, один язык программирования и небольшой набор инструментов. Поэтому Unix позже и занял свое место операционной системы для экспериментов и создания сетей между компьютерами.

"Очевидно, что человек, который имел наибольшее влияние на мою карьеру это Кен Томпсон." - Деннис Ритчи

В 1978 году была издана книга Денниса Ритчи и Браена Кенигана - Язык программирования Си. Книга охватывает краткое введение в язык Си, а также различные техники и стили программирования. Эта книга остается практическим руководством для многих программистов до сих пор.

К середине 1980 язык Си стал одним из самых популярных языков программирования в мире. Из-за функциональности и скорости, с которой Си может быть легко использован для создания программного обеспечения и запуска его на различных платформах, многие компании начали использовать Си для разработки своих продуктов.

Язык программирования Си все еще используется в настоящее время как второй по популярности язык программирования в мире для создания прикладных систем, операционных систем, и развития встраиваемых систем. Его влияние все еще заметно во многих современных языках. Так же как и концепции UNIX сейчас считаются вычислительными заповедями.

"С уже был реализован для нескольких совершенно различных машин и операционных систем, UNIX уже распространяется на PDP-11, но переносимость всей системы была совершенно новой." - Денис Ритчи

Последний важный вклад, который сделал Деннис Ритчи в Unix, это механизм потоков, который используется для соединения устройств, приложений и протоколов.

Windows, Mac, Linux и...

Многочисленные приложения написаны на С или на его объективно ориентированном потомке С++. Си был стандартизирован ANSI и ISO, потому что на основе него сегодня строится почти каждый аспект информационной индустрии.

В качестве примера языков, которые были созданы позже на основе Си можно привести С++ или JavaScript, кроме того, браузеры написаны на Си. Microsoft Windows изначально была написана на Си, и даже обе операционных системы от Apple основаны на Unix.

Нет никаких сомнений, что вклад Денниса Ритчи значительно изменили ядро компьютерной индустрии.

Стиль программирования, который обеспечивается в Си, вероятно, будет использоваться все меньше и меньше. Но JavaScript и XML будут продолжать становиться все более важными. - Деннис Ритчи

Ричти позже стал руководителем департамента исследований компьютерных систем в Lucent Technologies и стремился сделать компьютеры проще и лучше для пользователей, вплоть до своего выхода на пенсию в 2007 году.

Награды

  • Награда АСМ за выдающиеся успехи в системах и языках в 1974 году.
  • Награда IEEE Emmanuel Piore в 1982
  • Награда сотруднику Bell Labs в 1984
  • Премия имени Тьюринга в 1983 году
  • Награда ACM Software Systems в 1983
  • Был номинирован Национальной академией инженеринга Соединенных Штатов Америки в 1963
  • Медаль IEEE Хэмминга в 1990.
  • Член музея компьютерной истории в 1997 году.
  • Национальная медаль Соединенных Штатов от президента Билла Клинтона за его работу над операционной системой UNIX и языком программирования C В апреле 1999 года.
  • Премия от Industrial Research Institute за его ценный вклад в науку и технологии в 2005 году.
  • Японская премия по информатизации и разработке UNIX в 2011 году.

Все награды, которые получил Деннис Ритчи также получил и Кен Томсон.

Смерть Ритчи

Деннис жил сам в своем доме в Беркли Хайтс штат Нью Джерси. Был найден мертвым 12 октября 2011 года. Причины и точное время смерти неизвестны. Последние несколько лет у него было слабое здоровье после лечения рака предстательной железы и сердечно сосудистых заболеваний.

Он умер через неделю после смерти Стива Джобса, но это не было так ярко освещено прессой. Релиз Fedora Linux 16 в 2012 году был посвящен памяти Денниса Ритчи.

Пол Крези, компьютерный историк, после смерти Ритчи сказал.

Спасибо, что скачали книгу в бесплатной электронной библиотеке Royallib.ru

Эта же книга в других форматах

Приятного чтения!

Б. Керниган, д. Ритчи

Язык программирования Си

Издание 3-е, исправленное

Предисловие

С момента публикации в 1978 г. книги "Язык программирования Си" в мире компьютеров произошла революция. Большие машины стали еще больше, а возможности персональных ЭВМ теперь сопоставимы с возможностями больших машин десятилетней давности. Язык Си за это время также изменился, хотя и не очень сильно; что же касается сферы применения Си, то она далеко вышла за рамки его начального назначения как инструментального языка операционной системы UNIX.

Рост популярности Си, накапливающиеся с годами изменения, создание компиляторов коллективами разработчиков, ранее не причастных к проектированию языка, - все это послужило стимулом к более точному и отвечающему времени определению языка по сравнению с первым изданием книги. В 1983 г. Американский институт национальных стандартов (American National Standards Institute - ANSI) учредил комитет, перед которым была поставлена цель выработать "однозначное и машинно-независимое определение языка Си", полностью сохранив при этом его стилистику. Результатом работы этого комитета и явился стандарт ANSI языка Си.

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

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

Мы попытались сохранить краткость первого издания. Си - небольшой язык, и чтобы его описать большой книги не требуется. В новом издании улучшено описание наиболее важных средств, таких как указатели, которые занимают центральное место в программировании на Си; доработаны старые примеры, а в некоторые главы добавлены новые. Так, для усиления трактовки сложных объявлений в качестве примеров включены программы перевода объявлений в их словесные описания и обратно. Как и раньше, все примеры были протестированы прямо по текстам, написанным в воспринимаемой машиной форме.

Приложение A - это справочное руководство, но отнюдь не стандарт. В нем мы попытались уложить самое существенное на минимуме страниц. По замыслу это приложение должно легко читаться программистом-пользователем: для разработчиков же компилятора определением языка должен служить сам стандарт. В приложении B приведены возможности стандартной библиотеки. Оно также представляет собой справочник для прикладных программистов, но не для разработчиков компиляторов. Приложение C содержит краткий перечень отличий представленной версии языка Си от его начальной версии.

В предисловии к первому изданию мы говорили о том, что "чем больше работаешь с Си, тем он становится удобнее". Это впечатление осталось и после десяти лет работы с ним. Мы надеемся, что данная книга поможет вам изучить Си и успешно его использовать.

Мы в большом долгу перед друзьями, которые помогали нам в выпуске второго издания книги. Джон Бентли, Дуг Гунн, Дуг Макилрой, Питер Нельсон и Роб Пайк сделали четкие замечания почти по каждой странице первого варианта рукописи. Мы благодарны Алу Ахо, Деннису Аллиссону, Джою Кемпбеллу, Г. Р. Эмлину, Карен Фортганг, Аллену Голубу, Эндрю Хьюму, Дэйву Кристолу, Джону Линдерману, Дэйву Проссеру, Гину Спаффорду и Крису Ван Уику за внимательное прочтение книги. Мы получили полезные советы от Билла Чезвика, Марка Кернигана, Эндрю Коэнига, Робина Лейка, Тома Лондона, Джима Ридза, Кловиза Тондо и Питера Вайнбергера. Дейв Проссер ответил на многочисленные вопросы, касающиеся деталей стандарта ANSI. Мы широко пользовались транслятором с Си++ Бьерна Страуструпа для локальной проверки наших программ, а Дейв Кристол предоставил нам ANSI Си-компилятор для окончательной их проверки. Рич Дрешлер очень помог в наборе книги. Мы искренне благодарим всех.

Брайан В. Керниган, Деннис М. Ритчи



Рекомендуем почитать

Наверх