Дональд Кнут о хаке с числом Пи и «эндшпиле» TeX82

Stanford Online 1,7 тыс. 1 ч 3 мин 4 мин 27.11.2025
Главное

В заключительной лекции курса, прочитанной 30 июля 1982 года, Дональд Кнут (Donald Knuth) подводит итоги разработки TeX82, раскрывая внутренние механизмы инициализации системы и подготовки её к промышленной эксплуатации. Основное внимание уделено различиям между версиями initex и virtex, а также решению фундаментальной проблемы рендеринга шрифтов на устройствах с низким разрешением.

🛠 Две ипостаси TeX: Initex и Virtex 4:08

Программный код TeX82 содержит специальные переключатели (с использованием системы WEB), которые позволяют компилировать две разные версии программы: initex и virtex (также называемую «virgin TeX») .

Initex (Инициализирующий TeX):

Virtex (Рабочая версия):

По словам Кнута, использование формата .fmt вместо чтения 20 отдельных файлов шрифтов (TFM) экономит до 15 секунд времени на медленных системах с разделением ресурсов .

🧩 Хак с числом Пи и обход защиты Pascal 17:31

Одной из самых сложных задач при отладке Кнут назвал корректную инициализацию переменных при перезапуске системы из «дампа» памяти (core image). Чтобы программа понимала, нужно ли ей проходить полный цикл инициализации или она уже загружена в готовом состоянии, автор применил нестандартный подход .

В программе используется глобальная переменная ready_already. При первом запуске ей присваивается значение константы 314159 . По мнению Кнута, вероятность того, что эта переменная случайно примет такое значение при загрузке, крайне мала.

Однако этот метод сталкивается с особенностями некоторых компиляторов Pascal:

🏁 «Эндшпиль»: Как TeX завершает работу 25:24

Завершение работы TeX (команды \end и \dump) — критический момент, когда могут быть потеряны «плавающие» элементы, такие как иллюстрации. Если фигура была перенесена на следующую страницу, а текст закончился, стандартная процедура могла бы просто «забыть» её .

Алгоритм завершения работы в модуле 1,204 работает следующим образом:

  1. Вызывается процедура build_page для выталкивания содержимого .
  2. Если на странице осталось содержимое, TeX добавляет пустой блок (null box) шириной hsize .
  3. Добавляется штраф eject (принудительный разрыв страницы) .
  4. Этот цикл повторяется до 25 раз, пока выходная рутина (output routine) полностью не очистит список вкладов .

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

📐 Проблема округления на устройствах с низким разрешением 33:34

Одной из главных проблем машинонезависимости TeX стала отрисовка на принтерах с низким разрешением (например, 200–300 dpi). Если просто переводить идеальные координаты в пиксели, возникают «глитчи» — скачки в 1 пиксель, которые очень заметны человеческому глазу .

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

Решение, предложенное Кнутом и его командой:

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

🖋 Будущее Metafont и «дымные пробы» 48:21

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

Интересные факты о новом Metafont:

При разработке шрифтов Кнут использует режим «smoke mode» (дымный режим) . Это дань уважения старым мастерам, которые коптили литеры над свечой, чтобы сделать пробный оттиск на бумаге . Чтобы оценить качество дизайна, разработчики смотрят на распечатки с большого расстояния или используют бинокль, повернутый обратной стороной .

🔮 Интерактивный TeX и завершение серии книг 52:20

Дональд Кнут видит TeX82 как часть масштабного труда из четырех томов под общим названием «Компьютерная типографика» (Computer Typography) :

  1. Том 1: TeX.
  2. Том 2: Metafont.
  3. Том 3: Шрифты Computer Modern.
  4. Том 4: Искусство программирования (продолжение классической серии после завершения типографского проекта) .

Говоря о будущем, Кнут упомянул работу Дэвида Фукса (David Fuchs) над интерактивной версией TeX, где изменения видны сразу при вводе . Автор считает это необходимым для финальной «полировки» манускриптов, когда нужно подогнать абзац так, чтобы он не сдвинул следующую страницу .

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

💬 Цитаты

«Ничто так не помогает понять, что что-то не работает, как попытка объяснить это кому-то другому.»

Дональд Кнут 30:05

«Тонкости дизайна шрифтов сильно недооценены миром.»

Дональд Кнут 56:05
👥 Спикер
📚 Упомянутые книги
🔗 Упомянутые сайты и проекты
📖 Термины
Initex
Специальная версия TeX, используемая для подготовки файлов форматов и инициализации таблиц.
TFM (TeX Font Metric)
Файлы, содержащие информацию о размерах символов и кернинге, но не их изображения.
Kerning
Процесс изменения расстояния между конкретными парами букв для улучшения визуального восприятия текста.
Run-length representation
Метод сжатия данных, при котором последовательности одинаковых элементов заменяются на значение и количество повторов.
📊 Цифры
🗓 Хронология
  1. 30 июля 1982 Дата проведения лекции в Стэнфорде.
  2. Январь 1983 Планируемое начало работы над новой версией Metafont.
⚖️ Другая сторона
Технологии и IT TeX82 Donald Knuth Metafont DVI Initex