Разработчик Начо Мелладо взялся за задачу модернизации 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, делая процесс
кодирования более стройным и эффективным.
9 апреля
Материал взят с сайта:
securitylab.ru
|