Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Крис Касперски по поводу С++


Автор: Kuvaldis 25.10.2007, 21:06
Ребята, не в целях пропаганды другого ресурса.
Наткнулся на интересную статью по поводу С++ от Криса Касперски. 
Можно и пообсуждать
http://www.xakep.ru//magazine/xs/065/022/1.asp

Автор: archimed7592 25.10.2007, 22:52
В принципе, Мыщъх говорит всё правильно... Не соглашусь только с одним:
Цитата
Вот и приходится использовать готовые компоненты, заточенные под конкретный компилятор, и нестандартные языковые расширения, которые привязывают программиста к поставщику. К тому же, хотя и существует множество открытых библиотек, которые написаны на стандартном С++ и позволяют создавать переносимые графические приложения, компилируемые любым компилятором, все-таки... Как же они тормозят! Взять хотя бы «Горящего Лиса» и сравнить его с Opera...

По хорошему приходится использовать непереносимые решения только тогда, когда просто нет другого выбора.
А насчёт тормознутости - ИМХО, важнее именно переносимость, да и тормознутость - понятие субъективное и от продукта к продукту эта характеристика меняется.

Автор: JackYF 25.10.2007, 23:34
Цитата(archimed7592 @  25.10.2007,  22:52 Найти цитируемый пост)
Взять хотя бы «Горящего Лиса» и сравнить его с Opera...

проблемы криворукости разработчиков отдельных приложений к языку имеют мало отношения.

Тем более тормоза в большой мере в продуктах Mozilla относятся к XUL, который вообще из другой степи.

Автор: archimed7592 25.10.2007, 23:47
JackYF, насколько я понимаю, FF(сделанный переносимым их собственными разработками) ставится в противоположность Opera, написанной на Qt-3.x. Отчасти тормознутостью опера обязана именно третьей версии Qt, отчасти, уже упомянутой кривости рук.
Но... Такие библиотеки как Qt(c таким размахом - охватывает большое кол-во областей программирования и работает почти на любой платформе) со своим "обобщённым" дизайном(каким бы он ни был) просто обязанны проигрывать нативным решениям. Просто очень спорный вопрос - что важнее: пара тиков процессора или свобода от вендора/компилятора/платформы/ОС. ИМХО второе.

Автор: ksili 26.10.2007, 05:59
Свобода от ОС по-моему не настолько актуальна. Не так часто пишется ПО сразу для хотя бы двух осей. А вот свобода от вендора - это конечно очень неплохо.

Автор: Lazin 26.10.2007, 08:06
Цитата

Несомненно одно: человек, привыкший к Microsoft Visual C++ (вернее, к ее Microsoft C/C++ Optimizing Compiler, cl.exe - прим. AvaLANche), переходит на «правильные» трансляторы типа GCC с большим трудом, если переходит вообще, хотя, казалось бы, и то, и другое — компиляторы одного и того же языка С++.

Непонятно, чем cl.exe неправильный.
Вообще если нужна кроссплатформенная разработка то лучше C++ вообще не использовать, а использовать к примеру Java или Python. Потому-что используя кроссплатформенные библиотеки для С++ получишь примерно те-же тормоза, имхо. Да и для многих вещей вообще нет таких библиотек, например есть ли в Linux аналог WMI, а кроссплатформенная библиотека для его использования?
Для Pyton-a например есть модуль anydb через который можно общаться с любой СУБД одинаково, была так-же попытка создать модуль anyGUI (для работы с произвольными GUI тулкитами), но она оказалась неудачной.

Автор: zkv 26.10.2007, 08:23
Цитата(Lazin @  26.10.2007,  08:06 Найти цитируемый пост)
Непонятно, чем cl.exe неправильный.

ага, непонятно, может тем, что один из лучших компиляторов под Винду на сегодняшний день? 
Или потому что в удобную IDE встроен, типа настоящие мачо только из командной строки компилят?
Может просто потому что Made by Microsoft? Это ведь модно - кричать, что все от MS - г.
Кто такой Крис Касперски? 
Закрадывается сомнение в компетентности автора.

Автор: archimed7592 26.10.2007, 08:37
Цитата(zkv @  26.10.2007,  08:23 Найти цитируемый пост)
ага, непонятно, может тем, что один из лучших компиляторов под Винду на сегодняшний день?

Думаю тем, что он пропускает код, который по стандарту не должен компилироваться. Не знаю такого ключа в настройках, который включал бы strict C++ режим(к примеру пропускает специализации member template in class scope).


Цитата(zkv @  26.10.2007,  08:23 Найти цитируемый пост)
Кто такой Крис Касперски? 
Закрадывается сомнение в компетентности автора. 

В его компетентности можешь не сомневаться smile.
Те кто читает Хакер очень хорошо знают его интересные статьи smile.

Автор: ksili 26.10.2007, 08:38
Цитата(Lazin @  26.10.2007,  13:06 Найти цитируемый пост)
Непонятно, чем cl.exe неправильный

Да я думаю, что просто имелось в виду, что GCC более точно соответствует стандарту и меньше содержит отсебятины. А cl.exe просто приведён в противовес. По-моему Касперски ничего плохого про MS VC++ и не сказал.

Автор: MAKCim 26.10.2007, 09:08
Цитата(zkv @  26.10.2007,  08:23 Найти цитируемый пост)
Кто такой Крис Касперски? 

http://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%81%D0%BF%D0%B5%D1%80%D1%81%D0%BA%D0%B8

Автор: zkv 26.10.2007, 09:25
Цитата(archimed7592 @  26.10.2007,  08:37 Найти цитируемый пост)
Не знаю такого ключа в настройках, который включал бы strict C++ режим

Цитата(Visual C++ Compiler Options )

/Za flags language constructs not compatible with either ANSI C++ or ANSI C as errors. /Ze enables Microsoft extensions.

Ы?
еще есть раздел: Compatibility and Compliance Issues in Visual C++ 

Цитата(archimed7592 @  26.10.2007,  08:37 Найти цитируемый пост)
к примеру пропускает специализации member template in class scope

про это, правда, там не говорится..

Автор: zkv 26.10.2007, 09:40
Цитата(ksili @  26.10.2007,  08:38 Найти цитируемый пост)
По-моему Касперски ничего плохого про MS VC++ и не сказал. 

Цитата

«правильные» трансляторы типа GCC

да, можно по разному трактовать, что он имел ввиду говоря в кавычках.
Наверное просто неосознанно не понравился поклеп на инструмент, с которым работаю.  smile 

Автор: ksili 26.10.2007, 09:44
Вообще-то Касперски сравнивая в других материалах компиляторы, как раз хвалит компилятор С++ от Майкрософт, отмечая его способности по оптимизации

Автор: Ln78 26.10.2007, 14:50
Цитата(zkv @  26.10.2007,  09:40 Найти цитируемый пост)
Наверное просто неосознанно не понравился поклеп на инструмент, с которым работаю.   

Я тоже в последнее время работаю только с данным компилятором (из тех двоих, с которыми работал – VS и Borland, первый считаю «самым» удобным smile ). Но мне показалось, что в статье как раз правильность указана в кавычках неслучайно. Более того, критическое отношение к самому стандарту и юношескому максимализму при отстаивании позиций типа: "Стандарт – единственный источник и критерий для оценки компиляторов", ИМХО, в статье выражено сильнее, чем порицание конкретных компиляторов.

Автор: Alexeis 26.10.2007, 15:10
  Ну может виндовый компилятор и приличный, но EVC они сделали просто ужасным. Ужасно глючным + дебагер шаблоны не берет, часто блоки внаглую игнорирует (при дебаге), сам ставит брейки без спроса. После включения оптимизации неожиданно появляются ошибки. Родной STL, что есть, что нет никакой пользы! Имена функций в разных модулях не изолирует (это уже кривой линкер, но все равно стандарт языка не выполняется)! Переменные в цикле for создаются не в блоке, а в функции. 
  По моему в таких элементарных вещах уж нужно придерживаться стандарта.

Автор: zkv 26.10.2007, 15:18
Цитата(Alexeis @  26.10.2007,  15:10 Найти цитируемый пост)
Переменные в цикле for создаются не в блоке, а в функции. 

в восьмерке нормально все, хотя в прошлых версиях была такая фигня.
Цитата(Alexeis @  26.10.2007,  15:10 Найти цитируемый пост)
После включения оптимизации неожиданно появляются ошибки.

ну это на компилятор не стоит сваливать  smile 
Цитата(Alexeis @  26.10.2007,  15:10 Найти цитируемый пост)
Имена функций в разных модулях не изолирует

это как, можно пример простой?
Цитата(Alexeis @  26.10.2007,  15:10 Найти цитируемый пост)
Родной STL, что есть, что нет никакой пользы!

в смысле?

Автор: Alek86 26.10.2007, 15:39
меня тоже раздражают в VS некоторые моменты. но все они весьма мелочные.
к примеру то, что в классе нельзя создать чисто виртуальный конструктор

но вообще впечатление о связке VS+Visual Assist отличнейшие

Автор: Lazin 26.10.2007, 15:41
Цитата(Alek86 @  26.10.2007,  15:39 Найти цитируемый пост)
чисто виртуальный конструктор

Виртуальных конструкторов не бывает в принципе

Автор: Alexeis 26.10.2007, 15:42
Цитата(zkv @  26.10.2007,  15:18 Найти цитируемый пост)
в восьмерке нормально все, хотя в прошлых версиях была такая фигня.

  Максимальная версия сейчас EVC 4.0

Цитата(zkv @  26.10.2007,  15:18 Найти цитируемый пост)
ну это на компилятор не стоит сваливать


А на кого? Не я же генерю машинный код. Кто ему виноват, что он не знает того, что не все инлайны можно делать инлайнами, ведь стандарт утверждает что делать или нет оптимизацию инлайн на совести компилятора. Че это я должен убрать слово inline руками в тех местах, где он не сумел правильно подставить? Раз не можешь делай функцию! Так везде работает.

Цитата(zkv @  26.10.2007,  15:18 Найти цитируемый пост)
это как, можно пример простой?

  В двух cpp шниках если объявить функцию с одинаковым именем, то линкер ругается, хотя в заголовочных файлах прототипы функций не объявлены!

Добавлено через 2 минуты и 4 секунды
Цитата(Lazin @  26.10.2007,  15:41 Найти цитируемый пост)
Виртуальных конструкторов не бывает в принципе 

  Это еще почему? Очень даже есть, на них весь VCL держится. Просто их нет в С++.

Автор: Lazin 26.10.2007, 15:51
Цитата(Alexeis @  26.10.2007,  15:42 Найти цитируемый пост)
В двух cpp шниках если объявить функцию с одинаковым именем, то линкер ругается, хотя в заголовочных файлах прототипы функций не объявлены!

И правильно делает, в таких случаях положено использовать модификатор static.
Цитата(Alexeis @  26.10.2007,  15:42 Найти цитируемый пост)
Очень даже есть, на них весь VCL держится. Просто их нет в С++

Что-то я не замечал в вцл такого, на этапе создания объекта всегда известен его тип.
Код

TWinControl* btn = new TButton(Form);

Автор: Kuvaldis 26.10.2007, 16:06
Alexeis, 
Цитата

 Это еще почему? Очень даже есть, на них весь VCL держится. Просто их нет в С++.

В С++ нет метаклассов.
А виртуальный конструктор "через бубен" можено сделать, как предлагает Страуструп, метод Clone

Автор: Alexeis 26.10.2007, 16:07
Цитата(zkv @  26.10.2007,  15:18 Найти цитируемый пост)
в смысле? 

  ХЗ. Недоделанный он и урезанный до нельзя.

Цитата(Lazin @  26.10.2007,  15:51 Найти цитируемый пост)
Что-то я не замечал в вцл такого, на этапе создания объекта всегда известен его тип.

  А вот среда не знает тип объекта, потому при мышкоделии юзает виртуальный конструктор для создания необходимого класса. 

Автор: zkv 26.10.2007, 16:07
Цитата(Alexeis @  26.10.2007,  15:42 Найти цитируемый пост)
EVC

упустил из виду. Тогда молчу.

Автор: Lazin 26.10.2007, 16:14
Цитата(Alexeis @  26.10.2007,  16:07 Найти цитируемый пост)
А вот среда не знает тип объекта
 среда не знает, но код который его создает знает, иначе как-бы выделялась память под объект.

Добавлено через 53 секунды
зы
никогда eVC не использовал

Автор: Alexeis 26.10.2007, 16:22
Цитата(Lazin @  26.10.2007,  15:51 Найти цитируемый пост)
И правильно делает, в таких случаях положено использовать модификатор static.

хм.. а другие компиляторы и без static не ругаются...

Цитата(Lazin @  26.10.2007,  16:14 Найти цитируемый пост)
 среда не знает, но код который его создает знает, иначе как-бы выделялась память под объект.

  Вот этот код и вызывает виртуальный конструктор, который создает нужный объект.

Автор: Lazin 26.10.2007, 16:29
Цитата(Alexeis @  26.10.2007,  16:22 Найти цитируемый пост)
Вот этот код и вызывает виртуальный конструктор, который создает нужный объект. 

Тогда это уже фабрика классов, а не конструктор.
Цитата(Alexeis @  26.10.2007,  16:22 Найти цитируемый пост)
хм.. а другие компиляторы и без static не ругаются...

вот BCB6 к примеру не ругается, а вызывает какую либо одну реализацию функции. Для компоновщика они одинаковы, хоть и находятся в разных obj файлах. Он в принципе не может определить какую функцию вызывать, так как не обрабатывает исходники.

Автор: archimed7592 26.10.2007, 16:34
Цитата(Alexeis @  26.10.2007,  16:22 Найти цитируемый пост)
хм.. а другие компиляторы и без static не ругаются...

Хм, это плохие компиляторы.


Цитата(Alexeis @  26.10.2007,  16:22 Найти цитируемый пост)
Вот этот код и вызывает виртуальный конструктор, который создает нужный объект. 

Что именно он вызывает?
TButton::TButton(TControl *parent)? smile

Автор: Alexeis 26.10.2007, 16:41
Цитата(archimed7592 @  26.10.2007,  16:34 Найти цитируемый пост)
Что именно он вызывает?

  Не буду утверждать, но предположу, что виртуальный конструктор Create у переменной метакалсса, ведь классы реализованы не на C++.

Автор: archimed7592 26.10.2007, 17:31
Alexeis, не буду утверждать, но предположу, что TButton.Create - это тоже никакой не виртуальный конструктор smile.
А вот создание объекта имеяя только метакласс - это уже виртуальный конструктор. Это легко реализуемо. Сложнее с получением самих метаклассов. В Delphi они есть. В С++ их нет, но, к примеру, Qt реализует их(и рефлексию вообще) посредством отдельных утилит. В BCB это делается точно также, только "отдельная" утилита "встроена" в компилятор.

Автор: Alexeis 26.10.2007, 17:52
Цитата(archimed7592 @  26.10.2007,  17:31 Найти цитируемый пост)
не буду утверждать, но предположу, что TButton.Create - это тоже никакой не виртуальный конструктор

  Все наследники TComponent по дефолту имеют виртуальный конструктор Create, а это вся палитра VCL, остальные его перекрывают.

Цитата(archimed7592 @  26.10.2007,  17:31 Найти цитируемый пост)
В BCB это делается точно также, только "отдельная" утилита "встроена" в компилятор.

  Боюсь что эта утилита называется Dcc32.exe.

Автор: archimed7592 26.10.2007, 17:56
Цитата(Alexeis @  26.10.2007,  17:52 Найти цитируемый пост)
Все наследники TComponent по дефолту имеют виртуальный конструктор Create, а это вся палитра VCL, остальные его перекрывают.

Ок, сменим приоритеты: что такое виртуальный конструктор? В чём заключается его виртуальность(помимо, возможно, ключевого слова virtual)?

Добавлено через 37 секунд
Другими словами приведи пример, где будет видно, что конструктор виртуален.

Автор: Alek86 26.10.2007, 19:06
Цитата(Lazin @  26.10.2007,  15:41 Найти цитируемый пост)

Цитата(Alek86 @  26.10.2007,  15:39 )
чисто виртуальный конструктор

Виртуальных конструкторов не бывает в принципе


сори, оговорился. Деструктор

Автор: archimed7592 26.10.2007, 19:12
Alek86, студия позволяет делать чисто виртуальные деструкторы(точно так же, как и любой другой компилятор, утверждающий, что он соответствует Стандарту). Скорее всего их не умеешь делать ты smile.

Автор: Alek86 26.10.2007, 19:42
отакие сразу наезды...

отэто по стандарту должно скомпилиться и слинковаться?
Код


class IC {
public:
    virtual ~IC() = 0;
};

class C1 : public IC {
public:
    virtual ~C1() {}
};

int main() {
    IC* pC = new C1();
}


Автор: archimed7592 26.10.2007, 19:57
Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
отэто по стандарту должно скомпилиться и слинковаться?

Нет - ты же своим объявлением виртуального деструктора класс IC "отменил" его неявное определение(definition), а сам его определить не потрудился. А чтобы уничтожить объект деструкторы всех базовых классов должны быть доступны(не private) и определены(потому что деструктор твоего класса неявно вызывает деструкторы базовых классов).

Автор: JackYF 26.10.2007, 19:59
Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
отэто по стандарту должно скомпилиться и слинковаться?

нет.


Цитата(Alek86 @  26.10.2007,  19:42 Найти цитируемый пост)
virtual ~IC() = 0;

чисто виртуальный деструктор? быть не должно, исправляйте:
Код

virtual ~IC() {};

Автор: archimed7592 26.10.2007, 20:03
Цитата(JackYF @  26.10.2007,  19:59 Найти цитируемый пост)
чисто виртуальный деструктор? быть не должно, исправляйте:

Интересно, почему? 0_о

Добавлено @ 20:07
То ли я чё-т недопонимаю, то ли... вы надо мной издеваетесь? smile
Вам религия не позволяет написать определение деструктора?
Это примерно то же самое что говорить "а почему вот это не линкуется?"
Код

stuct B
{
    virtual void foo() = 0;
};
stuct D
    : public B
{
    void foo()
    {
        B::foo();
        // ...
    }
};


Либо напишите определение B::foo, либо не делайте явный вызов B::foo()(либо не задавайте вопросов почему это не линкуется smile). Разница с деструктором только в том, что вы не можете не делать явный вызов IC::~IC() ибо за вас это сделает компилятор вам по любой придётся написать определение деструктора(если компилятор не делает это за вас).

Автор: JackYF 26.10.2007, 20:22
Цитата(archimed7592 @  26.10.2007,  20:03 Найти цитируемый пост)
Интересно, почему?

а что будет вызывать компилятор?

foo ему вызывать не требуется, а вот деструктор - извольте.

Автор: archimed7592 26.10.2007, 20:29
Цитата(JackYF @  26.10.2007,  20:22 Найти цитируемый пост)
а что будет вызывать компилятор?

IC::~IC(). А какие ты видишь в этом преграды? 0_о
Он и так его вызывает, только линкер определения ф-ции не находит.

Автор: Alexeis 26.10.2007, 21:01
Цитата(archimed7592 @  26.10.2007,  17:56 Найти цитируемый пост)
Ок, сменим приоритеты: что такое виртуальный конструктор? В чём заключается его виртуальность(помимо, возможно, ключевого слова virtual)?

Добавлено через 37 секунд
Другими словами приведи пример, где будет видно, что конструктор виртуален.


Например такой гипотетический пример загрузки вида.

Код

Function GetComponentClass : TCompomponentClass;
Begin
  Result := TButton;
end;

......

procedure ShowChild(InitProc : Function : TCompomponentClass; astream : TStream);
var
  AChild            : TComponent;
Begin
  AChild            := InitProc.Create(Panel1);
  AChild.LoadSizesFromStream(astream);
end;

Автор: archimed7592 26.10.2007, 21:07
Цитата(Alexeis @  26.10.2007,  21:01 Найти цитируемый пост)
TCompomponentClass;

Ну, вот видишь - виртуальность конструктора проявляется только в случае создания через метакласс(как я и сказал ранее).
В С++ это реализуется очень просто - одна проблема: это нужно именно реализовывать. К примеру это реализованно утилитой moc в случае Qt. Это же реализованно частью компилятора bcc32(нет, нет, dcc32 тут не при чём - он же не понимает С++ код).

Автор: Alexeis 26.10.2007, 21:15
Цитата(archimed7592 @  26.10.2007,  21:07 Найти цитируемый пост)
Это же реализованно частью компилятора bcc32(нет, нет, dcc32 тут не при чём - он же не понимает С++ код). 

  И не нужно, VCL классы C++ Builder являются лишь интерфейсами делфийских классов, для которых есть метаклассы. Потому билдер просто использует этот отработанный механизм, не внося туда ничего от самого языка С++. А компилятор dcc32 поставляется с билдером и нужен для компиляции кода на Delphi (Object Pascal), который реально и реализует механизмы VCL.

Добавлено через 2 минуты и 6 секунд
Цитата(archimed7592 @  26.10.2007,  21:07 Найти цитируемый пост)
Ну, вот видишь - виртуальность конструктора проявляется только в случае создания через метакласс(как я и сказал ранее).

  А я разве говорил что это не так? Я говорил лишь, что это интенсивно используется в VCL и все, опровергая доводы о том, что это мало где используется.

Автор: archimed7592 26.10.2007, 21:25
Цитата(Alexeis @  26.10.2007,  21:15 Найти цитируемый пост)
И не нужно, VCL классы C++ Builder являются лишь интерфейсами делфийских классов, для которых есть метаклассы.

Мы друг друга не понимаем...
В С++ рефлексии нет.
Пользовательский компонент можно использовать как и любой другой VCL'овский(в т.ч. виртуальные конструкторы и рефлексию в общем).
Вывод: bcc32 добавляет к С++ рефлексию(в том или ином виде) и dcc32 тут не при делах smile.


Цитата(Alexeis @  26.10.2007,  21:15 Найти цитируемый пост)
Я говорил лишь, что это интенсивно используется в VCL и все, опровергая доводы о том, что это мало где используется. 

А разве кто-то говорил, что это мало где используется? smile

Автор: Alexeis 26.10.2007, 21:51
Цитата(Lazin @ 26.10.2007,  15:51)
Цитата(Alexeis @  26.10.2007,  15:42 Найти цитируемый пост)
Очень даже есть, на них весь VCL держится. Просто их нет в С++

Что-то я не замечал в вцл такого, на этапе создания объекта всегда известен его тип.
Код

TWinControl* btn = new TButton(Form);

Пояснение было больше к этому.

Цитата(archimed7592)

Пользовательский компонент можно использовать как и любой другой VCL'овский(в т.ч. виртуальные конструкторы и рефлексию в общем).


  Пользовательский компонент не может не быть наследником TComponent. 
class PASCALIMPLEMENTATION TButton : public TButtonControl 
  Мне кажеться что для классов наследников в билдере тоже создаются метаклассы иначе это потребовало слишком значительной переделкой самого VCL.

Автор: archimed7592 26.10.2007, 21:54
Цитата(Alexeis @  26.10.2007,  21:51 Найти цитируемый пост)
Пользовательский компонент не может не быть наследником TComponent. 

Почему? Хочешь сказать в Builder'е невозможно создавать пользовательские контролы? smile

Автор: Alexeis 26.10.2007, 22:19
Цитата(archimed7592 @  26.10.2007,  21:54 Найти цитируемый пост)
Почему? Хочешь сказать в Builder'е невозможно создавать пользовательские контролы? 

  Лезем на Torry.net качаем первый попавшийся компонент, берем даже невизуальный, чтобы не было соблазна использовать классы высокого уровня, смотрим в объявление класса
Код

class PACKAGE TAnimTimer : public TComponent
{
public:
  __fastcall TAnimTimer(TComponent* Owner);
  virtual __fastcall ~TAnimTimer();

__published:
  __property bool Enabled = {read=FEnabled,write=SetEnabled,default=true};
  __property unsigned int Interval = {read=FInterval,write=SetInterval,default=10};
  __property TNotifyEvent OnTimer = {read=FOnTimer,write=SetOnTimer};



  Хм... с чего бы тут нужен был наследник TComponent?

Смотрим ниже, секция __published !!! епрст, как же мы увидим свойства Enabled, Interval и OnTimer в object inspector, если их не будет в RTTI метакласса? Их же извлекают по названию.

Все это на 100% повторяет объявление класса в Delphi. Очевидно, что и для TAnimTimer будет создан метакласс. 

Автор: archimed7592 26.10.2007, 22:30
Цитата(Alexeis @  26.10.2007,  22:19 Найти цитируемый пост)
Все это на 100% повторяет объявление класса в Delphi. Очевидно, что и для TAnimTimer будет создан метакласс.  

Гхм... Да я не спорю... Я лишь говорю, что bcc32 расширяет язык С++, добавляя к нему рефлексию(чтобы было видно в object inspector'е, чтобы можно было делать метаклассы, и т. д.).

Автор: powerfox 27.10.2007, 21:24
Цитата

Основная разница между С++ и Basic'ом вовсе не в том, что трансляторы Basic'а генерируют тормозной код. Главное отличие С++ в том, что он никому не принадлежит. Есть открытый стандарт и десятки аттестованных компиляторов, которые генерируют стандартный промежуточный код, легко интегрируемый в любой проект, написанный, например, на Паскале или Ассемблере.

Не объясните, что это значит? Стандартный промежуточный код - понятие и .NET. Если не ошибаюсь, то в "чистом" С++ такого нет. А вызывать API программ на других языках -- не проблема. Вставлять код... Компановка объектных файлов -- это не промежуточный код. И тут надо юзать связки, наподобие g++ + gpc, и то... Это не всегда просто (если сравнивать с .NET).

Автор: MAKCim 28.10.2007, 10:14
powerfox, 
тот же GCC генерирует промежуточный код с целью дополнительной оптимизации
т. е сначала код на ЯВУ преобразуется во внутреннее представление компилятора, далее идет его оптимизация, (архитектуро-независимая (основное назначение промежуточного кода))
потом из оптимизированного внутреннего представления идет генерация кода целевой машины, далее его архитектуро-зависимая оптимизация и наконец на последнем шаге - формиование объектного файла

Автор: archimed7592 28.10.2007, 10:23
Цитата(powerfox @  27.10.2007,  21:24 Найти цитируемый пост)
десятки аттестованных компиляторов, которые генерируют стандартный промежуточный код

Я не очень хорошо знаком с вопросом кодогенерации современными компиляторами, но, если учесть, существование name mangling и кучу других не специфицированных стандартом ньюансов, то, осмелюсь предположить, что, даже при наличии промышленных стандартов на объектники, склеивание объектников от разных компиляторов - весьма не тривиальная задача.

Автор: ksili 28.10.2007, 10:30
Цитата(archimed7592 @  28.10.2007,  15:23 Найти цитируемый пост)
склеивание объектников от разных компиляторов - весьма не тривиальная задача

В свете всего этого Крис Касперски хвалит (не в этой статье) линкер ulink от Юрия Харона,  smile  даже вроде говорит, что он единственный может делать это нормально

Автор: MAKCim 28.10.2007, 10:34
Цитата(archimed7592 @  28.10.2007,  10:23 Найти цитируемый пост)
что, даже при наличии промышленных стандартов на объектники, склеивание объектников от разных компиляторов - весьма не тривиальная задача. 

не вижу ничего нетривиального  smile 

Автор: archimed7592 28.10.2007, 10:40
Думаю, проблема больше не в нормальном линкере а в том, что делая это ты накладываешь множество ограничений на свой код. В частности:
1) нельзя выпускать исключения за пределы модуля
2) нельзя освобождать память в модуле, отличном от того, в котором она была выделена.
3) нужно заставлять компилятор какие-нибудь распространённые правила вызова ф-ций(calling conventions), т.о. связывая руки оптимизатору.
4) список думаю можно продолжить - если бы я сталкивался с этим на практике, то скорее всего что-нибудь добавил бы.

Добавлено @ 10:41
MAKCim, я же сказал "осмелюсь предположить" smile. Если ты имел с этим дело на практике, то тебе виднее.
В частности, я не представляю как можно "нетривиально" решить проблему с name mangling.

Автор: MAKCim 28.10.2007, 11:18
Цитата(archimed7592 @  28.10.2007,  10:40 Найти цитируемый пост)
В частности, я не представляю как можно "нетривиально" решить проблему с name mangling. 

с объектниками, которые были сгенерировали С компиляторами, проблем нет, согласен?
в случае с С++ компиляторами
можно сравнивать имена символов и находить одинаковые подстроки в них (связано с тем, что С++ компиляторы добавляют суффиксы и/или префиксы к именам символов)

Автор: archimed7592 28.10.2007, 11:32
Цитата(MAKCim @  28.10.2007,  11:18 Найти цитируемый пост)
в случае с С++ компиляторами

Ну дык статья то про С++ smile.

foo(int, char);
foo(const A &, int);
...
Как выбрать сравнениями выбрать одну из нужных? ;-)
С шаблонами вообще труба.

Автор: powerfox 28.10.2007, 13:56
MAKCim, спасибо. Понял.

Автор: Mayk 28.10.2007, 14:55
Цитата(archimed7592 @  28.10.2007,  14:40 Найти цитируемый пост)
В частности, я не представляю как можно "нетривиально" решить проблему с name mangling.

Это достаточно  легко.  Нужен стандарт mangling'а и   ......................... extern "C++"[та да!], который можно вставлять перед определенными классами/ф-циями[как справделиво заметили в C++ FQA Lite,  свзяать си и си++ легче, чем с++ и с++].

Автор: archimed7592 28.10.2007, 17:30
Цитата(Mayk @  28.10.2007,  14:55 Найти цитируемый пост)
extern "C++"

Вообще говоря, стандарт не оговаривает даже то, что может указываться после extern в кавычках smile.

Автор: Mayk 28.10.2007, 17:34
Цитата(archimed7592 @  28.10.2007,  21:30 Найти цитируемый пост)

Вообще говоря, стандарт не оговаривает даже то, что может указываться после extern в кавычках

ну вот, значит будет  smile Ставлю десятку, что когда-нибудь extern "cpp" или extern "c++"  станет стандартным.  smile 
лет так через 50.

Автор: archimed7592 28.10.2007, 18:23
А в чём предполагаемая разница между extern "c++" и обыкновенными c++ объявлениями? smile

Автор: MAKCim 28.10.2007, 21:04
Цитата(archimed7592 @  28.10.2007,  11:32 Найти цитируемый пост)
Как выбрать сравнениями выбрать одну из нужных? ;-)
С шаблонами вообще труба.

да, тут я задумался
может и никак

Автор: Lazin 30.10.2007, 13:03
Цитата(archimed7592 @  26.10.2007,  19:12 Найти цитируемый пост)
Alek86, студия позволяет делать чисто виртуальные деструкторы(точно так же, как и любой другой компилятор, утверждающий, что он соответствует Стандарту)

кстати стандарт Embedded C++ не включает в себя, множественное наследовани пространства имен RTTI и абстрактные базовые классы и многое другое

Автор: archimed7592 30.10.2007, 15:01
Цитата(Lazin @  30.10.2007,  13:03 Найти цитируемый пост)
стандарт Embedded C++

Что за стандарт такой? smile
Я только о 14882 слышал...

Автор: Alexeis 30.10.2007, 15:07
фигасе  smile , значит я зря матюгался на отстутствие исключений и кривой STL .

Автор: zkv 30.10.2007, 15:13
Цитата(archimed7592 @  30.10.2007,  15:01 Найти цитируемый пост)
Что за стандарт такой?

похоже Lazin прав, не нашел ничего совсем "официального", но аргументы имеются:
http://en.wikipedia.org/wiki/Embedded_C%2B%2B
http://www.caravan.net/ec2plus/index.html

Автор: archimed7592 30.10.2007, 15:19
Alexeis, я не думаю, что в embeded delphi(если такой существует) возможностей больше...


zkv, да я не говорю, что он не прав smile. Я спрашиваю, что это за стандарт такой...

Автор: Lazin 30.10.2007, 16:06
Ну может это и не совсем стандарт, но в WinAVR(порт gcc для AVR) эта приблуда входит. 
eVC - скорей всего то-же что-то в этом роде.
зы
я сам никогда Embedded C++ не использовал

Автор: archimed7592 30.10.2007, 16:34
Lazin, ты об http://www.caravan.net/ec2plus/question.html?

Насколько я понимаю, это промышленный стандарт. Это так?

Автор: Alexeis 30.10.2007, 20:24
Цитата(Lazin @  30.10.2007,  16:06 Найти цитируемый пост)
eVC - скорей всего то-же что-то в этом роде.
зы
я сам никогда Embedded C++ не использовал

  Ну там есть и абстрактные классы и множественное наследование и нэймспэйсы и даже шаблоны (хоть и кривые).

Добавлено через 5 минут и 50 секунд
Цитата(archimed7592 @  30.10.2007,  15:19 Найти цитируемый пост)
Alexeis, я не думаю, что в embeded delphi(если такой существует) возможностей больше...

  Существует только дополнение для разработки под compact framework Windows Forms, но имхо это извращение... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)