Как написть тетрис не привлекая внимания санитаров. Или поворот в не туда

Locked
UR5FFR
Site Admin
Posts: 2361
Joined: 21 Apr 2012, 22:00
Позывной: UR5FFR
Location: Odessa

Как написть тетрис не привлекая внимания санитаров. Или поворот в не туда

Post by UR5FFR »

Все началось с размышлений на тему «а что, если бы всё сложилось по-другому». Мои размышления как профессионального программиста, который пишет код уже 35+ лет, часто возвращаются к языку C. И к тому чудовищу под названием C++, которое он породил. Чудовище — потому что других слов подобрать невозможно: это сложный, запутанный и противоречивый монстр, который, несмотря на всё свое уродство, используется повсеместно. Потому что куча кода, совместимость и прочий легаси — горел бы он огнем.

Но язык C тоже не возник на ровном месте. Тут немного стоит углубиться в историю. Итак, изначально был PDP-7. И было у него машинное слово в 18 бит. Неожиданно? Да, но в 60-х никто такими вещами не заморачивался. И оперировал он только словами — то есть единицей доступа к памяти было слово. Байт еще не изобрели. Шутка, изобрели конечно :)
Небольшая ремарка о том, что из себя представляла PDP-7 внутри: аккумулятор, индексный регистр, еще один регистр данных — ну, собственно, и всё :) Теперь становится понятно, откуда содрали архитектуру 6800 и 6502 почти полностью
И тогда Ken Thompson создал для этой машины язык B. Вот просто так и назвал одной буквой — B. (Кстати, Кен — личность легендарная: вместе с Деннисом Ритчи работал над юниксом, разрабатывал UTF-8 и Go, и многое другое, но об этом не сейчас). Так вот, этот язык, если на него посмотреть, удивительно похож на известный всем C.

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 */
  }
}
В чем отличие? Нет типов данных. Один тип данных — машинное слово. То самое, которое 18 бит :)

Но техника развивалась, и появилась знаменитая PDP-11. У нее слово было уже нормальные 16 бит. Целых 8 регистров, очень гибкая система адресации данных. По сравнению с PDP-7 — просто небо и земля. Но что еще немаловажно — команды работали не только со словами, но и с байтами. И в памяти так же можно было обращаться к отдельному байту, а не только слову.

Язык B был портирован на PDP-11, но его возможностей не хватало. И тогда к работе над языком подключился Деннис Ритчи. Так появился язык C. Тут важно акцентировать внимание на том, что вначале было железо, которое проектировалось исходя из соображений «а давайте еще и вот так зафигарим, круто же». А язык допиливался, чтобы покрыть функционал уже существующего железа. И многие решения по языку были продиктованы этим самым железом.

Язык оказался небольшим, понятным, низкоуровневым и удачным, так как достаточно быстро был портирован на другие системы. Язык был невероятно низкоуровневым дял того времени. Интересующиеся могут ознакомиться с алголом и фортраном:) Эффективность кода, который он порождал, была гораздо выше. И главная киллер-фича — можно переносить программы простой перекомпиляцией. Ну почти:) Потому были написаны терабайты софта на C, и так язык стал гегемоном. А после плюсов все вообще пошло под откос :)

Если сравнить архитектуру и систему команд PDP-11 с более поздними процессорами, то критике можно подвергнуть два момента. Во-первых, мало регистров. Их всего 8, при этом два заняты указателем текущей команды и верхушки стека. То есть у программиста остается всего 6. Локальные переменные на регистрах особо не поразмещаешь — они быстро закончатся. И во-вторых, система адресации хоть и ортогональна, но несколько избыточна и сложна. Но с другой стороны а что делать если переменные по большей части в памяти или стеке? С ними же надо как-то работать.

Позже, в 80-е и далее в 90-е архитектура процессоров была существенно переосмыслена. Стали считать, что регистров надо больше — это позволяет хранить локальные переменные не на стеке, а в регистрах и работать с ними быстрее. А вот сложных команд, которые работают память-память, надо избегать. Команды должны быть простые, прогнозируемые и выполняться за один-два такта. Квинтэссенцией упрощения архитектуры стал RISC/MIPS. Не все были с этим согласны. Интел например продолжал пилить своего легаси монстра х86, что тоже изрядно повлияло на индустрию, но об этом в другой раз :)

И вот мне тут подумалось как-то: а что было бы, если бы PDP-11 была другой? Тогда, возможно, и язык C выглядел бы иначе? Однозначно иначе. Но как?

Продолжение следует ...
Locked