Глава III. Язык C и переписывание ядра
От B к C: рождение нового языка
Если Unix — тело, то язык C — душа. Их история неразрывна. В начале 1970-х Unix был написан на ассемблере PDP-11 и на языке B, созданном Кеном Томпсоном. B был интерпретируемым, бестиповым языком, унаследовавшим черты BCPL Мартина Ричардса. Для написания операционной системы он не годился: медленный, неэффективный в работе с памятью, без поддержки структур данных.
Деннис Ритчи взял B и радикально переработал его. Он добавил типы (int, char, float, указатели), ввёл структуры (struct), изменил механизм передачи параметров. Так родился язык C — названный просто следующей буквой алфавита после B.
Ритчи не пытался создать язык для всех случаев. C был спроектирован с одной целью — писать операционные системы. Отсюда его близость к аппаратуре, прямой доступ к памяти через указатели, минимальный рантайм. Компилятор, написанный самим Ритчи в 1972 году, был простым и эффективным. Он генерировал удивительно компактный машинный код — сопоставимый с тем, что писал человек на ассемблере.
Переписывание ядра Unix на C
В 1973 году Томпсон и Ритчи приняли судьбоносное решение: переписать ядро Unix с ассемблера PDP-11 на C. Это был акт огромной смелости. Никто до них не пытался написать операционную систему на "высокоуровневом" языке — считалось, что ОС должна быть максимально близка к железу.
Перенос начался с компилятора: Томпсон написал компилятор C, который генерировал код PDP-11. Затем ядро было переписано на C — около 10 000 строк кода. Результат превзошёл все ожидания. Система не только работала, но и оказалась стабильнее ассемблерной версии. Код стал более читаемым, его было легче отлаживать и модифицировать.
Ритчи неоднократно подчёркивал, что C позволил сделать Unix переносимой. Пока используется компилятор C под новую архитектуру, операционная система может быть перенесена с минимальными изменениями. Это было революционное утверждение.
Революция переносимости
После переписывания ядра на C Unix перестал быть привязанным к PDP-11. Это открыло путь к портированию на другие аппаратные платформы. Первый порт был сделан на Interdata 8/32 в 1977 году — всего через четыре года после переписывания ядра. С тех пор Unix была перенесена на десятки архитектур: от IBM System/360 до персональных компьютеров на Intel 8086.
В 1975 году вышла версия V6, ставшая точкой отсчёта для всего последующего развития. V6 была первой версией, широко распространявшейся за пределами Bell Labs. Академические лицензии стоили символическую сумму — 200 долларов — и включали полные исходные коды. Именно V6 легла в основу как BSD, так и ранних коммерческих версий Unix.
V6 представила многое из того, что мы сегодня считаем неотъемлемой частью Unix: make, diff, sed, grep (написанный Кеном Томпсоном за одну ночь!). Формат man-страниц, нотация регулярных выражений, иерархия каталогов — всё это кристаллизовалось в V6.
Язык C как культурный феномен
C не просто позволил Unix стать переносимой. Он изменил то, как пишут программы. Влияние C на индустрию сложно переоценить. C++ (подмножество C с классами), C#, Objective-C, Java (C++ с гарниром из Smalltalk), Go, Rust — все они несут отпечаток синтаксиса и идей Ritchie.
Язык из инструмента превратился в философию. Доверие к программисту (pointer arithmetic — ок, но ты сам отвечаешь за последствия), минимализм (сколько фич в C? очень мало), эффективность — эти ценности перешли в культуру Unix и Linux.
Заключение
Решение переписать ядро Unix на C было технологическим риском, который окупился стократно. Язык C стал вакциной переносимости, которая позволила Unix выжить и распространиться по всему миру. Без C не было бы ни современного Unix, ни Linux, ни той экосистемы программирования, в которой мы живём сегодня.
Комментарии
Комментарии пока не подключены.