LINUX.ORG.RU
ФорумTalks

Да что вы знаете - 2: Разработчик взломал компилятор C++ 28-летней давности, чтобы проект поддерживал исключения

 , , ,


0

4

Разработчик Начо Мелладо (Nacho Mellado) рассказал, что он взломал компилятор C++ 28-летней давности (Watcom C++32 версии 11.0 1996 года от Sybase Inc.), чтобы проект поддерживал исключения. Фактически это произошло за два года до того, как исключения стали частью первого стандарта 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.

https://habr.com/ru/news/806239/

★★★★★

Последнее исправление: hobbit (всего исправлений: 1)

Сильно. Ъ.

З.Ы. Насчет нужности тут щас ыксперты пояснят, наверное.

Zhbert ★★★★★
()

версии 11.0 1996 года

Не нужный копролит.

ox55ff ★★★★★
()

Вот как человек без ржавого мучался

DumLemming ★★★
()

Непонятно зачем ему понадобился именно старый компилятор. Бери свои демки да компиль gcc или clang. Если речь идёт про плюсы и исключения врядли дело в размере генерируемого бинарников. А код генерируемый современными компиляторами лучше работает на современных же процессорных микроархитектурах. Т.е. в целом красавчик, но идея ускользает

cobold ★★★★★
()

Проект Watcom уже тогда опередил своё время, но поддержки исключений там ещё не было

Тогда может и опередил, но чуть позднее появился djgpp, который нынче тоже мертв, но чувак же всё равно занимался жёсткой некрофилией.

no-such-file ★★★★★
()
Ответ на: комментарий от cobold

Непонятно зачем ему понадобился именно старый компилятор

Ну может он по-хардкору всё на реальном железе собирал.

no-such-file ★★★★★
()

я когда-то компилировал на ваткоме

kto_tama ★★★★★
()

сколько времени он на все это угробил ?

kto_tama ★★★★★
()

Во-первых, непонятно в чём суть взлома, если судя по тексту речь идёт о добработке стандартной бибилиотеки из комплекта компилятора (дописыванием в неё реализаций недостающих хуков).

Во-вторых, не рассказано самое главное: почему понадобилось патчить старую версию вместо того чтоб взять чуть поновее. Причины для такого, конечно, могли существовать, но про них не указано.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Stil

да уж, здесь более актуален тег «упорин»

seiken ★★★★★
()

взломал компилятор

провёл реверс-инжиниринг компилятора

Его же уже сто лет как открыли.

hobbit ★★★★★
()
Ответ на: комментарий от cobold

Так вот и вопрос к автору новости, зачем он такой плохой перевод организовал или скопипастил откуда-то.

firkax ★★★★★
()

От watcom C (образца 94-96 г.) у меня остались только плохие впечатления.

Включение оптимизаций периодически давало неработоспособный код. Я смотрел код который оно генерировало и там была явная ошибка связанная с обращением к локальным переменным которые размещались в стеке. В зависимости от того в каком порядке ты описываешь локальные переменные можно было получить ситуацию когда часть одной переменной перекрывало другую переменную :(

vel ★★★★★
()

дос, ватком, моя первая программа на сях, ностальгия :)

sergej ★★★★★
()
Ответ на: комментарий от vel

Включение оптимизаций периодически давало неработоспособный код

оно и в gcc похоже бывало, с -O3 или -Os

sergej ★★★★★
()

Мог бы DJGPP использовать.

Meyer ★★★★★
()

Исходники Ваткома открыты и выложены, называется openwatcom. Это на 100% тот самый, незамутнённый Ватком. Зачем было так изголяться - не понятно.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от vel

Да, была такая ошибка, и осталась до сих пор. У ваткома была совершенно чёткая и единственная ниша - DOS программы с экстендером. Остальное там было только чтоб на коробке слова пейсать.

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 1)
Ответ на: комментарий от firkax

Потому что проект собирается только этой версией, а допиливать сложна Потому что этот компилятор диды использовали, и нормально было, а всё новое – глючащие и жрущие свичтоперделки для быдлокодеров.

apt_install_lrzsz ★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)