Глава 1. Предпосылки и создание языка
1.1. Краткая характеристика языка C и его особенностей
1.1.1 Исторический контекст появления языка C
Язык C был создан в период с 1969 по 1973 годы сотрудником Bell Labs Деннисом Ритчи. Его появление неразрывно связано с разработкой операционной системы UNIX. Изначально UNIX писалась на ассемблере, что создавало проблемы при переносе системы на другие аппаратные платформы. Кен Томпсон, соавтор UNIX, создал язык B как промежуточное решение, но он оказался слишком ограниченным.
Схема 1.1 · Генеалогическое древо языка C
%%{init: {'theme':'base', 'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e4a76',
'primaryBorderColor': '#7ca2c9',
'lineColor': '#2b6a9e',
'secondaryColor': '#f6faff',
'background': '#ffffff'
}}}%%
flowchart LR
A[CPL
1960-е] --> B[BCPL
1967]
B --> C[Язык B
1969]
C --> D[Язык NB
1971]
D --> E[Язык C
1972]
E --> F[UNIX на C
1973]
E --> G[K&R C
1978]
G --> H[ANSI C
1989]
H --> I[C99/C11/C17/C23]
Развитие: BCPL → B → C. Появление типизации — ключевое отличие C от предшественников.
К 1973 году язык C стал достаточно мощным, чтобы на нём можно было переписать ядро UNIX — это стало одним из первых примеров операционной системы, написанной не на ассемблере.
1.1.2 Ключевые особенности языка C
Язык C занимает уникальное положение: он сочетает возможности высокоуровневого языка с эффективностью, близкой к ассемблеру.
Схема 1.2 · Базовые характеристики языка C
%%{init: {'theme':'base', 'themeVariables': {
'primaryColor': '#ffffff',
'primaryTextColor': '#1e4a76',
'primaryBorderColor': '#7fa9d1',
'lineColor': '#2b6a9e',
'secondaryColor': '#eef6ff',
'background': '#ffffff'
}}}%%
mindmap
root((Язык C))
Парадигмы
Процедурное программирование
Структурное программирование
Модульность
Типизация
Статическая
Слабая
Явная
Управление памятью
Ручное
Указатели
Адресная арифметика
Области применения
Системное программирование
Операционные системы
Встраиваемые системы
Драйверы
Влияние
Синтаксическая основа
Базовый язык для C++
Вдохновитель Java/C#
1. Процедурная и структурная парадигма
C организует код в виде функций, не поддерживает классы, но даёт мощные средства структурного программирования.
2. Система типов
Главное нововведение C — статическая типизация. Появились:
- базовые типы:
int, char, float, double;
- модификаторы:
short, long, unsigned, signed;
- производные: массивы, структуры, объединения, указатели.
// Пример 1.1. Объявление переменных различных типов в C
int count = 25; // целое
float price = 19.99f; // плавающее
char grade = 'A'; // символ
unsigned int positive = 100; // беззнаковое
long large = 1000000L; // длинное целое
Пример 1.1 · Декларации типов в C
3. Указатели и работа с памятью
Важнейшая особенность C — указатели, переменные хранящие адреса памяти. Это даёт прямой доступ к памяти и высокую производительность, но требует аккуратности.
Схема 1.3 · Визуализация работы указателя
Переменная x Указатель ptr
┌─────────────┐ ┌─────────────┐
│ 42 │ │ 0x7ffd40 │
└─────────────┘ └─────────────┘
│ │
└──────────────────────────────────┘
(ptr хранит адрес x)
Адрес в памяти: 0x7ffd40 0x7ffd44 0x7ffd48
// Пример 1.2. Использование указателей в C
int x = 42;
int *ptr = &x; // ptr хранит адрес x
printf("Значение x: %d\n", x); // 42
printf("Адрес x: %p\n", &x); // 0x7ffd40
printf("Значение ptr: %p\n", ptr); // 0x7ffd40
printf("Разыменование ptr: %d\n", *ptr); // 42
Пример 1.2 · Работа с указателем
4. Близость к аппаратному обеспечению
Операции ++, --, += и адресная арифметика транслируются в эффективные машинные команды.
5. Переносимость
C спроектирован как переносимый язык: программы можно компилировать под разные платформы при соблюдении стандартов.
6. Минималистичная стандартная библиотека
Ядро языка невелико, функции ввода-вывода и работы со строками вынесены в подключаемые заголовки.
// Пример 1.3. Минимальная программа на C
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
Пример 1.3 · Hello World
1.1.3 Стандартизация языка C
Долгое время стандартом служила книга Кернигана и Ритчи (1978) — K&R C. Позже появились официальные стандарты.
Таблица 1.1 · Эволюция стандартов C
| Год | Стандарт | Ключевые нововведения |
| 1978 | K&R C | Структуры, long, unsigned, += |
| 1989 | ANSI C (C89) | Прототипы функций, стандартная библиотека |
| 1999 | C99 | inline, long long, комментарии // |
| 2011 | C11 | Многопоточность, атомарные операции |
| 2024 | C23 | Текущая редакция |
Стандартизация C повлияла на C++: заимствованы комментарии //, объявления в любом месте и др.
Роль C как предка C++ (кратко)
Бьерн Страуструп выбрал C благодаря эффективности, распространённости и гибкости. Но ограничения C (отсутствие ООП, ручное управление памятью, слабая типизация) привели к созданию "C with Classes" — будущего C++.
| Ограничение C | Описание |
| Отсутствие ООП | Невозможно выражать классы и объекты |
| Ручное управление памятью | Риск утечек и ошибок с указателями |
| Слабая типизация | Неявные преобразования типов |
| Нет шаблонов | Отсутствие обобщённого программирования |
Светлая заливка схем 1.1 и 1.2 — фон изменён на белый с лёгкими тенями, текст контрастный. Все схемы адаптированы для максимальной читаемости на бумаге.
✓ Охвачены пункты 1.1.1–1.1.3 и детально пункт 3. Указатели и память.