Кардинальное повышение быстродействия

Коренное ускорение компиляции программ на входных языках ПМК

МК-161 бросил серьёзный вызов тем, кто считает себя хорошими программистами на языке советских ПМК. Классическая клавиатура, улучшенный индикатор — но быстродействия едва-едва хватает на улучшенный входной язык. Который запрограммировать вполне реально, как показал опыт Каллисто Классик.

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

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

Главный «внутренний резерв» любой программы — алгоритмы. Улучшив алгоритм, можно существенно улучшить быстродействие программы, и не только. Я не нашёл «ту самую» короткую цитату из ТМ на этот счёт (у кого на слуху, поделитесь), но длинная тоже к месту:

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

Решение нашлось в colorForth, из которого в Каллисто взят замечательный цикл FOR/NEXT. Через десятилетия после создания Форта Чак Мур пришёл к гениальной (очевидной) идее перенести лексический разбор со времени компиляции на время редактирования исходного текста программы. В результате лексема распознаётся не при каждой компиляции заново, а ровно один раз — когда её программист ввёл или изменил.

Если усложнить редактор Каллисто, введя «раскраску» исходников цветом или шрифтами, владелец ПМК сможет вводить в текст программы числа, как числа — в их численном значении. Искать их по всему словарю компилятору будет не нужно. Тратить время на перевод строк в численное значение — тоже. Редактор выводит числа, выделяя их шрифтом. Компилятор считывает значения прямо из исходников. Время экономится, выгода всем.

Можно пойти ещё дальше и зафиксировать набор слов, как это сделано в 161eForth. Тогда исходному тексту проще состоять не из имён слов, а из токенов — уже распознанных редактором. Что, кстати, сработает, как сжатие и позволит разместить в 3Кбайтном «экране» больше исходного кода. Компилятор будет знать, что нераспознанные слова искать во встроенном словаре (который в памяти программ) бесполезно.

Не уверен, что использую все эти подходы уже в Каллисто-2. Но colorForth словно специально разработан, чтобы входной язык МК-161 работал быстро. Похожий подход предварительной компиляции во время редактирования был в MSX-Бейсике, когда частота процессоров была около 1 МГц. Каллистянские программы будут исполняться быстрее таких Бейсиков, так как заранее разобранные на лексемы исходники перед исполнением компилируются в косвенный шитый код — на Каллисто-2 плавно переходящий в подпрограммный.