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.
Postgres 19 наконец отвечает: как эта строка выглядела в прошлый вторник?
Годами запросы с путешествием во времени в Postgres означали самодельные диапазоны дат и гимнастику с GIST-индексами. PG19 приносит темпоральные возможности SQL:2011 нативно: первичные ключи без пересечений, обновления по временным срезам и внешние ключи на период действия. Инженер, который это сделал, появился в треде.