alex0x08

alex0x08

Очень давно в этом вашем ойти. Видел сеть до интернета, помню интернет без фейсбука. До сих пор пишу код. ТГ/VK/Instagram/LinkedIn/Youtube/Rutube/Dzen: alex0x08 https://0x08.ru/ https://blog.0x08.ru/
Пикабушник
в топе авторов на 408 месте
438 рейтинг 4 подписчика 0 подписок 6 постов 1 в горячем
8

Марсианские страсти: DOS, любовь и С++

У нас было 640Кб памяти, CGA-экран, 20-мегабайтовый диск и целых четыре мегагерца тактовой частоты. А еще старые пятидюймовые дискеты на 360кб. Не то чтобы это был необходимый набор для современного разработчика C++, но если уж начали коллекционировать дичь, то сложно остановиться..

Весь сетап целиком.

Весь сетап целиком.

Проклятая выдача

Наверное все уже в курсе, что социальные сети и поисковые системы постоянно подкручивают ленту выдачи под каждого пользователя на основе его предыдущих запросов и проявленных интересов?

На меня эти алгоритмы тоже начали влиять, но.. особенным образом:

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

Когда я уже не мог выдерживать накал выдаваемого проклятыми алгоритмами — начал про всю эту дичь писать. На свет стали появляться статьи, испортившие безвозвратно психику, взгляды на жизнь и карьеру многим несчастным.

Если серьезно, то конечно же этот материал появился не на пустом месте и не за один день, это результат довольно долгого изучения матчасти, ковыряния исходников и темных ритуалов из Некрономикона.

Все ради того чтобы в очередной раз показать читателям невозможное, по мнению ИИ и обитателей StackOverflow.

Технический ультрахардкор

Коль уж читаете эту статью — скорее всего и так знаете через какое место как именно программы появляются на свет и какова роль компилятора в этом сложном процессе.

Для простых обывателей поясняю:

чтобы получить тот самый steam.exe, которым вы жадными ручками запускаете любимые игры, его необходимо собрать из исходников.

Сотрудник компании Valve вместо работы над Half-Life 3 запускает компилятор, который собирает из набора файлов с исходниками «финальный билд», который затем упаковывается в инсталлятор и выкладывается на официальный сайт Steam.

Откуда его потом скачивают ушастые простые пользователи.

Теперь представьте:

внезапно настал зомби-апокалипсис и всех программистов, которые занимались разработкой игр в Valve сожрали зомби, после чего процесс сборки, вся документация и тулчейны были утрачены.

C концами.

Все что осталось — несколько старых бекапов на забытых носителях, с трудом извлеченные из.. ээ останков голодного зомби. Из задней части.

Спустя пару сотен лет, вы — представитель жалких остатков человечества, выживших на небольшой колонии с обратной стороны Луны, вновь ступаете на опустевшую Землю в поисках артефактов погибшей цивилизации.

И находите на развалинах бывшего офиса Valve ту самую флешку с исходниками альфа-версии Half-Life 3.

Конечно прогресс в разработке программ к тому времени успел уйти далеко вперед, у вас в ходу на лунной базе теперь какие-нибудь C++-157 и clang-777, с встроенным Rust, тремя слоями виртуализации и сборщиком мусора, работающим через промпты LLM. А про язык C вы узнали лишь из лекции по истории, про исторический период между египетскими пирамидами и вторжением инопланетян.

Встает очевидный вопрос:

как же все-таки насладиться шедевром далеких предков, так и не увидевшим свет в свое время?

Многое можно отдать за запуск этой красоты, даже спустя пару сотен лет после зомби-апокалипсиса:

Нет, это не релизная версия.

Нет, это не релизная версия.

Несмотря на весь этот «апокалиптический треш», ситуация сама по себе — более чем реальная:

прямо сейчас эксплуатируются полностью виртуальные системы, собственных средств разработки для которых либо уже нет совсем, либо такая разработка чрезвычайно затруднена.

В первую очередь это мейнфреймы, которые до сих пор живее всех живых, вроде такого красавца от Unisys:

Далеко не только IBM занимается мейнфреймами до сих пор.

Далеко не только IBM занимается мейнфреймами до сих пор.

Если немного снизить накал технического фетишизма экстрима и обратить взор к современной коммерческой разработке — можно внезапно обнаружить, что фактически вся ее продуктовая часть (там где создается приложение, устанавливаемое у конечного пользователя) работает с обязательной поддержкой устаревшего окружения:

поддержка Windows 7/10, поддержка старых версий Android и iOS, обязательная работа на JRE 1.8+ и так далее и тому подобное.

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

Обратное портирование

Процесс, с помощью которого в окружении 21го века создается нечто работающее на оборудовании из века 20го называется обратным портированием (backporting). И мы уже неоднократно о нем рассказывали, например тут или тут.

Обычно бекпорт создается для окружения с не очень большим устареванием — лет на 5-10 с момента релиза, поскольку на таком промежутке и проходят все основные обновления пользовательского окружения.

В редких случаях (и за отдельную плату) разработчик ПО может согласиться покопаться в чем-то еще более древнем, но уже без гарантий.

Однако то что покажу в этой статье — однозначно выходит за любую границу разумности, проходя даже среди коллег по категории отбитой дичи научной фантастики:

приложение на современном C++, с современными фичами, созданное в современной ОС, которое работает в окружении из 1986 года!

Операционной системой, которую выпустили 40 лет назад выступит известная MS-DOS 3.20. Именно эта версия была выбрана ввиду одной интересной исторической особенности:

Version 3.20 – First retail release (non-OEM); Release date: July 1986

Это первая версия MS-DOS, продаваемая конечным пользователям напрямую от самой Microsoft, с полок магазинов.

До нее Microsoft продавала свою операционную систему только производителям компьютеров, которые включали ее в поставку своих продуктов и под своим собственным брендом:

"<a href="https://pikabu.ru/story/marsianskie_strasti_dos_lyubov_i_s_14059563?u=https%3A%2F%2Fblog.0x08.ru%2Fapricot-emulator-qdae&t=%D0%97%D0%B0%D0%B2%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%90%D0%B1%D1%80%D0%B8%D0%BA%D0%BE%D1%81&h=3d437ee3ae93b69a9c4829f75b2a736753f3a53a" title="https://blog.0x08.ru/apricot-emulator-qdae" target="_blank" rel="nofollow noopener">Заводной Абрикос</a>"

"Заводной Абрикос"

Наконец показываю, как выглядит компьютер тех лет, для которого мы будем сейчас писать код на современном C++:

Фото современное, таких машин в живом состоянии сохранилось довольно много.

Фото современное, таких машин в живом состоянии сохранилось довольно много.

Комната жениха

Для начала, опишу тестовое окружение, которое будет использовано для столь задорной задачи. Три ключевых компонента, необходимых для осуществления задуманного злодейства:

  • Компилятор C++ DigitalMars, который до сих пор официально поддерживает сборку под DOS;

  • Эмулятор 86Box для запуска DOS из 1986 года;

  • Утилиты GNU Mtools для работы с образами старых дискет.

И все это под FreeBSD 14, в качестве своеобразного гаранта качества:

если что-то работает на FreeBSD, оно однозначно будет работать и на Windows и в MacOS и в Linux и на Луне.

Цифровой Марс

Главный герой сегодняшнего праздника жизни — набор компиляторов от Digital Mars:

Digital Mars is an American computer software company founded by Walter Bright and based in Vienna, Virginia. It makes C, C++, and D compilers, and associated utilities such as an integrated development environment (IDE) for Windows and MS-DOS, which Digital Mars calls an integrated development and debugging environment (IDDE)

Думаю уже по одному этому абзацу можно догадаться о накале предстоящей дичи, хотя ряд нюансов все же стоит пояснить.

Во-первых Вена это не только столица Австрии, но еще и небольшой городок на севере США, на 15к жителей, где (внезапно) находится штаб-квартира серьезной софтверной компании, выпускающей эпические компиляторы аж с 1988 года:

In 1988, Zortech was the first C++ compiler to ship for Windows. PC Magazine ran a graphics benchmark and reported that most executables produced by Zortech ran faster than executables produced by Microsoft C 5.1 and by Watcom C 6.5.[3]

Вот так, парни переплюнули официальный компилятор от самого Microsoft, несмотря на весь инсайд и поддержку. Кстати «Zortech» — старое название компилятора (если вдруг будете искать в архивах), продукт по какой-то причине несколько раз переименовывался.

Есть еще один удивительный факт, связанный с этой компанией:

The company gained notice in the software development community for creating the D programming language. D resulted from Bright's frustration with the direction of the C++ language and from his experience implementing it.

Ребята до такой степени угорели по С++, что создали свой собственный язык, «по мотивам»:

resulted from Bright's frustration with the direction of the C++ language

Но вернемся к другим талантам этой замечательной компании — к разработкам для совсем старой школы:

  • Includes C++ templates, exception handling and rtti.

  • Most other compilers for 16 bit code were abandoned nearly a decade ago. Digital Mars has a modern compiler for 16 bits.

Все перечисленные выше радости — для официально поддерживаемой сборки под DOS и 16-битных приложений.

Догадываюсь, что современным программистам тяжело воспринимать реалии разработки тех лет и технические ограничения софта из далекого прошлого, поэтому в качестве иллюстрации, покажу таблицу моделей памяти создаваемых приложений:

Сравните это с современными "запускаемыми архивами" с играми, по 100Гб в одном .EXE

Сравните это с современными "запускаемыми архивами" с играми, по 100Гб в одном .EXE

Это предельные размеры создаваемого приложения, в случае MS-DOS 3.20 мы будем использовать «s» модель памяти, поэтому размер финальной сборки не должен превышать 64Кб.

Сборка и запуск

Компиляторы C и C++ от DigitalMars изначально были коммерческим продуктом и до сих пор существует коммерческая версия, включающая помимо компиляторов еще и собственную среду разработки (IDDE). Однако не так давно компиляторы стали бесплатным и открытым проектом, с исходниками на Github.

К сожалению проект пока не портируемый — собирается и работает исключительно под Windows.

Тем не менее, поскольку создавали его очень опытные люди — все отлично работает в Wine, что мы и будем использовать для его запуска на FreeBSD. Чтобы снова не раздувать статью — не стал заморачиваться сборкой компилятора из исходников (хотя это не очень сложный процесс), использовав готовую сборку версии 8.5.7.

Инсталлятора тут нет, в архиве сразу готовые бинарники, поэтому распаковываем и запускаем:

mkdir -p /opt/src/digitalmars/dm
cd opt/src/digitalmars/dm
wget http://ftp.digitalmars.com/Digital_Mars_C++/Patch/dm857c.zip
unzip dm857c.zip
wineconsole bin/dmc.exe

Так выглядит отображаемая версия компилятора:

Для поддержки сборки под DOS нужно скачать и распаковать дополнительный пакет:

Внутри будут дополнительные бинарники, главный из которых это довольно известный EXE2BIN.COM, используемый для генерации COM-файлов из EXE.

С EXE2BIN есть один важный нюанс — он не запустится с помощью Wine, поскольку является DOS-приложением.

Чтобы использовать эту утилиту для создания COM-файлов — необходимо запускать ее с помощью DOSbox:

Теперь переходим к основному эмулятору.

Официальный логотип 86Box

Официальный логотип 86Box

86Box

Достаточно новый проект (разрабатывается с 2016 года), который сейчас активно развивается и позволяет эмулировать огромное множество x86-совместимых систем:

86Box is an IBM PC system emulator that specializes in running old operating systems and software designed for IBM PC systems and compatibles from 1981 through fairly recent system designs based on the PCI bus.

Готовой сборки для FreeBSD пока нет (как и присутствия в портах) и еще год назад были проблемы, требующие ручных правок исходников:

Initially exclusive to Windows, it was ported to Linux in version 3.2 and macOS in version 3.4.

Но на момент написания статьи все поправлено и эмулятор отлично собирается из исходников без каких-либо проблем, а в инструкции по сборке появился раздел про FreeBSD.

Сборка

Забираем исходники:

Репозиторий довольно большой, поэтому стоит использовать ограничение на историю выгружаемых коммитов (ключ --depth 1).

Я использовал master-ветку с текущей версией эмулятора, если будут проблемы — можно использовать срез исходников конкретной версии.

Сборка построена на cmake, но также использует ninja (для модулей).

Следующие пакеты должны быть установлены в системе для того чтобы сборка отработала:

pkg install cmake pkgconf freetype-gl sdl2 libspng openal-soft rtmidi qt5 libslirp fluidsynth libsndfile

Запуск вполне классический для cmake-проектов:

mkdir build
cd build
cmake ..

Готовое для запуска приложение эмулятора будет в build/src/86Box.

Но это еще не конец.

Для работы нужен еще и набор ROM-файлов (да, опять), который для текущей версии (из master-ветки) необходимо загружать из отдельного репозитория:

Для релизных версий эмулятора — ROM-файлы надо брать в другом месте, со страницы releases. Запускается эмулятор с указанием путей к каталогу с ROM-файлами следующим образом:

./src/86Box --rompath /opt/src/roms

После запуска эмулятора (по прямой аналогии с каким-нибудь VirtualBox) необходимо создать новую виртуальную машину, задав ей вот такие настройки:

Это не единственный возможный сетап эмулируемого оборудования, но максимально приближенный к реалиям 1986 года.

Так выглядела обложка коробочной версии с MS-DOS. Помимо префикса, слово "Microsoft" встречается трижды ;)

Так выглядела обложка коробочной версии с MS-DOS. Помимо префикса, слово "Microsoft" встречается трижды ;)

MS-DOS

Образы самого MS-DOS достать в сети очень легко, например отсюда. Все они уже давно находятся в публичном пользовании (public domain), поэтому за их использование Microsoft вас не съест засудит.

Более того, даже исходный код некоторых версий MS-DOS был выложен в публичный доступ:

The original sources of MS-DOS 1.25, 2.0, and 4.0 for reference purposes

Коробочная версия поставлялась на 5-дюймовых дискетах, размером в 360Кб, собственно их образы и выложены в сети.

Нам нужен лишь первый:

Этот файл нужно выбрать в меню после запуска эмулятора:

После чего перезагрузить эмулируемую систему.

При запуске пойдет проверка памяти, затем MS-DOS будет просить ввести ей дату и время, достаточно нажать пару раз <Enter> для пропуска:

MS-DOS из 1986 года готов к работе.

MS-DOS из 1986 года готов к работе.

Mtools

Разумеется есть проблемы с пробросом данных с хоста в столь старую эмулируемую систему. Существуют несколько возможных решений, но самое простое и очевидное:

с помощью генерации образа floppy-диска на хосте и подключения его на эмулируемой системе, в виртуальный floppy-привод.

Тот самый, с которого мы выше загружали образ MS-DOS.

Для генерации образов флоппи я использовал известный пакет GNU Mtools,

In addition to file access, it supports many FAT-specific features: volume labels, FAT-specific file attributes (hidden, system, ...), "bad block" map maintenance, access to remote floppy drives, Iomega ZIP disk protection, "secure" erase, display of file's on-disk layout, etc.

Пакет довольно известный, поэтому присутствует практически везде, для FreeBSD установить его можно так:

pkg install mtools

Так выглядят те самые пятидюймовые дискеты (5.25").

Так выглядят те самые пятидюймовые дискеты (5.25").

Работа с образом дискеты

Создаем пустой образ дискеты на 360кб:

mformat -C -t 40 -h 2 -n 9 -i floppy360k.img

Копируем файл с хоста внутрь этого образа:

mcopy -i floppy360k.img /opt/src/digitalmars/dm/bin/test.exe ::test.exe

Запускаем эмулятор 86box и указываем созданный образ в качестве второго в эмулируемой системе:

Переходим на диск B:

Обратите внимание на даты на файлах.

Обратите внимание на даты на файлах.

Тесты

А теперь будут танцы:

показываю функционал 21 века, работающий под MS-DOS из 20 века.

Напоминаю, что система в эмулятора была выпущена 40 лет тому назад — возможно старше вашего папы.

Первым делом я попробовал что-то собрать с RTTI и классами, вот такой довольно простой код:

#include <iostream.h>

class Base {
public:
virtual void test() {
cout << "this is base" << endl;
}
};

class Derived : public Base {
public:
void test() {
Base::test();
cout << "this is derived" << endl;
}
};

int main()
{

Base* b = new Derived();
Derived* d = dynamic_cast<Derived*>(b);
if (d != NULL) {
// Successful cast
cout << "works" << endl;;
d -> test();
} else {
// Cast failed
cout << "cannot cast B* to D*" << endl;;
}
return 0;
}

Напоминаю, что сборка осуществляется с помощью wineconsole:

dmc.exe -0 -ms -Ar -NV -o+space ..\..\test.cpp

Дальше копируем полученный EXE-файл в образ дискеты:

mcopy -i floppy360k.img /opt/src/digitalmars/dm/bin/test.exe ::test.exe

Ну и запускаем эмулятор.

Как видите все отлично работает в операционной системе 40-летней давности:

Покажите вашему преподу по C++.

Покажите вашему преподу по C++.

Следующим шагом проверил обработку ошибок:

#include <iostream.h>
#include <exception>

int main() {
try {
int age = 15;
if (age >= 18) {
cout << "Access granted - you are old enough.";
} else {
throw 505;
}
} catch (int myNum) {
cout << "Access denied - You must be at least 18 years old.\n";
cout << "Error number: " << myNum;
}
return 0;
}

Тут стоит уточнить, что поддержку обработки ошибок надо включать отдельно, ключом -Ae:

dmc -0 -ms -Ae -NV -o+space ex.cpp

Не поверите, но оно тоже работает:

Вот такие дела, конструкция try-catch на языке высокого уровня спокойно работает в MS-DOS образца 1986 года.

Еще больше балета

Разумеется я показал лишь малую часть возможностей компилятора, в первую очередь потому что уже декабрь а статья опять превратилась в простыню не успел закончить историю с STL:

STLport 4.5.3 ported to Digital Mars C++ (requires Digital Mars C++ 8.32 or later)

Это отдельная, весьма своеобразная версия STL, совместимая с DigitalMars, доступная для скачивания в собранном виде (плюс исходники). Но собрана она для целевой платформы Win32, поэтому для сборки под DOS ее готовую версию использовать не получится, надо пересобирать самостоятельно.

Сама возможность такой пересборки под DOS существует, но необходима либо платная версия DigitalMars, которая содержит собственную систему сборки (smake), либо очередной «кровавый патчинг», чтобы собрать STLport вручную.

Не поверите, но еще существует Boost (хоть и очень старый) с поддержкой компилятора DigitalMars:

Boost 1.30.0 for Digital Mars C++

Вот уж где раздолье и настоящий угар: писать под DOS c помощью самой жирной библиотеки для C++ на свете!

Чтобы окончательно добить вашу психику и чувство прекрасного, показываю несколько проектов «обратного портирования» STL — как раз для особых случаев, вроде истории с DigitalMars.

Первый проект:

A recreation of much of the modern C++ standard library in ISO C++98

https://github.com/DryPerspective/Cpp98_Library

Что именно из STL реализовано и примеры использования есть в Wiki проекта. Собирать с помощью dmc попробовать не успел, но выглядит многообещающе.

Второй проект:

A backport of C++11/14/17 features to earlier versions

https://github.com/chaossky/cppbackport

Тут основная цель это C++11, который DigitalMars поддерживает очень слабо, плюс будут проблемы с Windows-платформой:

Does it work on Windows? Sorry, POSIX mostly. Would love for some Windows devs to help.

Но проект сам по себе весьма интересный и ничего не мешает надергать отсюда необходимых кусков в свою реализацию.

Возвращение на Землю

Несмотря на описанное в статье, дела с компиляторами C/C++ от DigitalMars обстоят несколько печальней чем кажется. Во-первых этот компилятор очень сильно устарел и совместимость со стандартом языка осталась на уровне C++98.

Для более новых версий стандарта есть поддержка лишь отдельных фич и планов по улучшению ситуации я не видел.

Фактически активная разработка остановилась в 2004м году, с тех пор выпускаются лишь мелкие патчи и обновления, поскольку фокус авторов сместился на поддержку языка D.

Во-вторых этот компилятор по прежнему имеет серьезные проблемы с лицензированием:

несмотря на открытие исходного кода, для полноценной сборки требуется закрытый инструментарий.

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

Добавлю, что компилятор для наших краев довольно редкий, по крайней мере лично я не встречал проектов, где бы он использовался.

Но для целей кросс‑компиляции под DOS (если вас жизнь заставит) — инструмент более чем интересный.

P.S.

Статья была опубликована на Хабре, оригинал как обычно в нашем блоге, процесс всех этих изысканий и отбитых экспериментов выкладываем в нашем Телеграм канале.

Показать полностью 20
15

Необычный заказ: разработка под CP/M

Древний дисковод ожил и издавая чудовищный скрежет стал медленно загружать мое послание. Через какое-то время на экране появились строки:

NE PUERO GLADIUM, DR. KRIGER. 04.03.2026

Три пары глаз повернулись ко мне в немом изумлении.

— Это длинная история, нам лучше присесть.

Все герои в сборе.

Все герои в сборе.

Человек, перешагнувший порог моего маленького офиса в тот летний вечер явно имел отношение к спецслужбам — армейскую выправку и годы тренировок не спрячешь так просто.

Рослый и поднятутый, в безупречном костюме и с острым, пронзительным взглядом — он производил серьезное впечатление.

И тем странее выглядел этот заказ.

— Алекс, полагаю?

— Он самый, рад наконец познакомиться лично. Вы написали, что для нас есть работа. Хотя исходя из содержания письма, задача выглядит довольно.. необычной.

— Это проблема? Мне рекомендовали вас как опытных профессионалов..

— Нет, не проблема. Просто уточняю детали, дабы убедиться, что мы понимаем друг друга. Итак, вы действительно используете компьютеры.. из 1987 года?

АРХЕОТЕХ

Копаясь в сети в поисках очередного археотеха, был обнаружен удивительный репозиторий, в котором один почтенный джентельмен, недавно отошедший от дел, собрал невероятную подборку дичи инструментов разработки для компьютеров конца 70х — начала 80х:

CP/M 2.2 compilers, assemblers, and interpreters

CP/M, если кто вдруг не знает (коих среди читателей точно будет большинство), это такая операционная система из далекого-далекого прошлого, созданная аж в 1974 году. Разумеется давно и крепко забытая обывателями.

Для сравнения и понимания исторического периода:

в 1977м году вышел первый фильм Джорджа Лукаса по вселенной «Звездных Войн», а в 1975м закончилась война во Вьетнаме.

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

Чтобы вы смогли оценить объем и сложность проделанной работы:

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

C помощью дисководов, возрастом слегка за пятьдесят, типа такого:

<a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FHistory_of_the_floppy_disk&t=8-%D0%B4%D1%8E%D0%B9%D0%BC%D0%BE%D0%B2%D1%8B%D0%B9&h=cd61eab45f544483eb7ee1c8de57cbbf55554ef9" title="https://en.wikipedia.org/wiki/History_of_the_floppy_disk" target="_blank" rel="nofollow noopener">8-дюймовый </a>(!) диск с дисководом начала 70х. Слева для сравнения "современная" 1'44 дискета.

8-дюймовый (!) диск с дисководом начала 70х. Слева для сравнения "современная" 1'44 дискета.

Представляете, чего стоило все это оживить, запустить и заставить работать?

Физические процессы, механические повреждения и влияние среды при этом никто не отменял.

Если быть совсем точным, то сначала был обнаружен немного другой репозиторий от этого же почтенного автора, где была собрана похожая коллекция, но для более обыденного DOS. Лишь несколько недель спустя обнаружилось, что совсем рядом находится настоящее сокровище утраченной цивилизации — чистый археотех. И понеслась.

От такого изобилия начала капать слюна и дергаться глаз:

Сообщения коммитов вроде "macos build" и "linux build" в одной строке с компиляторами из 70х невероятно доставляют.

Скорее всего ничего из длинного списка выше вам знакомо не будет, поскольку все эти древности на десяток-другой лет старше даже автора этих строк.

Отдельный восторг у искушенной публики вызовет наличие скриптов сборки под Unix (Linux/Mac/BSD).

Примерно из-за таких изумительных проектов хорошие инженеры навсегда бросают пить. Но вернемся в мой кабинет — к гостю с армейской выправкой и странными, хотя и законными запросами.

— Этот разговор будет долгим. Не найдется ли у вас чем освежиться?

..

Искусство искусством, но прежде чем погружаться по локоть в «кровавый ад разработки» 80х c линковщиками и компиляторами, стоит рассказать о технических реалиях тех лет — оборудовании и самой операционной системе CP/M. Будет интересно, даже если вы, дорогой читатель, сами не старше третьего GTA.

Аукционный дом <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fwww.christies.com%2F&t=Christie%27s&h=668bd8bd8985e0826c77a55bac7d97b5689ffd47" title="https://www.christies.com/" target="_blank" rel="nofollow noopener">Christie's</a>, <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fonlineonly.christies.com%2Fs%2Ffirsts-history-computing-paul-g-allen-collection%2Fgroup-nine-early-microcomputers-120%2F230058&t=%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B0%D1%8F%20%D0%BA%D0%BE%D0%BB%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D1%8F%20%D0%9F%D0%BE%D0%BB%D0%B0%20%D0%90%D0%BB%D0%BB%D0%B5%D0%BD%D0%B0&h=cb7e7057a8bda4da9e09231074fbf666bca6f0a7" title="https://onlineonly.christies.com/s/firsts-history-computing-paul-g-allen-collection/group-nine-early..." target="_blank" rel="nofollow noopener">частная коллекция Пола Аллена</a>.

Аукционный дом Christie's, частная коллекция Пола Аллена.

ЭПОХА МИКРО

Между огромными мейнфреймами, занимающими машинные залы и первым домашним PC с DOS а затем и Windows, был относительно краткий период рассвета (1970-1980) микрокомпьютеров:

A microcomputer is a small, relatively inexpensive computer having a central processing unit (CPU) made out of a single integrated circuit microprocessor.

Да, это официальное название, «микрокомпьютерами» назывались множество разных девайсов от разных производителей, предназначенных для игор домашнего использования.

Знаменитый <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FCommodore_128&t=Commodore%20128D&h=a8faf68b98c488a7565ecaeae3695fafd7f55edb" title="https://en.wikipedia.org/wiki/Commodore_128" target="_blank" rel="nofollow noopener">Commodore 128D</a>

Знаменитый Commodore 128D

Не менее знаменитый <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FTRS-80&t=TRS-80&h=562f4f5c590fd1e17a9c83a77d3c676ae9e688a7" title="https://en.wikipedia.org/wiki/TRS-80" target="_blank" rel="nofollow noopener">TRS-80</a>.

Не менее знаменитый TRS-80.

Это был настоящий бум домашней электроники и сотни разных компаний по всему миру начали создавать свои линейки для новой отрасли — домашних компьютеров.

— Интересная история, крайне.. необычная.

Рассказ гостя определенно интриговал.

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

— Но все же, что конкретно мы должны реализовать? И под какую машину?

KAYPRO II

Одной из компаний, решивших поучаствовать в гонке первых домашних компьютеров была Kaypro Corporation:

Kaypro Corporation was an American home and personal computer manufacturer based in Solana Beach, California, in the 1980s

Хотя сама компания давно не существует, она успела наследить оставить след в истории компьютеров и сердцах благодарных потомков. Первый же ее продукт имел оглушительный успех:

by mid-1983 the company was selling more than 10,000 units a month, briefly making it the fifth-largest computer maker in the world

Пятая в мире по продажам, рядом с Apple и IBM — в первом ряду, не где-то сбоку, причем с первого продукта.

Именно этот продукт — домашний компьютер Kaypro II был выбран в качестве полигона для восстановления процесса разработки под CP/M. И последующей сдачи этого фантастического проекта для столь особенного заказчика.

Только посмотрите на эту брутальную «няшу» в стильном металлическом корпусе:

Ну как можно было пройти мимо такого сказочного девайса?

— Видите ли, Алекс. У нас в.. организации есть один сотрудник. С наци.. ээ немецкими корнями и такой же педантичностью.

Мой гость сделал еще один глоток виски, явно наслаждаясь процессом.

— Отвечает за техническое сопровождение и разные.. эксперименты. В некотором смысле — ваш коллега. К великому сожалению, последнее время он начал.. скажем так, проявлять неустойчивость. Рассказывал коллегам о своей избранности и незаменимости. Стал требовать сдавать ему кровь. Даже представлять не хочу, для чего ему могло понадобиться столько крови, но нам срочно необходимо это прекратить.

— С нашей помощью, полагаю?

Создатель операционной системы CP/M <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGary_Kildall&t=Gary%20Kildall&h=9f2249d31f7fb95184c772e94dd2cdfbf20db77e" title="https://en.wikipedia.org/wiki/Gary_Kildall" target="_blank" rel="nofollow noopener">Gary Kildall</a> за работой, 1978 год. Огромный ящик слева это.. дисковод.

Создатель операционной системы CP/M Gary Kildall за работой, 1978 год. Огромный ящик слева это.. дисковод.

CP/M

Стоит рассказать и про операционную систему тех лет, благо очень немногие из читателей дожили имели шанс с ней поработать:

CP/M,originally standing for Control Program/Monitor and later Control Program for Microcomputers, is a mass-market operating system created in 1974 for Intel 8080/85-based microcomputers by Gary Kildall of Digital Research, Inc.

Внешне это сильно похоже на более привычный отечественному пользователю DOS, хотя конечно же CP/M появилась гораздо раньше.

Зеленые буквы на черном фоне, за тридцать лет до выхода "Матрицы".

Зеленые буквы на черном фоне, за тридцать лет до выхода "Матрицы".

Кстати скриншот выше это тоже настоящий артефакт, который был сделан после случайной археологической находки — были обнаружены исходники четырех первых версий CP/M, примерно 1975-79 годов. Так вот на этом скриншоте — работающая CP/M версии 1.3.. собранная из найденных исходников!

..

— Несмотря на все наши таланты и умения, думаю не сможем помочь.

Окинув гостя взглядом и оценив его серьезную физическую подготовку, я добавил:

— Полагаю в вопросах наказания, проучения и приручения вы дадите сто очков форы кому угодно..

— Ну что вы, Алекс. Конечно же речи не идет о применении насилия, мы мирные землепашцы люди. К тому же для такого существуют.. профильные специалисты. Нет, боюсь все несколько сложнее. Я хочу чтобы вы проучили коллегу морально — с помощью вашего ума и инженерных талантов. Мы договорились?

ЭМУЛЯЦИЯ

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

«Большая часть» — потому что действующий компьютер 80х я все же нашел и даже смог запустить на нем собранное приложение.

Вообще 8-битные микрокомпьютеры быстро завоевали популярность, фактически создав новый рынок домашней электроники и оставив заметный след рваную рану в юных сердцах. Благодарные пользователи, убившие детство на первые компьютерные игры и выросшие затем в бородатых программистов, наклепали горы самых разных эмуляторов этих машин.

Я отобрал три абсолютно разных эмулятора, для максимального погружения в тему микрокомпьютеров и эстетику 80х.

В качестве тестовой среды на этот раз использовался обычный Mageia Linux, чтобы не отвлекать внимание читателей на любимую FreeBSD. Кстати вот тут находится очень интересная подборка образов дискет для компьютеров Kaypro, включая исходники — на случай, если статьи покажется мало и захотите продолжить банкет.

MYZ80

Начнем с самого отбитого хардкорного. Перед вами настоящий дедушка эмуляции — действующий эмулятор CP/M, написанный в 1991м году под MS-DOS:

MyZ80 does more than just emulate the CPU though, it's a complete Z80 computer emulation

Этот эмулятор когда-то был коммерческим продуктом — «shareware», хотя и без каких-либо технических ограничений. Исходного кода найти не удалось, так что использовать будем его готовую сборку.

Ссылка указанная выше, на самом деле лишь сохраненная копия сайта автора, поскольку и сайт и сам проект были давным давно заброшены. Тем не менее нужный файлик myz80124.zip со сборкой эмулятора легко находится в сети, можно скачать например тут.

Скачиваем и распаковываем:

wget http://www.z80.eu/downloads/myz80124.zip
mkdir myz80cpm && cd myz80cpm
unzip ../myz80124.zip

Внутри будет весьма необычный для современности набор файлов:

MYZ80.EXE — очевидный бинарник эмулятора, но проблема в том что это 16-битное приложение для DOS, запустить которое в современном окружении представляет проблему. Так что придется использовать еще один известный эмулятор — Dosbox, чтобы запустить внутри винтажный MYZ80. А так эта «матрешка» выглядит в работе:

Самое важное, ради чего были нужны заморочки аж с двумя эмуляторами — виртуальные диски, связанные с файловой системой DOS:

Поскольку Dosbox в свою очередь дает виртуализацию дисков непосредственно из хоста — получаем отличный способ быстро перебрасывать файлы в виртуальную CP/M.

Что важно при любой разработке с использованием эмулятора.

Собственно, то самое тестовое приложение EXMPL.COM на заглавной картинке было сначала скопировано в каталог с эмулятором:

cp ../../src/cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM .

Затем импортировано в виртуальный диск CP/M:

И запущено уже в CP/M.

Все это проще и быстрее, нежели описываемый ниже вариант с Mame и полной эмуляцией Kaypro II, но к сожалению не дает того самого «ощущения от использования», что это реальная машина тех лет. Так что я пошел дальше в своих изысканиях.

..

— Интересное предложение. Проучить коллегу по опасному инженерному делу, еще и за приличные деньги..

Моему гостю этого знать не следовало, но я готов был таким заниматься совершенно бесплатно и на регулярной основе.

— ..путем разработки под столь винтажный компьютер. Практически совершить уринотерапию..

— Боюсь, уринотерапия тут не поможет — коллега все же имеет немецкие корни. У каждой нации свои.. культурные особенности.

— Ну да ладно. Обсудим конкретику?

MAME

Mame это очень известный эмулятор самых разных машин и архитектур, как устаревших так и современных, когда-то созданный ради запуска игор, выгруженных из старых игровых автоматов.

С помощью Mame, мы получим почти настоящий Kaypro II, с оригинальным ROM и оригинальным образом загрузочной дискеты с CP/M — прямо из 80х.

Дальше нужно будет скачать загрузочный образ 5.25-дискеты с CP/M 2.2, например отсюда, затем специальные ROM-файлы для самого Kaypro II и его весьма специфической клавиатуры, отсюда.

Архивы называются kayproii.zip и kaypro10kbd.zip, их необходимо копировать как есть, не распаковывая. Создаем структуру каталогов:

mkdir kayproii-machine && cd kayrpoii-machine
mkdir roms disks

Копируем ROM-файлы:

cp ~/Downloads/kaypro*.zip ./roms/

Распаковываем образ дискеты:

7z e ~/Downloads/KAYPRO\ II\ 64k\ CPM\ vers\ 2.2.7z -o./disks/

Запускаем:

mame kayproii -w -rompath ./roms -flop1 disks/KAY64CPM.IMD

Если все шаги выполнены правильно, появится заставка Mame с описанием эмулируемой машины:

После нажатия любой клавиши, загрузится сама CP/M и вы увидите такое приглашение:

..

Да все просто.

Если бы мне давали доллар каждый раз, когда я слышу эту фразу — давно бы стал миллионером..

— Наш коллега из организации, назовем его для простоты доктор Кригер, свято уверен, что только он один может.. как это он выразился?

Создать новую электронную жизнь в древнем компьютерном теле.

— Надеюсь, ваш коллега хотя-бы вводит код руками а не другим органом.

Гость посмотрев с удивлением, ненадолго задумался.

— Какая интересная мысль! Мне бы такое в голову не пришло. Я уже упоминал, что вы с ним похожи?

CPMTOOLS

Это весьма известный (среди некрофилов) набор инструментов для работы с файловыми системами CP/M, за авторством Michael Haardt. К сожалению работа над оригинальным проектом давно прекращена, так что мы будем использовать более современный форк:

Собираем и запускаем сборку:

./configure
make

В результате сборки появится несколько бинарников, готовых к запуску:

Думаю даже по названию нетрудно догадаться об их предназначении.

Думаю даже по названию нетрудно догадаться об их предназначении.

Для всех последующих увеселений будут использоваться в основном эти два: cpmls и cpmcp. Первый предназначен для просмотра содержимого образа диска, второй — для копирования внутрь файлов с хоста.

Копируем созданный образ диска в текущий каталог:

cp ../../work/kayproii-machine/test2.dsk .

Проверяем что диск читается:

./cpmls -f kpii test2.dsk

Копируем тестовый файл:

./cpmcp -f kpii test2.dsk README 0:README.TXT

Повторный запуск cpmpls должен показать содержимое диска с тестовым файлом:

NTVCM

Наконец последний эмулятор CP/M, который тоже придется использовать, хотя и опосредованно:

Virtual CP/M Machine. Emulates CP/M and the 8080/Z80 on Linux, MacOS, Windows, and real-mode 8086 DOS to run CP/M .com files

Кстати последний он еще и в том смысле, что это новая разработка, созданная (судя по коммитам) буквально пару лет назад.

Этот самый ntvcm придется собрать и добавить в переменную PATH, поскольку эмулятор создан тем же автором, что собрал репозиторий с компиляторами под CP/M и используется из скриптов для тестов и.. кросс-компиляции. Под CP/M, ага.

Шаги простые и очевидные:

Дальше просто добавляете этот каталог в переменную PATH:

export PATH=$PWD:$PATH

На этом подготовка к оргии празднику древней разработки наконец завершена и мы снова переносимся обратно в офис.

..

— Короче, коллега Кригер считает, что только он один в силах что-то написать для нашего Kaypro II. Что вообщем-то правда, поскольку остальные умеют все эти ваши компьютеры только включать и выключать. Обычно пинком.

Тут мой гость понял, что наверное не стоило показывать зависимость от будущего исполнителя.

— Но разумеется, у нашей организации есть и другие варианты.  Пробовали привлекать «юные дарования», как самые перспективные. Закончилось.. не очень хорошо.

Достав из внутреннего кармана пиджака конверт, гость выложил на стол несколько фотографий.. полных неописуемого ужаса.

Увиденное на фото заставило шевелиться последние остатки волос.

— Когда его нашли, он был в бреду и ползал в ванной, обмазавшись собственными экскрементами. Весь пол, стены и даже потолок были изрисованы чем-то коричневым — символами, похожими на египетские иероглифы:

All 24 and 28 pins EPROM pinout 2708 - 27512. <a href="https://pikabu.ru/story/neobyichnyiy_zakaz_razrabotka_pod_cpm_14058329?u=http%3A%2F%2Fwww.z80.info%2F&t=%D0%9E%D1%82%D1%81%D1%8E%D0%B4%D0%B0&h=0538d55ccd2e382340c71e498d719cfb76e91df1" title="http://www.z80.info/" target="_blank" rel="nofollow noopener">Отсюда</a>.

All 24 and 28 pins EPROM pinout 2708 - 27512. Отсюда.

— Это распиновка EPROM, для Z80.

— Хм, гляжу вы действительно разбираетесь.

Тут гость привлек мое внимание, указав на одну из фотографий.

— Вот здесь, на стене было загадочное послание, оставленное.. аналогичным способом. Но его смысл мы так и не смогли разгадать.

Я пригляделся к фотографии:

640КБ ХВАТИТ НА ВСЕХ

— Нет идей что бы это могло значить?

Пол Аллен и юный Гейтс за четыре года до основания Microsoft.

Пол Аллен и юный Гейтс за четыре года до основания Microsoft.

НЕПРЕРЫВНОЕ ВЕСЕЛЬЕ

Возвращаясь к тому адскому репозиторию с компиляторами, наконец рассказываю основное:

как современному ребенку программисту вести разработку для компьютера из 1987 года.

Цепочка необходимых действий выглядит следующим образом:

  • Сборка;

  • Тестовый запуск с помощью ntvcm;

  • Запуск с помощью myz80;

  • Запуск в Mame с образом настоящего Kaypro II;

  • Сеанс рукоблуд.. ээ переход к следующему примеру.

И начнем мы с того самого примера, показанного на заглавной картинке в фоне. Заранее предупреждаю:

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

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

Aztec C

Спасая цитату из погибающей википедии:

Aztec C is a discontinued C programming language compiler for CP/M-80, MS-DOS, Apple II (both Apple DOS 3.3 and ProDOS), Commodore 64, early Macintosh, Amiga, and Atari ST. It was sold commercially by Manx Software Systems[1].

Судя по обнаруженным материалам, это был весьма известный и популярный продукт для тех лет. А еще это вариация языка С до стандартизации, поэтому и называется не просто компилятором, а прям отдельным языком:

Aztec C — a programming language for a variety of platforms

Редкое для современных бюрократических реалий зрелище: компилятор, забивающий на стандарты и правила. Так что это был популярный и известный инструмент, с весьма скромными прайсами:

Сложно из 2026 года оценивать цены 1980х, но судя по прайсу выше, Aztec C был явно не самым дорогим софтом, тем более для разработчиков. Но мы опять отвлеклись.

Переходим в каталог manx aztec c v106d и запускаем сборку примера:

./m.sh EXMPL

Да, обязательно КАПСЛОКОМ и обязательно без указания расширения, поскольку в скрипте идет вызов как компилятора, так и линковщика. Будет собран COM-файл для CP/M, который проще всего запустить с помощью эмулятора от автора репозитория:

ntvcm EXMPL.COM

Так весь процесс выглядит в действии:

Теперь запустим на втором эмуляторе — MYZ80, чтобы убедиться в корректности только что собранного приложения. Копируем созданный EXMPL.COM в каталог с эмулятором и запускаем его через Dosbox:

cp ../../src/cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM .
dosbox MYZ80.EXE

Затем, уже из CP/M выполняем:

import EXMPL.COM

Этим действием, файл будет скопирован с хоста в виртуальный диск (дискету) CP/M, откуда его наконец можно будет запустить:

EXMPL

В действии:

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

./cpmcp -f kpii ../../work/kayproii-machine/test2.dsk ../cpm_compilers/manx\ aztec\ c\ v106d/EXMPL.COM 0:EXMPL.COM

Этим действием мы запишем наше собранное приложение EXMPL.COM в образ дискеты для Kaypro II. Для проверки выполняем:

./cpmcp -f kpii ../../work/kayproii-machine/test2.dsk

Должно быть видно содержимое образа дискеты, с новым файлом внутри:

Наконец запускаем максимально близкую к реальности эмуляцию компьютера Kaypro II в Mame:

mame kayproii -w -rompath ./roms -flop1 disks/KAY64CPM.IMD -flop2 test2.dsk

Так это выглядит в действии:

Чтобы не раздувать статью до совсем уж скотских размеров, для всех остальных компиляторов покажу только финальный запуск в Mame. Пусть ваше больное воображение дорисует недостающее.

..

— Ладно, думаю мы договорились. Небольшое приложение для Kaypro II образца 1987 года, для причинения моральных страданий немецкому инженеру.

На этом мой гость задумался, как будто вспоминая важную деталь.

— Как же оно называется? Туда запихиваются такие плоские черные штуки? Д.. дди.. доо..

— Дисковод, для дискет. Работу необходимо сдать на 5.25 дискете, я уже понял.

Это был первый раз в моей жизни, когда надо было сдать работу на пятидюймовой дискете. Но с учетом роста цен на чипы памяти и SSD — думаю далеко не последний.

(гомерический хохот за кадром)

Так выглядела обложка от оригинальной упаковки с комплектом дискет.

Так выглядела обложка от оригинальной упаковки с комплектом дискет.

Microsoft COBOL

Малоизвестный ныне факт, но компания Microsoft когда-то продавала компилятор COBOL:

Microsoft produced a COBOL compiler for CP/M. This product was also licensed to IBM as IBM Cobol Compiler.

Я собрал и запустил пример, который производит вычисление корня методом Ньютона:

./m.sh SQUARO

Для запуска помимо SQUARO.COM надо перебросить в эмулятор еще и файл RUNCOB.COM, иначе не заработает. Так этот пример выглядит в работе, на фоне (в редакторе) можно заметить исходный код на COBOL:

Microsoft COBOL оказался хотя и интересным, но все же мало актуальным компилятором, так и не нашедшим широкого применения в свое время. Врядли приложение на COBOL было лучшим вариантом, чтобы утереть нос немецкому коллеге-инженеру.

Так что я стал искать дальше. Однако был еще один важный вопрос, который стоило закрыть прежде чем выбрать наконец язык реализации.

..

alex0x08: дарова!

alex0x08: нужны тайные знания ордена

alecv: излагай

alex0x08: надо программку одну запустить, на железе из 1987 года :)

..

Единственное фото дискеты с этим компилятором, которое удалось найти.

Единственное фото дискеты с этим компилятором, которое удалось найти.

Prospero Pascal

Кто ищет — всегда находит, поэтому очень скоро обнаружилась еще одна невероятная дичь редкость:

Prospero Pascal is a full-featured Pascal that includes everything you need to begin writing stand-alone programs for your Atari ST.

Компилятор Паскаля для 8-битных компьютеров с блекджеком и блудницами с дополнениями и доработками:

Prospero Pascal is a superset of ISO Standard Pascal. In addition to the standard features, this package offers a number of extensions including dynamic strings, single- and double-precision floating-point arithmetic, an assembler-level interface, and separate compilation of program segments. Moreover, Prospero Pascal offers a high degree of portability.

Динамические строки, вычисления с плавающей точкой, поддержка ассемблерных вставок и все это в 1983м году! На Паскале и под Atari, если кто вдруг не понял.

В качестве примера была взята реализация "симулятора жизни":

./m.sh LIFE

К сожалению автоматически (из скрипта сборки) оно не линкуется, так что пришлось вызывать этот шаг отдельно:

ntvcm PROLINK.COM LIFE,PASLIB/S

Так эта программа выглядит в работе:

Все выше конечно весьма занимательные (для археологов и некрофилов) штуки, но самое интересное я приберег напоследок.

Borland Pascal 1.0

Тот самый Паскаль, ставший для многих первой любовью первым языком программирования, поскольку именно на нем много лет обучали кодингу в школах и некоторых ВУЗах этой страны.

В результате чего появлялись на свет такие как автор, для которого Паскаль тоже когда-то был самым первым.

Но то что я сейчас покажу — не просто «какой-то там Паскаль» и даже не «какой-то там Паскаль» от фирмы Borland, ставшей законодательницей мод в паскалестроении.

Это его первая релизная версия, с которой все началось.

А еще с первой версии стартовала история и знаменитой среды разработки, с помощью которой осуществлялась сборка и отладка программ.

Вот он, тот самый TURBO.COM, который позже превратится в TURBO.EXE:

Кусочек руководства пользователя с адресом «небольшой компании-стартапа» на просторах Калифорнии:

А я почему-то всегда был уверен, что Borland начиналась как европейская компания — удивительные открытия порой приносит компьютерная археология.

Для тестов, были скопированы TURBO.COM и HELLO.PAS на образ дискеты, который затем подключили в эмулятор. Так все действо выглядит в эмуляторе Mame:

НЕЛЕГКИЙ ВЫБОР

Итак, у меня набралось четыре варианта на выбор:

  • Первая релизная версия Borland Pascal;

  • Редкая версия Pascal, с крутыми (для 1983 года) фичами;

  • Microsoft COBOL, без комментариев.

И конечно же Aztec C — реализация языка С до его стандартизации, настоящий артефакт. Что выбрала для меня судьба?

И.. да, это Aztec C.

(бурные аплодисменты)

Но не потому, что верю в судьбу или так подсказал какой-то кубик. Просто в любой непонятной ситуации я всегда выбираю С. И такой подход еще ни разу не подводил.

В такое безусловно сложно поверить далекому от Сант-Петербурга обывателю, но это настоящий барельеф с масонским гербом.

В такое безусловно сложно поверить далекому от Сант-Петербурга обывателю, но это настоящий барельеф с масонским гербом.

ПОСЛЕДНЯЯ ПРОВЕРКА

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

Меня встретили у неприметной двери, в которую надо было постучать определенным образом и строго в нужной последовательности. Затем надев на голову черный мешок, непроницаемый для любого света, аккуратно сопроводили в тайное помещение ордена.

Ордена «Свидетелей Спектрума».

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

Тут было все:

Спектрумы, Амиги, старые рабочие станции Sun и HP, DEC и даже Alpha.

Денно и нощно (обычно по субботам) монахи ордена без устали смазывали, паяли и окуривали все это благовониями, дабы ублажить «дух машины» обитающий в старом железе. Орден ревностно хранил свои секреты и мне очень далеко не сразу было позволено хотя бы приблизиться к их древностям. Но все же мне необходима была их помощь для последней проверки перед сдачей этого фантастического проекта:

запуска собранного приложения для машины из 1987го на реальном компьютере 1987го.

Меня сопроводили в специальную, строго охраняемую комнату, где на постаменте, под защитным стеклом находился артефакт из далекого прошлого.

Robotron 1715 — 8-разрядный персональный компьютер производства ГДР. Производился на заводе VEB Robotron.

Версия 1715M, сохраненная в ордене это «экспортный» вариант, когда-то давно поставляемый в Советский Союз. С величайшим почтением нашептывая молитвы загрузки, послушник в черном балахоне приблизился к постаменту и приложил ладонь к считывателю отпечатков пальцев. Защитное стекло начало медленно опускаться.

Наконец запуск и загрузка операционной системы SCP ( аналога CP/M, но из ГДР) были завершены. Появилось приглашение ввода команд:

А>

Послушник взял мою пятидюймовую дискету с записанной сборкой и с благоговением вставил ее в древний дисковод, не забыв выставить специальную защелку в вертикальное положение.

Затем на не менее древней механической клавиатуре он ввел:

Дисковод ожил и издавая чудовищный скрежет начал загружать мое послание. Через какое-то время на экране появились строки:

NE PUERO GLADIUM, DR. KRIGER. 04.03.2026

Что в переводе с латыни означает:

НЕ СТОИТ ДАВАТЬ БОЕВОЙ МЕЧ МАЛЬЧИКУ, ДОКТОР КРИГЕР.

Проверка удалась и написанное мой приложение для компьютеров 80х под CP/M действительно успешно запустилось на настоящем компьютере из 1987 года. Так это выглядело в живую:

Мое послание, запущенное на настоящем Роботроне.

Мое послание, запущенное на настоящем Роботроне.

P.S.

Все персонажи (кроме автора) - пародия на известный сериал Archer. Статья в более развернутом виде была опубликована на Хабре, оригинал в нашем блоге.

Показать полностью 36
12

Элитный вайбкодинг

Еще одна поучительная история из жизни современной разработки, на этот раз на тему вайбкодинга — новой заразы, поражающей чаще всего обычных людей, не имеющих никакого отношения к ИТ и программированию.

Вы же хотели узнать как обстоят дела в современном ИТ?

Все имена в этой истории выдуманы, все совпадения случайны, концов найти не получится. Жалобы и заявления можно отправлять сразу в «Спортлото», там помогут.

Что такое вайбкодинг

Если совсем честно, объяснение явления «вайбкодинга» напрямую зависит от наличия у читателя высшего технического образования:

если вас обучали условно «крутить гайки и извлекать корни» — врядли получится свести все объяснения к «разработке по ощущениям» или известной фразе «я так чувствую».

Но когда такого образования нет и математические формулы для вас лишь «руны на эльфийском» — поздравляю:

окружающий мир для вас будет всегда полон магии и волшебства

И в качестве одного из проявлений такого «магического мышления» рано или поздно появится приписывание машине человеческих черт, в первую очередь дурацкая идея, будто машина «умеет думать».

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

Все, что более-менее доступно человечеству на данный момент — симуляция внешнего отражения мышления с помощью нейросетей.

Но вернемся к теме «вайбкодинга»:

вайбкодинг это такой новомодный стиль разработки ПО, при котором исходный код генерируется компьютером путем составления запросов на человеческом языке.

Как-то так это выглядит в действии:

Вайбкодинг предсказуемо набрал огромную популярность и захватил умы широких масс, поскольку полуграмотных идиотов с магическим мышлением всегда было и будет больше чем нормальных инженеров.

К счастью законы вселенной все также неизменны и любое проявление идиотии в жизни является наказуемым.

Клиент всегда прав

На закате одного прекрасного летнего дня, когда уже были сделаны все важные дела и автор превкушая отличный вечер переключился на очередные изыскания в ядре FreeBSD, на почту упало письмо:

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

Впрочем, как обычно ;-)

Работа есть работа и заявку стоило изучить, даже если она феерична по сути и абсурдна по содержанию.

Тоже Стив, но другой ;)

Тоже Стив, но другой ;)

Для первого знакомства и прояснения ситуации с проектом, был назначен созвон по видеосвязи, на котором потенциальный заказчик, назовем его Стивом, проявил себя.. крайне занимательным персонажем:

«дружище Стив» подробно и без стеснения изложил свое видение будущего всего ИТ и разработки ПО в частности, которое во многом совпадало с идеями «известного гуманиста и эксперта по ИИ» Дани Шеповалова.

Немного прямой речи «дядюшки Стива», для оценки его замечательных идей и общей адекватности:

— Понимаешь Алекс (именно для таких я подписываюсь как «Alex», произнести целиком «Alexander» дано очень далеко не всем)..

— ..скоро роботы заменят всех инженеров-людей, программирование как вид деятельности уже давно в прошлом, никто теперь не пишет код руками..

— ..все эти ваши «глубокие знания» и «уникальный опыт» больше ничего не стоят и никому не нужны.

...

Всегда изумляли люди, которые могут так просто и без малейшего стеснения рассказывать представителю третьей древнейшей профессии о его печальном будущем и скорой кончине в холоде, голоде и нищете.

Почему-то врачам и юристам так не хамят, но инженерам — запросто.

— Мой племянник легко и быстро может написать вообще все что угодно с помощью ChatGPT, хотя еще учится в школе..

..недавно написал социальную сеть (это дословная цитата). - ИИ это наше общее великое будущее, ниспосланное нам мировыми корпорациями!

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

А «дружище Стив» продолжал нести дичь, поведав интересную историю, что «сам-то он тоже воевал за Деникина когда-то был программистом» — в солнечном Лориене, писал на Borland C++ софт для страховой.

Но было это очень давно.

Так что в разработке ПО он «понимает», но давно уже большой начальник и теперь работает головой а не руками.

Поэтому ему нужна наша помощь, в виде тех самых «рук».

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

А поможет ему в этом нелегком деле любимый племянник — «юный ИТ-гений с большими перспективами», чьему мнению Стив целиком и полностью доверяет.

Пареньку на тот момент было 17 лет и он действительно оказался далеко не самым тупым из подростков.

Но доверить практически ребенку выбор технологий для реального проекта, где планировалось участие целой команды серьезных программистов — сами понимаете. Было затеей крайне сомнительной, если мягко.

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

Так что я предложил еще раз созвониться уже на троих и обсудить следующие шаги.

Юный гений

Племянник Стива, назовем его Майк, оказался самым обыкновенным американским подростком, с самыми обычными подростковыми интересами и увлечениями:

спорт, девушки, учеба и компьютеры.

Нет, Майк не просиживал вообще все свободное время за монитором, не входил в Телесеть, не собирал винтажные компьютеры из прошлого века и не пытался притащить домой мейнфрейм IBM.

Он, как и все нормальные подростки, просто делал на компьютере домашние задания, играл в видеоигры, смотрел порно и учился программировать. Разумеется на прикладных языках, не на чистом С или ассемблере.

Словом, эльфийский паренек Майк не делал ничего такого, что выходило бы за рамки обычных подростковых занятий и увлечений.

Еще Майк очень любил вайбкодинг:

ChatGPT, Claude, разнообразные агенты и сложные промпты — видимая мощь этих технологий явно очаровала паренька.

Ну а добрый дядя Стив с радостью оплачивал все счета, не без оснований полагая, что любимый племянник занимается полезным делом.

Вайбкодинг разумеется куда лучше чем фентанил, так что тут вопросов к дядюшке Стиву нет никаких.

Не имея сколь-нибудь серьезного опыта в разработке но раз за разом получая в выдаче длинные листинги кода — впечатлительный подросток действительно уверовал, что выдаваемое нейросетью говно это есть настоящее программирование.

Что больше не нужно долго учиться, тратить годы на ковыряние компьютеров и изучение матчасти, достаточно лишь попросить нейросеть.

И она сделает всю работу сама.

А все что нужно для завершения их с дядей мега-проекта — как-то запустить код, сгенерированный нейросетями.

Для чего и понадобились толковые «запускатели» — мы.

Да, вы правильно поняли, Стива с Майком не интересовали ни наш многолетний опыт в разработке, ни широкие компетенции, они пришли с куда более простым и понятным запросом:

почините пожалуйста результат работы ChatGPT, который почему-то не запускается.

Уборщиками за нейросетью нас еще не нанимали, но сотня баксов есть сотня баксов.

Особенно в час.

Всю жизнь мечтал с баяном и тремя бабами плясать на сцене, а не вот это все. Честно.

Всю жизнь мечтал с баяном и тремя бабами плясать на сцене, а не вот это все. Честно.

Толковые исполнители

Я уже неоднократно рассказывал о прошлых победах и проектах, по которым можно сделать выводы о нашей отмороженности смелости и отваге, позволяющей браться за самые сложные проекты.

Но в этот раз проблема заключалась не в технологиях а в людях — можно сказать в классической стартаперской связке «Hacker&Hustler», в современной интерпретации:

престарелый маразматик, давно отошедший от дел и его малолетний племянник, угоревший по ИИ и вайбкодингу.

Встал нелегкий выбор:

  • попытаться все же сделать проект, перехитрив опасных идиотов;

  • молча уйти в закат, оставшись без денег.

Коль уж читаете эту статью, думаю очевидно какой вариант мы выбрали.

...

— Дружище Стив!

— С радостью поможем вашему начинающему предприятию приблизить закат человечества и добить остатки инженерной культуры!

— Но есть нюанс.

— Видишь ли, ИИ и роботы это самые новые, самые топовые и самые прорывные технологии, специалистов очень мало и стоят они дорого.

— $150/hr.

Разумеется я был в курсе стоимости подобных услуг на далекой эльфийской родине Стива, поэтому не особо надеялся его впечатлить.

— Алекс, все понимаем и полностью доверяем. Но хотим контролировать процесс.

Надо чтобы ваш специалист работал на камеру, с записью экрана.

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

Но меня уже было не остановить.

— Дружище Стив! Конечно мы сможем такое организовать, любой разврат за ваши деньги желание клиента для нас закон.

— Но есть нюанс.

— Наши эксперты работают по нескольким проектам, на их рабочих компьютерах есть чужая конфиденциальная информация, которую не стоит показывать на камеру. Так что придется готовить выделенные рабочие места, специально под ваш замечательный проект. А это наши прямые затраты, которые придется компенсировать.

— $200/hr.

— ..и $6000 на закупку необходимого оборудования.

..

Стив согласился.

Так мы получили весьма неплохой проект, в комплекте с набором обязательств по реализации, причем фактически против воли заказчика.

Потому как сделать что-то адекватное при таких вводных было физически невозможно, чтобы там ни рассказывали по этому поводу «мировые эксперты вайбкодинга».

Ни за сотню баксов в час, ни за две ни за миллион.

Нет способов с позиции исполнителя успешно переубедить малолетнего идиота, очарованного новой игрушкой и престарелого маразматика, хотя и работавшего по профилю в славном боевом прошлом, но давно утратившего связь с реальностью.

Особенно, когда они оба из страны «сказочных эльфов», где с детских лет рассказывают про «страшный Мордор» и его тупых обитателях.

Так что нам пришлось применить военную хитрость и смекалку.

"Senior Vibecoding Expert", the Василий

Недолго думая, был взят сотрудник с самой большой в компании бородой, на голову ему были нацеплены огромные студийные наушники — самые большие, которые только смогли достать.

Для максимального сходства с известным персонажем на фото выше, часто мелькающим в материалах про вайбкодинг, Василий еще медленно кивал головой и качался в ритм расслабляющей мелодии.

Василию были подключены платные подписки на ChatGPT, Copilot, Claude и все прочие радости вайбкодера, затем поставлена задача «чего-то делать с умным выражением лица».

Все это записывалось на камеру, для отчета нашим благодарным клиентам — дружище Стиву и его юному, но уже гениальному племяннику.

Надо сказать, денежная мотивация пробудила у Василия настоящий актерский талант:

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

Так мы получили идеальную картинку.

The process

Картинка-картинкой, но проект все же надо было как-то реализовывать.

Поэтому помимо Василия, играющего для заказчика роль «мирового эксперта по вайбкодингу», был взят обычный программист Виталий, уже без тактической бороды, огромных наушников и актерского пафоса.

Обычный инженер Виталий, используя самые обычные технологии и весьма обыденный процесс разработки.. сел и создал весь этот замечательный проект.

Целиком.

Без нейросетей, промптов и кодогенерации.

Попивая чаек с печеньками, как делал это много-много раз.

Разумеется серая и обыденная итеративная разработка радикально отличается от безумного потока шизоидного бреда, называемого вайбкодингом и коль уж мы подписались под второе, надо было каким-то образом синхронизировать выдаваемые результаты.

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

Потому что это все с их точки зрения было.. «не круто».

Каким-то невеорятным образом, то что давно считается нормой в отрасли, стало восприниматься как «дедовский кринж» и потеря времени для заказчиков нового типа — тех кто готов платить по $200 в час за безумную генерацию кода с помощью ИИ.

Поэтому мы пошли другим путем.

Рок-звезда вайбкодинга

Василию были даны инструкции на тему как должна вести себя «настоящая творческая личность» и «рок-звезда от разработки».

Мы по-быстрому нагуглили отчеты полиции биографии таких замечательных людей как Оззи Осборн, Сид Вишес и Дейв Мастейн, по достоинству оценив их досуг и внимательно изучив что все эти персонажи творили между концертами, как обходились с обслуживающим персоналом и различными препаратами, как легальными так и не очень.

Василию были даны указания.

Получилось... эпично.

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

Он просто вел себя... немного необычно:

задумчивое цитирование Некрономикона Библии, долгое сидение напротив стены в позе лотоса, диалоги с воображаемым оппонентом на тему будущего ИИ и «сумерек человечества» — в таком духе.

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

Особенно удался Василию монолог на несколько часов (при рейте $200/час) на тему личной ответственности при использовании ИИ:

Василий с невероятной страстью, с заламыванием рук и дерганьем бороды на камеру практически повторил бессмертные произведения Шекспира.

Приведу небольшой отрывок выступления:

— О Боже мой! Я не могу коммитить в репу этот темный код! Это же ересь!

— Она разожжет страстей огонь в сердцах невинных!

— ..низвергнет во мрак проклятый ИИ все юные и неокрепшие души!

Получилось очень круто, Василий получил заслуженный бонус.

Разумеется все творилось отнюдь не из одной любви к искусству и весь этот цирк был действительно необходим для двух весьма приземленных вещей:

обоснования затраченных часов и поддержания легенды «рок-звезды» от вайбкодинга.

И можно сказать выступление удалось.

Фактически пока за кадром шла обычная итеративная разработка, с планами и этапами, на камеру наш «звездный» Василий непрерывно генерировал в потоке нейронную дичь, создавая запросами что-то похожее на прототип или требуемый функционал.

А затем.. наигранно все удалял, жалуясь на галлюцинации ИИ.

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

А затем повторно все удалял, как настоящий артист.

Творчество — процесс непредсказуемый, что тут скажешь.

Average results

Проект мы сдали.

Но самое главное, что заказчик тоже был в полном восторге, уверовав окончательно в мощь высоких технологий:

— Ну вот, ты же видишь, Алекс — вот оно будущее! Нафиг никому не нужен твой скепсис!

(это я честно пытался предупредить Стива о последствиях)

— Вы просто говорите машине что делать и она делает. Никакого набивания кода вручную, один сплошной вайб и релакс.

Дружище Стив не мог нарадоваться и постоянно сравнивал этот успешный опыт со своим «боевым прошлым»:

— Помню как тяжело было кодить на C++, как я мучился с багами и падениями. Надо было знать наизусть синтаксис и всякие ограничения Windows. Память текла как решето.

Хотя я и пытался честно донести Стиву мысль, что прогресс ушел далеко вперед даже для C++, разница между его познаниями в программировании из 1998 года и современностью была слишком велика.

Так что даже концепцию «Garbage Collector» объяснить Стиву не удалось.

Immersive success

Как и любой успешный проект, эта история не закончилась на сдаче-приемке и получении оплаты. «Дружище Стив» как оказалось, имел по истине наполеоновские планы, простирающиеся минимум на следущее столетие:

любимый племянник Майк становится CTO новоявленной мегакорпорации по захвату мира и на этом посту продолжает генерировать замечательные идеи в виде неработающего кода, путем вайбкодинга.

Ну а мы должны были бы продолжать все это «просто запускать».

Однако своих собственных сотрудников Стив почему-то нанимать не хотел, будучи полностью уверенным что их с племянником навыков, усиленных модными нейросетями хватит для ведения крупного бизнеса.

Замечательный план, надежный как швейцарские часы (ц).

Возможно мы оказались недостаточно жадными или слишком правильными, но развивать тему дальше не стали, сославшись на то, что «великий гуру вайбкодинга» Василий нас покинул, открыв для себя буддийские духовные практики.

И ныне путешествует где-то в районе Тибета.

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

«Видимо» поскольку мы потом несколько раз получали запросы от мутных типов, увешанных плашками «AI/ML/Vibecoder/20см» в подписи и вопрощающих как у нас получилось сделать настолько крутую реализацию с помощью вайбкодинга.

Даже % от будущих прибылей предлагали, за решение.

Эпилог и выводы

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

«профессия врач устарела», «врачи никому не нужны», «зря дружок учился десятки лет» и вообще «по жизни неудачник».

Самый простой способ сесть в тюрьму, потеряв все имущество — начать хамить вашему юристу, примерно в таком же стиле. Самый простой и надежный способ потерять кучу денег в ИТ — начать поучать опытных разработчиков в их нелегкой профессии.

Даже если вы «очарованы и влюблены» в очередную крутую технологию, обещающую золотые горы и бесконечный успех. Даже если вы сами когда-то писали код и думаете что чего-то в этом понимаете.

Теперь, прочитав эту замечательную историю, задумайтесь о реальном положении дел в отрасли и всем что связано с ИИ.

Прикиньте сами, сколько еще таких команд работают в индустрии и какой процент из них рассказывает про реальный расклад а не генерирует очередную красивую картинку про «тотальную победу ИИ».

Скольких из них еще не купил Илон Маск или Сэм Альтман.

Прикинули?

P.S.

Статья была опубликована на Хабре, оригинал в нашем блоге собрав заметный интерес широкой аудитории.

Пердаки полыхали настолько ярко, что решили записать отдельное видео с ответами на вопросы, которыми читатели закидали после выхода статьи:

На других платформах: Rutube, Youtube.

Наслаждайтесь ;)

Показать полностью 10 1
5

Восстановлен оригинальный редактор карт DoomEd на NeXT

Многие не в курсе, что Doom разрабатывался на NeXT. Еще меньше народу знает, что Ромеро недавно (всего лишь 10 лет назад) выложил исходники первой версии редактора карт для Doom, как раз для NeXT.

Зато теперь вы знаете, что я собрал этот самый редактор карт DoomEd под NeXT. Из исходников, вот этими самыми руками, да.

Осталось разобраться с текстурами и ресурсами и будет полностью восстановленный процесс разработки оригинального Doom.😍
Кстати Ромеро в своем посте выложил еще и "unreleased soundtrack" - дополнительные мелодии, не вошедшие в оригинальный Doom, с которым рекомендую ознакомиться.

В качестве пруфа.

В качестве пруфа.

На скриншоте выше эмулятор NeXT с NeXTSTEP, сетью, средой разработки и собранным редактором карт для Doom - именно той версии, которая использовалась Ромеро для оригинальной разработки.

Собственно запуск оригинального Doom под NeXT, задолго до того как он появится под MS-DOS:

Более развернутое обсуждение было в нашем канале, сейчас пилим полный процесс оригинального картостроения - выйдет большой разбор.

Показать полностью 1 1
15

Покатушки от Лахты в Красное Село

Закрыл для себя еще одну точку на карте, доехав на своем железном коне до Красного Села.

Самая жесть, что Красносельское шоссе идет на подъем начиная с КАД, так что я пер в гору что-то около 10 км.

Выехал в 7 утра, вернулся обратно в 23 вечера, получается 16 часов на колесах подряд.

К сожалению трекер не выдержал такого накала, по проехал я где-то 150км за один день.

Вот эту адскую развязку КАД пришлось проходить "козьими тропами" и с помощью местных проводников, т.к. прохода нет ни на одной карте:

Страшное место.

Страшное место.

Напротив Троицкой церкви, самый центр города:

В прошлом году аналогичным образом скатался из Питера в Шлиссельбург, сильно удивив местных жителей.

Показать полностью 1 1
271

Cray: оживление легенды

В ИТ-индустрии существуют вещи, само существование которых давно стало красивым мифом, о котором принято вспоминать лишь шепотом и закатывая глаза от благоговения.

Настоящий Cray.

Настоящий Cray.

Cray

На сегодняшний день, во всем мире осталось наверное не больше пары сотен инженеров, заставших «те времена» и имевших возможность прикоснуться к легенде.

Лишь единицы из них еще могут что-то рассказать.

То что описано в этой статье — редчайшее знание, которое совсем недавно было доступно горстке избранных, с ученой степенью, специальной подготовкой и допусками к такому оборудованию.

Огромное, древнее чудовище из далекого прошлого, из времен мифов и легенд ожило и вернулось к жизни.. руками фанатов.

Дав возможность и простым людям прикоснуться к легенде.

Seymour Cray на фоне собственного суперкомпьютера.

Seymour Cray на фоне собственного суперкомпьютера.

Легенда

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

Создаваемые полностью вручную (некоторые модели — вплоть до чипов) и имевшие цену в десятки миллионов долларов, суперкомпьютеры Cray поставлялись в исследовательские лаборатории, крупные датацентры и конечно же в разведывательные управления разных стран.

Про последнее стоит рассказать подробнее:

суперкопьютеры Cray всю историю плотно ассоциировались именно с секретными проектами, поскольку действительно часто использовались для взлома секретных кодов, паролей и шифров.

Что характерно, сам Крэй начинал карьеру во флоте (US NAVY) и работал над взломом японских шифров времен второй мировой войны, по всей видимости сохранив с тех лет хорошие отношения с главным разведывательным управлением.

У вас же, дорогой читатель шанс увидеть суперкомпьютер Cray был лишь в кино, где они довольно часто мелькали в качестве реквизита:

Ни о работе с такими машинами, ни тем более о разработке под них простым обывателям не стоило даже мечтать, даже если они родились и выросли в США. Допуски, специальное обучение с сертификацией и чаще всего наличие PhD — вот что обычно требовалось от «пользователей» подобного оборудования.

В Россию суперкомпьютеры Cray предсказуемо завозились с очень большими препонами и исключительно простые модели. В частности в Росгидромете была практика использования таких машин, начавшаяся еще в 90е.

Как бы то ни было, простому обывателю доступ к суперкомпьютерам Cray был заказан.

Я сам, несмотря на двадцать лет практики в разработке ПО, о них лишь слышал краем уха, да видел пару картинок в сети, вроде такой:

Производство суперкомпьютеров Cray-1

Производство суперкомпьютеров Cray-1

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

Так выглядел случайно найденный бекап от суперкомпьютера.

Так выглядел случайно найденный бекап от суперкомпьютера.

Симулятор

История создания симулятора Cray за авторством Andras Tantos сама по себе достойна голливудской экранизации, поскольку являет собой победу инженерного духа над всеми преградами и трудностями:

So it’s settled. I’m building a Cray-1.

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

Для примера, чтобы только прочитать данные со случайно обнаруженной ленты, автору пришлось реализовывать специальный драйвер для виртуального контроллера, полагаясь на такие картинки:

Затем пришлось вручную восстанавливать последовательность загрузки:

Разбираться с багами загрузчика и эмуляцией сети — не забываем что речь идет про суперкомпьютер, все основные части которого были связаны между собой по сети.

Andras провел чудовищную по объему и сложности работу, в успех которой к тому же никто особо не верил.

Именно поэтому результат его трудов настолько впечатляет.

Фронтальная панель суперкомпьютера Cray и индикаторы стадий запуска. Сверху кнопка включения.

Фронтальная панель суперкомпьютера Cray и индикаторы стадий запуска. Сверху кнопка включения.

Оживляем легенду

Симулятор использует внешние приложения для работы: xterm, telnet, tmux

Все это необходимо установить на хосте до первого запуска симулятора.

Дополнительно я использовал cool-retro-term для наведения красоты, чтобы снимки экрана выглядели еще эпичнее.

Важное уточнение:

несмотря на использование сетевого telnet, полноценное взаимодействие с запущенной UNICOS придется настраивать позже и отдельно — запускаемый при старте telnet-клиент на самом деле подключается к портам симулятора, через которые происходит трансляция консольных команд в виртуальную ОС и обратно.

Настоящее сетевое подключение к UNICOS требует специальной настройки на хосте, а поскольку инсталляция происходит по сети — сей шаг является обязательным.

Настройка выглядит следующим образом:

brctl addbr craybr
ip tuntap add mode tap tap1
ifconfig tap1 up
brctl addif craybr tap1
ifconfig craybr 172.16.0.1 netmask 255.255.255.0

Несмотря на всю внешнюю монструозность, ничего сложного тут нет:

создается новый мост с именем craybr, затем создается виртуальный сетевой интерфейс tap1, которому назначается IP-адрес 172.16.0.1.

Последним шагом этот интерфейс добавляется в мост.

Название интерфейса указывается в конфигурационном файле симулятора, который называется unicos.cfg, выдержка:

.. EthInterfaces {

en0 {

InterfaceNameLinux tap1

InterfaceNameWindows "Cray Ethernet"

SimMacAddr 0x020143524159

Channel 020

IopNumber 0

}

}

..

IP-адрес должен быть именно 172.16.0.1, поскольку внутренний интерфейс в UNICOS указан как 172.16.0.2 и поменять его достаточно проблематично.

Можно зайти и немного дальше, включив роутинг наружу:

brctl setfd craybr 0
sysctl net.ipv4.ip_forward=1
iptables --table nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE

В случае Mageia исходящий интерфейс будет называться по-другому, что-то вроде wlp4s0.

На стороне UNICOS в симуляторе необходимо выполнить команду:

route add default 172.16.0.1

Ну и радоваться — ведь вы только что выпустили в сеть суперкомпьютер Cray, пусть и виртуальный:

Все что вы видите в консоли выше - оригинальный софт от Cray, для суперкомпьютеров Cray.

Все что вы видите в консоли выше - оригинальный софт от Cray, для суперкомпьютеров Cray.

Готовая сборка

Существуют готовые сборки симулятора Cray для 64-битного Linux, c уже установленным UNICOS версий 10.0.0.2 и 10.0.1.2, созданные известным в узких кругах камрадом neozeed.

Проблема в том, что эти сборки на момент написания статьи успели устареть (от 2022 года) и не факт что заработают в вашей системе.

А планов по обновлению у их автора нет.

Запускается симулятор из этих сборок с помощью стартового скрипта:

./unicos

Не забудьте что перед запуском необходимо выполнить скрипт для настройки сети (см выше).

Так выглядит запуск UNICOS 10.0.1.2 в симуляции суперкомпьютера Cray J90:

Я заменил стандартный xterm, используемый симулятором по-умолчанию на cool-retro-term для большей эпичности скриншотов.

Но конечно у настоящего Cray J-90 не было настолько древних мигающих терминалов и все выглядело куда современне:

<a href="https://pikabu.ru/story/cray_ozhivlenie_legendyi_14053753?u=https%3A%2F%2Fcray-history.net%2Fcray-history-front%2Ffom-home%2Fcray-t90%2F&t=%D0%A7%D1%83%D1%82%D1%8C%20%D0%B1%D0%BE%D0%BB%D0%B5%D0%B5%20%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9%20Cray%20T-90&h=a841ddbc1dd2dcf1e084306efc7989d3bd4841ab" title="https://cray-history.net/cray-history-front/fom-home/cray-t90/" target="_blank" rel="nofollow noopener">Чуть более новый Cray T-90</a> с рабочим местом оператора (OWS)

Чуть более новый Cray T-90 с рабочим местом оператора (OWS)

Если приглядеться, можно заметить на мониторе рабочей станции, характерные квадратные окна 4dwm — оконного менеджера SGI Irix.

Все потому, что в разные исторические периоды для суперкомпьютеров Cray использовались разные терминальные системы — SunOS, Irix и даже Mac:

Чтобы добиться такого же эффекта, измените поле настройки NewTerminalCommand в файле unicos.cfg:

Так выглядит UNICOS в запущенном состоянии:

Согласно описанию автора, в системе есть следующие учетные записи:

The root password is 'password' and I've created a neozeed user with the password of 'password' so you can telnet in

Входим от root:

Если вы все настроили правильно, также заработать сеть между симулятором и хостом, в обе стороны.

Появится возможность войти уже по сети, непосредственно на машину Cray:

Для завершения работы симулятора, введите команду exit в нижней консоли основного приложения и нажмите Enter:

То что нижний блок - тоже терминал, причем допускающий ввод, я догадался не сразу.

То что нижний блок - тоже терминал, причем допускающий ввод, я догадался не сразу.

В принципе даже этой версии хватит для последующих развратных действий с участием компилятора (см. ниже).

Если у вас успешно заработала готовая сборка и нет настойчивого желания «собрать из исходников» — следущий шаг можно пропускать и переходить сразу к стадии действительно изысканных приключений.

Первые суперкомпьютеры Cray были обшиты натуральной кожей убитых инженеров.

Первые суперкомпьютеры Cray были обшиты натуральной кожей убитых инженеров.

Сборка из исходников

Несмотря на то что сие занятие — точно не для всех и любимый ChatGPT врядли подскажет что-то разумное по этому проекту, сделать все же стоит — для большего погружения.

Симулятор написан на C++, с использованием библиотеки Boost, поэтому компиляция из исходников протекает.. весьма неспешно.

Забираем исходники:

Релизных веток нет и все собирается из master.

Перед тем как запускать сборку необходимо установить следующие зависимости, версия для Ubuntu:

g++ make libboost-all-dev libncurses-dev libgpm-dev

Для Mageia:

gcc-c++ make lib64boost-devel lib64ncurses-devel lib64gpm-devel

Исходный код находится в каталоге simulator, поэтому сборка проекта также запускается именно оттуда, а не из корня репозитория.

Поскольку в пакетах Mageia нет статической версии библиотеки Boost, а для сборки Boost из исходниокв не хватило размеров статьи свободного места, я использовал динамическую линковку:

make LINK_TYPE=dynamic build

В Ubuntu сборка будет работать и вот так:

make build

Готовые бинарники будут находиться в каталоге simulator/_bin, но управляющие скрипты об этом знают, поэтому в ручную ничего перекладывать не надо.

Завершение установки на одном из сохранившихся Cray Y-MP, консоль - реальный терминал Wyse тех лет.

Завершение установки на одном из сохранившихся Cray Y-MP, консоль - реальный терминал Wyse тех лет.

Установка UNICOS

Теперь самая интересная стадия, которую вы пропустите если остановитесь на готовой сборке:

установка операционной системы UNICOS в симуляторе суперкомпьютера Cray из оригинальных образов CD-дисков.

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

Но благодаря любопытным фанатам, теперь наконец и вы сможете в этом поучаствовать.

Как уже описывал выше, два случайно обнаруженных диска оказались единственными сохранившимися носителями загрузочного образа UNICOS и без них судьба симулятора сложилась бы совершенно иначе.

Образы UNICOS доступны по ссылкам:

Оба диска являются загрузочными, первый содержит UNICOS версии 10.0.0.2 для модели Cray J90, второй — UNICOS 10.0.1.2 для Cray SV1.

Шаги установки полностью совпадают, но устанавливать я буду более свежую версию 10.0.1.2, со второго ISO‑образа. Несмотря на то что разные версии этой ОС предназначены для установки на разные суперкомпьютеры, в условиях симулятора все отлично работает.

Так выглядит модель Cray SV1

Так выглядит модель Cray SV1

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

Напоминаю, что все команды ниже, выполняемые с хоста, как и управляющие скрипты симулятора подразумевают использование bash.

Со стороны UNICOS используется ksh, но для стадии установки это не особо важно.

Для упрощения вводимых команд, зададим две переменные окружения:

export ISO=/mnt/iso
export SIM=/opt/work/cray/cray-sim

Первая указывает на путь к примонтированному образу диска, вторая — полный путь до каталога с симулятором.

Монтируем загрузочный диск с UNICOS:

fuseiso ./cray-cd2.iso $ISO

Образ UNICOS содержит длинные имена файлов а также файлы и каталоги с именами в разных регистрах:

Поэтому использовать известный трюк сmount -o loop не получится. Копируем архив с системой и ядро:

cp $ISO/unicos_exe/ram_fs $SIM
cp $ISO/unicos_exe/krn_11.bgz $SIM

Распаковываем архив с ядром:

cd $SIM
gzip -d -- < krn_11.bgz | cpio -i

В корневом каталоге симулятора появятся несколько новых файлов, нужный нам называется unicos.generic — то самое ядро.

На этой стадии можно наконец запустить симулятор, но пока с использованием образа RAMFS, который мы только что скопировали с установочного диска:

./unicos_ramfs

Запустится симулятор и появится терминал с подключением к UNICOS, запущенной в single user mode:

Кто бы мог подумать, что смогу запустить в Single User Mode ОС для суперкомпьютеров Cray!

Кто бы мог подумать, что смогу запустить в Single User Mode ОС для суперкомпьютеров Cray!

Теперь настраиваем сеть на стороне UNICOS, поскольку следующим шагом необходимо копировать системные файлы с примонтированного ISO-образа.

Напомню что подключение через telnet происходит на самом деле к самому симулятору, не к эмулируемой ОС внутри.

Вводим в консоли UNICOS:

ifconfig en0 172.16.0.2

После выполнения команды должна отрабатывать команда ping до хоста:

Дальше начинается еще один интересный этап, полный боли и страданий, поскольку придется встретиться с одной очень древней технологией передачи файлов между компьютерами — rcp.

UNICOS, который мы с вами запускаем это система из далекого 1997 года и ничего другого для передачи файлов в ее загрузочном образе просто нет.

Когда-то предполагалось, что весь процесс установки и запуска в эксплуатацию суперкомпьютера — строго секретный, поэтому с «usability» не заморачивались.

Есть еще один важный нюанс:

единственная доступная в образе утилита для передачи файлов на расстояние это клиент.

Для того чтобы подключиться с его помощью и скачать файл, надо поднимать сервер, сервер древнего rcp и на современном линуксе.

Ввиду своей древности, rcp в любом виде (как клиент и как демон) давно отсутствует по-умолчанию в любых линуксах и BSD, а его установка и запуск в современном окружении требует «особой уличной магии».

Для Ubuntu вам будет необходимо установить пакеты:

rsh-client rsh-server

Для Mageia:

rsh rsh-server

В последней запуск rsh-сервера происходит через демон xinetd, который по-умолчанию отключен и попытка запуска будет выдавать ошибку:

xinetd.service is not active, cannot reload.

Поэтому сначала запускается xinetd, затем rsh:

service xinetd start
service rsh start

Следующим шагом необходимо разрешить использование демона rsh по сети (входящие подключения), для Ubuntu необходимо добавить строку в файл /etc/hosts.equiv:

172.16.0.2 +

Для Mageia используется файл ~/.rhosts.

Это позволит подключиться к хосту и скопировать стартовый скрипт инсталляции в запущенную UNICOS.

Но прежде чем копировать, скрипт необходимо немного изменить.

Открываем файл install (находится в корневом каталоге симулятора) любимым редактором vi и заполняем значения переменных:

  • LOCAL_LOGIN = имя пользователя на хосте

  • ISO_MNT = /полный/путь/к каталогу с образом UNICOS

Также добавляем новую переменную SIM_LOC, которой устанавливаем значение в виде полного пути к каталогу с симулятором.

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

Чтобы ее избежать, необходимо задать еще одну переменную:

UNICOS_EXE=UNICOS_exe

В результате всех описанных выше правок должно получиться такое:

Финальный скрипт установки операционной системы Cray, мама будет вами гордиться ;)

Финальный скрипт установки операционной системы Cray, мама будет вами гордиться ;)

Cохраняем изменения, затем на стороне UNICOS вводим команды, заменив предварительно имя пользователя и путь к симулятору:

cd /
rcp alex@172.16.0.1:/opt/work/cray/cray_sim/install .

В результате выполнения команды файл install будет скопирован с хоста и появится в корне файловой системы UNICOS:

Запускаем скопированный скрипт инсталляции UNICOS:

./install

Появится сообщение с перечислением введенных параметров:

Нажимаем любую клавишу и запустится увлекательный процесс установки операционной системы для суперкомпьютера Cray:

Несмотря на эпичность, это всего лишь копирование файлов по сети.

Несмотря на эпичность, это всего лишь копирование файлов по сети.

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

В самом конце установки, будет предложено установить пароль для суперпользователя, а также будет запущен диалог создания учетной записи обычного пользователя.

После чего установка наконец будет завершена:

Да, вы только что установили ОС на суперкомпьютер Cray, пусть и виртуальный.

Да, вы только что установили ОС на суперкомпьютер Cray, пусть и виртуальный.

Во время установки UNICOS происходит один очень важный шаг, о котором стоит рассказать — линковка ядра.

Эта практика происходит из времен первых UNIX, когда архитектур было много а стандартов мало. Совместимость оборудования хромала, поэтому такая линковка использовалась в качестве своеобразного финального теста системы.

Из современных операционных систем, эту практику сохранила например OpenBSD, хотя и по другой причине.

Останавливаем симулятор командой exit и убеждаемся, что основное ядро UNICOS успешно слинковано — должен появиться файл unicos.ymp.10012:

После этого, проверяем файл unicos.cfg, в котором должно появиться указание на новое ядро:

Если все хорошо и ссылка на свежее ядро на месте, запускаем полноценную симуляцию:

./unicos

Так выглядит полностью запущенный симулятор суперкомпьютера Cray J90 с только что установленной UNICOS:

Если на стороне UNICOS прописать маршрут по-умолчанию, такой же командой как и в готовой сборке:

route add default 172.16.0.2

..получим выход в интернет.

Прямо с суперкомпьютера Cray, вы правильно поняли:

Мам, я вывел суперкомпьютер Cray в интернет!

Мам, я вывел суперкомпьютер Cray в интернет!

Вы же не думали, будто на этом я успокоюсь, открою шампанское, вызову девок и уйду в загул? Конечно же нет и впереди ждет еще много интересного и удивительного.

Графический интерфейс, на суперкомпьютере

В найденных образах UNICOS, один из которых мы только что использовали для установки, была обнаружена работающая клиентская библиотека для протокола X11.

Самого X-сервера внутри разумеется нет, поскольку далекие предки использовали специальные управляющие терминалы с SGI Irix:

Зато есть возможность пробросить отображение приложения с поддержкой протокола X11, чтобы оно отрисовывалось на запущенном современном Xorg-сервере хоста.

Что автор немедленно и проделал:

Часики, которые тикают прямо на суперкомпьютере Cray.

Часики, которые тикают прямо на суперкомпьютере Cray.

Два приложения на скриншоте выше xterm и xlock — запущены из работающей UNICOS и отображаются в Xorg-сервере на Mageia Linux.

Чтобы это повторить, необходимо принести кровавую жерт.. ээ выполнить три простых шага, описанные ниже.

Запуск Xorg-сервера с поддержкой сети

По-умолчанию и очень давно, даже в самых олдскульных дистрибьютивах вроде Slackware, X-сервер запускается с параметром -nolisten, запрещающим удаленное подключение по сети.

Чтобы в этом убедиться, достаточно выполнить команду на хосте, которая покажет запущенный X-сервер со всеми параметрами:

ps -ax |grep X

Запускается X-сервер из специального приложения «display manager» (dm), который ответчает за красивое графическое окно авторизации, поэтому параметры запуска X-сервера указываются в настройках этого менеджера.

Поскольку в моей системе используется LightDM, для того чтобы X-сервер начал прослушивать сетевой порт, я добавил следующую настройку в раздел [Seat:*] в файл /etc/lightdm/lightdm.conf.d/49-mageia.conf:

xserver-allow-tcp=true xserver-command=X -listen tcp

После чего сервис lightdm необходимо перезапустить:

service lightdm restart

Естественно вас в этот момент выбросит из системы, так что будьте готовы и остановите заранее симулятор, если он был запущен.

Разрешение удаленного доступа без авторизации

Следующим шагом необходимо отключить авторизацию при подключении к X-серверу по сети.

Для этого авторизуйтесь с помощью DM и запустите графическое окружение — как вы обычно это делаете, затем введите в консоли:

xhost +

Выглядит это так:

После выполнения этой команды будет доступно удаленное подключение к вашему X-cерверу с любого хоста.

Что конечно считалось опасным еще лет двадцать назад, но в нынешние продвинутые времена (с Wayland вместо Xorg), когда о самой возможности такого удаленного подключения уже мало кто помнит — не стоит заморачиваться:

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

Кроме автора, разумеется.

Указание адреса удаленного X-сервера

Наконец последним шагом необходимо указать адрес удаленного X-сервера на стороне UNICOS. Делается это командой (не забываем о ksh по-умолчанию):

setenv DISPLAY 172.16.0.1:0.0

Набор софта с графическим интерфейсом находится в каталоге /usr/bin/X11, так для примера выглядит запуск xterm:

"This is a private computer facility" - самое возбуждающее приглашение на свете.

"This is a private computer facility" - самое возбуждающее приглашение на свете.

Если вы выполнили все шаги правильно, появится графическое окно, с запущенным приложением, работающим в среде суперкомпьютера:

И.. нет, это еще не конец.

Особенные радости, для особенных

Вместе с симулятором поставляется интересный архив goodies.tar, собранный оригинальным автором симулятора, который можно найти в каталоге unicos_tools.

Архив содержит несколько известных утилит, собранных для UNICOS, без которых жизнь юниксоида сера и уныла — bash и midnight commander.

Узрите смертные, ибо так выглядит ваш любимый mc , запущенный на суперкомпьютере Cray:

Страшно? А мы предупреждали.

Страшно? А мы предупреждали.

Копируется сей замечательный архив с помощью уже известного по процессу установки rcp:

rcp alex@172.16.0.1:/opt/work/cray/cray-sim/unicos_toos/goodies.tar /

Распаковывается в каталог /usr, который уже присутствует в переменной окружения PATH:

cd /usr
tar xvf /goodies.tar
rm /goodies.tar

Перед запуском необходимо выставить бит запуска:

chmod +x /usr/bin/mc
chmod +x /usr/bin/bash

и соответствующие права:

chmod 765 /usr/bin/mc
chmod 765 /usr/bin/bash

Если mc будет ругаться при запуске, необходимо выставить тип терминала:

setenv TERM xterm

И нет, это тоже еще не коне..

(удары тяжелым предметом на фоне)

Механический голос за кадром:

..угроза раскрытия корпоративных секретов устранена.

Приступаю к зачистке территории.

P.S.

Это первая часть серии статей посвященной суперкомпьютерам, оригинал как обычно в нашем блоге, версия для Хабра.

Скажу сразу:

да, мы действительно получили доступ к настоящему Cray и даже смогли кое-что на нем запустить.

Так что будут новые открытия и потрясения ;-)

Показать полностью 38
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества