Когда байты были маленькими

в 7:57, , рубрики: UNIX, баги, старое железо, старый софт

Ну что же, после комментария к статье про выборы карма стала отрицательной (не понимаю, кстати, как: за комментарии только плюсики стоят), надо наверстывать. Попробую написать первую свою хабрастатью.

Мне нравится старое железо и старый софт, так что ловите три короткие истории про историю.

Когда байты были маленькими

Сейчас большинство людей привыкли пользоваться 8-битными байтами, но когда "байт" только появился, он был 4-битным (впервые byte упоминается в документации к IBM Stretch в 1956 году; интересно, что сам компьютер был при этом 64-битным), и следующие 10 лет плавал от 4 до 8 бит, задерживаясь на 6 битах.

В 1964 году IBM выпустила IBM/360 с 8-битными байтами (а заодно 8-битной кодировкой EBCDIC, расширением 6-битной кодировки BCDIC), что положило начало доминированию привычного байта-октета. Но в 1964 до этого доминирования было еще далеко, так что когда в этом же году PDP решила выйти на рынок больших машин и выпустила систему PDP-6 с 36-битными словами, которые удобно разбивались на шесть 6-битных символов, "байтиков", никто не удивился такому выбору.

PDP-6 получилась не очень удачной системой, зато из нее выросла фантастически успешная в гиковском смысле (правда куда менее успешная, а может и провальная в коммерческом) PDP-10 с тем же 36-битным словом, которое делилось на 18-битные и 6-битные кусочки, "маленькие байтики". Система появилась в 1966 году и за последущие 16 лет приобрела культовый статус. Культура хакеров MIT, EMACS, первые RPG и MUDы, все это пошло от PDP-10. Пол Аллен и Билл Гейтс написали свой первый BASIC (для 8080) на PDP-10, что положило начало Microsoft. Графика фильмов Tron, Полет Навигатора и одного из Стар Треков тех времен была создана на его клонах!

Но время шло.                                                                                                                                     

DEC перестала выпускать PDP-10 в 1983, пожалуй даже до расцвета этой линейки, желая переключить пользователей на "the next big thing", VAX. Пользователи переключались не очень охотно, например CompuServe в середине 80-х не только не убирала 36-битные системы, но и расширила свой парк, в пике примерно до 200 мейнфреймов и предоставляло услуги доступа к ним (что делало CompuServe, наверное, самой крупной информационной системой публичной Сети тех времен; впрочем CompuServe заслуживает отдельной статьи, конечно). Этот спрос привел к появлению и кратковременному расцвету рынка клонов: Foonly, System Concepts, XKL.
О последней и поговорим.

Компания XLK появилась в 1991 году, на излете архитектуры. В 1995 они продемонстрировали PDP-10 в формате deskside, а чуть позже и 1U TOAD-2. Увы, к концу 90-х рынок совсем уже сдулся (хотя тот же CompuServe использовал клоны PDP-10 по меньшей мере до 2007), и надо было что-то делать. Этим чем-то для XKL стал выпущенный в 2007 году 100-гигабитный магистральный коммутатор DarkStar XDM. Ну коммутатор, конечно, хорошо, но надо им как-то управлять, а у них же уже был богатый опыт работы с PDP-10 и наследниками, так что в качестве машины управления внутри коммутатора засунули наследника TOAD-2.

Компания XKL живет и здравствует по сей день, выпускает магистральное сетевое оборудование и продолжает ставить 36-битные PDP-10 внутрь своих коммутаторов - получается, внутрь Интернета, в глубину. И ставят эти коммутаторы у себя не старые большие бюрократические организации, а провайдеры, которые стараются быть на переднем крае.

Как знать, может быть эти большие 8-битные байты, которые мой ноут пошлет в Сеть после того, как я нажму "Отправить", пройдут через системы под управлением машин с 6-битными байтиками с TOPS-10 на борту.

И не думайте, что это единственный пример жизни старой архитектуры. Канадские атомные станции по-прежнему используют 16-битные PDP-11 родом из 70-х и будут использовать по меньшей мере до 2050. А предпоследнее поколение спутников Глонасс летает с советскими клонами VAX на микросхеме (а может и последнее тоже; про него информацию с ходу не нашел).

Кстати, многие начинающие программисты считают, что в C char это 1 байт, а байт это 8 бит. Это не совсем так: char действительно 1 байт, но вот сколько бит в байте определяется в CHAR_BIT. Для gcc @ PDP-10, например, 1 char будет 9 бит.

Пуговицы и Министерство Обороны

Ну ладно, мейнфреймы мейнфреймами, но что если копнуть поглубже и погрузиться во время, когда не было еще "мейнфреймов" (просто потому, что не было еще "мини-компьютеров", и не с чем было сравнивать) а были просто "компьютеры". Вернемся в 1958 год. Штаты запускают свой первый спутник, Фидель Кастро штурмует Гавану, а Министерство Обороны США решает запилить простенькую систему на входящих в моду компьютерах, чтобы управлять своими закупками.

Языков программирования как-то немного, самые известные Фортран да Лисп, и не особо они подходят для такой задачи, АЛГОЛ обсуждается, но еще не готов. Зато уже есть FLOW-MATIC для UNIVAC-ов (кстати, похожий немного синтаксисом на КОБОЛ; его считают основным предшественником КОБОЛа), и вот Министерство Обороны закупает несколько машин, разрабатывает своими силами СУБД и бизнес-логику и в 1958 году выкатывает и пускает в бой систему MOCAS (Mechanization of Contract Administration Services) с надеждой, что заложенные идеи позволят системе прожить лет пять, а то и (ну вдруг, помечтать всегда приятно!) все десять, и с намерением за 1960-е заменить ее на что-нибудь более современное.

Спустя 51 год, в 2019 году (более позднее не нашел с ходу) под управлением MOCAS было 370 тысяч активных контрактов и 2.3 триллиона долларов. Для сравнения, федеральный бюджет России в 2019 был порядка 300 миллиардов долларов.

MOCAS начиная с 1960-х несколько раз пробовали чем-то заменить (самая масштабная попытка была, наверное, в 2000-2002 годах), но каждый раз оказывалось, что заменить могут, но какой-то небольшой процент контрактов и записей немного сбивается. А даже 0.1% контрактов --- это, получается, два с лишним миллиарда долларов. Как-то дороговато выходит замена, риски велики.

И это тоже не уникальный пример. Система MUMPS была разработана для PDP-7 в 1966 году по заказу одной из американских больниц. Сейчас MUMPS и ее наследники отвечают за хранение половины записей о пациентах в США. Система IMF, разработанная в 60-е, все еще используется американской налоговой службой, более того является основной и хранит данные обо всех американских налогоплательщиках - физических лицах и их налогах, и все эти коронавирусные чеки в позапрошлом году проходили именно через нее. По сравнению с ними IBM TPF 1970-к, которая используется системами VISA и American Express, уже очень, очень современная штука.

Так что не только старое железо, но и старый, и даже очень старый софт успешно живет и развивается.

Кстати, язык FLOW-MATIC был разработан барышней. Грейс Хоппер ("Amazing Grace"), адмирал, математик, программист еще со времен Mark I, разработчик первого в мире компилятора и один из ключевых разработчиков COBOL-а. Так что, милые девушки, если вдруг вам будут попадаться токсичные мужчины, которые будут говорить, что математика и программирование "не женское дело", говорите им про Грейс Хоппер и спрашивайте, а чего они сделали в жизни.

Праздник, который всегда с тобой

В 2008 году один из разработчиков OpenBSD натолкнулся на забавный артефакт. SAMBA (это, грубо говоря, такая штука, которая позволяет *nix-ам раздавать файлы по виндовому протоколу SMB) в какой-то момент валилась, отдавая файлы с раздела под VFAT. Ну разработчик удивился, стал разбираться, оказалось, что в SAMBA есть специальный странный код вокруг вызовов *dir().

Стал разбираться дальше и оказалось, что начиная с каких-то древних времен раз в вечность кто-то писал в mailing list о странном поведении вызовов, связанных с просмотром директорий, но ему советовали поменьше курить травы и забывали об этом. Или (как в случае с SAMBA) не понимали поведения и, на всякий случай, делали workaround).

На этот раз разработчик попался въедливый и решил разобраться. Оказалось, что при некоторой последовательности вызовов, сбивался механизм работы с блоками метаданных внутри вызовов seekdir/readdir и один из блоков "терялся".

Раскручивая историю, удалось найти подтверждения бага в коде по крайней мере начиная с 4.2BSD 1983 года!

Вернемся к (относительной) современности. Думаю, большинство читателей в курсе, что MacOS и iOS - это такие палимпсесты BSD поверх амальгамы из разных версий микроядра Mach. Так что не стоит удивляться тому, что, наряду с основными версиями Unix-ов, растущих из дерева BSD, этот баг присутствовал и в айФонах 2008 года, на которых, конечно, тоже работали куски кода из начала 1980-х.

Изначально я эту часть хотел назвать "самая старая ошибка", но решил не срезать углы, ведь это точно не самый старый баг, а, скорее, "одна из самых старых на момент обнаружения ошибок из широко известных". Были ошибки и постарше. Например, в "компиляторе компиляторов" yacc (тоже стандартная *nix штука) в том же 2008 году нашли и пофиксили баг, который тянулся по меньшей мере с 1975 года, со времен Version 6 UNIX.

И такие истории продолжают происходить. Например, в том году нашли баг в Linux-овом TCP-стеке, которому было 24 года; в некоторых (редких) случаях он приводил к подвисаниям соединений (впрочем, в современном вебе, кажется, "почти всегда работает как надо" вместо "всегда работает как надо" стало уже нормой). А вот другой баг из 2021 позволял получать рута, и тому багу было 15 лет.

А что уж говорить о странном наследстве старых ОС, которые не то, чтобы баги, а фичи, но в современном мире воспринимаются уже несколько странно. В Windows 10 нет кода MS-DOS (or so they say), но попробуйте там создать файл с именем aux.txt :-)
                                     
В общем, не только старое железо и старый софт живет, но и старые баги.

Автор:
boh_muh

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js