Но язык C тоже не возник на ровном месте. Тут немного стоит углубиться в историю. Итак, изначально был PDP-7. И было у него машинное слово в 18 бит. Неожиданно? Да, но в 60-х никто такими вещами не заморачивался. И оперировал он только словами — то есть единицей доступа к памяти было слово. Байт еще не изобрели. Шутка, изобрели конечно
И тогда Ken Thompson создал для этой машины язык B. Вот просто так и назвал одной буквой — B. (Кстати, Кен — личность легендарная: вместе с Деннисом Ритчи работал над юниксом, разрабатывал UTF-8 и Go, и многое другое, но об этом не сейчас). Так вот, этот язык, если на него посмотреть, удивительно похож на известный всем C.Небольшая ремарка о том, что из себя представляла PDP-7 внутри: аккумулятор, индексный регистр, еще один регистр данных — ну, собственно, и всёТеперь становится понятно, откуда содрали архитектуру 6800 и 6502 почти полностью
Code: Select all
main( ) {
auto c;
while (1) {
while ( (c=getchar()) != ' ')
if (putchar(c) == '*n') exit();
putchar( '*n' );
while ( (c=getchar()) == ' '); /* skip blanks */
if (putchar(c)=='*n') exit(); /* done when newline */
}
}Но техника развивалась, и появилась знаменитая PDP-11. У нее слово было уже нормальные 16 бит. Целых 8 регистров, очень гибкая система адресации данных. По сравнению с PDP-7 — просто небо и земля. Но что еще немаловажно — команды работали не только со словами, но и с байтами. И в памяти так же можно было обращаться к отдельному байту, а не только слову.
Язык B был портирован на PDP-11, но его возможностей не хватало. И тогда к работе над языком подключился Деннис Ритчи. Так появился язык C. Тут важно акцентировать внимание на том, что вначале было железо, которое проектировалось исходя из соображений «а давайте еще и вот так зафигарим, круто же». А язык допиливался, чтобы покрыть функционал уже существующего железа. И многие решения по языку были продиктованы этим самым железом.
Язык оказался небольшим, понятным, низкоуровневым и удачным, так как достаточно быстро был портирован на другие системы. Язык был невероятно низкоуровневым дял того времени. Интересующиеся могут ознакомиться с алголом и фортраном:) Эффективность кода, который он порождал, была гораздо выше. И главная киллер-фича — можно переносить программы простой перекомпиляцией. Ну почти:) Потому были написаны терабайты софта на C, и так язык стал гегемоном. А после плюсов все вообще пошло под откос
Если сравнить архитектуру и систему команд PDP-11 с более поздними процессорами, то критике можно подвергнуть два момента. Во-первых, мало регистров. Их всего 8, при этом два заняты указателем текущей команды и верхушки стека. То есть у программиста остается всего 6. Локальные переменные на регистрах особо не поразмещаешь — они быстро закончатся. И во-вторых, система адресации хоть и ортогональна, но несколько избыточна и сложна. Но с другой стороны а что делать если переменные по большей части в памяти или стеке? С ними же надо как-то работать.
Позже, в 80-е и далее в 90-е архитектура процессоров была существенно переосмыслена. Стали считать, что регистров надо больше — это позволяет хранить локальные переменные не на стеке, а в регистрах и работать с ними быстрее. А вот сложных команд, которые работают память-память, надо избегать. Команды должны быть простые, прогнозируемые и выполняться за один-два такта. Квинтэссенцией упрощения архитектуры стал RISC/MIPS. Не все были с этим согласны. Интел например продолжал пилить своего легаси монстра х86, что тоже изрядно повлияло на индустрию, но об этом в другой раз
И вот мне тут подумалось как-то: а что было бы, если бы PDP-11 была другой? Тогда, возможно, и язык C выглядел бы иначе? Однозначно иначе. Но как?
Продолжение следует ...