Компиляторы
От: Poudy Россия  
Дата: 04.09.02 10:20
Оценка:
Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.

VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).

Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.

Может в Линух податься? Там есть хорошие среды разработки?
Re: Компиляторы
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 04.09.02 10:22
Оценка:
Здравствуйте Poudy, Вы писали:

P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.

Comeau C++

P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


Это ошибка? Интересно. С каких пор?
Алексей Кирдин
Re: Компиляторы
От: Vsevolod V.Burkutsky Россия  
Дата: 04.09.02 10:28
Оценка:
Здравствуйте Poudy, Вы писали:

P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.


P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


P>Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.


P>Может в Линух податься? Там есть хорошие среды разработки?


Попробуй Intel Compiler 6.0, он поближе.
+ на некоторых задачах выигрыш по производительности до 100%
+ лучше работает с шаблонами
+ его понимет MS линкер
+ встаивется в Visual Studio

-/+ понимает большинство MS specific и MS несоответсвий стандарту
// типа for( int i =0 ; i < 100 ; i++ ){ }
// int i — ошибка

— из-за предыдущего о полном соотв. станд не может быть и речи
— есть свои глюки
— компилит раза в два дольше

P.S Можно скачать с сайта Intel-a, в где-то Inet-e есть кряка
With best regards
Vsevolod V.Burkutsky...
Re: Компиляторы
От: Bell Россия  
Дата: 04.09.02 10:29
Оценка: -1
Здравствуйте Poudy, Вы писали:

P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.


P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).

Этого тебе ни один компилятор не позволит (по крайней мере стандартом это запрещено).

P>Borland 6.0 (среда, номера его компилера не помню) — тоже, т.к. плохо работает с шаблонами и странно наследует статические члены.

А можно подробнее про статические члены?

P>Может в Линух податься? Там есть хорошие среды разработки?

Там хорошо, где нас нет...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Компиляторы
От: Sergey Россия  
Дата: 04.09.02 10:33
Оценка:
Здравствуйте Kaa, Вы писали:

P>>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.


Софта без ошибок не бывает

Kaa>Comeau C++


P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


Kaa>Это ошибка? Интересно. С каких пор?


С сентября 1998 года, если не ошибаюсь. Пункт стандарта 10.3.5
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Компиляторы
От: orangy Россия
Дата: 04.09.02 10:38
Оценка: 7 (1)
Здравствуйте Bell, Вы писали:

P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).

B>Этого тебе ни один компилятор не позволит (по крайней мере стандартом это запрещено).

Неправда, это называется ковариантные возвращаемые типы, стандарт описывает это в пункте 10.3.5:

The return type of an overriding function shall be either identical 
to the return type of the overridden function or covariant with the 
classes of the functions. If a function D::f overrides a function B::f, 
the return types of the functions are covariant if they satisfy the 
following criteria:
— both are pointers to classes or references to classes
— the class in the return type of B::f is the same class 
  as the class in the return type of D::f or, is an unambiguous 
  direct or indirect base class of the class in the return type 
  of D::f and is accessible in D
— both pointers or references have the same cv-qualification and the 
  class type in the return type of D::f has the same cv-qualification 
  as or less cv-qualification than the class type in the return type of B::f.
"Develop with pleasure!"
Re: Компиляторы
От: Павел Кузнецов  
Дата: 04.09.02 10:39
Оценка: 5 (1)
Здравствуйте Poudy, Вы писали:

P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.


Ну, как известно, совсем без ошибок нетривиальных программ не бывает...

P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


В этом отношении, а также в некоторых других, VC7.0 ближе к стандарту, но все еще не поддерживает частичную специализацию шаблонов классов, частичное упорядочение шаблонов функций, разрешение имен в зависимости от аргументов (Keonig lookup).

Можешь также попробовать Intel C++ Compiler. В некоторых отношениях поближе к стандарту, чем MSVC++. Кроме того, очень неплохо оптимизирует, прозрачно встраивается в Visual Studio, бинарно совместим с MSVC++.

P>Может в Линух податься? Там есть хорошие среды разработки?


(Почти) все, что есть в Linux, есть и в Windows (www.cygwin.org (?), www.mingw.org), но меня gcc особо не впечатлил: слабая по сравнению с VC++ 7.0 или Intel C++ оптимизация, медленная по сравнению с VC++ 7.0 скорость компиляции, имеющиеся среды — imho — сильно уступают Visual Studio.

Попробуй Comeau C++ (www.comeaucomputing.com) — основан на самом близком на сегодня к стандарту EDG front-end версии 3.0, стоит всего $43.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Компиляторы
От: Raul  
Дата: 04.09.02 11:19
Оценка: -6
Здравствуйте Poudy, Вы писали:

P>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).
Re[2]: Компиляторы
От: Leper Россия  
Дата: 04.09.02 11:32
Оценка: 5 (1)
Здравствуйте Raul, Вы писали:

R>Здравствуйте Poudy, Вы писали:


P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


R>Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).


Товарищ, Вы комментарии читаете (См. выше комментарий Orangy), или у Вас свой стандарт (Судя по заявлениям, написанный фирмой Микрософт )?
Think for yourself. Question authory.
Re[2]: Компиляторы
От: orangy Россия
Дата: 04.09.02 11:32
Оценка: 5 (1)
Здравствуйте Raul, Вы писали:

P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).


R>Этот компилер действует в данном случае строго в соответсвии со стандартом С++. Да и вообще из тех каккие видел VC самый продвинутый и имеет самую лучшую среду разработчика. (Убью, кто не согласен).


Не согласен, убивай
Однако точку зрения стандарта на это дело я уже изложил, так что спорить просто бессмысленно до тех пор, пока ты не приведёшь что-либо более конкретное. У VC достаточно много проблем во взаимопонимании со стандартном. Разводить тут флейм по этому поводу не намерен, прочитай официальные заявления Microsoft, потом возмущайся
http://support.microsoft.com/default.aspx?scid=KB;EN-US;q243451&amp;
"Develop with pleasure!"
Re: Компиляторы
От: comer США http://getboost.codeplex.com/
Дата: 04.09.02 11:53
Оценка:
Здравствуйте Poudy, Вы писали:

P>Посоветуйте компилятор, не только наиболее близкий к стандарту, но и без ошибок.


Comeau C++ (платный), кстати, на сайте разработчиков этого компилятора
есть онлайновая компиляция (правда запустить программу не сможешь,
куски программы удобно проверять на соответствие стандартам.
Обычно, если Comeau C++ не заглатывает, то ошибка где то у тебя .

GCC (халява), лучше бери последную версию, сейчас, помоему это 3.2.

GCC можеш под виндой использовать (см. CygWin).
getboost.codeplex.com
citylizard.codeplex.com
Re[3]: Компиляторы
От: Bell Россия  
Дата: 04.09.02 13:14
Оценка:
Здравствуйте orangy, Вы писали:

O>Неправда, это называется ковариантные возвращаемые типы, стандарт описывает это в пункте 10.3.5:


Посыпаю голову пеплом...
Любите книгу — источник знаний (с) М.Горький
Re[2]: Компиляторы
От: Poudy Россия  
Дата: 04.09.02 14:07
Оценка:
Здравствуйте Vsevolod V.Burkutsky, Вы писали:

VVB>Попробуй Intel Compiler 6.0, он поближе.


Уже пробовал. Intel не подходит по той же причине, что и VC6. А пока у меня нет Itanium'а , от Intel нет большой выгоды, т.к. ускорение достигается почти только на "сплошных", без ветвлений, участках кода. Он циклы разворачивает, только жаль, что опция эта ставится для всего файла — в десять раз все циклы, например.
Re[2]: Еще со времен ARM'a
От: jazzer Россия Skype: enerjazzer
Дата: 04.09.02 14:19
Оценка:
P>>VC6 — не подходит. Не разрешает переопределение виртуальной функции, если меняется тип возвращаемого значения (со ссылки на базовый класс -> на ссылку на дочерний).

Kaa>Это ошибка? Интересно. С каких пор?


уже тогда это было в драфте стандарта, насколько я помню.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Еще со времен ARM'a
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 04.09.02 14:23
Оценка:
Здравствуйте Sergey, jazzer, Вы писали:

Я, видимо, что-то пропустил. Не помню, чтоб я это где-то слышал ранее А может и слышал, но уж очень плотно забыл. Такие вот пироги. Истинно, век живи, век учись.
Алексей Кирдин
Re: Компиляторы
От: Poudy Россия  
Дата: 04.09.02 14:42
Оценка:
VC — отвратительный компилятор.
Я больше чем уверен, что для подавляющего числа задач и при правильном проектировании он подходит идеально, только от этого не легче.

Замена возвращающего значения при перегрузке виртуальных функций нужна при реализации расширяемой библиотеки потоков и контейнеров. Если абстрактный поток-ридитель (Parent) умеет работать с объектами вида А, причем его операторы << >> возвращают Parent&, а дочерний поток (Child) реализует также работу с объектами вида Б или просто объединяет двух шаблонных абстрактных Parent для А и Б, то станут невозможными записи вида:
Child << A << Б, т.к. Child << A вернет Parent&, а тот не умеет работать с Б.

Кроме того, VC часто путается при определении размеров объектов для классов, переданных как аргументы шаблона. И это, видимо, не связано с выравниванием (или связано косвенно, но выравнивание byte все равно не помогает).
Просто, например, в модуле Picture.cpp объект Picture p весит 20 байт, а в модуле Template.cpp в инстанцированном шаблоне TTemplate<class T> : TTemplate<Picture> этот самый Т будет весить, например, 17.

Со статическими членами коряво работает Borland. Статические члены-классы в шаблонном классе определить не получается. Точнее не получается вызвать конструктор в модуле .cpp при повторном определении. Работать можно только со ссылками, тогда в .cpp приходится определять глобальный объект и устанавливать на него статическую ссылку в шаблоне. Или еще вот: при дебаггинге все статические члены с одинаковым именем в родственных классах выглядят как один (один и тот же) объект. К счастью, в самом коде это не так.

А вот насчет $43 за ComeauС. Я о нем раньше не слышал. Обязательно схожу по ссылке. И тогда такой вопрос: есть ли для него IDE и нельзя ли достать сам компилятор бесплатно? Все стремятся к бесплатному. За хорошую работу я с удовольствием заплачу, а вот если все окажется рекламой, то будет обидно.
Re[2]: Компиляторы
От: Павел Кузнецов  
Дата: 04.09.02 14:59
Оценка:
Здравствуйте Poudy, Вы писали:

P>VC — отвратительный компилятор.

P>Я больше чем уверен, что для подавляющего числа задач и при правильном проектировании он подходит идеально, только от этого не легче.

Помимо соответствия стандарту надо еще учитывать другие факторы. У VC++ один из лучших на сегодня оптимизаторов, один из лучших показателей скорости компиляции, прекрасная среда, масса кода доступна для использования с VC++ и т.д.

P>Замена возвращающего значения при перегрузке виртуальных функций нужна при реализации расширяемой библиотеки потоков и контейнеров. Если абстрактный поток-ридитель (Parent) умеет работать с объектами вида А, причем его операторы << >> возвращают Parent&, а дочерний поток (Child) реализует также работу с объектами вида Б или просто объединяет двух шаблонных абстрактных Parent для А и Б, то станут невозможными записи вида:

P>Child << A << Б, т.к. Child << A вернет Parent&, а тот не умеет работать с Б.

В данном случае можно обойтись и без ковариантных возвращаемых значений: сделай operator << невиртуальным и пусть он вызывает соответствующие виртуальные методы при необходимости.

P>Кроме того, VC часто путается при определении размеров объектов для классов, переданных как аргументы шаблона. И это, видимо, не связано с выравниванием (или связано косвенно, но выравнивание byte все равно не помогает). Просто, например, в модуле Picture.cpp объект Picture p весит 20 байт, а в модуле Template.cpp в инстанцированном шаблоне TTemplate<class T> : TTemplate<Picture> этот самый Т будет весить, например, 17.


(Не)работающий пример, please. Никогда не наблюдал в "нормальных" ситуациях. Обычно было связано с #pragma pack, макросами или подобной ерундой.

P>А вот насчет $43 за ComeauС. Я о нем раньше не слышал. Обязательно схожу по ссылке. И тогда такой вопрос: есть ли для него IDE и нельзя ли достать сам компилятор бесплатно? Все стремятся к бесплатному. За хорошую работу я с удовольствием заплачу, а вот если все окажется рекламой, то будет обидно.


В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Компиляторы
От: Юнусов Булат Россия  
Дата: 04.09.02 15:41
Оценка:
Здравствуйте Павел Кузнецов, Вы писали:

ПК>В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.


Заманчиво.
А в среду от какой девстудии встраивается? Или в обе (6 и 7)?
И как его добывают на постсоветском пространстве? На сайте я что то ни слова бай ни слова скачай не нашел.
Re[3]: Компиляторы
От: Poudy Россия  
Дата: 04.09.02 15:48
Оценка:
Уважаемый Павел Кузнецов.

ПК>Помимо соответствия стандарту надо еще учитывать другие факторы. У VC++ один из лучших на сегодня оптимизаторов, один из лучших показателей скорости компиляции, прекрасная среда, масса кода доступна для использования с VC++ и т.д.


Я и не спорю. Все прекрасно. Но не для тех целей.

ПК>В данном случае можно обойтись и без ковариантных возвращаемых значений: сделай operator << невиртуальным и пусть он вызывает соответствующие виртуальные методы при необходимости.


т.е. вы предлагаете сделать так?:

template <class T>
class Stream
{
 public:
 ...
 virtual void Put(T&);
 virtual void Get(T&);

 Stream& operator >> (T& t) { Get(t); return *this; }
 Stream& operator << (T& t) { Put(t); return *this; }
};


если так, то непонятно, зачем делать Put, Get виртуальными? И зачем вообще виртуальные функции... Собственно так я и делаю, только выглядит это странновато, поскольку приходится каждый раз заново описывать все операторы "туда-сюда".

А как в VC со ссылками на стандартные типы? У меня сейчас он не стоит. В Borland не работают операции Stream >> i, если i, к примеру, int, поскольку вместо ссылки оператору передается копия.

ПК>(Не)работающий пример, please. Никогда не наблюдал в "нормальных" ситуациях. Обычно было связано с #pragma pack, макросами или подобной ерундой.


К сожалению, код потерян. Могу только под честное слово сказать, что никаких макросов и pragma не было (кроме полученных от stdio).
Re[4]: Компиляторы
От: Павел Кузнецов  
Дата: 04.09.02 15:52
Оценка:
Здравствуйте Юнусов Булат, Вы писали:

ЮБ>Здравствуйте Павел Кузнецов, Вы писали:


ПК>>В отношении соответствия стандарту и качества реализации работа хорошая, если не сказать больше — будь спок. В отношении среды, все просто: его можно встроить прямо в Visual Studio. В качестве back end он может использовать MSVC++, что, на мой взгляд, является еще одним плюсом, учитывая способности к оптимизации последнего.


ЮБ>Заманчиво. А в среду от какой девстудии встраивается? Или в обе (6 и 7)?


Насчет встраивания: в MSVC++, как в 6, так и в 7 можно встроить любой компилятор. Достаточно сделать программу-драйвер, которая будет перекодировать входные опции, предназначенные для MSVC++ в опции для компилятора. В свое время я делал подобную программу для запуска из Visual Studio компиляторов bcc32 и gcc. Делали ли Comeau Computing подобную программу, я не знаю, думаю, что что-нибудь в этом духе где-нибудь должно быть. Главное же совместимость форматов для отладки. В этом отношении bcc32 и gcc не лучшие варианты. Т.к. Comeau в качестве back end использует MSVC++, это значительно улучшает ситуацию.

ЮБ>И как его добывают на постсоветском пространстве? На сайте я что то ни слова бай ни слова скачай не нашел.


Отож. Надо покупать.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.