Бесплатно Экспресс-аудит сайта:

10.04.2024

C++ из прошлого: ретро-компилятор Watcom C++ обзавелся современными функциями

Разработчик Начо Мелладо взялся за задачу модернизации 28-летнего компилятора C++, Watcom C++32 версии 11.0 от 1996 года, выпущенного компанией Sybase Inc., добавив в него поддержку обработки исключений – функционал, который официально появился в языке C++ лишь двумя годами позже с появлением первого стандарта C++.

В 1998 году Мелладо вместе с коллегами представил The DarkRising Library (TDL) – передовую библиотеку для обработки графики и аудио в реальном времени, прежде всего для игр на DOS и проектов в духе demoscene. На тот момент проект Watcom уже опережал время, однако в нем отсутствовала поддержка исключений.

Годы спустя Мелладо вернулся к работе над библиотекой, которая в основном использовала язык ассемблера для обработки в реальном времени, и начал интегрировать C++ для ускорения интеграции. Однако изменение привело к излишней громоздкости кода из-за всепроникающей проверки ошибок.

Мелладо заметил, что использование шаблонов для обработки ошибок по принципу «do this or fail gracefully» могло бы быть значительно упрощено за счёт исключений и использования паттерна RAII (Получение ресурса есть инициализация), что позволило бы программе исправлять некритические ошибки. Несмотря на реализацию классов RAII, которые игнорировали ошибки, введённые им исключения нигде в программе не перехватывались.

Хотя компилятор Watcom мог компилировать конструкции try, catch и throw, сгенерированный код полагался на хуки, отсутствующие в любой библиотеке, поставляемой с компилятором. Поиски решения на ретрофорумах, посвящённых проекту, не принесли результатов. Это указывало на то, что команда Sybase начала реализацию поддержки исключений, но так и не выпустила её полностью.

Без какой-либо документации Мелладо фактически работал вслепую. Он предпринял попытку реверс-инжиниринга компилятора, создавая множество программ, дизассемблируя сгенерированные двоичные файлы и формулируя гипотезы, пока полностью не понял и не смог объяснить все двоичные файлы, связанные с проектом.

Усовершенствования Мелладо в компиляторе позволили кодировать хуки и реализовать исключения, значительно улучшив ясность и эффективность кода. С исключениями и RAII код, который ранее был громоздким и подверженным ошибкам, стал более лаконичным и надёжным.

Платформа оборачивает все операции во внешний блок try-catch, автоматизируя обработку ошибок и освобождение ресурсов. Мелладо пояснил, что итоговый код будет более кратким, поскольку класс Image теперь включает в себя большую часть базовой структуры SLI, делая процесс кодирования более стройным и эффективным.