Re[24]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.05 21:05
Оценка: -2
Здравствуйте, Павел Кузнецов, Вы писали:

>> Опять же интерейс тебе поможет. Кто скзал, что его нужно реализовывать в типе?


ПК>Я сказал.


О. Это серьезный аргумент.

ПК> Эти типы должны быть удобны в использовании и без шаблонов.


Не имеет ни малейшего отношения к делу.

ПК> Плюс это все хозяйство должно работать со встроенными типами и с типами из сторонних библиотек.


Работает.

>> Сделай хэлпер. Ты же в С++ передаешь через параметр разные Аллокаторы и т.п.


ПК>Я о них забочусь только когда они мне нужны (в частности аллокаторы — три или четыре раза за все время).


И я тоже.

ПК> В остальных случаях они под руками не мешаются,


И мне тоже.

ПК> т.к. их явно указывать не нужно.


И мне тоже.

ПК> С generics это не пройдет:


Чушь.

ПК> там все нужно будет делать явно, т.к. даже специализаций нет.


Чушь.

ПК>Методы чего? А если это не оператор *, а вспомогательная функция, которая не может быть членом Vector3<>, т.к. этот класс в библиотеке, а функция — в моем приложении?


Тебе уже сказали как при этом нужно поступать. Хороший пример объекты-компараторы. Погляди как они работаеют.

ПК> В C# не будет работать потому что: нельзя вызвать * для T, нельзя вызвать конструктор для Vector3<T>.


Все будет работать. Просто ты привык работать как привык и принимаешь в штыки любой другой подход.

>> ПК> Впрочем, отсутствие необходимости в boxing/unboxing можно тоже добавить, но это уже речь об оптимизации, а не о возможностях.


>> А о чем еще можно говорить если речь зашла о скорости кода?


ПК>Речь о скорости кода завел ты. Я говорил о возможностях, направленных на облегчение повторного использования кода.


Я только слово сказал, как ты тотчас же попытался использовать его для доказательства своих заблуждений.

ЗЫ

В общем, опять бессмысленный разговор. Тебе очень хочется доказать недоказуемое. Ты находишь какие-то системные проблемы там где их нет. Твое мышление все лежит в рамках подходов навязываемых плюсами. Но есть и дуругие подходы. То что они тебе кажутся недобобными — это всего лишь твоя проблема.

Ну, а что до копипэстов, то не С++-никам про них говорить. В С++ копипэст повсюду. Как минимум разделаная декларация и определение — это уже горы копипэста. С дублированием "x + y" — это даже в сравнение не идет.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 12.02.05 22:47
Оценка:
VladD2,

> ПК>Легко. Они будут порождаться клиентом. "Рабочий" код будет в .dll.


> На базе чего они будут порождаться? В длл может быть только специализация. Так что или длл не нужна, так как весь код в заголовочном файле, или мы не может порождать специализаций не предусмотренных в длл-е.


Нет, код может быть в DLL, а в заголовочном файле — только переходники для "автоматического" приведения типов. Например (псевдокод):
interface I
{
   void f();
   void g();
   . . .
};

Для такого "generic" класса:
class G<T> where T : I
{
   public void a(T) { /* ... some long and complex code ... */ }
   public T    b()  { /* ... some long and complex code ... */ }
   . . .
};

можно сделать такую комбинацию шаблона с "обычным" классом, реализация которого будет в DLL:
[dllexport]
class G_
{
public:
   void a(I&); // some long and complex code is in the DLL
   I&   b();   // some long and complex code is in the DLL
};

template<class T>
class G : private G_
{
   BOOST_STATIC_ASSERT( boost::is_convertible<T*,I*>::value );

public:
   void a(T& t) { G_::a(t); }
   T&   b()     { return dynamic_cast<T&>( G_::b() ); }
};

В классе G_ с аргументами можно делать то же, что и в "generic" G<T>, т.к. за пределы интерфейса I выйти в "generic" классе в C# все равно нельзя.

> ПК> Ага. Для int, например.


> А чем он отличается если мы плюем на производительность? В те же Питонах и лиспах int-ы — это такие же ссылочные типы.


В Лиспе и Питоне — да. В C# — нет. В Лиспе и Питоне, например, с разными арифметическими типами можно работать полиморфно. В C# — очень ограниченно, по сути, нельзя. В C++ шаблоны дают возможность работать с арифметическими типами полиморфно. Generics в C# — нет.

> ПК> Можно и по-другому повернуть: ты уже 4 часа откровенно не понимаешь, где черное, а где белое, да еще и хамишь. Мне это уже порядком надоело.


> Я называю вещи своими именами.


И ты точно знаешь, что представляет из себя каждая вещь, и какое у нее имя? Ну-ну.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[31]: Экспорт шаблонов
От: prVovik Россия  
Дата: 12.02.05 22:55
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>На базе чего они будут порождаться? В длл может быть только специализация. Так что или длл не нужна, так как весь код в заголовочном файле, или мы не может порождать специализаций не предусмотренных в длл-е.


Не, ты не понял. В длл плмещается полиморфный код, а в заголовочном файле — типобезопасная обертка для него.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[31]: Экспорт шаблонов
От: prVovik Россия  
Дата: 12.02.05 23:02
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Дженерики привросят качественное изменение. Они позволяют писать статически проверяемый код для набора неких абстрактных типов. Именно для этого и были в свое время созданны шаблоны.

Об этом я и говорю.

VD>Это качественное отличие.

Согласен. Об этом и толкую, что их единственное качественное свойство — это типобезопасность, вызванная отсутствием необходимости приведений типов на этапе выполнения программы.

VD>Можно ли без него жить? Можно.

VD>Можно ли решать задачи без обобщенного программирования? Можно.
VD>Является ли динамический полиморфизм нормальной заменой статическому? Нет.
Точно.

VD>Это заблуждение. И как любое заблуждение его доказывать не нужно.

То есть? Не понял, что ты имеешь ввиду. Поясни.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[30]: Экспорт шаблонов
От: prVovik Россия  
Дата: 12.02.05 23:27
Оценка: 1 (1) +1
Здравствуйте, VladD2, Вы писали:

VD>Обобщенное — значит применимое для любого типа.

Свойства типов могут зависеть от констант (например, размер), поэтому константы можно рассматривать, как механизм доопределения типов. И вообще, само слово "обобщенный" означает независимый от частностей. В качестве таких честностей вполне могут выступать не только типы, но и константы. Почему нет?

VD>Параметризация же константами — это чистый макросный стиль, или метапрограммирование.

спорно

VD>Если константы просто подставляются, то тоже самое можно добиться простым заданием констант в классе или заменой их на переменные.

Совершенно верно. Точно так же, как статический полиформизм вегда можно заменить динамическим. Ситуация абсолютно идентична.

VD>Если же константы начинают влиять на алгоритм (менять код), то это четкий признак применения шаблонов для метапрограммирования.

Меня не волнует, меняется ли ассемблерный код, или нет. Важно то, что алгоритм семантически одинаков.

VD>Еесли классы/методы отличаются только абстрагированностью от конкретных типов, то это обобщенное программирование. Если имеется элементы кодогенерации — это это уже нечто выходящее за рамки обобщенного программирования.

Кодогенерация тут вообще не причем. Нет такой парадигмы программирования, которая называется "кодогенерация". Это всего лишь, низкоуровневый технический приём.

VD>Несмоненно с помощью метапрограммирования можно эмулировать практически любые расширения ЯП, но это уже отдельный вопрос имеющий опосредованное отношение.

Абсолютно согласен.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[31]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.05 00:07
Оценка:
Здравствуйте, prVovik, Вы писали:

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


VD>>Обобщенное — значит применимое для любого типа.

V>Свойства типов могут зависеть от констант (например, размер), поэтому константы можно рассматривать, как механизм доопределения типов.

В дотнете типы не могут зависеть от констант. От констант могут зависить только экземпляры. Так что это не аргумент.

V> И вообще, само слово "обобщенный" означает независимый от частностей. В качестве таких честностей вполне могут выступать не только типы, но и константы. Почему нет?


По определению.

VD>>Параметризация же константами — это чистый макросный стиль, или метапрограммирование.

V>спорно

Оспорить можно все.

VD>>Если константы просто подставляются, то тоже самое можно добиться простым заданием констант в классе или заменой их на переменные.

V>Совершенно верно. Точно так же, как статический полиформизм вегда можно заменить динамическим. Ситуация абсолютно идентична.

Это обратная аналгия. То что что-то похожее не дает ни малейшего основания для выводов на этой основе.

В общем, еще раз отправляю к определению обобщенного программирования. И еще к метапрограммированию на шаблонах С++. Ну, и к определению метапрограммирования как такового.

V>Кодогенерация тут вообще не причем. Нет такой парадигмы программирования, которая называется "кодогенерация". Это всего лишь, низкоуровневый технический приём.


Это называется техникой. Но в рпнципе оно тянет и на парадигму. Ссылки см. выше.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.05 00:07
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Нет, код может быть в DLL, а в заголовочном файле — только переходники для "автоматического" приведения типов.


Понятно. Пошли выдумывать неотносящиеся к делу случая чтобы оправдать свои слова. Мы вроде говорили об экспорте шаблона из библиотеки. Ну, и не нужно сваливаться на необобщенные интерфейсы. Они тут не причем.

ПК>В Лиспе и Питоне — да. В C# — нет. В Лиспе и Питоне, например, с разными арифметическими типами можно работать полиморфно. В C# — очень ограниченно, по сути, нельзя. В C++ шаблоны дают возможность работать с арифметическими типами полиморфно. Generics в C# — нет.


Создай обертку над типом и предстваь все операции в виде методов. Далее проблем с полиморфными алгоритмами не будет. Это на любом языке поддерживающем полиморфизм можно сделать. Хоть на С.

ПК>И ты точно знаешь, что представляет из себя каждая вещь, и какое у нее имя? Ну-ну.


Я и не утвреждаю, что знаю все. Но очевидные вещи есть очевидные вещи. Даже если прийдет 100 экспертов-художников и скажут мне, что белое — это черное я останусь при своем мнеии.

Заявления типа "дженерики непригодны для обощенного программирования, они неполноценны" стольк очивидно бредовые, что с ними даже нельзя спорить.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.05 00:07
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Не, ты не понял. В длл плмещается полиморфный код, а в заголовочном файле — типобезопасная обертка для него.


Речь шла о шаблонах, об экспорте шаблонов. Причем тут твои слова?
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.02.05 00:07
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>Это качественное отличие.

V>Согласен.

Вот Паша не согласен. Религия не позволяет. Шаблоны типа полноценный инструмент обобщенного программирования, а дженерики эдакие приводилки типов.

V> Об этом и толкую, что их единственное качественное свойство — это типобезопасность, вызванная отсутствием необходимости приведений типов на этапе выполнения программы.


Блин. Да нет в обобщенном программировании понятия "избавление от приведения тиов". Это законченная парадигма. И, кстати, никто не мешает заниматься обобщенным приведением типов и писать динамически типизированный код. Хоть так:
T MyCast<T>(object obj)
{
    return (T)obj;
}


VD>>Это заблуждение. И как любое заблуждение его доказывать не нужно.

V>То есть? Не понял, что ты имеешь ввиду. Поясни.

Пояснить то что твои слова являются заблуждением? Может это ты пояснишь из какого пальца высасоны твои выводы? Дженерики без всяких оптимизаций делают код значительно более эффективным нежели аналогичный полиморфный. И никаких причин их по оптимизации я вроде бы не вижу. Ты на них тоже не указывал. Взял так и высосал из пальца "оптимизации, предоставляемые генериками — это просто ДЕТСКИЙ САД".

Детский сад — это подбные заявления.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[33]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 13.02.05 00:31
Оценка: -1
VladD2,

> ПК> Нет, код может быть в DLL, а в заголовочном файле — только переходники для "автоматического" приведения типов.


> Понятно. Пошли выдумывать неотносящиеся к делу случая чтобы оправдать свои слова. Мы вроде говорили об экспорте шаблона из библиотеки. Ну, и не нужно сваливаться на необобщенные интерфейсы. Они тут не причем.


Таким образом есть разница между опосредованным экспортом и непосредственным?

> ПК> В C++ шаблоны дают возможность работать с арифметическими типами полиморфно. Generics в C# — нет.


> Создай обертку над типом и предстваь все операции в виде методов. <...>


Иными словами ты в очередной раз предлагаешь мне использовать арифметические типы в обобщенных алгоритмах опосредованно. Спасибо, не надо — уже, кажется, говорил.

> Это на любом языке поддерживающем полиморфизм можно сделать. Хоть на С.


Совершенно верно. Именно это я и имел в виду, говоря о том, что generics лишены большинства достоинств шаблонов.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[33]: Экспорт шаблонов
От: prVovik Россия  
Дата: 13.02.05 08:56
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Речь шла о шаблонах, об экспорте шаблонов. Причем тут твои слова?

С точки зрения пользователя библиотеки, он оиспользует обычный типобезопасный шаблон со статическим контролем типов. При этом, весь реально работающий код находится в длл, которую можно менять. И чем это ПРИНЦИПИАЛЬНО будет отличаться от генериков?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[33]: Экспорт шаблонов
От: prVovik Россия  
Дата: 13.02.05 08:56
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Блин. Да нет в обобщенном программировании понятия "избавление от приведения тиов". Это законченная парадигма. И, кстати, никто не мешает заниматься обобщенным приведением типов и писать динамически типизированный код. Хоть так:

VD>
VD>T MyCast<T>(object obj)
VD>{
VD>    return (T)obj;
VD>}
VD>

А смысл?


VD>Взял так и высосал из пальца "оптимизации, предоставляемые генериками — это просто ДЕТСКИЙ САД".

А может не стоит выдергивать фразы из контекста? Я сказал следующее:

возможности по оптимизации, предоставляемые генериками — это просто ДЕТСКИЙ САД, по сравнению с оптимизацией на шаблонах!

То есть ты не согласен с тем, что шаблоны предоставляют на порядок больше возможностей для оптимизации, чем генерики? Я правильно тебя понял?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[32]: Экспорт шаблонов
От: prVovik Россия  
Дата: 13.02.05 08:56
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>По определению.

Обобщение — это абстрагирование от частностей. Если так, то я не понимаю, почему же можно абстрагироваться от конкретных типов, а вот абстрагироваться от конкретных констант партия запрещает? Почему обобщать по типам можно, а обобщать по константам нельзя? Неужели, это все потому, что так написано в энциклопедии?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[34]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.05 14:18
Оценка:
Здравствуйте, prVovik, Вы писали:

VD>>Речь шла о шаблонах, об экспорте шаблонов. Причем тут твои слова?

V>С точки зрения пользователя библиотеки, он оиспользует обычный типобезопасный шаблон со статическим контролем типов. При этом, весь реально работающий код находится в длл, которую можно менять. И чем это ПРИНЦИПИАЛЬНО будет отличаться от генериков?

Тем что дженерики можно положить в длл и использовать их без исходников прямо в бинарном виде. А шаблоные нельзя.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[35]: Экспорт шаблонов
От: prVovik Россия  
Дата: 15.02.05 15:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Тем что дженерики можно положить в длл и использовать их без исходников прямо в бинарном виде. А шаблоные нельзя.

Так, еще разок:

При этом, весь реально работающий код находится в длл, которую можно менять.

... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[36]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.02.05 22:03
Оценка: :)
Здравствуйте, prVovik, Вы писали:

VD>>Тем что дженерики можно положить в длл и использовать их без исходников прямо в бинарном виде. А шаблоные нельзя.

V> Так, еще разок:
V>

При этом, весь реально работающий код находится в длл, которую можно менять.


Вот это сказка.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[37]: Экспорт шаблонов
От: prVovik Россия  
Дата: 15.02.05 22:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вот это сказка.

Попробую объяснить. Допустим, мы хотим сделать типобезопасный обобщенный список и экспортировать его в длл.
///////////////////////////////////////////////////////////////////////////////////////
// заголовочный фал, поставляемый с библиотекой.
///////////////////////////////////////////////////////////////////////////////////////

// этот класс реально экспортируется в длл, но пользователем напрямую не используется
class MyArrayListImpl
{
public:
    void Add( void *item );
    void* GetItem( int index );
    ...
};

// а это уже реально используемый пользователями шаблон. Не содержит абсолютно никакого кода,
// а только делегирует к MyArrayListImpl
template< class T >
class MyArrayList: public MyArrayListImpl
{
public:
    void Add( T item )
    {
        MyArrayListImpl::Add( item );
    }
    
    T Get( int index )
    {
        return (T)MyArrayListImpl::GetItem(index);
    }
    ...
};

///////////////////////////////////////////////////////////////////////////////////////
// клиентская программа
///////////////////////////////////////////////////////////////////////////////////////
struct SomeStruct
{
    ...
};
...
MyArrayList<SomeStruct*> arlst;
arlst.Add( new SomeStruct() );
void *ptr = arlst.Get(0); // ОШИБКА КОМПИЛЯЦИИ.


То есть, таким образом, мы получили статический контроль типизации нетипизированной динамически загружаемой библиотеки.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[37]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 16.02.05 00:27
Оценка:
VladD2,

> VD>>Тем что дженерики можно положить в длл и использовать их без исходников прямо в бинарном виде. А шаблоные нельзя.


> V> Так, еще разок:

> V>

При этом, весь реально работающий код находится в длл, которую можно менять.


> Вот это сказка.


Влад, не смешно. Перечитай предлагавшиеся варианты (выше по ветке). Т.к. generics ограничены возможностями работы через интерфейсы, то можно вынести соответствующие non-generic функции, работающие через ссылки и указатели на интерфейсы, в DLL. Что конкретно не будет работать?
Posted via RSDN NNTP Server 2.0 alpha
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[38]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.05 02:21
Оценка:
Здравствуйте, prVovik, Вы писали:

V>То есть, таким образом, мы получили статический контроль типизации нетипизированной динамически загружаемой библиотеки.


Это, я извинясь, хрень полная, а не шаблон в библиотеке. Что и следовало доказать. В то же время дженерики лежат себе в библоиотеках и даже описания текстового не просят. Потому как проектировались в рассчете на это.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.02.05 02:21
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:


ПК>Влад, не смешно. Перечитай предлагавшиеся варианты (выше по ветке). Т.к. generics ограничены возможностями работы через интерфейсы, то можно вынести соответствующие non-generic функции, работающие через ссылки и указатели на интерфейсы, в DLL. Что конкретно не будет работать?


Ничего не будет работать. Положить полноценный шаблон в длл невозможно. А дженерик раз плюнуть.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.