Есть языки, которым стандартизация, в принципе, не очень нужна. Они разрабатываются одними и теми же разработчиками на протяжении многих лет и не имеют большого количества различных реализаций. Классический пример языка такого типа - PHP. Есть и другие языки, которые в силу популярности имеют множество реализаций, не всегда хорошо совместимых друг с другом. И здесь, конечно, чемпионом выступает C++ - язык очень серьёзно стандартизированный, однако имеющий множество компиляторов, которые вносят свои коррективы в принятые стандарты.
Единожды выбрав компилятор, программист, как правило, избавлен от необходимости вникать в стандарты. Ему и так есть во что вникнуть - в свои разработки, например: в алгоритмы, в используемые библиотеки, в особенности архитектуры проекта, в гневные вопли начальства... До стандартов ли тут? Однако бывает так, что и стандарты оказываются нужными. Например, если создаётся продукт, который должен поддерживаться многими компиляторами - например, какая-нибудь специализированная библиотека. Тогда приходится делать так, чтобы всё максимально соответствовало стандартам, которые поддерживаются всеми популярными компиляторами. Для этого нужно знать сам стандарт, это даже обсуждать нечего. Правда, стандарт не бесплатен. Точнее, не доступен для бесплатного скачивания PDF-файл с текстом стандарта. Купить его можно на сайте международной (ISO) и американской (ANSI) организаций по стандартизации, соответственно, по адресам www.iso.org и www.ansi.org.
Конечно, обязательно тестировать такие продукты на всех компиляторах, на которых планируется проводить компиляцию, однако при этом основным компилятором, с помощью которого будут вестись промежуточные сборки, лучше такой, который лучше всех других соответствует стандартам.
Выбор такого компилятора - задача сложная. Каждый производитель заявляет, что его компилятор - самый лучший и самый стандартный. Однако при ближайшем рассмотрении оказывается, что у каждого есть изрядное количество проблем в области совместимости со стандартами. Среди open-source компиляторов наиболее приближен к стандартам, конечно, GNU C++. А вот среди коммерческих?.. Вопрос интересный, однако, судя по всему, никто всерьёз им не задавался. Кроме, может, самих разработчиков компиляторов... но так они и напишут нам, что их компилятор не поддерживает больше трети всех спецификаций. Проведя два дня в поисках на сайте www.open-std.org и облазив сайты ведущих производителей компиляторов, я пришёл к выводу, что точных данных о том, какой компилятор ближе всего к стандарту, нет. А если и есть, то они засекречены. Поэтому будем опираться на статистику: поискав на сайтах, посвящённых C++, информацию о стандартах, сделаем выборку и посмотрим, какой компилятор назовут самым "стандартным" те, кто всерьёз изучал эту проблему и кому нужно по работе знать эту немаловажную информацию.
Конечно, данный способ имеет свои недостатки, но определённые результаты он даёт. За неимением лучшего, воспользуемся результатами такого анализа. Конечно, по законам статистики нужно было бы изучить информацию на астрономическом числе сайтов, однако мы ограничимся двумя десятками. Результаты таковы: чаще всего программисты, изучившие стандарты языка C++, называют компилятором, наиболее придерживающимся стандартов, либо Intel C++, либо Comeau C++, либо EDG C++. Сейчас я расскажу немного о каждом из них.
Intel C++ Compiler (www.intel.com/cd/software/products/asmo-na/eng/compilers/284132.htm) не нуждается в долгих представлениях широкой публике. Этот компилятор известен среди разработчиков на C++ не меньше, чем его фирма-производитель в кругах компьютерных и околокомпьютерных. Этот компилятор завоевал хорошую репутацию как мощный и надёжный оптимизирующий компилятор языка C++, и множество крупных компаний по всему миру пользуются им. Когда-то одна из версий этого компилятора, теперь уже, конечно, не самая свежая, была признана российским порталом rsdn.ru самым качественным в плане генерации кода оптимизирующим компилятором для платформы Win32. И сейчас этот компилятор продолжает держать марку, поддерживая множество уникальных методик оптимизации. При этом, по заявлениям корпорации Intel, компилятор на все 100% поддерживает два основных стандарта: ISO стандарт для компиляции языка C (ISO/IEC 9899:1990) и ISO стандарт для C++ (ISO/IEC 14882:1998). Чем хорош этот компилятор с точки зрения стандартов - так это тем, что в нём отсутствует поддержка многих вещей, которые в стандарт не входят, но в компиляторах присутствуют потому, что однажды они появились в каком-то одном компиляторе, а потом расползлись по всем остальным, как ужи по болоту. С точки зрения разработчика готового скомпилированного продукта, Intel C++ Compiler - оптимальный вариант баланса между стандартами и качеством получаемого объектного кода. Однако, с точки зрения стандартов, Intel C++ далёк от идеала. Два следующих компилятора намного более подвержены стандартам.
Comeau C++, собственно, правильно было бы назвать не компилятором, а транслятором. Для тех, кто не улавливает разницы в этих терминах, поясню её. Транслятор - это средства для перевода текста программы с одного языка программирования на другой. Компилятор же - это частный случай транслятора, преобразующий код программы, написанный на языке высокого уровня, в объектный код (команды процессора) либо эквивалентный ему код программы на Ассемблере. Исходя из данных дефиниций, Comeau C++ - транслятор, но не компилятор, поскольку текст программы на C++ он преобразует в программу на C. Почему этот транслятор не является полноценным компилятором, вполне понятно - Comeau Computing хоть и старая фирма, но не очень большая, поэтому, сосредоточив усилия на поддержке стандартов, команда разработчиков может не распыляться на компилятор языка C, сборщик, компоновщик и оптимизатор. Правда, для того, чтобы полноценно пользоваться Comeau C++, нужно иметь ещё и все указанные инструменты, но их (в том числе и бесплатные) найти не так уж и сложно. Однако для проверки кода на соответствие стандартам Comeau C++ подходит лучше, чем детище Intel. И особенно хороша такая черта, как наличие бесплатной ознакомительной версии, специально предназначенной для данной цели. Эта версия доступна онлайн, найти её можно на сайте производителя (точный адрес - www.comeaucomputing.com/tryitout). Набрав в форме свой e-mail и код на C++, можно посмотреть, будет ли он транслироваться транслятором от Comeau. Естественно, такой бесплатный способ хорош только для приведения кода к стандартам, однако если есть желание (и/или необходимость) приобрести полную версию Comeau C++, то это сделать не так уж и трудно, поскольку стоит транслятор всего $50. При этом поддерживаются все распространённые компиляторы C: GNU, Microsoft, Borland, LCC... Количество платформ, которые поддерживаются, также впечатляет. Подумайте, может быть, приобретение этого транслятора будет не такой уж плохой идеей для вашего проекта.
Впрочем, как бы ни старались разработчики Comeau C++ сделать свой транслятор максимально соответствующим стандартам, у него есть конкурент, который поддерживает стандарт лучше. Авторы этого транслятора заявляют, что их продукт полностью поддерживает стандарт ISO/IEC 14882:2003. То есть, если компилятор компании Intel поддерживает стандарт 1998 года, то этот транслятор поддерживает стандарт 2003-го. Что же это за транслятор? Это EDG C++ Front-End, официальный сайт которого - www.edg.com. По неподтверждённой информации, именно EDG C++ Front-End (конечно, не самая новая его версия) лежит в основе Borland C++. Так это или нет, не знаю, поскольку производитель соответствующего компилятора такую информацию на публику не выставляет. Как и Comeau C++, EDG C++ Front-End генерирует код на языке C, который потом можно собрать компилятором этого языка. К сожалению, EDG C++ Front-End не имеет бесплатной ознакомительной версии даже в онлайновом варианте. Более того, лично мне не удалось найти на сайте производителя цены этого инструмента. Однако, учитывая то, что целевая аудитория покупателей продукта - разработчики компиляторов и различных инструментов для анализа исходного кода программ на C++, цену EDG C++ Front-End представить не так уж и трудно.
Лично мне наиболее удачным выбором для быстрой проверки кода на соответствие стандартам кажется Comeau C++. Поскольку он довольно дешево стоит и имеет онлайновую версию, которую вполне можно использовать для проверки кода, ибо сообщения она выдаёт весьма информативные. Хотя, конечно, если речь идёт о продукте, для которого необходимо 100% соответствие стандартам, то лучше использовать EDG C++ Front-End. Правда, лучше подумать, так ли это необходимо - 100% соответствие такой неустойчивой вещи, как стандарт языка C++.
Напоследок хочу сказать несколько слов о стандартах вообще и о языке C++ в частности. Стандарт - это обычно такая вещь, которой стараются придерживаться. И ключевое слово здесь - стараются. А поскольку C++ - очень большой язык, имеющий множество элементов, трудных как для реализации со стороны разработчиков компиляторов, так и со стороны программистов, для которых C++ - это, прежде всего, объектно-ориентированное расширение языка C, то многие вещи, задекларированные в стандарте, остаются за бортом в реальной жизни. Поэтому вопрос о следовании стандарту лучше поставить более глобально: а стоит ли вообще использовать C++?
Вадим СТАНКЕВИЧ
![Версия для печати Версия для печати](https://www.kv.by/sites/all/modules/print/icons/print_icon.png)
Горячие темы