Apple переписала шрифтовой интерпретатор байткода с C на Swift — и он ускорился на 13%

Шрифты TrueType несут крошечные программы на байткоде, которые интерпретатор выполняет на каждом глифе. У Apple он был на C и разбирал недоверенные данные из PDF и веб-страниц. Переписанная на Swift версия дала пиксель-в-пиксель ту же отрисовку, уничтожила целый класс ошибок памяти и при этом работает быстрее.

Вкратце

Команда безопасности Apple переписала интерпретатор хинтинга TrueType — управление потоком на основе ввода поверх недоверенных шрифтовых данных — с C на Swift к релизам осени 2025. Итог: ускорение в среднем на 13%, пиксель-в-пиксель тот же результат на 27 миллионах глифов и устранённый класс ошибок памяти; на границе с C осталось лишь несколько проверенных unsafe-инструкций.

Системные программисты порадовались связке «безопасность плюс скорость», но один пользователь Swift предупредил: возможности времён жизни, которыми хвастается пост, ещё пару месяцев назад роняли компилятор на простейших программах.

Интерпретатор безопаснее — и при этом быстрее

Материал Apple описывает переписывание, которое звучит парадоксально: взять чувствительный к производительности интерпретатор байткода на C, перенести на язык с безопасной памятью и в итоге получить быстрее. Интерпретатор хинтинга TrueType выполняет маленькие программы на байткоде, встроенные в шрифты, чтобы подогнать контуры глифов под пиксельную сетку на низком разрешении. Важно: он выполняет данные из недоверенных источников — PDF, веб-страницы, — а это делает его первоклассной поверхностью атаки: «управление потоком на основе ввода, сложные структуры данных и аккуратная работа с памятью», ровно там, где C даёт сбой.

Цифры, которые привела Apple

Версия на Swift вышла в осенних релизах ОС 2025 года с конкретными результатами:

  • ускорение в среднем на 13% против реализации на C
  • пиксель-в-пиксель та же отрисовка, проверено на 27 миллионах глифов, по четыре преобразования на каждый
  • класс ошибок безопасности памяти устранён, осталось лишь «небольшое число тщательно проверенных инструкций unsafe» на границе взаимодействия с C
  • набор тестов с покрытием кода 99,7%, где строк тестового кода почти в 4 раза больше, чем кода интерпретатора
  • корпус фаззера из 10 миллионов PDF, ужатый до 4200 файлов без потери покрытия

Чтобы достичь целей по скорости на безопасном языке, команда опиралась на свежие возможности Swift: некопируемые типы (\~Copyable), чтобы убрать накладные расходы на подсчёт ссылок, тип Span для доступа к последовательностям без копирования, проекционные типы-обёртки над C-структурами и передачу продолжений, чтобы держать операции со стеком вне кучи. Руководил работой Скотт Перри из команды безопасности Apple; код выложен на GitHub как эталонная реализация, под MIT, а не привычной для Apple Apache 2.

«Добро пожаловать в клуб»

Те, кто делал отрисовку текста с безопасной памятью, оценили веху. Ведущий инженер, работающий со шрифтами на Rust, отозвался теплее всех:

«Добро пожаловать в клуб тех, кто делает высокопроизводительный текст на языке с безопасной памятью!» — ведущий инженер, исследующий двумерную отрисовку и шрифты на Rust

Это оживило старое «а что если»: Microsoft в 2023 году прикидывала переписать свой шрифтовой стек на Rust по тем же причинам, и не один читатель задумался, как выглядел бы мир Apple, выбери она Rust по умолчанию вместо Swift.

Оговорка про блестящие новые времена жизни в Swift

Самое резкое возражение пришло от разработчика, который пробовал ровно те возможности, что демонстрирует пост:

«Когда я попытался использовать возможности времён жизни, которыми хвалится этот пост, я постоянно натыкался на падения компилятора на очень простых программах, пока не сдался и не списал их как непригодные. Так было и на стабильном, и на nightly-компиляторе… Подозреваю, они используют узкое подмножество того, что эти возможности должны поддерживать». — comex

Вот честная рамка: команда Apple выжала отполированный результат из набора возможностей, который у остальных всё ещё сырой. Другие подцепили вопрос охвата: хинтинг срабатывает только на низком разрешении, и один читатель отметил, что Apple рисует значительную часть собственного интерфейса без хинтинга, так что этот интерпретатор в основном отрабатывает на отрисовке PDF. Вывод не в том, что «Swift бьёт C». А в том, что критичный для безопасности интерпретатор можно увести с C, не платя налог производительности, который все считали обязательным, — если заодно написать вчетверо больше тестового кода.

Получайте такие разборы каждый день

Главные истории Hacker News — на email, в Telegram или RSS.

Следующая новость · 17 из 20 Читать дальше
🚀Tech

Postgres 19 наконец отвечает: как эта строка выглядела в прошлый вторник?

Годами запросы с путешествием во времени в Postgres означали самодельные диапазоны дат и гимнастику с GIST-индексами. PG19 приносит темпоральные возможности SQL:2011 нативно: первичные ключи без пересечений, обновления по временным срезам и внешние ключи на период действия. Инженер, который это сделал, появился в треде.

★ 147 · 💬 41 · pgedge.com · 3 мин