Гонки на вымирание, девяносто пятые выживают

       

Вавилонская башня языка Си/Си++


Качество OpenSource проектов (чтобы там не говорили их поклонники) вообще говоря очень невелико. Когда программа компилируется — это уже хорошо, а если при этом она еще и работает… Всякая попытка оптимизации (или переход на другой транслятор) разваливает хрупкое программистское строение окончательно. Программа либо перестает компилироваться совсем, либо в ней заводится глючный баг. Работающие на голом энтузиазме разработчики просто не в состоянии опробовать все версии всех компиляторов, а ведь различия между ними очень значительны. Вот только один пример: в GCC 3.х из класса std::fstream изъяли конструктор fstream(int) и метод attach(int), в результате чего объявления вида "fstream* FS = new fstream(fd)" перестали работать. Еще одна жертва заявленной совместимости со Стандартом! Впрочем, неприятность эту можно обойти: написать свой класс, производный от std::streambuf, создающий streambuf поток (что долго, зато портабельно), или использовать гнусное расширение __gnu_cxx::stdio_filebuf ("GNUсное" — потому что непортабельное), но это работа программиста, а не конечного пользователя!

Со времен GCC 2.95, поддержка плюсов претерпела существенные изменения. В основном — положительные. Контроль за ошибками ужесточился. Это хорошо (хотя внешние верификаторы кода типа LINT еще никто не отменял и во многих случаях они предпочтительнее). А вот с классическим Си появились проблемы. Оптимисты верят, что он компилируется не хуже, чем вчера. Пессимисты же закидывают их дизассемблерными листингами, убеждающими, что новые версии GCC генерируют более громоздкий и менее эффективный код, а часть конструкций не компилируется вообще!

Объем программ, компилируемых только теми версиями компиляторов, под которыми они разрабатывались, в действительности очень велик очень значителен (и не важно где зарыта ошибка — в листинге программы или компиляторе, пользователям от этого не становится легче). Древний GCC 2.95 поддерживается большинством производителей и генерирует достаточно качественный даже по сегодняшним меркам код. Поэтому-то составители нормальных дистрибьютивов и устанавливают его основным системным компилятором по умолчанию, оттесняя всех конкурентов в порты.

По утверждению фирмы Intel, ICC практически полностью совместим с GCC. Он нормально компилирует линуховое ядро версии 2.4, однако, спотыкается на 2.6, требуя специальных заплаток. Одна правит исходный код ядра, другая — сам компилятор. Прикладное программное обеспечение без напильника и ритуальных танцев с бубном так же не обходится.

В общем, слабонервным товарищам на эффективность лучше забить. Оставьте GCC 2.95 основным системным компилятором и никуда с него не сходите.



Содержание раздела