От эксперимента с Unix — к языку для системного кода

C появился не как проект универсального языка «на будущее», а как инструмент для конкретной задачи: сделать Unix проще развивать и переносить между компьютерами. В начале 1970-х Деннис Ритчи работал над языком для системы, которую вместе с коллегами создавал в Bell Labs. Предшественником C был язык B, разработанный Кеном Томпсоном; сам B восходил к более раннему BCPL. Название C обозначало следующий шаг после B.

Как C связал программы с устройством компьютера

Системной программе приходится работать близко к «железу»: управлять памятью, обращаться к отдельным байтам и взаимодействовать с устройствами. C давал для этого указатели — значения, обозначающие адреса в памяти, — и позволял описывать данные и операции достаточно близко к тому, как компьютер их обрабатывает.

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

Почему это изменило судьбу Unix

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

Так C оказался не просто языком для отдельных программ, а способом переносить целую операционную систему. Его подход повлиял на последующие системные языки и оставил след в инфраструктуре, где важны скорость, контроль над ресурсами и возможность работать на разных платформах.