В заключительной лекции курса, прочитанной 30 июля 1982 года, Дональд Кнут (Donald Knuth) подводит итоги разработки TeX82, раскрывая внутренние механизмы инициализации системы и подготовки её к промышленной эксплуатации. Основное внимание уделено различиям между версиями initex и virtex, а также решению фундаментальной проблемы рендеринга шрифтов на устройствах с низким разрешением.
🛠 Две ипостаси TeX: Initex и Virtex 4:08
Программный код TeX82 содержит специальные переключатели (с использованием системы WEB), которые позволяют компилировать две разные версии программы: initex и virtex (также называемую «virgin TeX») .
Initex (Инициализирующий TeX):
- Представляет собой «tabula rasa» — чистый разум системы без предустановленных макросов .
- Обладает эксклюзивными возможностями: запись форматов файлов (
.fmt), загрузка примитивов в хеш-таблицу и упаковка паттернов переносов в компактное дерево (tri) . - Использует уменьшенные размеры таблиц памяти для экономии ресурсов при загрузке макросов, но расширенные таблицы для паттернов переносов .
Virtex (Рабочая версия):
- Предназначена для повседневного использования в «продакшене».
- Не содержит алгоритмов упаковки паттернов, так как они считаются «мертвым грузом» для готовой системы .
- Имеет максимально возможный размер памяти (
mem_size) для обработки больших документов . - Загружает уже готовые файлы форматов (например,
basic.fmtилиams-tex.fmt), что значительно ускоряет старт .
По словам Кнута, использование формата .fmt вместо чтения 20 отдельных файлов шрифтов (TFM) экономит до 15 секунд времени на медленных системах с разделением ресурсов .
🧩 Хак с числом Пи и обход защиты Pascal 17:31
Одной из самых сложных задач при отладке Кнут назвал корректную инициализацию переменных при перезапуске системы из «дампа» памяти (core image). Чтобы программа понимала, нужно ли ей проходить полный цикл инициализации или она уже загружена в готовом состоянии, автор применил нестандартный подход .
В программе используется глобальная переменная ready_already. При первом запуске ей присваивается значение константы 314159 . По мнению Кнута, вероятность того, что эта переменная случайно примет такое значение при загрузке, крайне мала.
Однако этот метод сталкивается с особенностями некоторых компиляторов Pascal:
- Системы защиты Pascal часто обнуляют переменные или записывают в них «флаги ошибок», если переменная используется до явного присваивания .
- Кнут признает, что этот хак «нарушает правила Pascal», так как проверка значения происходит в самом начале работы программы .
- Решение проблемы: Кнут рекомендует отключать защиту компилятора после завершения этапа отладки .
🏁 «Эндшпиль»: Как TeX завершает работу 25:24
Завершение работы TeX (команды \end и \dump) — критический момент, когда могут быть потеряны «плавающие» элементы, такие как иллюстрации. Если фигура была перенесена на следующую страницу, а текст закончился, стандартная процедура могла бы просто «забыть» её .
Алгоритм завершения работы в модуле 1,204 работает следующим образом:
- Вызывается процедура
build_pageдля выталкивания содержимого . - Если на странице осталось содержимое, TeX добавляет пустой блок (null box) шириной
hsize. - Добавляется штраф
eject(принудительный разрыв страницы) . - Этот цикл повторяется до 25 раз, пока выходная рутина (output routine) полностью не очистит список вкладов .
Кнут отмечает, что пустой блок должен иметь правильную ширину, иначе в многоколоночной верстке это приведет к искажению расположения колонок .
📐 Проблема округления на устройствах с низким разрешением 33:34
Одной из главных проблем машинонезависимости TeX стала отрисовка на принтерах с низким разрешением (например, 200–300 dpi). Если просто переводить идеальные координаты в пиксели, возникают «глитчи» — скачки в 1 пиксель, которые очень заметны человеческому глазу .
Особую проблему вызывал кернинг (корректировка расстояния между парами букв). Из-за микроскопических смещений округление срабатывало в неожиданных местах, и текст с кернингом выглядел хуже, чем без него .
Решение, предложенное Кнутом и его командой:
- Введены дополнительные регистры
hhиvvдля хранения координат в целых пикселях . - Малые прыжки (Small jumps): Координата обновляется относительно предыдущей (относительное вычисление). Это сохраняет целостность слов и формул .
- Большие прыжки (Big jumps): При переходе на новую строку или большом отступе происходит полное переокругление координаты (абсолютное вычисление) .
- «Большим прыжком» считается расстояние, превышающее определенный процент от текущего размера шрифта .
Такой подход позволяет накапливать ошибку округления там, где глаз её не заметит — в больших промежутках между блоками текста .
🖋 Будущее Metafont и «дымные пробы» 48:21
Кнут поделился планами на полную переработку системы дизайна шрифтов Metafont. Новая версия будет ориентирована на эффективность и использование целочисленной арифметики .
Интересные факты о новом Metafont:
- Вместо битовых масок будет использоваться представление растра через длины серий (run-length representation), что позволит памяти расти линейно, а не квадратично при увеличению разрешения .
- Будет оптимизирована отрисовка «пером» шириной в 1 пиксель, что крайне важно для каллиграфических шрифтов .
При разработке шрифтов Кнут использует режим «smoke mode» (дымный режим) . Это дань уважения старым мастерам, которые коптили литеры над свечой, чтобы сделать пробный оттиск на бумаге . Чтобы оценить качество дизайна, разработчики смотрят на распечатки с большого расстояния или используют бинокль, повернутый обратной стороной .
🔮 Интерактивный TeX и завершение серии книг 52:20
Дональд Кнут видит TeX82 как часть масштабного труда из четырех томов под общим названием «Компьютерная типографика» (Computer Typography) :
- Том 1: TeX.
- Том 2: Metafont.
- Том 3: Шрифты Computer Modern.
- Том 4: Искусство программирования (продолжение классической серии после завершения типографского проекта) .
Говоря о будущем, Кнут упомянул работу Дэвида Фукса (David Fuchs) над интерактивной версией TeX, где изменения видны сразу при вводе . Автор считает это необходимым для финальной «полировки» манускриптов, когда нужно подогнать абзац так, чтобы он не сдвинул следующую страницу .
В завершение лекции Кнут выразил восхищение тем, что более 70 человек смогли дослушать этот сложный технический курс до конца, отметив, что TeX82 — это общая территория, которую теперь предстоит осваивать всему сообществу .