Сравнение языков программирования
C: Язык, на котором работает все остальное
C — это язык, лежащий в основе всего остального: ядер, драйверов, интерпретаторов, которые работают на ваших серверах Python, механизмов баз данных, лежащих в основе ваших веб-сайтов. Для операционных команд C — это не то, что вы пишете каждый день, а скорее то, что вы должны бегло читать, потому что описания CVE, трассировки стека и дампы ядра ведут свою работу в словаре C. Это специальная статья, посвященная нашему сравнению C и C++.
Главное
- Модель честная: ручная память через malloc/free, арифметика с указателями и неопределенное поведение как истина уровня спецификации, а не категория ошибок; Дисциплина, которая делает C быстрым, — это та же самая дисциплина, которая делает небрежное C дорогим.
- Неопределенное поведение — это вращающаяся опасность: индексация за пределами границ, знаковое переполнение, классы использования после освобождения, которые напрямую соответствуют семействам CVE, обеспечивающим безопасность памяти (почти одно за другим включающиеся в данные CVE за десятилетия); фаззеры (инструменты класса AFL-libFuzzer) и дезинфицирующие средства превращают предположения в условия воспроизведения.
- Инструменты отладки мирового класса, и их стоит знать: gdb, valgrind/memcheck, AddressSanitizer и его родственники (UBSan, Tsan) выявляют классы ошибок во время тестирования, которые только подразумевают трассировку производственного стека; именно эта комбинация является причиной того, что «создавать с использованием дезинфицирующих средств в CI» является внутренним правилом в каждой команде C-тяжело, с которой мы работаем.
- Чтение C — это операционный навык: объявления CVE ссылаются на функции и типы, ошибки сегментов служб создают обратные трассировки в словаре GDB, а сборки пакетов из источников классов дерева портов показывают предупреждения компилятора, которые отделяют качество от мусора; Преимущество читателя незаметно накапливается годами.
- ABI — это соединительная ткань: каждый «интерфейс внешней функции» (ctypes в Python, FFI в Rust, cgo в Go) имеет C-образную форму, поскольку C стал лингва-франка границ библиотек; эта роль сохраняет актуальность C независимо от моды разработчиков.
- Когда C по-прежнему является подходящим инструментом для написания: ядра, драйверы, встроенное ПО и самые внутренние циклы, в которых доминирует поведение кэша; в других местах сравнения языков (Rust для безопасного переписывания небезопасных компонентов C, Go для инструментов управления операциями) охватывают честный современный выбор.
Заметка из практики
Ошибка C, которая заставила нас институционализировать дезинфицирующие средства, заняла три недели, чтобы найти ее с помощью трассировки стека, и три минуты с помощью AddressSanitizer: экосистема компилятора уже знает вещи, которые людям не следует сканировать в 2 часа ночи.
Частые вопросы
Должны ли мы писать новую инфраструктуру на C?
Почти никогда полностью: там, где важен максимальный контроль, ядро и драйверы остаются C; сервисы и инструменты развертывают Python/Go/Rust уже сегодня; C-образный сердечник с безопасными краями — это прагматичная современная форма.
Почему C обвиняют в таком количестве CVE?
Потому что ошибки безопасности памяти живут именно там, где находится UB, и потому что огромная доля критического кода в мире — это C. Менеджеры смягчают последствия с помощью более безопасных инструментов памяти, фаззинга и целенаправленной перезаписи в соответствии с практикой «проактивной разработки».
Как администраторы могут научиться эффективно читать C?
Разберите реальный исходный код сервиса: пакеты с небольшими базами кода (curl — хорошее начало), прочитайте отчеты CVE об исправлениях и попрактикуйтесь с gdb на тестовом поле. Свободное владение — это несколько выходных плюс настоящие артефакты.
Достаточно ли отличается современный C (C17/C23), чтобы изменить историю?
Поэтапно: стандарт постепенно развивается, но модель памяти и ландшафт UB остаются давней реальностью; Инструменты, а не стандартная отработка, — вот где произошел прогресс в области безопасности.
Как мы берём на себя сравнение языков программирования
Это то, чем мы занимаемся каждый день: Языки для работы системы, сценариев и сервисов, сравниваемые по тому, что действительно важно в производстве: гарантии безопасности, чистая скорость, кого вы можете нанять, и насколько болезненно развертывать и исправлять полученные сервисы. Наша услуга Администрирование серверов и Обслуживание сайтов закрывает задачу целиком — оценка, внедрение, круглосуточный мониторинг и экстренная реакция в течение 30 минут.