TUстрашилка из моего детства

Вступительная речь

// кхе кхе
Мне никогда не приходила мысль выставлять то что написано ниже на общее обозрение. На эту мысль меня натолкнули беседы с неким человеком по имени Wanderer. До сих пор эти исходники валялись на моём винте без дела (играя роль мусора).
// "В начале было Слово, и Слово было у Бога, и Слово было Бог"

С чего всё началось

Началось всё в институте... . Когда у нас преподавали проивную и скольскую теорию по информатике. Одним из приколов этого курса была машина Тьюринга (кстати вешь очень хорошая, тот кто не умеет программировать на машине тьюринга программистом себя считать не имеет право). В программе курса у нас была некая лабороторная номер 5, целью которой было написать программу на машине тьюринга. Первое явление которое произошло после начала лабороторных это две машины тьюринга, которые слепили два человека - один на Си а другой я на Turbo BASIC .. Результат вы можете посмотреть тут TU.EXE (F2 - врубает звук). Исходник можете скачать тут TU.TUR.. А для того чтобы посмотреть как она работает вы можете скачать программу для самой машины Тьюринга - тут NOD1.TU. Данная программа находит наибольший общий делитель для двух двоичных чисел. Если кто-то из вас понимает как работает машины тьюринга и не может понять как она это работает. В двух словах работает она по алгоритму эвклида. А столь маленький размер имеет потому что я был очень ленивый и решил наложить оба числа друг на друга с тем чтобы арифметические операции над ними можно было выполнять одновременно - одним движением каретки (программирование на ассемблере на мозгах сказывается). Между делом эта программа написана как никак на бейсике, а вещи при этом пытается делать не совсем обычные. Поэтому если вы хотите чтобы она работала без тормозов, то лучше запускайте её в режиме чистого ДОС-а.

Поскольку тот интерпретатор был больше похож на красивую игрушку и создавал очень много тормозных эффектов, толку от него было очень мало. Кроме того модель машины в тот день сделал не я один. Моё внимание вскоре переключилось на другую игрушку, написаную полностью на ассемблере и с более серьёзным подходом. Результате на свет появился интерпретор с неким простеньким языком программирования, который покрывал саму машину тьюринга и был полностью ей эквивалентен. Целью этого языка было создание лабороторных на машине тьюринга буквально в две строчки До практического применения к сожалению не дошло, т.к. программа в конце концов была брошена на пол пути - недоделаной. Поглядеть на то что у меня получилось вы можете тут TU.RAR. Сразу говорю сделано всё очень коряво. Всё что вы сможете - это загрузить файл в программу и запустить его в реальном режиме. Управление частично мышка и кнопки : пробел - редактирование ленты, Enter - редактирование текста, ESC возврат из редактирования. Вот на этом кажется и всё. Старайтесь не наживать лишних снопок и трогать посторонние пункты в меню (за исключением SETUP - там всё работает на сколько помню). Если вы дочитали до этого места то советую сразу скачать программу и посмотреть что она из себя представляет, чтобы иметь возможность убедиться в её ничтожности и корявости и не портить впечатление от ниже прочитанных преимуществ.

Я могу с уверенстью заявить что в программе работают следующие вещи :

  • сама машина тьюринга, с усовершенствованым синтаксисом (например состояния задаются словами).
  • возможность создавать вложенные процедуры (с локальными состояниями) и множественными выходами. Для непосвященных - в моём языке есть прочедуры которые имеют несколько тоцек возврата. Если в обычной процедуре выполнение можно закончить только простым возвратом из процедуры, то в этом языке процедура может иметь неколько точек выхода, которые нужно подключать Возможно ещё процедура имела так называемые точки входа, но я не помню успел ли тогда их сделать. Все эти извраты нужны были для того чтобы язык мог соотвествовать оригинальной машине Тьюринга и имелась возможность конвертировать программу в оригинальный код без сильных потерь в объёме.
  • в программу встроен много оконный текстовой редактор. В котором предусмотренны все функции для работы с текстовыми блоками (копирование перенос и т.д.). Прикол в том что функции были реализованы, но управление этими функцияци наружу н выведены и из редактора не доступны). Впрочем вы можете отметить начало и конец блока - Ctrl-B Ctrl-E если память не изменяет.
  • лента машины бесконечна в оба конца.
  • созданный вами алгоритм компилируется в некий промежуточный код, все состояния и переходы заменяются прямыми сслыками. В итоге работает всё это достаточно быстро.

    То о чём я мечтал, но руки не дошли

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

    1. машины маркова, поста и прочие бредовые создания. Возможно даже программы в которых все они работают вперемешку и одновременно. При такой перемешке в ряде случаев. Совместимость оригиналами уже теряется.
    2. объекно ориентированный подход. + возможность создавать библиотеки и подключать из частично копмилированного кода.
    3. автоматическая оптимизация кода на стадии копмиляции.
    4. ну и конечно возможность конвертировать все эти программы в тот самый исходный код на оригинальных машинах.

    Современнае модификации программы

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

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

    Теперь о мыслях которые остались только в теории (руки не дошли даже до черновых набросков). Редактирование текстов размером больше 64 кб. Идея заключалась в том чтобы разбить текст на набор всязанных в цепь модулей. То есть если в какой-нибудь момент размер модуля с текстом превышает размер 64 кб, то он просто разбивается на два модуля связзаных между собой. Так же если резмер модуля стал слишком маленьким, то по возможности он должен был объедениться с рядом стоящим по списку модулем. Всю эту бурду можно было повесить на сами функции распределителя памяти и жить припеваютчи. Есдиственное усложнение это усложнение работы с копированием и переносом блоком в тексте, но не сильное. Второй прикол это свопинг памяти на диск. Допустим наш большой и жирный текст состоит из 10 модулей. Даже если поставить наш текст на экране так чтобы мы видели то что находится в конце 3 модуля и начале 4, то для того чтобы нарисовать наш текст на экране нам нужны только два модуля (3 и 4) остальные восемь занимают нашу память напрасно и их можно сохранить на диске. При достаточно продумманой системе свопинга можно перемещаться и редактировать мегабайтные тексты не чуствуя потери скорости. По небольшим тогдашним прикидкам , имея 286 компьютер и обычный DOS в реальном режиме, можно без усилий редактировать скажем десяток текстов размером по 20 мегабайт.

    Напоследок - один из набросков программы на объектно ориентированнном ассемблере. NEW.RAR Всё что вам доступно - это первый пункт файлового меню.

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

    Hosted by uCoz