воскресенье, 14 января 2024 г.

Немного о компьютерах БК-0010/0011(М)

     Когда я вернулся из армии домой, когда настал 1989 год, мне жутко хотелось иметь свой собственный НАСТОЯЩИЙ компьютер! Микрокалькуляторы, даже программируемые меня уже не удовлетворяли (ага, калькулятор МК-52, почти аналогичный по техническим возможностям моему домашнему МК-61 тогда летал в космос на космических кораблях "Союз", в качестве резервного бортового вычислительного комплекса, а меня он не удовлетворял... бывает). Компьютер нужен был "настоящий", слишком долго я в армии по нему тосковал.

Программируемый калькулятор МК-61, у меня он до сих пор есть (фото из сети)

    Настоящий компьютер

    А какой тогда был выбор "настоящих" домашних компьютеров? Клоны IBM PC уже были, и были они оооочень настоящими, но стоили чуть ли не как пяти-комнатная квартира в центре Москвы! Ну ладно, на счёт квартир в Москве точно не знаю, может и преувеличиваю, но две новеньких Лады-09 за одну IBM PC XT точно могли выторговать. Явно не мой уровень.
До массового появления в наших широтах разномастных кооперативных и самодельных клонов ZX-Spectrum оставалась ещё минимум пара лет. Всякие разные вариации Apple, Mac, Atari, Commodore и т.п. до нас вообще не доходили (хотя Apple II+ я у своего одноклассника еще в середине 1980-х видел, но мне лично такое не светило). Был вариант самостоятельно паять клоны ранних машинок на базе схем Радио-86, Микроша-80 на процессорах i8080/к580вм80, но это точно не для меня - во первых слишком технически сложно (и много комплектующих требуется, которых у нас не найдёшь), а во-вторых всё равно на выходе, после всех чудовищных мучений, какая-то совсем дохлая (по меркам конца 1980-х) фигня получается... Что же мне остаётся!?
И тут внезапно, я увидел ЕЁ!!! Прямо в комиссионном магазине! На полочке среди б/у пылесосов и б/у магнитофонов. И ценник выставлен в точности равный официальной (о, я читал рекламу в журналах) государственной цене - 600 рублей. Чудовищная удача! Как лотерейный билет на миллион! 
Домашний (бытовой) компьютер БК-0010 (фото из сети)

    Этот шанс я не должен был упускать. Ценник в 600 рублей был конечно слишком велик для меня, пришлось срочно просить помощь родителей, но в целом, для семейного бюджета вопрос был решаем. Единственный, случайно всплывший в комиссионке экземпляр, я успел купить. Машина оказалась полностью исправной и даже практически в полной заводской комплектации. Книжки с документацией были на месте (гарантия только утеряна, но она ни разу и не понадобилась). Только вместо утраченной магнитофонной кассеты с дополнительными программами предыдущие владельцы (как честные люди!) вложили кассету с записями какой-то попсовой музыки. Впрочем, позже я выяснил, что на заводской кассете всё равно никаких полезных программ не было.
    Теперь расскажу коротко о технических особенностях БК-0010, поскольку раньше я про них вроде не говорил. Это был действительно НАСТОЯЩИЙ компьютер, с очень приличными на конец 1980-х характеристиками, с перспективами на модернизацию, хотя и не без странностей и недостатков. Архитектура компьютера 16-разрядная, совместимая с очень распространённой и удачной архитектурой компьютеров DEC PDP-11. Это безусловное достоинство! Второе безусловное достоинство - обалденная, запредельная, по советским меркам, НАДЁЖНОСТЬ. Машина (ни ОДНА из множества моих БК) на моей памяти вообще не ломалась, не требовала какого-то нештатного вмешательства в свои внутренности. Ещё была весьма неплохая по тем временам графика, во всяком случае в монохромном (ч/б) режиме. С цветной графикой дела обстояли хуже, хотя, при желании, и цвет можно было использовать, был бы цветной телевизор.

Явные недостатки:
- Оперативная память, чёрт возьми!!! Компьютер БК-0010 изначально мог адресоваться к 64 кб памяти. Это скромно, но пока ещё не так уж и мало. Следующим ходом разработчики оттяпали 32 кб адресов под Постоянное Запоминающее Устройство (ПЗУ), которое программируется только в заводских условиях. Предполагалось, вероятно, что основная часть программ будет писаться на государственном уровне, и сразу записываться на заводе-производителе прямо в ПЗУ. А остальным "негосударственным" программистам хватит и оставшихся 32 кб памяти. Но ведь и её не было! От оставшихся 32 кб ровно половину оттяпали под буфер растрового изображения на экране. Если программист что-то пытался записать в эту область памяти, на экране монитора отображалось хаотическое множество точек. Ну, или не совсем хаотическое множество, если программист в эту память сознательно какую-то красивую картинку заливал. И наоборот, при попытке вывести на экран какую-нибудь надпись, или рисунок, все предыдущие данные в затронутой области памяти полностью стирались. В любом случае, 16 кб экранной памяти использовать под программный код и данные произвольным образом не получалось. Еще 0.5 кб памяти отобрали на системные переменные. Итого программистам БК-0010 разработчики щедрой рукой отсыпали аж 15.5 кб оперативной памяти. Жрите, мелкопузики, не подавитесь! А вот 15.5 кб памяти - вот это уже правда очень и даже ОЧЕНЬ МАЛО!!! 
- Второй по важности недостаток БК-0010 - это его необычная плёночная клавиатура, хорошо видная на фото выше. Нет, изначально идея вместо сложных и дорогих кнопок использовать дешевые пузырьки воздуха между двумя слоями полиэтилена, при нажатии пальцем схлопывающиеся и замыкающие контакты, а поверх этого - сменный листок бумаги с текстом надписей над кнопками, это вроде же хорошая идея? Вроде, ты просто поменял бумажку с рисуночками кнопок, и опа-ля-ля - у тебя уже есть новая раскладка клавиатуры, фокус-покус! Но не прокатило. Пленочные кнопки оказались крайне неудобными, нетактильными, затрудняющими слепой набор символов, а главное - с жутким дребезгом. Нажимая на очередную кнопку пальцем, никогда нельзя было заранее предугадать, сработает ли эта кнопка один раз, ноль раз, два раза или шесть раз. Набор текста на такой клавиатуре был реально МУЧИТЕЛЬНЫМ. Хотя изначальная идея - безусловно хороша.
- Третий, на мой взгляд, крупный недостаток БК-0010 - предлагаемый изначально вшитым в ПЗУ (т.е. в "заводскую" поставку компьютера) язык "высокого уровня" ФОКАЛ. В 1980-е годы было повсеместно принято, что в каждый персональный/домашний/бытовой компьютер, должен быть встроен какой-нибудь само-запускающийся язык ВысокогоУровня, чтобы написав на нём фразу типа "? 2 + 2" и получив ответ "4",  каждый дурак Д`Артаньян смог бы себя почувствовать крутым компьютерным хакером. Но в большинстве западных компьютеров таким языком высокого уровня "для Д`Артаньянов" был всё-таки BASIC, причём в диалектах языка постепенно (но отчётливо) захватывала монополию компания Microsoft. А при чём здесь ФОКАЛ? А ни при чём! Он не похож ни на один из Бейсиков, он жутчайше тормозной, он ни с кем и ни с чем не совместим. Разве что размер интерпретатора у ФОКАЛа маленький, так у некоторых Бэйсиков он аналогичный? На практике ФОКАЛ БК-0010 оказался почти абсолютно неприменим. Считаю - деньги на ветер!
- Четвёртая и самая главная, на мой взгляд, проблема БК-0010 - полное отсутствие технической поддержки со стороны производителя. Это стандартная проблема производства СССР. Производим хороший и современный компьютер, но к нему нет ни единой (за исключением откровенной тупизны) полезной программы, и ни единого практически нужного периферийного устройства. Впрочем, программы позже (через 4-6 лет) может быть напишут частные пользователи-энтузиасты. Правда, тогда эта вся ерунда уже сильно устареет, но потомки какую-нибудь отмазку нам придумают. А вот периферийную аппаратуру мы сами с усами, мы сами её через лет 10-15 тоже выпустим. Правда, к тому времени она тоже устареет, ну так и мы же уже тогда на пенсии будем, нам будет уже всё равно, не так ли?
    Одним словом, компьютер БК-0010 представлял собой крайне причудливую смесь из отличных, надёжных, проверенных технологий, весьма низкой цены (правда, при наличии возрастающего дефицита), огромной перспективы на совершенствование, плюс кучка совершенно бредовых проектных наработок и полностью тупо отсутствующей технической поддержкой, ладно бы ещё только в части железа, но ведь и поддержка в программах абсолютно отсутствовала, хотя, казалось бы, архитектура PDP-11 исхожена программистами вдоль и поперёк, куда бы уж, казалось, проще? А вот, оказывается, есть нюансы....

    В коробке компьютера шёл только "системный блок" (толстенькая клавиатура с электронной начинкой) компьютера с отдельным блоком питания, необходимыми модулями памяти и проводами. Для получения работоспособной машины, БК-0010 нужно было самостоятельно подключить к домашнему телевизору и к кассетному магнитофону. Процесс подключения магнитофона, чтобы сохранять/загружать собственные программы и данные на магнитофонные кассеты, был крайне прост - требовалось лишь воткнуть имеющийся заводской кабель в стандартный разъём магнитофона. Если всё исправно - работало сразу "из коробки". У меня дело осложнялось тем, что единственный в квартире магнитофон стационарно стоял в гостиной комнате в виде домашней радиолы. Использовать его оказалось крайне неудобным.
    Сначала попробовал использовать старую "костровую-походную" магнитолу. Не получилось, качество лентопротяжки после туристических походов стабильно грузить с ленты программы не позволило. Пришлось опять обращаться к родителям за деньгами. Купили в итоге самый-самый типовой и дешевый на тот момент переносной магнитофон "Электроника-302". Это помогло. Вопрос с хранением программ на магнитофонных кассетах на некоторое время был полностью снят.

    Подключение мониторов

    Подключение БК-0010 к телевизору оказалось несколько более сложным. В документации компьютера писали, что нужно элементарно кабель видеовыхода БК подключить к разъёму "композитного видеосигнала" (название воспроизвёл по памяти, если ошибся - поправьте) телевизора. Всего и делов-то! Вот только ни на одном советском телевизоре я ни разу в жизни не сумел обнаружить тот самый разъём "композитного видеосигнала". Изучение доп.литературы и популярных журналов дало некоторые подсказки - БК всё-таки с 1984 года разрабатывались, за 5 лет народ опыт поднакопил. 
    Оказалось, что телевизор получает сигнал от антенны на УКВ радио-частотах. Далее, в телевизоре этот радиосигнал фильтруется по полосе выбранного теле-канала. Потом переводится к унифицированному сигналу промежуточной частоты. Далее этот промежуточный сигнал усиливается и подвергается ещё некоторым преобразованиям. И вот то, что получилось на выходе всей этой цепочки - вот это и есть тот самый композитный видеосигнал. Именно он дальше используется для отрисовки изображения на экране. И получается этот сигнал где-то в самых недрах схемы телевизора. И чтобы подключить к телевизору БК нужно залезть по шею во внутренности этого телевизора, найти ту самую скрытую точку входа видеосигнала, отрезать от этой точки нафиг всю радиочастотную часть телевизора (чтобы помехи не создавала), а вместо неё припаять кабель от компьютера.
    Задача была очевидно не совсем моего уровня, здесь полностью всё делал отец. Благо для него всё выглядело не слишком сложно - схемы устройства советских телевизоров обычно не секретились, и читать их любой грамотный радиоинженер умел. Все дальнейшие модификации моего видеооборудования для подключения к БК делал тоже мой отец, кстати, легко и быстро.

    А видеооборудование пришлось менять несколько раз. Сначала, ради экономии итак слишком перерасходованных денег, подключили выкопанный из сарая старый ч/б телевизор 2-го класса - огромный деревянный гроб, занимавший почти весь мой письменный стол. Его пришлось долго чистить, регулировать, настраивать, менять какие-то радиолампы (благо были в запасе). В результате, изображение он показывал, но весьма неудовлетворительно - буквы расплывались, края изображения вытягивались, цвет был отнюдь не чёрно-белый, а скорее слегка-серый на светло-сером фоне. По экрану бежали раздражающие горизонтальные полосы. Вся эта огромная электронная пушка била своими серыми лучами прямо в глаза, а отодвинуться дальше, на другой конец комнаты, не получалось - резкость изображения не позволяла, элементы букв начинали сливаться и становились нечитабельными.
    Небольшое время спустя, чтобы окончательно не испортить моё зрение, родители согласились потратить ещё немножко денег на новый телевизор. Идеальным выбором был бы небольшой современный переносной цветной телевизор 4-го класса, что-нибудь вроде Юность Ц-404. Но... Но я очень хорошо чувствовал, что трачу ЧУЖИЕ деньги. Поэтому скромно выбрал самый-самый недорогой вариант - опять же деревянный ч/б телевизор 3-го класса, который тогда продавался с огромной скидкой специально "для бабушек". Что-то вроде Горизонт или Берёзка, или Весна? Не помню уже, они тогда все были абсолютно типовые, одинаковые, как близнецы... Но стоил он в ТРИ раза дешевле, чем та же Юность Ц-404.
    Этот телевизор занимал всего лишь четверть письменного стола, выдавал относительно чёткое ч/б изображение, не требовал придвигаться к экрану вплотную, чтобы отличить букву "Ц" от буквы "Щ". Искажения геометрии пришли в норму. Контрастность тоже. Глазам стало гораздо лучше. На несколько месяцев, а возможно и на целый год, вопрос с нормальным монитором для моего домашнего БК был успешно решён.

    Но пока что все мои телевизоры были монохромными. А ведь у меня же игровой компьютер, с возможностью вывода цветов! Очень хотелось попробовать игры в цветном режиме. Возможность купить цветную Юность Ц-404 я уже благородно упустил. Оставалось уговорить отца присобачить подключение моего БК в виде эксперимента к основному домашнему цветному телевизору в гостиной. Подключаться нужно было опять прямой пайкой внутрь схемы телевизора. Некоторая сложность была в том, что на этот раз внутрь телевизора нужно было впаять не один сигнальный провод, а сразу четыре. А кроме того, требовалось не просто "отрезать всё лишнее", но ещё и сохранить работоспособность телевизора, когда компьютер отключен - основной семейно-развлекательной функции с большого телевизора в гостиной никто не снимал. Впрочем, отец с этим тоже справился легко. 
    А вот реализация цветного изображения на БК меня откровенно разочаровала. Всего 4 фиксированных цвета - Red, Green, Blue, Black, причём несимметричные по точкам на канве экрана. Красный и чёрный цвета всегда занимали ДВЕ соседние экранные точки (пикселя) по горизонтали, в то время, как синий и зелёный цвета всегда занимали ОДНУ точку, плюс соседнюю чёрного цвета. Всё это - при крайне скромном разрешении экрана 256х256 точек (которое ещё и не соответствовало горизонтальной вытянутости экранного прямоугольника) и без вариаций с палитрами. В итоге, если монохромный вывод БК был вполне на приличном уровне среди компьютеров своего времени, и позволял вполне профессионально работать, то возможности цветного изображения явно отставали от большинства других домашних машин. Так, скорее побаловаться, чем для чего-то полезного. Так я и использовал подключение к цветному телевизору - изредка немного поиграть в отдельные игры, посмотреть, как они выглядят по задумке их авторов. Больше я к цвету на БК не присматривался.

    А основой для работы у меня остался монохромный вывод изображения. Когда со временем я получил некоторую финансовую самостоятельность, немедленно заменил свой "деревянный" телевизор на профессиональный монитор. Друзья-товарищи предложили по очень сходной цене настоящий монитор ВК8071 от школьного компьютерного класса "Корвет". Скорее всего, монитор спёрли ушлые студенты то-ли из какого-то ПТУ, то ли из какого-то ВУЗа, во время летнего ремонта помещений. Но меня подобные подробности не волновали. Дают - бери! На улице ведь 1990-е годы, самое начало.
    Монитор оказался ИДЕАЛЬНЫМ. Он имел почти в два раза меньшую диагональ экрана, по сравнению с моим прошлым деревянным телевизором, кажется 12 или 13 дюймов по современным меркам. И, соответственно, занимал в четыре раза меньше места по объёму. Без проблем подключался к тому самому вышеупомянутому "композитному видео сигналу". Давал предельно чёткое, ясное, контрастное ч/б изображение. Никакого напряжения глаз, никакой размытости, никаких мерцаний экрана, никаких проблем со зрением! С момента его покупки всё стало просто идеально, другого слова даже и не подберу. Умели же в СССР делать действительно качественные вещи, если речь шла о здоровье детей! :))  (Монитор был из комплектации школьного класса компьютеров, напоминаю) Впрочем, чуть позже у друзей и коллег наблюдал мониторы МС6105 - качество было примерно аналогичное.

    Отвлекаемся на историю из "лихих 90-х"

    Хочу немного отвлечься от компьютеров БК, раз уж зашла речь о мониторе ВК8071. Был забавный случай, который мне негде больше озвучить. Пусть будет здесь.
    К моему новому монитору требовался отдельный блок питания. Его, судя по всему, спереть вместе с монитором не получилось, но мои товарищи, продававшие монитор, подрядились мне спаять на коленке самодельный блок питания, включив его в общую стоимость покупки. И вот я поздним зимним вечером пришёл на окраину города в общежитие, забрал свой свеженький блок питания, положил его в заплечную сумку, пошёл пешком через половину города домой. Надо сказать, что парень, паявший для меня блок, был очень хорошим человеком (у нас с ним вообще всегда сохранялись прекрасные отношения). Он подошёл к делу ответственно, поместил свой самопальный блок питания с большим трансформатором, в очень красивый прозрачный корпус, склеенный из прозрачного пластика-плексигласа. Просто дизайнерский шедевр!
    Ну и вот, несу я в сумке этот шедевр посреди ночи домой. Передо мной один из участков моего пути - длинная узенькая тропинка, примерно 1 км длиной. Справа - сплошной бетонный забор промзоны в 2 метра высотой. Слева - огромный вал снега в 3 метра высотой, сгребённый очистителями с трамвайных путей. Между бетонным забором и снежным завалом есть узкая тропинка на одного человека. И я иду по ней. Прохожу почти до конца тропинки, и внезапно понимаю, что дальше путь ЗАКРЫТ! На выходе тропы стоит компания из 5-6 явно очень возбуждённых лиц кавказской национальности. И эти лица очень активно выясняют отношения между собой, в пропорции примерно половина на половину. Они что-то громко орут на своём языке, смысл я не улавливаю. Они машут руками, кулаками, в свете уличных фонарей мелькают ножи. Вдруг раздаётся громкий выстрел пистолета. Но поскольку никто после выстрела не упал, догадываюсь - было что-то не летальное, травмат, газовый, или вообще холостой/стартовый.
    А мне-то теперь что делать? Обойти стороной? Так это надо возвращаться на целый километр назад по тропинке, потом переходить на другую сторону улицы, а потом снова переться этот же километр опять вперёд, но уже по другой тропинке. Нифига себе, крюк для вечерней прогулки получается? Нет, так не пойдёт! И у меня сработала самопроизвольная реакция.
- Эй, мужики, погодите драться, дайте я тут пройду!

    Кавказцы заткнулись в полном изумлении. Ножи и кулаки слегка приопустились. Я весело помахал мужикам рукой, улыбнулся, как будто так и планировалось, прошёл узенькой тропкой посредине зависшей на несколько секунд драки, внимательно, стараясь никому не наступить на ногу. Мужики молча проводили меня глазами. Никто не шевельнулся и не сказал ни слова. Я спокойным, уверенным шагом, вышел с тропинки на широкий очищенный от снега тротуар, прошёл ещё несколько десятков метров. За спиной услышал возобновившиеся крики на незнакомом языке. Снова громко хлопнул пистолетный выстрел. Но меня это уже не страшило, только лишь радовало: эти крики и стрельба были уже не ко мне. не в мою сторону, я ПРОШЁЛ!
    "Я ПРОШЁЛ" - всё в моём сознании ликовало! В эту секунду я поскользнулся ногой на наледи, не удержал равновесия, упал и хлопнулся задницей об лёд. Успел чуть повернуться на бок и отбиться рукой, как учили на тренировках. Ничего себе не повредил, поднялся, слегка разочарованный (ещё бы - такое глупое фиаско после такого крутого триумфа).  Заглянул в сумку.... Боже!  От великолепного прозрачного дизайнерского корпуса блока питания остались лишь осколки... К счастью, сам блок питания почти не пострадал в этом инциденте. Дальше успешно питал и монитор, и даже дисководы.

    Немного о программировании

    Но вернёмся к нашим БКшкам. Изначально машина досталась мне практически "голой", без всяких готовых программ. А написать что-то своё очень-очень хотелось. Я ведь себе настоящий компьютер покупал, а не какую-нибудь там игрушку! Начал я, разумеется, с самого простого, что лежало прямо на поверхности - с языка высокого уровня ФОКАЛ (FOCAL), зашитого в постоянную память (ПЗУ). Язык был очень простой, точнее даже примитивный. Примитивнее даже ранних версий Бейсика. Программы на Фокале работали невероятно медленно, кажется, чуть ли не медленнее, чем на упомянутом ранее калькуляторе МК-61. Ничего, кроме чисто учебных программ, типа "реши квадратное уравнение" или "угадай задуманное число с 5 попыток" там написать было физически невозможно. Ни о каких динамически меняющихся изображениях, ни о каких играх и т.п. речь даже не шла. Когда первая эйфория от новизны прошла, мне очень быстро надоело пытаться что-то писать на языке, который вычислял квадратный корень из числа девять за целых две секунды, а строчку "Мама мыла раму" выводил на экран аж за полторы секунды. Я справедливо ожидал от современного 16-разрядного компьютера большей эффективности.
    В следующей модели БК (о ней упомяну ниже) встроенный язык ФОКАЛ был заменен на встроенный БЕЙСИК. Это была более продвинутая реализация, текст программы пользователя перед исполнением компилировался в особый "шитый код", в котором наиболее трудоёмкие для процессора места заменялись вызовами готовых подпрограмм в машинных кодах. В результате, скорость исполнения программ повысилась как минимум на порядок, по сравнению с ФОКАЛом. Правда, осложнились требования к свободной памяти (теперь там нужно было хранить и исходный текст, и откомпилированный код, и дополнительные системные процедуры, всё это одновременно). Вроде уже получалось писать какие-то почти полезные, а иногда, даже почти игровые программы. Но меня в тот момент уже и это совершенно не устраивало. Мой НАСТОЯЩИЙ компьютер, уверен, был способен на большее.
Так выглядел встроенный БЕЙСИК (фото из сети)

    При отсутствии готовых инструментов программирования, оставалось пытаться писать программы в чистых машинных кодах, чистыми цифрами (на БК традиционно была принята запись машинных кодов числами в восьмеричной системе счисления). Сама по себе система машинных кодов БК оказалась совсем не сложной, очень логичной, и весьма качественно документированной (PDP-11 всё же). 
    У меня отложилось в памяти, что я вводил машинный код своих первых программ прямо в стартовом мониторе БК, но сегодня перечитал документацию и понял, что кажется путаю монитор БК с чуть более продвинутым монитором компьютеров ДВК. Тем не менее к БК тоже прилагался специальный модуль тестовой диагностики (подключался вместо ФОКАЛа), в ПЗУ которого был прошит более мощный монитор с возможностью непосредственной записи цифровых машинных команд с клавиатуры в ОЗУ по выбранным адресам. Вероятно им я и пользовался.
    Сам по себе машинный код был вовсе не сложен: пишешь, например, такую строчку чисел:
    12701, 1040, 111102
    Этот кусочек программы означает: взять 16-разрядное число, которое записано в ОЗУ по восьмеричному адресу 1040 (544 в десятичной) и поместить это число в регистр №1, а потом взять из ОЗУ другое уже 8-разрядное число, которое лежит по адресу, записанному только что в регистр №1, и поместить его в регистр №2. Всё просто и логично! Хи-хи.
    На самом деле, не в цифровой восьмеричной кодировке программы крылась проблема. К цифрам привыкаешь очень быстро. Основная проблема - подсчитывать вручную адреса.
Изначально программа писалась в тетрадку карандашом. По итогам этой записи выяснялось, сколько требуется команд в программе, сколько байт будет занимать каждая команда. В результате, зная адрес первой команды (например 1000), можно было вручную вычислить и зафиксировать в тетрадке адреса в памяти всех остальных команд. И во все имеющиеся в программе команды условных и безусловных переходов нужно прописать эти вычисленные в тетрадке адреса. Аналогично и с данными - когда программа дописана, адреса её команд стали известны, оказался известным и адрес начала свободной области памяти, где разместятся переменные с данными. Адрес каждой переменной нужно опять вычислить в тетрадке, зная начало области данных, адреса и размер всех ранее определённых переменных, потом все эти свежевычисленные адреса данных нужно тщательно расписать по программе, во все места, где какие-то команды к этим данным обращаются. А ещё адресация бывает абсолютной - сказали обращаться к ячейке 1040 (как в примере), значит именно к ней и нужно обращаться. А бывает относительная адресация, когда настоящий адрес ячейки памяти неизвестен, его нужно подсчитать, взяв текущий (действующий на сей момент вычислений) адрес следующей исполняемой команды, и прибавив к нему некоторое число относительного смещения вперёд или назад по программе.
    Но самое смешное начинается, когда вдруг выясняется, что где-то в середину программы необходимо добавить несколько команд, которые там ранее не предусматривались. А из-за этих добавленных команд, адреса ячеек всех нижерасположенных команд и данных вынужденно "съезжают" на некоторое число вниз. Вручную пересчитать! И вручную переписать по всей программе, ничего не забыв и ничего не перепутав! В тысячу мест ручные изменения! И так с каждым отдельным малюсеньким исправлением, которое затрагивает количество команд в программе. Вот!!! Вот, где эта дьявольская Собака Баскервилей порылась!!! Вот почему никто в чистых машинных кодах никогда не программирует, аж с 1950-х годов!
    Я с машинными кодами конечно некоторое время баловался, в исключительно учебных целях. Прежде всего, чтобы ощутить, что я действительно понимаю устройство моего компьютера и его систему команд. Написал несколько очень мелких учебных программ. Оценил все трудности. Вершиной моего машинного кодирования была реализация известной "игры" Конвея "Жизнь" - простая модель клеточной колонии на экране, где клетки дохнут, если им слишком тесно, или наоборот, слишком скучно, и радостно размножаются, если имеют комфортное число соседей. Для дальнейшего совершенствования в программировании уже потребовались сторонние программы.

    Такие программы постепенно нашлись, я искал их в ларьках с пиратским софтом, где изредка проскакивали и кассеты для БК. Целенаправленно искал, задействуя все доступные каналы, людей также интересующихся БК, с которыми мы активно обменивались всем, что имели. Нашёл группу студентов Политехнического университета, которые использовали БК, как и я, но кроме того имели ещё и периодический личный доступ к московским пиратским рынкам софта. Постепенно моя коллекция программ пополнялась всё более полезными экземплярами.
    В первую очередь меня заинтересовали отладчики. Дизассемблирующий отладчик - очень полезная для разработчика программа: в одной половине экрана она показывает содержимое выбранных адресов памяти компьютера в числовом, восьмеричном виде. На другой половине та же самая память отображается в виде символических команд на языке ассемблера, так что если бы именно такую ассемблерную программу откомпилировать, то получился бы именно такой восьмеричный код, как на другой половине экрана. Только вместо символических меток и имён переменных, которые отладчику были заведомо неизвестны, в тексте программы использовались явные числовые адреса ячеек памяти. Эту область памяти можно было оперативно редактировать с клавиатуры. Причём любую половину экрана по выбору. Если ты исправлял числовой код - немедленно переписывались соответствующие команды ассемблера. Если исправлял ассемблерный код программы - тут же менялись восьмеричные числа в другой половине экрана (и, разумеется реальное содержимое ячеек ОЗУ компьютера тоже). А ещё всю эту программу можно было при желании запустить на исполнение с любого желаемого адреса. В том числе в пошаговом режиме запустить, чтобы проконтролировать состояние памяти и регистров после каждой отдельной команды. Именно это и является основной функцией отладчиков.

    Писать программы в отладчике стало конечно заметно проще, чем в чистых машинных кодах. Можно было отложить в сторону надоевшую тетрадку с карандашом и калькулятором - их заменил отладчик. Также он взял на себя преобразование кодов операций в мнемокоды ассемблера, и частично взял на себя подсчёт относительной адресации. Но лишь частично, и только лишь относительной, но не абсолютной. Всё-таки, для нормального написания программ требовался нормальный ассемблер, а не полумера в форме отладчика.
    Ассемблер для архитектуры PDP-11 был, назывался он MACRO-11, но я никогда не видел полной (и полноценной) его реализации на линейке компьютеров БК. Для начала до меня доходили только очень мало функциональные обрезки ассемблера, имеющие и проблемы с текстовыми редакторами исходных текстов, и невнятные ограничения на компиляцию и компоновку. Потом начали появляться более приличные и стабильные версии. Я с готовностью переходил от одного варианта к другому.
    Огромной проблемой встал ввод/вывод программ на магнитофонные кассеты. Ассемблер - принципиально не предназначался для мгновенной однопроходной обработки программы. Тот же MACRO-11, если не ошибаюсь, разбивался на несколько отдельных этапов-проходов: сначала отрабатывал анализатор исходного текста, разбивая его на модули, и выделяя макроэлементы языка, для препроцессора. Ой чёрт, не так! Сначала исходный текст набирали в текстовом редакторе и сохраняли в файл. А уж только потом натравливали на него анализатор макроассемблера. Продолжим, однако. Затем препроцессор, обрабатывал макроопределения и макро-вставки. Далее собственно ассемблер генерировал с учётом макросов кучу объектных файлов без ссылок на конкретные адреса. Наконец, эта куча объектных файлов компоновалась сборщиком-компоновщиком в окончательный исполняемый файл, который уже можно было пытаться запустить. При этом, каждый этап сей цепочки действий требовал сохранения на диске нескольких промежуточных файлов, которые позже служили исходными данными для следующих этапов. На больших и мини- компьютерах, где можно было автоматически сохранить на дисках, а потом прочитать снова кучу файлов, такая схема более-менее работала. На БК-0010 с мизерной оперативной памятью, с ручным вводом/выводом через магнитофонную кассету, с ручной её перемоткой - НЕТ!
    Для начала, энтузиасты-разработчики ассемблеров для БК были просто вынуждены полностью выкинуть нафиг из MACRO-11 всю часть, отвечающую за работу с макросами. Не самая актуальная фишка, а тут уж не до жиру. Потом оставшиеся куски, включая текстовый редактор, компилятор, компоновщик, постарались объединить в одну единую среду разработки, чтобы не заставлять пользователя постоянно вручную подгружать с магнитофона различные файлы отдельных модулей. И это объединение делалось в условиях жесточайшего дефицита оперативной памяти! Неудивительно, что получилось не с первой попытки, однако в итоге получилось. Я вынужденно через этот ряд попыток проходил. 
    Всё равно, даже лучшие ассемблеры БК жёстко лимитировались возможностями кассетного магнитофона. При ассемблировании сколь-нибудь чуть-чуть сложной программы уже требовались неимоверно нудные, но обязательно виртуозные манипуляции с ручной перемоткой кассет и записью/загрузкой промежуточных файлов. Этот этап миновал только с распространением дисководов (уже, как правило, на модели БК-0011М). А вот с приходом дисководов ситуация поменялась в противоположную сторону. Я готов был подписаться под словами одного из разработчиков программ для Макинтошей (процессор М68000): "А зачем мне нужны языки высокого уровня, все эти Паскали и Си?! Мне и на ассемблере всё ясно и понятно с первого взгляда! Ничего лучшего и не надо".
    Какие-либо современные компактные языки высокого уровня для БК из-за ограниченности ресурсов оказывались совершенно неприемлемыми. Я видел пару версий адаптированного к БК языка FORTH (с плеча "старших сестёр" БК - с ДВК, Электроники 60, СМ1420 и т.п.). Совершенно не впечатлило. Крайне неудобно (инверсная польская запись, однако), очень низкая надёжность (язык ориентирован на стековую архитектуру, которая с трудом контролируется в условиях предельного дефицита ресурсов), возможности "отчуждения продукта" (передачи своих разработок сторонним клиентам в приличном виде) - просто ниже всякого плинтуса. Ассемблер на порядок удобнее, проще и эффективнее.
    Аналогично и с языком Си. На фоне ассемблера PDP-11 язык Си смотрелся как относительно удобный, но совершенно необязательный препроцессор для того же ассемблера - как программа необязательной предварительной адаптации исходного текста для чуть лучшей компактности написания. Ну да, кажись хорошая штука, но жрёт лишние ресурсы, сссобака! А если ресурсов не хватает, так на чистом ассемблере работать гораздо проще и быстрее. Идёт этот Си лесом! И без него всё отлично читается и пишется.
    Так на ассемблере я и остановился, как на высшей ступени развития инструментов написания программ для БК.

    Апгрейд моего компьютера - немного о железе

    Несколько месяцев я увлечённо экспериментировал с моим первым так удачно купленным в комиссионке компьютером. А потом в наш город уже официально, в фирменный магазин "Электроника" завезли небольшую партию новеньких компьютеров БК следующей модели БК-0010-01. У меня загорелись глаза! Оперативно продал свою б/у БКшку с символической скидкой в 15 рублей через ту же комиссионку (за три дня ушла), добавил чуть-чуть своих денег, и купил новенький компьютер. 
    Новая модель БК-0010-01 технически была абсолютно тем же самым компьютером, с полностью теми же характеристиками. Отличий было только два. Во-первых, вызывавшую массу нареканий плёночную клавиатуру с разноцветной бумажкой заменили клавиатурой с традиционными пластмассовыми нажимающимися кнопками. Вероятно, "по многочисленным просьбам трудящихся", которых жуткий дребезг плёночных клавиш до чёртиков задолбал. Во-вторых, тоже вероятно по многочисленным просьбам, зашитый в ПЗУ экзотический и тормозной язык высокого уровня ФОКАЛ заменили на гораздо более традиционный язык БЕЙСИК. Обновлённый компьютер выглядел примерно так:
БК-0010-01 (фото из сети)

    На практике новая модель компьютера оказалась абсолютно ничем не лучше старой. Кнопочная клавиатура была спроектирована максимально, запредельно отвратительно, исполнена с наихудшим возможным качеством из самых неподходящих материалов. Кнопки скрипели, как ржавые петли на амбарных воротах, зацеплялись друг за друга краями, постоянно заедали в своих гнёздах так, что их приходилось выковыривать оттуда ножницами тли отвёрткой. Дребезжали ничуть не меньше прежних, плёночных клавиш, выдавая на каждое одиночное нажатие совершенно непредсказуемое случайное число символов, начиная, как и положено, с нуля. Я вообще никогда в жизни, нигде, ни в каких устройствах, не видел НАСТОЛЬКО ДЕРЬМОВЫХ клавиатур. Любые известные мне клавиатуры советского производства, постоянно ругаемые за низкое качество изготовления, все они были на порядок лучше! Плёночные клавиатуры БК-0010 и ранние кнопочные клавиатуры БК-0010-01 держат здесь на пару друг с другом абсолютный антирекорд, идя при этом "ноздря в ноздрю". И дело здесь не в том, что мне попался бракованный экземпляр. Нет, жалобы шли массово, я много общался с людьми в этой сфере, я всё это знал. Да и лично через мои руки проходили далеко не единицы компьютеров линейки БК, я видел массовость проблемы своими глазами.
    Должен добавить, что в более поздних выпусках БК-0010-01 клавиатуру полностью переработали, точнее просто стали устанавливать вообще другую клавиатуру, ту же, которой оснащались БК-0011М (будет ниже). Вот только что значит "в более поздних"? Первые плёночные БК-0010 появились в 1984-1985 годах. Уже тогда проблема дребезга клавиш была всем очевидна. БК-0010-01 начали выпускаться в 1986-1987 годах, если не ошибаюсь. Я купил новенькую машинку, ещё пахнущую заводским лаком, в конце 1989 года... А в ней всё ещё стояла "старая" дерьмовая клавиатура. Ню-ню. А когда в продаже появились БК-0010-01 с нормальной клавиатурой, они уже были не слишком нужны - в народ уже пошли гораздо более продвинутые БК-0011М по чуть большей, но близкой цене.

    Вторая доработка - БЕЙСИК вместо ФОКАЛ тоже, как понятно, оказалось несущественной. Да, компилируемая в шитый код программа работала на порядок быстрее ФОКАЛьной. Да, гораздо более традиционный синтаксис языка, более того - "Вильнюсский-БЕЙСИК" - это откровенная попытка сделать всё как можно ближе к вариантам Basic от Microsoft для ранних микрокомпьютеров, клонов IBM PC и распространяющихся школьных машин MSX. Вот только, получилось именно "по мотивам", но никак не реально совместимо. Сказалась и разница в машинной архитектуре - разные процессоры, разная организация графики, звука, ввода/вывода. И чудовищное ограничение БК-0010(-01) по размеру доступной памяти, которая была в разы меньше по сравнению с любыми современными западными конкурентами, что ещё более осложнялось компилируюшей природой Вильнюс-Бейсика БК, требующей одновременный доступ в адресном пространстве и к исходному тексту, и к большому стеку, и к скомпилированному шитому коду, и к готовым библиотекам подпрограмм... 
    Никакой реальной совместимости по программам ни с одной из распространённых версий БЕЙСИКа не было. Ни одну сколь-нибудь серьёзную западную программу просто из популярного журнала (и даже с готовой дискеты) скопировать не получалось. Да, чуть лучше ФОКАЛа. Но всё равно, нафиг в реальной работе не нужно.
    Тем не менее, поменяв БК-0010 на БК-0010-01 я, хоть ничего важного и не приобрёл, но и ничего не потерял, надёжность электроники внутри компьютера была по-прежнему на высшем уровне, возможности и характеристики (за исключением почти бесполезной рокировки ФОКАЛ-БЕЙСИК) ничуть не изменились. Я ещё несколько месяцев продолжал с энтузиазмом учиться программировать и использовать мой БК-0010-01.

    К тому моменту я заслужил среди местной компьютерной тусовки славу специалиста по программному обеспечению БК, имеющему одну из лучших в городе коллекций программ. Ко мне стали периодически обращаться за помощью в настройке только что купленных компьютеров, в подборе интересных (по возрасту клиента) и/или полезных готовых программ. Некоторые люди просто приходили обменяться добытыми пиратскими, по сути (а кто за них платил?) программами. В любом случае я менялся не "штука-на-штуку", нет. Всегда позволял скопировать со своих кассет всё пиратское, что интересовало клиента, взамен просил только известить меня, если у того вдруг в коллекции появится что-то интересное, чего у меня нет. 
    Надо, наверное помянуть, что термин "пиратство" здесь упомянут скорее в шутку. Не было тогда никакого способа получить все эти программы легально, с оплатой отчислений автору! Физически не было такого способа. Нет законов, нет счетов, нет контактов, нет возможностей заплатить. Просто есть под рукой на 100500 раз уже переписанная кассета с программами. Часть программ протухли, не читаются, ещё часть - совсем полный бредовый треш. Часть - очень интересные и полезные. Или пользуйся сам, и копируй другими, или.... Когда появилась реальная возможность заплатить автору за разработку... Первые две программы в моей жизни, на которые я реально приобрёл за свои собственные деньги право лицензионного использования - были программы для компьютеров БК. ВотЪ...
    
    Другие люди обращались с просьбами помочь настроить купленный компьютер, помочь выбрать программы и комплектацию системы. Часто оставляли мне свою свежую систему, чтобы я мог несколько дней погонять её в своих домашних условиях. Некоторые, после этого становились постоянными клиентами, приходили с вопросами о линейке БК регулярно. На что мог - отвечал сам, или проверял на практически развёрнутой машине. На что не мог ответить - перенаправлял к товарищам, имеющим более углублённую квалификацию (например, пайку электроники я на себя почти никогда не брал, старался переадресовать). Люди во многих случаях платили вознаграждение. Деньгами я обычно не брал. А вот отдельные экземпляры настраиваемой техники и её комплектующих, я в оплату своих услуг в собственность брал с благодарностью. Клиенты этим тоже охотно пользовались, с их точки зрения это выходило почти бесплатно. А я получал широкий доступ к новейшей, и относительно дорогой (по моим личным меркам) технике. 

    Вот примерно таким образом я и получил в распоряжение следующую версию линейки компьютеров БК - называлась она БК-0011. Фоточек не будет, БК-0011 от предшественницы по внешнему виду ничем, кроме циферки на шильдике, не отличалась. Получил её, как обычно, в полной заводской комплектации, в том числе с документацией. Начал с жадностью читать. Первые же строки показывали - это уже не жалкая косметическая модификация, это что-то реально КРУТОЕ! С ещё большей жадностью бросился изучать! Что я увидел? Разделим на две части:

    Ожидания от БК-0011:
    - Оперативная память, о которой так долго-долго кричали все глупые пролетарии в стародавнюю эпоху, на конец-то резко увеличилась!!! Теперь у нас есть огромные 128 кб, против прежних 32 кб, ура, товарищи!
    - Вместо одного буфера экрана в памяти, размером 16 кб, теперь там есть аж два буфера экрана по 16 кб каждый с возможностью мгновенного переключения между ними;
    - Вроде бы как есть разные варианты цветовых палитр;
    - Частота процессора повысилась с 3 МГц до аж целых 4 МГц, возрадуемся же!
    - В комплектацию компьютера добавлен штатный контроллер дисковода для гибких дискет диаметром 5.25 дюйма. И даже, кажется, в комплект входит гибкий диск 5.25'' с новой дисковой операционной системой ОС БК-11. 

    Реальные впечатления от БК-0011:
    - Начнём с простого - клавиатуру-то, наконец, нормальную присобачили? Что говорите? Нет??? Как-так нет?!?! Клавиатура осталась от ранних версий БК-0010-01, говорите?!?!?!?!!!!!! Ребята, да вы что там в своих европах вообще охренели????!!!! Вы что, вообще краёв идиотизма-дебилизма не наблюдаете???!!!!!  Это же сколько лет надо так над своими покупателями издеваться, когда всё было очевидно с первой же попытки в 1984 году???!!!!  Всё, всё, уберите полотенца, развяжите меня, не тычьте в меня шприцем. Я уже сам успокоился. Всё, я не кричу больше, простите.
    - Оперативную память, говорите, до аж 128 кб увеличили? Вот только адресное пространство 64 кб никуда не делось. Поэтому нет никакой вожделенной сплошной памяти, в которой 128 кб, которую можно было бы использовать под программы и данные. Есть отдельные окна в 16 кб, которые размещены в пространстве 64 кб. Из этих окон одно окно отдано под буфер экрана - эта фишечка никуда не делась, эта память для программы практически потеряна. Другое окно попадает на то место, где раньше было ПЗУ и с "основной" частью программной памяти по диапазону адресов не соседствует.. А ПЗУ ведь тоже никто вроде бы не отменял, оно тоже не лишняя деталь в компьютере. А как вся эта расширенная память совместима с уже готовыми программами для БК-0010, которых за последние годы понаписади реально сотнями? Да никак не совместима! Может быть эта технология совместима со старшими моделями мини- и микро- компьютеров архитектуры PDP-11? Нет, тоже не так. Принцип организации видео вывода, с буфером, торчащим посредине ОЗУ, как минимум мешается. Вроде бы и памяти стало много-много, а вроде и использовать её не совсем ясно как. Не пришей к ослику Иа-Иа хвостик...
    - Появилось два переключаемых буфера экрана, вместо одного? Хорошее дело. Правда абсолютно не совместимое с более ранними программами, да ещё и крайне специфически востребованное - почти только в играх, точнее в динамичных анимациях. Но хоть что-то почти положительное.
    - Варианты палитр появились? Честно, до конца работы с линейкой БК, так ни разу в жизни и не увидел применения этой особенности. И сами цвета там несколько странные. И опять же совместимости ни с чем ранее используемым в других системах нет. И перспектив на будущее не усматривается. И что с этим дальше делать?
    - Частоту процессора на 1 МГц подняли? Ну это как в анекдоте: "Построй первый в мире действующий звездолёт, и ты получишь от правительства бесплатную капитанскую фуражку в подарок!" Если что, сама архитектура PDP-11 с общей шиной, крайне зависима от скорости отдельных устройств компьютера и протоколов их взаимодействия. Самым узким местом является общая шина, через которую взаимодействуют все устройства компьютера, включая память. При этом вариации тактовой частоты процессора на всю эту сложную кухню влияют в двадцать восьмую очередь. Процессор в любом случае чуть ли не половину времени простаивает, в ожидании ответа устройств общей шины. Короче, простым глазом увеличение скорости было совершенно незаметно (кстати, на качество работы программ, зависящих якобы от тактовой частоты, оно тоже абсолютно никак не повлияло).
    - Контролер дисковода? О! Вот это реально - ДЕЛО! Остался маааааааленький вопрос: "А где сам дисковод?" Как так "нету"? Почему? Поясняю:
Контролер дисковода появился в БК-0011 конечно не в первые. К ранним БК-0010 дисководы тоже подключали, но делали это кустарно или полукустарно. В продажу до того момента дисководы БК никогда не поступали. А вот к БК-0011 решили от щедрости подключить дисковод штатным образом. Только, если я не ошибаюсь, взяли за основу технического задания какой-то древний ГОСТ первой половины 1980-х годов, принятый ранее для первых версий школьных компьютеров "Агат". Контролер для БК-0011 в итоге поддерживал чуть ли не единственную модель какого-то болгарского дисковода которой не было в продаже (подозреваю, ISOT 5321, но могу сильно ошибаться. Живьём я такое лично не трогал), и которая могла работать только с устаревшими 40-дорожечными дискетами (360 кб максимум). Зато именно эта модель дисковода централизовано поставлялась в школьные классы, так что контролер мог бы подойти для школьных компьютеров БК-0010Ш. Впрочем, не факт. Кроме всего, он был не совместим с предыдущими программами для БК-0010(-01) - не мог напрямую загружать старые версии БК с дискет, вместо магнитофона, не позволял держать в ПЗУ стандартную мониторную систему БК-0010 (фактически BIOS). Хотя там, кажется, проблема была не только с контролером дисковода, но и с какой-то несовместимостью БК-0010 и БК-0011 по системным адресам.

    В итоге, БК-0011 оказался полным отстоем. Не решал толком ни одной проблемы предыдущих версий, лишь усугублял их. Был несовместим по программам ни с предыдущими БК, ни с другими ветками архитектуры PDP-11. Идеи - хороши, исполнение - на минус 100500 баллов. Избавился от этой машины при первой возможности, и никому никогда не рекомендовал её приобретать. Опять же я такой не один. В той же Википедии пишут, что исходных БК-0011 было выпущено "очень немного".

    Последняя моя модель линейки БК - компьютеры БК-0011М. Фоток опять же не будет, от той же старой БК-0010-01 они внешне отличались лишь надписью. Это была тщательная и достаточно успешная "работа над ошибками" предыдущей версии. 
    Во-первых, наконец-то к БК-0011М присобачили нормальную клавиатуру! Внешне клавиатура почти не отличалась от предыдущих чудовищ. Те же кнопки, с теми же надписями, на тех же местах. Сохранялся и недостаток раскладки - русская раскладка пишущих машинок ЙЦУКЕН, с соответствующими латинскими буквами на похожих русских буквах (т.е. привычной сейчас латинской раскладки QWERTY не предусматривалось). Но это было уже мелочью, по сравнению с реальным достоинством. Зато клавиши (мы тогда называли их "герконовыми") теперь нормально нажимались, реагировали без скрипа, заеданий, дребезга. Стало возможным НОРМАЛЬНО (без непрерывных матюков) вводить с клавиатуры весьма объёмные тексты, в том числе и слепым методом. 
    Во-вторых, была восстановлена совместимость со старыми программами БК-0010(-01). Теперь их можно было почти всегда нормально запускать, как с магнитофона, так и с 5.25-дюймового дисковода, если он был подключен.
    В-третьих, контролер дисковода тоже подправили. Теперь он стал совместим с нормальными современными 80-дорожечными дисководами, работающими с дискетами объёмом 720 кб и более, которые как раз начали постепенно появляться в свободной продаже.
    Исправили ещё некоторые ошибки. В итоге новый компьютер засиял новыми красками, получил совсем иной приём, чем предшественник. Куча энтузиастов бросились обеспечивать его программами. БК-0011М, в сочетании с дисководом и матричным принтером, оказались весьма функциональными в качестве продвинутой интеллектуальной пишущей машинки, домашнего учебно-развлекательного комплекса, лабораторного контролера внешних датчиков, вычислительной системы начального уровня, с возможностью построения графиков и анализа зависимостей... И был уникальный период, в первой половине 1990-х годов, когда БК-0011М делала всё это почти так же хорошо (лишь чуть-чуть хуже), чем многие клоны IBM PC, при этом стоила (с учётом всего комплекса периферийного оборудования) раз в десять дешевле!

    Внешняя периферия

    В первую очередь я подключал к БК конечно же самое простое устройство - джойстик:
Один из вариантов джойстиков для БК (фото из сети)

    Выглядели джойстики тогда примерно так. Выпускались большей частью кустарно, в частных кооперативах, но относительно массовыми партиями, поступавшими в продажу. У меня было несколько разных вариантов. Идея проста - движения рукоятки заменяют нажатия четырёх кнопок со стрелками вправо-влево-вверх-вниз на клавиатуре. А несколько кнопок активируют какие-нибудь заранее предусмотренные действия. Применялось крайне узко в некоторых динамических играх. В подавляющем большинстве случаев, ни малейшей пользы джойстик на БК не приносил - управлять той же самой игрой с клавиатуры было гораздо удобнее. Впрочем, и большого убытка от джойстика не было - штуковина крайне простая и дешевая.

    Мышь. Для линейки БК, как для самых "настоящих" компьютеров на государственном уровне выпускалась и своя "настоящая" компьютерная мышь! Называлась "Марсианка":
Мышь УВК-01 "Марсианка". Специально для БК (фото из сети)

    Самая настоящая, компьютерная мышь, в современном понимании этого термина (только у меня беленькая была). Правда устаревшая по технологии - шариковая, а не оптическая. Ну так ведь в те времена почти все мыши были именно шариковыми. Эргономика, мыши конечно, несколько... ээээ... прикалывает, скажем так. Тем не менее, я уверен, умельцы смогли бы успешно подключить эту штуковину (через переходник, конечно) и к любому современному компьютеру! Использовалась мышь КРАЙНЕ ограниченно! 99% всех программ БК о существовании мыши вообще не подозревали. Никакой системной поддержки для мышей тоже не предусматривалось. Но единичные программы, которые ориентировались на мышиный интерфейс, вроде графических редакторов, вот те пользователей конечно впечатляли. 

   Однако, пора сворачивать этот жутко затянутый текст. Очень полезной штуковиной для БК стали дисководы гибких дискет 5.25 дюйма. Правда, стали они полезными, только когда получили товарное распространение среди пользователей и сами дисководы, и их контролеры заводского изготовления. Это уже начало 1990-х. Получили распространение как отечественные дисководы МС5311, так и импортные TEAC FD-55, и некоторые другие. Лично через мои руки проходили именно эти две модели. Обе работали безукоризненно! Так же, как и их контролер от БК-0011М. Впрочем, повторюсь, в линейке компьютеров БК вся электронная начинка обычно работала без нареканий. Разумеется, появление дисководов с возможностью автоматического чтения/записи данных по ходу работы программы, без необходимости регулярной ручной перемотки магнитной ленты, резко повысили возможности компьютера! Надежность дисководов, как импортных, так и советских, на удивление особых нареканий не вызывала. Судя по всему, бракованные экземпляры отсеивались на более ранних этапах, и до меня просто не доходили.

    Ещё один полезный элемент внешнего оборудования - матричный принтер. Они позволяли сделать из БК достаточно дешевую, но весьма функциональную пишущую машинку,, с возможностью продвинутого редактирования, сохранения и форматирования текста. Почему принтеры именно матричные? Элементарно! Других тогда просто не было. Точнее они были, даже и лазерные были, если усиленно поискать. Но стоили, как гиперзвуковой истребитель. Ещё были лепестковые "ромашковые", на западе очень популярные. Но у нас их ни разу не видали, видно никто не хотел "ромашки" с кириллицей массово выпускать. А вот матричные принтеры, примерно в тот же период, в начале 1990-х, стали реально доступны для покупки. В этот абзац я хотел вставить кучку фоток ранних матричных принтеров. И жутко удивился:
    Через мои руки прошли польские принтеры Mazowsze D-100 и немецкие Robotron СМ6329. Фотки в сети есть... Но какие-то не такие, как отложились в моей памяти. D-100 выглядел истинным бегемотиком. Хотя печатал вполне приемлемо. На нынешних фотках - ничего похожего не наблюдаю. Аналогично, и роботроны на современных фотах почему-то не кажутся мне похожими сами на себя. Роботроны запомнились надёжностью конструкции, прочностью. Ещё у них была приятная фишечка: можно было вместо фирменно картриджа с красящей лентой, поставить специальный "совместимый" картридж (тоже заводского изготовления) в который монтировались две стандартные катушки с лентой от советских пишущих машинок, и эти катушки штатным образом переключались, чтобы мотать ленту взад и вперёд, как им и положено. Обалденная забота о бедных советских юзерах! 
    Были, конечно, в очень гомеопатических количествах и импортные принтеры, Epson LX и какие-то Star. Я себе лично купил вполне себе отечественный принтер МС6313. О, кстати, фоточку хотите?
Вот примерно такой МС6313 (фото взято из сети)

    Очень приличный матричный принтер. Тормозной, до жути. Но, если его гладить по шёрстке, достаточно стабильно работающий. По командам полностью совместимый с импортным Epson LX. И даже, частично совместимый с командами Epson FX, но не совсем. Юмор понятен? По размеру, правда, половину стола занимает, но это уже издержки советской разработки. Главное что? Работает? Таки работает! Последнюю курсовую работу и значительную часть дипломной работы на нём печатал, в текстовом редакторе собственного написания. Защитился успешно. :)))

    Тут был ещё один прикольчик. У того самого принтера МС6313 был от заводского рождения задекларирован интерфейс к компьютеру, под названием ИРПР-М. Который, вроде как бы и не совместим с советским интерфейсом ИРПР, но и с импортным интерфейсом Centronics, он вроде бы тоже нифига не совместим! А с чем тогда? Я ни черта не понял, проанализировал документацию. Обнаружил, что вроде бы как интерфейс ИРПР-М выглядит точно так же, как и импортный Centronics, но только с задержкой на половину фазы синхронизирующего сигнала. Значит, если тупо инвертировать синхросигнал, получится тот самый сдвиг на пол фазы. Инвертор мне опять же принёс отец. Я его даже на плату паять не стал, просто примотал ножками мелкосхему К133 к проводочкам шлейфа синей изолентой. Сработало! Принтер запечатал.

    Вот и всё. Закончилось всё очень быстро. Рухнувшей советской промышленности стало абсолютно неинтересно поддерживать какие-то-там БК. Импортные клоны машин на базе 286/386/486 и далее резко превзошли всё предыдущее на голову. с этим тоже можно было соревноваться, но уже не на том примитивном уровне архитектуры PDP-11.
    Заказчики, ранее выбиравшие БК из дешевизны, очевидно уходили в рынок PC. Я сам тоже активно работал именно с клонами IBM PC на базе Windows 3.x, для начала. В итоге, к середине 1990-х годов, интерес к БК практически пропал. Новые машины - новые возможности. Линейку БК мне пришлось забросить. Крайне жалею, что ничего не смог с тех времён сохранить! Простите меня, о Боги!!!

пятница, 20 мая 2022 г.

Шеркало 06: красный свет

 - Шеркало, где я? Что со мной?

- Откуда я знаю? Ты же последние три месяца тёмную тень с глаз не снимаешь, что же я могу увидеть вокруг тебя?

- Почему все вокруг сошли с ума? Или это я сошёл с ума?

- Ммм?

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

- Ну и что? Бывает...

- Нет, Шеркало, ты не поняло. Я сам знаю, что бывает.

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

Ещё, бывает, встречаются люди (обычно старые бабки), которые с советских времён твёрдо усвоили, что во всех приличных местах их всегда обязаны пропускать строго без очереди, как признанных ветеранов Ледового Побоища 1242 года или Куликовской Битвы 1380 года. Ну и они автоматически относят перекрёсток со светофором к подобным "приличным местам". Для таких людей подождать зелёный сигнал светофора - это даже своего рода "западло", это значит самому по собственной воле унизить себя, принизить собственную значимость и занизить собственный возраст. 


Но сегодня почему-то было совсем не то. Обычно подобных "торопыг" встречаешь за день считанные единицы. Большинство людей всё же нормальные, на светофор глядят, дуром под поток машин не лезут. А вот сегодня - вдруг что-то особенное. На каждом, буквально на КАЖДОМ перекрёстке. Если не каждый первый, то уж каждый второй встречный точно!

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

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

Очередной перекрёсток, очередной молодой парень тоже студенческого возраста. Ему нужно было перейти перекрёсток по диагонали, через две перпендикулярные улицы - можно сначала налево, потом направо, а можно наоборот, сначала направо, потом налево, по расстоянию безразлично. Он уверенно зашагал прямо, никуда не сворачивая на красный свет. По улице в это время ехали машины, тормознули, хором возмущённо забибикали. Парень не оборачиваясь отмахнулся рукой: "Заткнитесь, придурки!!!". Когда он закончил переходить улицу, сигнал светофора как раз успел смениться на противоположный. Парень тут же повернулся и пошёл переходить вторую, перпендикулярную улицу, где только что ему зажёгся красный свет. Почему он не стал пересекать перекрёсток в обратном порядке, чтобы попасть на зелёные сигналы, для меня полная загадка.

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


- Слышь, Ёж, а может ты дальтоник?

- Во-первых нет, Шеркало, а во-вторых, верхний сигнал с нижним у светофора, я по-твоему тоже путаю?

- А может ГосДума издала новый закон, что в связи с политикой импортозамещения теперь нельзя руководствоваться сигналами светофоров, разработанных по недружественным международным стандартам, а ты этот закон пропустил?

- А может проще предположить, что кто-то сходит с ума?

- Может, осталось выяснить, кто именно.

- Так я с этого и начал разговор...

пятница, 28 января 2022 г.

Шеркало 05.10: (не)любимые системы программирования (Другие ч.4)

- Ёж, какая сегодня погода?

 - Так, Шеркало, не отвлекай меня! Эту серию про системы программирования, пора уже жесточайшим образом заканчивать, тем более, что любимые давно закончились, а нелюбимые, большей частью, не особо интересны!

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

C++

Про язык C++ конечно тоже нельзя не упомянуть. Тем более, что это совершенно самостоятельная среда и даже совершенно отдельная "экологическая ниша", по сравнению с исходным языком Си. Это не просто объектно-ориентированное расширение Си, это вообще отдельная парадигма программирования. Картинок, с исходными текстами наверное в этот раз не будет. Ни  к чему они, в моих воспоминаниях. Если Си я в прошлый раз оценивал, как "структурную надстройку над ассемблером PDP-11", то C++ безусловно с ассемблерами, да и вообще, с любыми предыдущими языками (включая даже язык Си!!!), сравнивать нельзя!

C++ есть воплощенная бескомпромиссная производительность и мощность программирования, выжимаемая из архитектуры современных микропроцессоров! Это язык, на котором программист должен иметь возможность написать ВСЁ, что пожелает, реализовать любые, самые смелые свои фантазии! На момент разработки C++ передовой технологией считалась (была, на самом деле) технология Объектно-Ориентированного Программирования (ООП). C++ вобрал в себя парадигму ООП по самому максимуму! Чего стоят только реализации множественного наследования, и перегрузка функций, и перегрузка операторов!!! Главная идея - всей мощности и свободы побольше, побольше, и ни в чём, кроме размера виртуальной памяти (которая почти бесконечна), не нужно себя ограничивать!

Моя личная работа с C++ не сложилась точно так же, как и работа с Си. Те же, самые достоинства, языка, что и у Си, только возведённые в третью степень. Те же самые недостатки, что и у Си, тоже возведённые в третью степень. Тот же самый мой вывод: Паскаль (на этот раз более современный Object Pascal, поддерживающий ООП) - гораздо проще и понятнее. Пусть у меня с Паскалем не будет всемогущей власти над всеми современными нюансами программирования, но зато я и не буду неделями выискивать в программе (особенно в чужой) кучу неприятных блох, появившихся в результате единичной случайной опечатки в одном символе текста.


Бейсик BASIC 

Тоже, вероятно надо упомянуть.  Изначально - учебный (поэтому очень сильно сокращённый вариант Фортрана). Выглядел примерно вот так:

10 INPUT "Введите значения X1,X2,X3,B,A"; X1,X2,X3,B,A
20 LET X=X1
30 LET Y=(B*X^2-A)/(EXP(A*X)-1)
40 PRINT "X=";X;"Y=";Y
50 LET X=X+X3
60 IF X<=X2 THEN 30
70 END
В качестве учебной версии Фортрана на период начала1960-х годов - идеальное решение, буквально по всем параметрам! Здесь нужно отметить, обязательную нумерацию строк. Это, с одной стороны, прямое наследие Фортрана (но в Фортране не все строки обязаны были иметь номера). С другой стороны, нумерация строк - очень существенное облегчение при реализации экранного текстового редактора (ВАУ! А читатели вообще в курсе, что ЭКРАННЫЙ текстовый редактор для ранних персоналок был недостижимой мечтой?! Что текст редактировался в лучшем случае в пределах одной строки, пока не нажата кнопка ENTER/ВВОД?! А потом - ищи-свищи эту строку!) на слабом компьютере (на тот момент, опять же, почти идеальное решение, позволяющее создать прямо на коленке приличный экранный текстовый редактор из примитивного строчного текстового редактора - очень простое (редактирование ранее введённой строки по её обязательному номеру) и удобное решение при разработке интерактивного интерпретируемого (построчно) языка на компьютере, который ещё толком не поддерживает полноценные полно-экранные терминалы.

Маленькая  техническая вставочка. Изначально под термином "терминал" (извините за невольную тавтологию) на больших компьютерах, подразумевался телеграфный аппарат. Ты ввёл строчку текста, она отпечаталась на бумаге (или, чаще на бумажной ленточке с клейкой основой), и после нажатия кнопки "Передать" ушла в компьютер. Тот немного подумал, подумал, в ответ выдал тебе на бумаге (ленточке) свою ответную строчку символов.
Вот и всё! Вернуться к предыдущей строчке и исправить её, если где-то опечатался, уже НЕЛЬЗЯ. Предыдущей строчки уже в компьютере физически НЕТ, она сохранилась только в форме строки букв, отпечатанных (перфорированных) на бумаге. Вернуть эту строку букв обратно в компьютер, чтобы исправить опечатку, уже никак нельзя, она уже вышла оттуда, она уже "wasted". (На самом деле можно, но сложно, и я сейчас говорю не об этом).
Ну и вот, идея жёстко пронумеровать каждую вводимую строку (при этом сохраняя копию этой строки в памяти компьютера!) позволяла обеспечить редактирование текста программы в интерактивном режиме - каждую строку редактировали, назвав её уникальный номер! Ну и плюс,, вспомним тот же FORTRAN, с которого BASIC брал пример - там тоже изначально каждая строка на бланке для пробития перфокарт свой номер имела. Только потом разрешили у "неважных" строк, на которые никто не ссылается, номера пропускать. Так, в исключительно строчном режиме, обходили технические ограничения терминалов на редактирование предыдущих (уже ушедших из короткого буфера памяти терминала) строк.

Как только терминалы больших ЭВМ, работавшие в режиме буквопечатающих телеграфных аппаратов, перестали быть супер-уникально-актуальными (где-то в конце 1970-х годов) и сменились полноэкранным редактированием текстов, так тут же язык BASIC начал очень быстро совершенствоваться. Прежде всего исчезла обязательная нумерация каждой строки, появились символьные переменные и операции с ними. С приходом микрокомпьютеров и ПК в язык включились низкоуровневые функции, элементы ООП, готовые библиотеки программ... Огромную роль в развитии BASIC сыграла фирма Microsoft, во главе с известным всему миру программистом Биллом Гейтсом. В своё время фирмы Microsoft и Borland даже, по слухам, очень круто поцапались друг с другом именно из-за языка BASIC. Итогом конфликта стал раздел сфер влияния: Борланд прекратила развивать свою успешную тогда линию компиляторов "Turbo Basic", отдав это поле Майкрософт. В свою очередь, компания Гейтса отказывалась от претензий на компиляторы языка Паскаль, признавая их сферой интересов Борланда. 

Дальше о BASIC - всё просто. Для изначально слабых ПК на базе ранних 8 и 16 разрядных процессоров, BASIC (тем более в относительно современных инкарнациях). был одним из немногих реально эффективно реализуемых на том железе языков высокого уровня. Тем более, будучи при том  изначально простым для понимания начинающими, BASIC получал всё более нарастающую популярность. размножался во множестве версий и пользователей. Немного позже, с появлением полноценных 32, 64 разрядных ПК, BASIC утратил какие-либо специфические преимущества. гораздо более простые, удобные, понятные, развитые языки программирования стали завоёвывать бОльшую популярность.
От полного забвения BASIC спас лично Билл Гейтс, испытывавший к этому языку свою личную симпатию. Он сделал именно BASIC, в варианте Visual Basic for Application (VBA), основным скриптовым языком сверх-популярного пакета программ MS Office, что безусловно продлило жизнь языка на несколько десятилетий (а потом ещё в оболочке PowerShell тоже танцы с BASIC продолжились и до сих пор продолжаются). Но, как и во многих иных случаях, то что понимается по Basic'ом сейчас к изначальному языку BASIC из Дартмутского колледжа не имеет практически никакого отношения - ни единой общей чёрточки, совсем ничего похожего, кроме нескольких общеупотребительных служебных слов, знаков арифметических операций и арабских цифр.

Моё мнение о BASIC: для маломощных ранних ПК - он самое ТО, что тогда и надо было! Для скриптового языка MS Office, в меньшей степени для скриптового же PowerShell - он на своём месте, хотя могло бы быть и гораздо лучше. На перспективу - да ну его, нафиг, явно устарело.

- Так, я бегу. Шеркало, бегу быстрее, стараюсь пропустить мимо внимания галопом всё, что возможно. Но не могу пропустить язык Forth.


Forth

Нельзя его пропустить, поскольку Forth - идеальная классическая стековая машина. Что такое стек? Точнее, что такое LIFO-стек (Last Input - First Output) - это такая специальная "несправедливая" очередь - кто последним в очередь встал, обслуживается самым первым. Классический пример стека - магазин к автомату Калашникова, в котором самый последний заряженный патрон, оказывается на самом верху и выстреливается первым, а самый первый из патронов наоборот спускается при зарядке в самый низ магазина, и стреляет последним. Или узкая трубка с конфетками, открытая только с одного конца. Конфетки засыпаются в трубку сверху по одной, съедаются потом тоже по одной, начиная с самой верхней, последней конфетки, далее по порядку до самой нижней, самой первой.
Зачем такая "несправедливая" очередь нужна? Очень просто - экономия аппаратуры машины на адресации. В обычных компьютерах нужно тратить ресурсы (место в памяти, в машинных командах, в регистрах, на адреса операндов. Вроде "взять число из ячейки памяти 9876 и сложить его с числом из ячейки 4567, результат записать в ячейку памяти 2233". На все эти номера ячеек нужно тратиться, хранить их, декодировать, передавать из одного устройства процессора в другое и т.п. А в стековой машине ничего подобного не нужно. Адрес ячейки, откуда нужно взять первое число ВСЕГДА точно известен - это вершина стека. Адрес второго числа... вы будете смеяться, но он ТОТ ЖЕ САМЫЙ - это снова та самая вершина стека, откуда мы только что взяли первое число. Только там, на вершине, теперь лежит другое число, вот его и возьмём. Куда положить результат? Вопросов нет - ТУДА ЖЕ, на вершину стека. Нам при этом ни разу не понадобилось обращаться к ячейкам памяти напрямую по их номерам/адресам! Экономия, однако!

Так вот, Forth - это классическая стековая машина, где всё что можно хранится в стеке, поэтому прямая адресация памяти по номерам ячеек почти и не используется. Данные в Forth лежат в стеке, программа, на Forth, состоит из "слов", которые лежат откомпилированные в словаре, который на самом деле тоже хранится в стеке (модифицированном, наложенном на линейную память). Собственно и самого языка Forth, просто не существует! Forth - это набор слов, которые оперируют стековыми данными и виртуальная машина, которая слова из стека читает и интерпретирует. Слова из словаря, в виде стека, который может дополняться программистом. Программирование на Forth - это и есть дополнение уже готового словаря новыми словами сверху. Всё, что может быть представлено стеком - всё это и есть в стеке (а что нельзя положить в стек, то всё равно, хотя бы частично, но тоже хранится в стеке). Очень красивая парадигма!
На первый взгляд слегка шокирующим для начинающих становится первое же следствие стековой архитектуры - простые арифметические выражения приходится записывать в так называемой "постфиксной или обратной/инверсной польской" записи. Да и дальнейшее  программирование тоже требует... эээ... постфиксного подхода к написанию текстов. Но привыкнуть можно.

В Forth нельзя написать умножение, как
2 * 3  - операция умножения * здесь написана слишком рано - в стеке ещё нет готовых для неё чисел, правильно нужно написать вот так:
2 3 *  - сначала в стек складывается число 2, потом поверх него складывается число 3. Потом появляется операция * умножить. Она берет с вершины стека по очереди два необходимых операнда, сначала берёт 3, потом берёт 2, потом умножает их друг на друга и результат снова кладёт в стек, на его вершину.
А что бы выполнить математическую операцию  sin((a+b)/(c-d)) в Forth нужно записать такое выражение:
a b + c d - / sin
Понятно? Вполне красиво, и никаких скобок не требуется.
Хи-хи (оно же P.S.). Нужно отметить, что ничего не даётся бесплатно! В постфиксных выражениях Forth каждый лишний уровень скобок или учёт приоритета операций "обычного" выражения требует +1 к глубине стека.

Пример: выражение c + a * b запишется в постфиксной записи c a b * +. Хотя скобок и нет, но приходится из-за приоритета умножения, сначала положить в стек сразу ТРИ числа c a b, потом выполнить умножение a на b, вернув результат в стек поверх ранее положенного c, а уже потом сложить с с этим результатом.
Со скобками, меняющими порядок действий, всё аналогично. Выражение a * (b + c) в постфиксной записи будет выглядеть a b c + * и так же потребует стека глубиной не менее трёх элементов, в отличие от стека глубиной 2, достаточного при отсутствии скобок и приоритетов операций..

Такая же постфиксная логика математических вычислений была реализована и и известной линейке советских программируемых калькуляторов Б3-21, Б3-34, МК-52, МК-61 и некоторых других  У меня такие калькуляторы были ещё со школы (и даже сейчас есть - МК-61). Очень нравились, вполне удобно считать (по моим современным ощущениям, у МК-61 индикатор явно мелковат по размеру (в смысле физически мелковат, в миллиметрах), да и по яркости слабоват, но это уже личные придирки, сам принцип интересен и вполне применим). Отдельную статью об их программировании вряд ли стану писать. Упомянуть, что близкие по возможностям американские программируемые калькуляторы появились раньше, вероятно имеет смысл.  Но последующие исследования показали, что наши советские модели программируемых калькуляторов с постфиксной арифметикой создавались "по мотивам" (вот нарисуйте так, чтобы считалось прям как у них!), однако технически были вполне самостоятельны, и на уровне микроэлектроники - абсолютно несовместимы с "прототипами-вдохновителями" от фирмы HP..

С показыванием программ на Forth у меня возникли некоторые трудности. Ну нечего там показывать, для человека, смотрящего со стороны? Это же просто текстовый бред какой-то. А пояснять более подробно - так тут уж целые книги цитировать надо (при подготовке этого этюда я реально и с интересом перечитал пару умных книг по программированию на Forth). Попробую уложиться в формат рассказа?
: FACT                        (... n -> ... n!               )
  DUP 2 < IF DROP 1           (1 если n<2, то n!=1           )
  ELSE                        (n иначе                       )
  DUP                         (n n s=n k=n                   )
             (Теперь лежащие в стеке числа будут представлять)
                (s - накопленное произведение и k - множитель)
  BEGIN                       ( s  k                    <--  )
  1-                          ( s  k' k'=k-1               | )
  SWAP OVER * SWAP            ( s' k' s'=s*k               | )
  DUP 1 =                     ( s  k k=1 если k=1, то s=n! | )
  UNTIL                       ( n! 1 иначе повторить    ---  )
  DROP THEN ;                 ( n!                           )
Или более интересный вариант:

- Ты, Ёж, тут хвостиком своим куцым не виляй. Прямо говори, чем тебя Forth не устроил!

- Понимаешь, Шеркало... Дело не в том, что устроил или не устроил. 
Forth - наиинтереснейший язык, это вещь, которую ОБЯЗАТЕЛЬНО нужно изучать! Must Have, что называется. На базе идей стековой машины Forth и "шитого кода" (сознательно эту штуковину не упоминал для сокращения статьи) развивалось множество современных концепций ИТ и множество очень известных, популярных и сейчас систем. Forth - безусловно красивый прорыв для своего времени! Вот только... это НЕ язык программирования.

На Forth нельзя (точнее можно, но крайне неудобно и никто этого не делает) писать программы, работающие на каких-то общеупотребимых компьютерах, под управлением каких-то известных операционных систем, в среде кучи других программ под эту же систему. Нет, Forth - сам себе компьютер и сам себе операционная система. На нём нельзя просто взять и "написать программу". Нет такой опции! Вместо программы можно написать расширение самого языка Forth - любая программа, это не просто сторонняя программа - это именно расширение (усовершенствование) самого языка. Получается, что средний программист не может просто писать обычные прикладные программы, а должен для достижения своих прикладных целей дорабатывать используемый им язык программирования! Представляешь? Надо тебе, допустим, написать программу находящую корни квадратного уравнения или считающую площадь прямоугольного треугольника. А ты вместо этой примитивнейшей задачи, пишешь фактически свою собственную расширенную версию языка программирования!!! Всего-то на всего! Писал простенькую программку, а написал в итоге новый язык!

Ну и "лёгкий" побочный эффект: допустим некий абстрактный Вася, доработал Forth одним образом, чтобы реализовать сравнительно сложную матричную арифметику, а некая Маша доработала свой Forth таким образом, чтобы её респонденты заполняли красивые формы данных, которые потом могли бы использоваться при матричных вычислениях Васи.
И вот Вася с Машей, находят друг друга, понимают, что Машина программа могла бы насобирать данные, которых так не хватало Васе, а Васина программа, в свою очередь, могла бы обработать данные, которые насобирала Маша. Но тут выясняется, что Маша с Васей имели вообще разные взгляды на перспективы доработок Forth, что их собственные версии языка вообще даже близко несовместимы друг с другом, что у них разная арифметика, не говоря уже о разных границах массивов (у Васи с 0, а у Маши с 1), что для приведения всего этого цирка с конями к единой схеме требуется целый институт научных работников... Ну, в общем, пример исключительно надуманный, но понятно, о чём я толкую - поскольку программы на Forth как таковой не существует, все свои наработки можно сохранить только вместе с полным словарём языка. И что делать, если этот словарь оказался вообще разным у разных программистов, что неизбежно, даже в простейших случаях?!

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

Для чего действительно удобен Forth? Разработка очень кратких, предельно эффективных программ в условиях маломощных процессоров и при катастрофической нехватке памяти (вроде своеобразного ассемблера для маломощных машин с преимущественно стековой адресацией). Но, при этом, отсутствие требований к "универсальным" программам, сосредоточенность на типовых, повторяющихся операциях. Что за ниша? Управление аппаратурой, промышленные контроллеры. Вторая ниша - виртуальные машины, когда стековая архитектура дико удобна (экономна), а стековые недостатки никого не волнуют, люди сами вручную программы для стековых машин не пишут.
Для живого человека - стековая архитектура Forth обычно не самый лучший мнемонический вариант написания программ. 

Мой личный опыт Forth (не считая чисто "книжного") это - конечно БК-0010/11(М). Вроде бы условия как раз подходящие - компьютер с чудовищно обрезанной до смешных 15.5 кБ оперативною памятью. И Forth на нём с любовью реализован (на самом деле он был реализован на других клонах системы PDP-11, но на БК-0010 тоже вполне запускался). И неутешительный вывод - работает крайне нестабильно (слишком ограниченная аппаратная поддержка стека), чудовищно неудобен, программы плохо переносимые даже между однотипными системами. С трудом подходит для чисто учебных целей на самом младшем уровне начинающих, вроде "посчитайте 2 + 2 и выведите строку 'HELLO' задом-наперёд" (но тут для начинающих, ожидаемо, постфиксная запись категорически обламывает им всю малину), но ничего хоть чуть-чуть серьёзного реализовать не получается. К такому же мнению единодушно пришли и другие программисты БК-0010. Родной ассемблер PDP-11 на сто порядков лучше, проще, удобнее, надёжнее.

- Всё, наконец уже, Ёж?!
- Нет, Шеркало, потерпи, осталось совсем чуть-чуть, буквально несколько абзацев. Не хочу растягивать повествование на ещё одну часть.

Simula-67, Smalltalk

Не могу же я вот так всё завершить цикл рассказов, не упомянув про языки - родоначальники парадигмы Объектно-Ориентированного Программирования (ООП)? Традиционно самым первым языком ООП считается язык Симула-67, в котором впервые были реализованы большинство синтаксических (и семантических) идей современных ООП-языков.
Симула - расширение известного языка Алгол-60, в который в первую очередь были добавлены классы - некие структуры, которые объединяли внутри себя данные (переменные, поля) и исполняемый код (процедуры, методы, оперирующие с этими данными). Классы могли наследовать свойства друг друга. В программе динамически порождались отдельные экземпляры - объекты описанных классов. Всё это предполагалось для того, чтобы как можно точнее моделировать (точнее симулировать, отсюда и название языка "Симула") объектами в программе поведение настоящих объектов реального мира.

Я в своё время (опять же в школьное время) на Симулу-67 внимание конечно обратил. Купил в магазине книжку про этот язык. Внимательно её прочитал. Идея объединять в единое целое специфические внутренние данные и работающий с ними код показалась здравой и интересной, но приведённые в книжке примеры меня особо не впечатлили. Вроде как с объектами, чуть нагляднее получается, но смысл огорода не совсем ясен, как бы и без объектов всё то же самое можно было и обычными средствами сделать почти не хуже. Повторюсь - это всего лишь моё личное впечатление от прочтения книжки-брошюрки, по сути - учебника. Книжка при очередном переезде конечно потерялась. Доступной реализации Симулы я так и не нашёл (хотя специально и не искал), так что на практике этот язык никогда не пробовал.
Много позднее вернулся к теме ООП уже при работе с TurboPascal и Delphi - вот там реально понимание объектно-ориентированной парадигмы понадобилось на практике. Ещё обратил внимание, что название одной из известных книг неоднократно упомянутого профессора Вирта - "Алгоритмы + Структуры данных = Программы" очень здорово перекликается с идеей Симулы-67. Пример того, что иногда востребованные идеи просто "витают в воздухе" и приходят в голову многим одновременно.

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

Другой язык, считающийся классикой парадигмы ООП - это Smalltalk, развивавшийся с начала 1970-х годов и оформившийся к началу 1980-х. В Smalltalk всё есть объекты, нет вообще ничего, кроме объектов. И эти объекты активно общаются друг с другом, обмениваясь сообщениями (которые на самом деле тоже есть объекты), и, реагируя на свои входные сообщения, собственно и реализуют логику работы программы. Объекты принадлежат классам, объединяющим похожие объекты. Логика поведения объектов (программный код) сохраняется в классах, а вот индивидуальные особенности - конкретные данные, сохраняются в индивидуальных объектах. Но классы, в которых сохраняется код, а не данные, тоже, разумеется, являются объектами...

- Хрррр-пшшшшш-хррр-хрр-пшшш-пуфф-хррр!
- Шеркало?!!!
- А, Что? Я всё слышал! Вот, смотри: "язык Forth является неотъемлемой структурой программы объектно-функционирующей при получении данных для системы класса 8-б Васи от PDP-11, которая у Маши в классе 7-г вместе с симуляцией". Я всё правильно понял?
- Э... Шеркало, а как будет звучать термин "ИДИОТ", несли его применить к существительному среднего рода?
- Ёж, давай уже, заканчивай, и не выёживайся!
- Даваю!

Не было у меня на практике никакого Smalltalk. Его вообще практически не было в нашей стране в то время (да и сейчас его тоже не очень). Но в мой университет ТГУ в связи с Горбачёвской "perestroyka" из самой Америки закупили целую партию сверхсовременных персональных компьютеров IBM PS/2. Их закупили аж 1.5 или даже целых 2 компьютерных класса. 
И где-то там, в недрах этих свежих, модных PS/2, затесалась какая-то ранняя PC-реализация языка Smalltalk. На нашей кафедре этот язык считали очень перспективным, пытались в том числе и меня к нему подвязать (примерно, как к Prolog и экспертным системам) из самых лучших побуждений. Вот только во-первых, нормальной русскоязычной литературы по нему в природе не существовало, во-вторых, стать моим научным руководителем по тематике работы со Smalltalk никто не спешил (как я понимаю, никто вообще этой тематики в университете и не знал, только самые любопытные ходили вокруг и облизывались, но всерьёз трогать боялись).

А в третьих... Ну почитал я рекламные проспекты. Потыкал мышкой в окошки. И бросилась мне в глаза такая деталь Smalltalk, которую я уже описывал в разделе про язык Forth.
Smalltalk - это НЕ ЯЗЫК программирования! Это целостная виртуальная система. На Smalltalk нельзя написать какую-то программу и отдать/продать её желающим пользоваться. Можно лишь взять уже готовую систему (виртуальную машину) и дорабатывать её своими собственными расширениями, чтобы в итоге получить другую виртуальную машину с изменённым функционалом, но зато не полностью совместимую с прежней. Соответственно, практическая польза от Smalltalk крайне ограничена, в основном академическими, учебными задачами, когда хочется поэкспериментировать с "чистым" ООП, без "прикладных примесей". Ну ещё он может быть полезен в тех областях, где заказчик желает вместо программы, решающей его конкретную задачу, получить (получить, оплатить, изучить, освоить и т.п.) целиком новенький полнофункциональный виртуальный компьютер, несовместимый с тем компьютером, который у него уже куплен под эту задачу, но по цене не менее дорогой, чем уже имеющийся.

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

Ну и самое последнее, хочу упомянуть популярный язык Python, который мне в последнее время благодаря моим детям довелось попробовать. Нет, Шеркало, не беспокойся, писать о нём я здесь не буду. У меня уже был шуточный рассказ про Python, можно его перечитать. Добавлю лишь, несмотря на бытующее мнение о "простоте" Python, на самом деле, если копнуть чуть глубже, это весьма сложный, многослойный и достаточно запутанный язык.

ВСЁ.