Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 05.01.05 05:14
Оценка: 91 (11)
Наткнулся вот на Heron Programming Language

В котором замечена интересная концепция интерфейсов (вернее их как бы отсутствия)

retrofit polymorphism : Heron does not require a class to explicitly state which interfaces it implements, interface implementation is determined by whether the function signatures match


Т.е. интерфейс есть просто объявление списка функций который вы хотите получить от объекта:
Я выделил этот момент в тексте:

types {
    class Dog {
      MakeSound() : String {
        return "woof";
      }
      GetNumLegs() : Int {
        return 4;
      }
      GoFetch() {
        // ...
      }
    }

    class Duck {
      GetNumLegs() : Int {
        return 2;
      }
      MakeSound() : String {
        return "quack";
      }
      FlySouth() {
        // ...
      }
    }

    interface IAnimal {
      MakeSound() : String;
      GetNumOfLegs() : Int;
    }  }
  functions {
    _main() {
      IAnimal& animal;
      Dog dog;
      Duck duck;
      animal = @dog;
      P(animal.MakeSound()); // outputs woof
      animal = @duck;
      P(animal.MakeSound()); // outputs quack
    }
  }


Показалось интересным.
http://www.heron-language.com/interfaces.html
Там еще мысли по поводу meta programming наличествуют.
В общем кому интересно — гляньте.
Re[28]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 22:01
Оценка: 1 (1) +1 :))) :)
Здравствуйте, VladD2, Вы писали:

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


MS>>Влад, у вас с Andrew какие-то не-лады с определением причинно-следственных связей,


VD>У вас проблемы с пониманием. От вам 30-тое сообщение пытается обяснить, что схема менее гибка, так как или небуедет полноценного рантайм-полиморфизма, или будут дикие накладные расходы в рантайме.


Это если смотреть на проблему с позиций несимметричного-диметилполиморфизма, а если смотреть на эту проблему незатуманенным фрейморковкой взглядом банальной эрудици то все будет пучком.
Я так думаю.

Достаточно ли энтропии в моем ответе?

Я понимаю что в .NET мышление осуществляется глобальными и крупными категориями вида "рантайм-полиморфизма"... Но мне сирому так и не понятно что конкретно это обозначает. "Это что-то из .NET или мы всегда этим занималтсь?"
Re[14]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 22:03
Оценка: 1 (1) +2 -1 :))
Здравствуйте, VladD2, Вы писали:

VD>Ну, продемонстрируй что я получу от них чего я не могу получить на сегодня в Шарпе (кроме потенциального ускорения)?


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

VD>Полностью согласен с АВК. Автору бы прежде чем переизобретать велосипен познакомиться бы с тем как все сделано в Шарпе. Может и желаение отпало бы.


Он свое желание изолентой примотал. Лично я не хочу, чтобы у меня "отпало желание". Несмотря ни на какие шарпы...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 05:44
Оценка: :))) :))
Здравствуйте, McSeem2, Вы писали:

MS>... Нужна серьезная ревизия C++, слишком много в нем накопилось синтаксической и семантической энтропии, но увы, это вряд ли осуществимо на практике.


Ну должно же быть хоть что-то постоянное в этом мире

А то что слишком часто нам приходится петь песню про "sic transit gloria mundi" и компонентные технологии ...
... все, все, молчу ...

Ниччо, еще пара тройка Александреску и комитет шо хош утвердит лиш бы не смотреть на сие безобразие.
Re[28]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 13.01.05 01:51
Оценка: :))) :))
Здравствуйте, VladD2, Вы писали:

VD>Вот и нафиг все это. Пусть лошать...


Грубая ошибка! В деревне Троицкое Угличского района Ярославской области, где я провел все детство, это слово звучит так: лошоть с ударением на первом слоге и четким 'о' во втором...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.05 09:37
Оценка: 7 (1) +3
Здравствуйте, c-smile, Вы писали:

CS>В котором замечена интересная концепция интерфейсов (вернее их как бы отсутствия)


А в чем замечательность? В том что не надо в классе указывать интерфейс? А какие от этого бенефиты, кроме повышения зависимости от опечаток?
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[7]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 06.01.05 00:22
Оценка: 7 (1) +2 -1
AndrewVK,

>>> Вобще то любой нормальный программист о боксинге знает.


> ПК> Это не означает, что он его везде ожидает


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


Не совсем: тамошнему поведению объяснение исключительно в пожелании так сделать, в стремлении к безопасности, т.е. предотвратить работу с несконструированным классом. Боксинг же — следствие оптимизации.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[41]: Unintrusive Retroactive Polymorphism
От: Шахтер Интернет  
Дата: 08.02.05 02:31
Оценка: +1 :)))
Здравствуйте, WolfHound, Вы писали:

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


VD>>Ага. Выход на пенсию.

WH>Ну вот скоро качаться будет некуда

Не дрейфь. До 99 ещё далеко. Это только некоторые наивные люди думают, что игра кончается в первой локации первого эпизода. А на самом деле за бабой с луком огромный и опасный мир.
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[3]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 04.05.05 00:11
Оценка: 44 (3)
Здравствуйте, c-smile, Вы писали:

CS>У автора кстати есть попытка имплементировать это в стиле boost на С++

CS>http://www.codeproject.com/cpp/retrofitpolymorphism2.asp

Также см. Boost.Interfaces.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка: -2 :)
Здравствуйте, McSeem2, Вы писали:

MS>Грубая ошибка! В деревне Троицкое Угличского района Ярославской области, где я провел все детство, это слово звучит так: лошоть с ударением на первом слоге и четким 'о' во втором...


Ну, по кривляйся еще проведешь остаток детства в бане.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[32]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 14.01.05 20:51
Оценка: :)))
Здравствуйте, AndrewVK, Вы писали:

MS>>Первый уровень. "Не понимаю, зачем вообще нужно это наследование".

MS>>Второй уровень. "Единственный способ написать правильную программу — это использовать наследование".
MS>>Третий уровень. "Концепция наследования — это атрофизм, не имеющий ничего общего с решаемыми задачами, и чем его меньше — тем лучше".
AVK>Четвертый уровень: "А все таки польза от наследования есть"

Нет. Как я уже сказал, четверый — это люди совсем без башни, изобретающие новые концепции, в то время, когда "все что можно было изобрести — давным давно изобретено"

ПК>>>> В т.ч. для динамического полиморфизма ошибки проявляются во время исполнения.

MS>>Именно так оно и есть. Лично для меня нет никакой разницы, падает ли приложение по GPF или по .Net exception.

AVK>А для меня есть. Видимо потому что написание серверов накладывает свой отпечаток на мировоззрение


Это я конечно же перегнул. Разница есть. В случае GPF — сразу кирдык, а при System.IndexOutOfRangeException можно хотя бы состроить хорошую мину при плохой игре.

Пристегните ремни! А то после последней катастрофы всех непристёгнутых по стенкам размазало, а все, кто был пристёгнут — сидели как живые...


McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[38]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 14.01.05 23:41
Оценка: :)))
Здравствуйте, AndrewVK, Вы писали:

AVK>И что тогда в этом плохого?


Именно то, что позволяет халтурить. Ты — высокоорганизованный и высокоморальный экземпляр. А сколько халтурщиков слетается на эту профанацию? И не просто халтурщиков, а халтурщиков, дискредититующих и профессию и дот-нет и меня своими тяп-ляпами. Шутка.

AVK>И почему ты считаешь что это всегда будет препятствием для высокопроизводительного кода?


Наверное, это перестанет быть препятствием только тогда, когда вся эта безопасность будет обеспечиваться на уровне железа. Что там говорил Gaperton про аппаратные Java-машины на майнфреймах IBM?

AVK>Это тоже стадии

AVK>Стадия первая: нравится вобще что то писать
AVK>Стадия вторая: просто писать не интересно, надо писать то что не могут другие. Например хитрые драйвера, вирусы.
AVK>Стадия третья: писать всякую фигню уже не интересно, начинаешь писать то что нужно реально, но при этом так, чтобы круче чего нибудь общепринятого. Например по скорости.
AVK>Стадия четвертая: заниматься оптимизацией надоедает. Начинаешь писать фреймворки.
AVK>Стадия пятая: наконец то главным критерием становится решение задачи за минимальные сроки с максимальным качеством
AVK>Стадия шестая: становишься консультантом

Ну, с этой точки зрения мой путь весьма крив. Я быстро проскочил стадию 1, просто перешагнул через стадию 2, надолго завис на стадии 3, побывал на стадии 5, потом — стадия 4, потом — снова 5 и в конце концов вернулся на стадию 3. Деградирую, понимашь. Но не теряю надежды, минуя стадии 4 и 5, сразу стать 6

А самый крутой консультант — знаешь какой?
Его нанимают за большие деньги, после чего подробно рассказывают что и как, кормят-поят, пляшут канкан. В конце концов, робко спрашивают — "Ну как по-вашему — есть надежда, что будет работать?" Консультант со сталью в голосе говорит "Нет!". На этом работа консультанта закончена.

MS>>Навеяло: <b>История одного байта</b>

MS>>Вот я — примерно из этой категории. Это не хорошо и не плохо. Это просто есть.

AVK>Всего лишь свидетельство узости мышления. Ничего интересного.


Точно так же я мог бы объявить и тебя в "узости мышления" и нежелании видеть красоту в чем-то другом, кроме дот-нет. Но это будет неправильно. Это не узость мышления, ты — просто иной.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.05 21:38
Оценка: 48 (1) +1
Здравствуйте, c-smile, Вы писали:

CS>Это совсем о другом на самом деле. Я так понимаю слово interface проинтерпретировано тобой в смысле C#

CS>Здесь interface это больше механизм родственный template в C++.

Он не родственный совсем, просто правила разрешения имен сходные. А по сути это интерфейс и есть. Только в отличие от шарпа не надо его явно указывать в самом классе.

CS>И еще одна мысль про такой способ описания interfaces — они жутко эффективные.


Да? А по мне так наоборот — для полиморфного кода при компиляции интерфейс неотрезолвить. Придется резолвить в рантайме.

CS>В .NET и Java получение ссылки на интерфейс от объекта:

CS>
CS>ISomething ismt = (ISomething)obj;
CS>

CS>вельми дорогостоящая операция.

Для джавы не знаю, а для дотнета нет, не дорогостоящая. В дотнете вобще один из самых быстрых (хотя и несколько более прожорливый в плане памяти) вариант реализации интерфейсов. В форуме по дотнету я как то подробно рассматривал как интерфейсы работают уже после работы JIT. В частности в таком коде:
class X : IX
{}

...

X x = new X();
IX ix = (IX)x;

На операцию приведения вобще никакого x86-кода не будет, JIT его просто выкинет. Т.е. в таком случае операция абсолютно эффективна. Ну а когда на этапе приведения при работе JIT заранее о результате неизвестно, там будет единственное обращение к interface map по константному смещению (любой интерфейс в imap всех классов всегда расположен по одному и тому же смещению). А вот в твоем варианте все намного печальнее — нужно будет сканировать символьные имена реального класса и интерфейса на предмет поиска соотвествий. Это можно конечно закешировать, но все равно до скорости дотнета не дотянуть.

CS>В С++ вызов виртуальной функции тоже не сильно дешев.


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

CS>В Heron же операция получения интерфейса


CS>
CS>animal = @dog;
CS>


CS>это фактически образование (compile time) таблицы method references — (this,funcptr)

CS>Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[2]: Unintrusive Retroactive Polymorphism
От: Костя Ещенко Россия  
Дата: 12.01.05 05:43
Оценка: 26 (2)
Здравствуйте, c-smile, Вы писали:

CS>Интерсная и очень показательная переписка "Heron"("christopher diggins") <-> David Abrahams (boost consalting, главный meta programmer )


CS>здесь


CS>David Abrahams сказал 2004-04-25 18:53:07 PST


CS>

CS>I believe I could write macros to allow you to generate baz with:

CS>DECLARE_INTERFACE(
CS> baz,
CS> ((int)(foo)(int))
CS> ((int)(bar)(char const*))
CS>);

CS>David Abrahams еще сказал 2004-04-30 11:13:06 PST
CS>

CS>If I get a few minutes maybe I'll hack them up for fun.


CS>Чего-то не видать результата. Ну да и ладно


CS>Похоже David в тумане метапрограмизма не проникся идеей которя на мой взгляд футдаментально-положительная.


здесь оно выглядит примерно так как он сказал.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: Unintrusive Retroactive Polymorphism
От: palm mute  
Дата: 05.12.07 09:13
Оценка: 18 (2)
Здравствуйте, FR, Вы писали:

CS>>Наткнулся вот на Heron Programming Language

FR>Есть вопрос ты за ним следишь?
FR>Интересный язык, но мне показалось, или так и есть, что он скорее мертв чем жив?

Скорее мертв. Автор Heron сейчас активно занимается Форто-подобным языком с выводом типов.
Вот последняя запись о Heron в блоге автора, в которой сообщается, что он планирует позиционировать Heron как инструмент для кодогенерации.
Re[9]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 19:53
Оценка: 13 (2)
Здравствуйте, c-smile, Вы писали:

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


CS>Ты не понял. Еще раз — это фактически механизм template instantiation чего в С# в принципе нет.


Это ты похоже чего то непонимаешь. Еще раз пример, более подробно:
class Base {}

interface IA
{
    void Foo();
}

class X : Base, IA
{
    void Bar1(); // адрес метода в памяти 0001
    void Foo(); // адрес метода в памяти 0002
}

class Y : Base, IA
{
    void Foo(); // адрес метода в памяти 0003
    void Bar2(); // адрес метода в памяти 0004
}

...

Base[] bs = new Base[]{new X(). new Y()};
(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003

Теперь поговорим о реализации
1) Неполиморфным вызов в данном случае быть не может. Не имеет смысла это даже обсуждать.
2) Поскольку в базовом интерфейсе реализация метода Foo() не присутствует, а компилятору ничего больше не известно, то он не то что что статический адрес подставить не может, но и не может произвести даже виртуальный вызов, поскольку не может определить смещение в VMT.
3) Отсюда для интерфейсов нужна двойная виртуальность. Разруливается это на практике обычно так:
а) Ресолвим имена методов в рантайме. Так собственно работает IDispatch. Очень гибко, но весьма медленно.
б) Для класса строится таблица соответствия индексов в vmt класса и vmt интерфейса. Собственно именно этот способ используется в дотнете. Самый быстрый способ, не требует приведения типов, но довольно проблематична реализация в компайл-тайме.
в) Для класса создается несколько VMT, по одной на каждый интерфейс. Этот способ применяется в C++ и Дельфи. Довольно быстрый, но требует определенной химии в рантайме для определения нужной VMT.
Теория закончена, перейдем к практике. С вариантом а все понятно — никакой особой помощи со стороный компилятора она не требует. Строим хеш с именами и адресами, потом при вызове для каждого экземпляра ресолвим строковое наименование метода. С вариантом б я ситуацию расписывал — при загрузке класса (можно в принципе и при компиляции, но при этом, как ты справедливо заметил, нужно будет разруливать конфликты в многомодульной конфигурации) строится таблица соотвествия. После этого все сводится к обычному табличному преобразованию смещений. В варианте в компилятор строит VMT для каждого интерфейса, поддерживаемого классом. Главная хитрость в переключении на нужную VMT в момент приведения.
А теперь вернемся к Херону. Основное отличие — в определении класса нет списка интерфейсов, которые этот класс поддерживает. Попробуем теперь примерить существующие варианты. С вариантом а все просто — никаких проблем нет, разве что при резолвинге простым хешем не обойдешься. С вариантом б уже все намного печальнее. В отличие от дотнета, мы не можем гарантировать что на момент поднятия класса все реализуемые интерфейсы уже подняты. Т.е. компонентность в таком разе уже гарантированно идет лесом. Ну да бог с ней, теперь попробуем разобраться что можно придумать с компиляцией. А придумать тут можно только одно — надо проверить все присутствующие интерфейсы программы на возможность применения к каждому классу (см. приведенный пример, в котором компилятор не сможет понять какие интерфейсы к каким классам будут применены). Поскольку применимость любого интерфейса к любому классу штука неконтроллируемая, то и размер imap тоже будет неконтроллируемым. Особенно если появятся Java-style интерфейсты без членов. Ну и с вариантом в все ровно тоже самое, только в отличие от неконтроллируемого роста размеров imap получим его же в отношении количества VMT.
А вот теперь я с удовольствием послушаю, каким из этих способов пользуется Херон, а если никаким, то интересно описание четвертого варианта. Только без общих слов, конкретный алгоритм вызова метода в последних двух строчках примера.
Что же касается виртуальности/невиртуальности, то это вопрос качества компилятора и отказ от объявления интерфейса в классе ничего тут не меняет.
Ну и наконец, то что ты считаешь что наложение интерфейса на класс по совпадению сигнатур методов есть нечто новое, говорит о том что ты не очень хорошо представляешь себе что такое неявная реализация интерфейсов в дотнете.

CS>Этот неуклюжий боксинг


Да, боксинг конечно имеет прямое отношение к интерфейсам .

CS>, imap


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

CS> и все остальное


Все остальное это что?
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[30]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 14.01.05 19:19
Оценка: 13 (2)
ПК>>Принципиальная разница есть: чем меньше в программе динамического полиморфизма, тем проще и полнее можно верифицировать ее корректность.

VD>Вот такую антиобъектную ересь я от тебя не ждал. Всю жизнь хорошие архитекторы закладывались на абстракцию и считали любые звсисимости не нее вредом. А тут оказывается, что это зло.


Просто Павел уже достиг следующей стадии просветления, пока что недоступной тебе Если говорить очень-очень утрированно, то это звучит так:

Первый уровень. "Не понимаю, зачем вообще нужно это наследование".
Второй уровень. "Единственный способ написать правильную программу — это использовать наследование".
Третий уровень. "Концепция наследования — это атрофизм, не имеющий ничего общего с решаемыми задачами, и чем его меньше — тем лучше".

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

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

http://ski-club.org.ru/people/bychkov.shtml
Конечно, мне до такого далеко, но в глубине души я тоже стремлюсь к "хот-догу".

ПК>> В т.ч. для динамического полиморфизма ошибки проявляются во время исполнения.


Именно так оно и есть. Лично для меня нет никакой разницы, падает ли приложение по GPF или по .Net exception.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 05.01.05 05:28
Оценка: 4 (1) :)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Гм... Структурная совместимость типов. Скажем, в C++ выражена шаблонами. В чем новизна подхода Heron?.. Правильно ли я понял, что в том, что подход "легализован" на уровне "основного" синтаксиса языка?


Да, легализован.

У автора кстати есть попытка имплементировать это в стиле boost на С++
http://www.codeproject.com/cpp/retrofitpolymorphism2.asp

>> Показалось интересным.


ПК>+1. Спасибо.


"Ниччо не нада"
Re[4]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 05.01.05 22:49
Оценка: +1 -1
Здравствуйте, AndrewVK, Вы писали:

CS>>И еще одна мысль про такой способ описания interfaces — они жутко эффективные.

AVK>Да? А по мне так наоборот — для полиморфного кода при компиляции интерфейс неотрезолвить. Придется резолвить в рантайме.

В С++ template как раз и занимаются тем что "резолвят". Это если я правильно понял термин "полиморфный код".
Дело в том что в C# статического полиморфизма (templates) нет как класса. Он там наверное и не нужен. Т.е. в общеме-то С# к обсуждаемой проблеме как бы не причем. С#/NET это система "everything is an object" что в С/C++ далеко не всегда имеет место быть.

CS>>В .NET и Java получение ссылки на интерфейс от объекта:

CS>>
CS>>ISomething ismt = (ISomething)obj;
CS>>

CS>>вельми дорогостоящая операция.

AVK>Для джавы не знаю, а для дотнета нет, не дорогостоящая. В дотнете вобще один из самых быстрых (хотя и несколько более прожорливый в плане памяти) вариант реализации интерфейсов. В форуме по дотнету я как то подробно рассматривал как интерфейсы работают уже после работы JIT. В частности в таком коде:

...
Т.е. все таки дорогостоящая. Не по времени так по размеру.

AVK>На операцию приведения вобще никакого x86-кода не будет, JIT его просто выкинет. Т.е. в таком случае операция абсолютно эффективна. Ну а когда на этапе приведения при работе JIT заранее о результате неизвестно, там будет единственное обращение к interface map по константному смещению (любой интерфейс в imap всех классов всегда расположен по одному и тому же смещению). А вот в твоем варианте все намного печальнее — нужно будет сканировать символьные имена реального класса и интерфейса на предмет поиска соотвествий. Это можно конечно закешировать, но все равно до скорости дотнета не дотянуть.


Можешь прояснить такой момент: скажем у меня есть в сборке N интерфейсов и M классов.
Как я понимаю по твоей схеме каждый класс должен включать N entries под все возможные интерфейсы.
Т.е. имеем фактически N*M таблицу. Я правильно все понял?
А как осущесвляется inter assembly interface linkage тогда?

CS>>В С++ вызов виртуальной функции тоже не сильно дешев.


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


Ну при использовании templates динамическая виртуальность заменяется на статическую. Что заведомо более эффективно.
Тот же самый ATL/WTL построен как раз на принципах минимизации исп. vtbl.

CS>>В Heron же операция получения интерфейса


CS>>
CS>>animal = @dog;
CS>>


CS>>это фактически образование (compile time) таблицы method references — (this,funcptr)

CS>>Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

AVK>Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.


Я совсем не понимаю что ты имеешь ввиду под "полиморфный код".

Когда я "забираю" интерфейс у какого-нибудь класса я при компиляции знаю его состав функций (сигнатуры)
и могу эффективно построить интерфейсную таблицу.
IAnimal animal;


в рантайм пустой (null) но присвоение устанавливает ему this плюс адрес на некую статическую таблицу построенную в
compile time.

пысы: Я не говорю и не говорил никогда что система используемая в .NET плохая. Она по своему и для своих задач хороша. Для ситуации когда everything is an object она может быть даже близка к идеалу.

Данный же конкретный Heron ближе и в струе эволюции C++. Т.е. в принципе концепт таких вот interface я считаю
прекрасно бы дополнил, развил механизм templates.
Плюс идеи (не нотация) meta-programming Heron я думаю тоже достойны рассмотрения.

"Я так думаю" (С) Мимино.
Re[12]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 23:18
Оценка: +2
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, c-smile, Вы писали:


CS>>Как ты можешь заметить VMT (виртуальное наследование) здесь не нужны.


AVK>Какой ты хитрый. Я тебя не спрашиваю как мне полиморфный код сделать неполиморфным. Для примера делать это бессмысленно, поскольку это игрушечный код. Убери к примеру из одного из классов метод Foo () (и вызов его соотв.), а в контейнере класс оставь, и все, приехали. Я тебя спрашивал как в Хероне будет реализован тот код что я привел. Если не знаешь как, так и скажи, а не увиливай от ответа.


Это не я хитрый, а автор Heron'a умный.

AVK>Я сам буду решать, что мне нужно. Вот к примеру типичный вариант использования интерфейсов.


Ничего ты не можешь решать. Так как у тебя есть один единственный спопособ — с помощью vmt/imap.
Статический полиморфизм тебе не дан большими дядями.

Это я могу решать в C++ что мне выбрать — template или virtual полиморфизм.
Если еще при этом будет механизм этих interfaces (который представляется родным для C++) будет еще лучше.

Т.е. для примера предлагаемого тобой (ниже) я могу выбрать наиболее оптимальное и эффективное решение.
Могу построить это все как коллекцию интерфейсных ссылок, могу пойти по сугубо виртуальному пути,
а могу построить нечто посредине.

AVK>
AVK>interface ISupportInitialize
AVK>{
AVK>    void Initialize();
AVK>}

AVK>class Control {}

AVK>class SomeCustomControl : Control, ISupportInitialize
AVK>{
AVK>    public void Initialize();
AVK>}

AVK>...

AVK>foreach (ControlDescription cd in ControlDescriptions)
AVK>{
AVK>    Control c = CreateControl(cd);
AVK>    ISupportInitialize isi = c as ISupportInitialize;
AVK>    if (isi != null)
AVK>        isi.Initialize();
AVK>}
AVK>
Re[4]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 04:41
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Здорово (я не шучу). Это действительно можно было бы использовать для реализации идеи ограничений (констрэйнов) для параметов шаблонов С++ и тем самым хоть немного сняло бы сложность этого языка. Но... но рантайм полиморфизм через такой мехазнизв вроде как не возможен, а это резко усложнит ОО-дизайн и в итоге может привести к проблемам.


Динамический полиморфизм — это принципиально другой механизм и он уже не требует какого-то глобального пересмотра.

CS>>Я считаю что механизм полезен и окажет свое воздействие на С++.


VD>А вот вот в это я уже совсем не верю. С++ похоже уже будет развиваться только в сторону усложения. К тому же когда появится новый стандарт никому не ясно.


О! Вот это тот редкий случай, когда я с Владом полностью согласен. Но этот случай подпадает под категорию "увы". Нужна серьезная ревизия C++, слишком много в нем накопилось синтаксической и семантической энтропии, но увы, это вряд ли осуществимо на практике.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[13]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 07.01.05 22:57
Оценка: +1 -1
AndrewVK,

> WH> Так value типы и есть оптимизация из-за которой понадобился боксинг...


> Так изначально то речь шла про то что автобоксинг это следствие оптимизации. На самом же деле причиной возникновения автобоксинга (а не value типов!) она не была.


Гм... Если разделение на value- и reference- типы является следствием оптимизации, и боксинг является следствием наличия разделения на value- и reference- типы, то боксинг является следствием оптимизации. Как автор обсуждаемого сообщения могу тебя заверить, что речь шла именно об этом.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[24]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 11.01.05 19:33
Оценка: :))
VladD2,

> MS>Ну и вот. "Ответ не верный. Ваше очко переходит залу"...


> Блин. Это не вопрос веры. Почитай стандарт на язык. А то просто возьми код исправь ошибки и протестиру. Вот тебе чтобы не мучиться работающий вариант: <...>


Это неправильный вариант. Это удаление наследования от IA у класса Y, в то время, как [url=http://rsdn.ru/Forum/Message.aspx?mid=977486&amp;only=1
Автор: McSeem2
Дата: 07.01.05
речь шла[/url] об удалении члена Foo() из класса X.

Так что еще одно очко переходит залу
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[13]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.01.05 08:39
Оценка: +2
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>

The most prominent difference is that they do not require declarations within a class of intention to implement an interface


Не думаю что это преимущество. Впрочем я про это уже писал.

ПК>

any class can be used polymorphically


В дотнете тоже.

ПК>

Function pointers can be effectively implemented as intefaces with only one function. This helps simplify the language significantly when compared to C++ for instance.

ПК>Т.е. ни указателей на функции, ни делегатов не нужно. В отличие, скажем, от inner классов Java (или как там они называются?), интерфейсы Heron в этом отношении предоставляет полноценную замену этим сущностям.

Фиговую они замену предлагают. Как только понадобится подписаться на несколько одинаковых событий настанет редкая задница, поскольку при отсутствии явного указания интерфейсов и явная их реализация невозможна. Делегаты на порядок гибче и удобнее.
... << RSDN@Home 1.1.4 beta 3 rev. 275>>
AVK Blog
Re[34]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 14.01.05 21:57
Оценка: :))
Здравствуйте, AndrewVK, Вы писали:

AVK>Тем не менее на практике не все так примитивно, как ты расписал.


Ну я же сделал оговорку "очень-очень утрированно".

AVK>Дело не в мине. Опять ты думаешь категориями десктопов. А для сервера, если запрос завершится ошибкой, это как правило не страшно. А вот если будет GPF то все, суши весла. Если был проход по памяти дальше сервер жить не будет.


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

Но как только дело доходит до хоть сколько-нибудь серьезных high-performance задач, как то, растеризовать карту по типу http://maps.yahoo.com (на сервере!) — вот тут уже либо безопасно но тормозно, либо же быстро, но непременно в unsafe (и уже не важно, что там — Java, C#, PHP или что еще). А разница производительности вдвое на таких задачах означает и разницу в максимальной нагрузке тоже вдвое! А железо, которое держит вдвое большую вычислительную нагрузку стоит не вдвое, а впятеро дороже. А вот здесь-то и появляюсь я на белом коне
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.05 23:25
Оценка: 16 (1)
Здравствуйте, c-smile, Вы писали:

CS>Дело в том что в C# статического полиморфизма (templates) нет как класса.


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

AVK>>Для джавы не знаю, а для дотнета нет, не дорогостоящая. В дотнете вобще один из самых быстрых (хотя и несколько более прожорливый в плане памяти) вариант реализации интерфейсов. В форуме по дотнету я как то подробно рассматривал как интерфейсы работают уже после работы JIT. В частности в таком коде:

CS>...
CS>Т.е. все таки дорогостоящая. Не по времени так по размеру.
Типа отмазался
Все относительно. Размер imap равен количеству загруженных на момент загрузки класса интерфейсов. Поскольку интерфейсов и классов как правило довольно конечное количество, то реальный перерасход памяти ничтожный. Опять же — все равно твое предположение совершенно неверно, поскольку дорогостояща в шарпе механика интерфейсов, но никак не механика приведения, о которой ты вел речь.

CS>Можешь прояснить такой момент: скажем у меня есть в сборке N интерфейсов и M классов.

CS>Как я понимаю по твоей схеме каждый класс должен включать N entries под все возможные интерфейсы.
CS>Т.е. имеем фактически N*M таблицу. Я правильно все понял?

Нет. Во-первых сборки тут совершенно не при чем. Во-вторых N = количеству загруженных на момент загрузки класса интерфейсов.

CS>А как осущесвляется inter assembly interface linkage тогда?


Так же. Никакой привязки к сборкам у этого механизма нет.

CS>Ну при использовании templates динамическая виртуальность заменяется на статическую. Что заведомо более эффективно.


Если на этапе компиляции известен и тип и шаблон.

CS>Тот же самый ATL/WTL построен как раз на принципах минимизации исп. vtbl.


Я в курсе. ИМХО экономия на спичках.

AVK>>Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.


CS>Я совсем не понимаю что ты имеешь ввиду под "полиморфный код".


class Base {}

class C : Base, IA {}

interface IA {}

...

Base b = new C();
IA ia = (IA)b; // здесь компилятор отрезолвить интерфейс не может


CS>Когда я "забираю" интерфейс у какого-нибудь класса я при компиляции знаю его состав функций (сигнатуры)

CS>и могу эффективно построить интерфейсную таблицу.
CS>
CS>IAnimal animal;
CS>


А где гарантия что ты у класса вобще когда либо попросишь этот интерфейс? Или компилятор выполняет перемножение всех классов и всех интерфейсов и строит для всех валидных комбинаций таблицы?

CS>в рантайм пустой (null) но присвоение устанавливает ему this плюс адрес на некую статическую таблицу построенную в

CS>compile time.

Т.е. при динамической загрузке это работать не будет.

CS>Данный же конкретный Heron ближе и в струе эволюции C++. Т.е. в принципе концепт таких вот interface я считаю

CS>прекрасно бы дополнил, развил механизм templates.

Честно говоря особой полезности я так и не ощутил. Очень сомнительная фича.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[12]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 11.01.05 19:29
Оценка: 9 (1)
VladD2,

> единственный недостаток runtime-полиморфизма это более медленный вызов методов и отсуствие возможности инлайнинга.


Не единственный. А если говорить не о runtime полиморфизме вообще, а конкретно о виртуальных функциях, то вот преимущества интерфейсов Heron (или соответствующие недостатки виртуальных функций), как их видит автор, за вычетом соображений о быстродействии:

http://www.heron-language.com/interfaces.html

The most prominent difference is that they do not require declarations within a class of intention to implement an interface


any class can be used polymorphically


you don't need to incur any of the cost of run-time polymorphism, until when and if you explicitly require it. That cost includes <...> space overhead of function dispatch tables.


virtual functions can lead to complex code, and violate object oriented principles such as information/implementation hiding. Virtual functions often lead to situiations where the objects are not tested properly for all possible inheritance scenarios.


Function pointers can be effectively implemented as intefaces with only one function. This helps simplify the language significantly when compared to C++ for instance.

Т.е. ни указателей на функции, ни делегатов не нужно. В отличие, скажем, от inner классов Java (или как там они называются?), интерфейсы Heron в этом отношении предоставляет полноценную замену этим сущностям.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 05:47
Оценка: 3 (1)
Вот наброски того как это могло бы выглядеть в C++
http://www.heron-language.com/cpp-iop.html
Re[20]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 04:34
Оценка: 1 (1)
Здравствуйте, c-smile, Вы писали:

CS>Я наверное неочевидно написал...


CS>На самом деле так:

CS>sizeof(IRef) == sizeof(void*) * 2; — два указателя: this и function table.

CS>Т.е. по размеру один указатель на интерфейс эквивалентен member function pointer в C++

CS>с чем уже все смирились

А мне сдается, что нефига тут выпендриваться, а надо просто сделать удобный механизм для автоматического построения массива указателей на функции в каждом экземпляре интерфейса. Тем более, что на современных процах косвенный вызов работает так же быстро, как и прямой. А вот виртуальный (двойная косвенность) сбивает весь конвейер и вряд ли они когда либо смогут "предсказывать наперед" такие вещи. Года 3 назад мне пришлось вручную на C++ имплементировать косвенные вызовы заместо штатного механизма наследования. Задача была тяжелая, DNA Contig Assembly, и работало это все на DEC-Alpha. За счет устранения одного уровня косвенности производительность всей процедуры выросла процентов на 30.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[25]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 12.01.05 08:39
Оценка: 1 (1)
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это неправильный вариант. Это удаление наследования от IA у класса Y, в то время, как [url=http://rsdn.ru/Forum/Message.aspx?mid=977486&amp;only=1
Автор: McSeem2
Дата: 07.01.05
речь шла[/url] об удалении члена Foo() из класса X.


Я имел ввиду и удаление метода и удаление интерфейса, просто второе подразумевалось.
... << RSDN@Home 1.1.4 beta 3 rev. 275>>
AVK Blog
Re[2]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 05.01.05 20:47
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

AVK>А в чем замечательность? В том что не надо в классе указывать интерфейс? А какие от этого бенефиты, кроме повышения зависимости от опечаток?


Это совсем о другом на самом деле. Я так понимаю слово interface проинтерпретировано тобой в смысле C#
Здесь interface это больше механизм родственный template в C++.

Смотри, если ты в C++ говоришь

template<typename T>
  void foo(T& t) { t.bar(); }


То тем самым ты неявно ожидаешь что T будет иметь метод [something] bar();
Т.е. ожидаешь от T имплементацию некоего интерфейса.

Вот эти вот "неявно" и "[something]" на самом деле не украшают картину templates в C++.

И еще одна мысль про такой способ описания interfaces — они жутко эффективные.

В .NET и Java получение ссылки на интерфейс от объекта:
ISomething ismt = (ISomething)obj;

вельми дорогостоящая операция.

В С++ вызов виртуальной функции тоже не сильно дешев.

В Heron же операция получения интерфейса

animal = @dog;


это фактически образование (compile time) таблицы method references — (this,funcptr)
Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

Я считаю что механизм полезен и окажет свое воздействие на С++.
Re[5]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 05.01.05 23:00
Оценка: :)
AndrewVK,

> ПК> А если в C# obj — value-тип, то использование полученной ссылки на интерфейс еще и чревато нарушением ожиданий программиста,


> Вобще то любой нормальный программист о боксинге знает.


Это не означает, что он его везде ожидает
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[11]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 20:50
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>heron:interface/c++:templates это статическое связывание — нахождение адреса функции в compile/link time.


Значит приведенный в примере код с хероновскими интерфейсами работать не будет.

CS>с#:interface это динамическое связывание — нахождение функции в runtime.


Не обязательно. Я об этом несколько раз писал. Когда компилятор не может определить конкретную функцию, тогда да, в рантайме. А когда может, то в коде присутствует конкретный адрес (статический вызов).

CS>Я не знаю уже как это объяснить, я пасс. Anybody else?


Опять общие слова. Я тебе задал конкретный вопрос — можно ли применять хероновские интерфейсы в полиморфном коде. Если ответ нет — то и вопросов нет.

CS>Я думаю имеет смысл прочесть сравнение templates vs. generics.


Спасибо, я и так их отличие очень хорошо представляю. Только при чему тут дженерики?

CS>http://blogs.msdn.com/branbray/archive/2003/11/19/51023.aspx

CS>Это как раз в тему.

Абсолютно не в тему.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[12]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 20:50
Оценка: +1
Здравствуйте, c-smile, Вы писали:

AVK>>А в дотнете дженериками.


CS> Две большие разницы как говорят в Одессе.


А я и не говорю что это одно и то же. И, эта, не надо мне рассказывать что такое дженерики, я на них еще года полтора назад очень внимательно смотрел. Более того, я знаю причины отличий дженериков и шаблонов. Вот только никакого отношения к боксингу это не имеет.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[16]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 23:23
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

Т.е. ты утверждаешь что вот это вот валидная конструкция?

class Base {}

interface IA
{
    void Foo();
}

class X : Base, IA
{
    void Bar1();
}


Если да то это не лезет ни в какие ворота.
Re[17]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 00:07
Оценка: -1
Здравствуйте, McSeem2, Вы писали:

MS>Причем, вне зависимости от каких-либо X,Y. Поскольку Base не имеет сигнатур, описанных в IA, то и использование Base в качестве интерфеса становится невалидным.


Собственно это я и хотел услышать.

MS>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>Я имею в виду — кто эту бяку обнаружит?

Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[18]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 00:26
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:


MS>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>Я имею в виду — кто эту бяку обнаружит?

AVK>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


Смею тебя уверить что именно компилятор ругнется. Типа: IA не имплементирован полностью в классе X.
Re[18]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 03:06
Оценка: :)
Здравствуйте, c-smile, Вы писали:

CS>Тут некий симбиоз:

CS>Операция получения интерфейса — статитческая. Но сама интерфейсная ссылка которя уже
CS>есть нечто типа
CS>IRef<typename A> 
CS>{
CS>  A *pa;
CS>  void* methods[] = {   
CS>    void (*A::Foo)();
CS>    int  (*A::Bar1)();
CS>    int  (*A::Bar2)(int);
CS>    ....
CS>  };
CS>}


[. . .]

Что-то мне это навевает... Старую-древнюю имплементацию виртуальных функций в C++, где каждый объект хранил не указатель на vtbl, а саму vtbl целиком.

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

Но они, конечно же, презрительно ухмыльнутся и скажут, "да ччо вы тут вааще возитесь, на спичках экономите — в си-шарпе уже все сделато и придумато".
Не работает, правда ни хрена, но это же мелочи. Главное — идея!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[21]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 11:14
Оценка: +1
Здравствуйте, McSeem2, Вы писали:

MS>Пардон. Это AndrewVK неверно ответил на вопрос и ввел меня в заблуждение.



А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[22]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 14:37
Оценка: -1
Здравствуйте, AndrewVK, Вы писали:

MS>>Пардон. Это AndrewVK неверно ответил на вопрос и ввел меня в заблуждение.

AVK>

Я чувствую здесь какое-то недопонимание. Собираю по частям.

AVK>class Base {}

AVK>interface IA
AVK>{
AVK>    void Foo();
AVK>}

AVK>class X : Base, IA
AVK>{
AVK>    void Bar1(); // адрес метода в памяти 0001
AVK>    void Foo(); // адрес метода в памяти 0002
AVK>}

AVK>class Y : Base, IA
AVK>{
AVK>    void Foo(); // адрес метода в памяти 0003
AVK>    void Bar2(); // адрес метода в памяти 0004
AVK>}

AVK>...

AVK>Base[] bs = new Base[]{new X(). new Y()};
AVK>(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
AVK>(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003


MS>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>Я имею в виду — кто эту бяку обнаружит?

AVK>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


Ну и вот. "Ответ не верный. Ваше очко переходит залу"...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[11]: Unintrusive Retroactive Polymorphism
От: WolfHound  
Дата: 07.01.05 20:51
Оценка: +1
Здравствуйте, AndrewVK, Вы писали:

ПК>>Оптимизация была сделана ранее: примитивные типы отделили от остальных, хотя на логическом уровне оставили их наследниками Object. Вот это и было оптимизацией. Боксинг — следствие принятой (для оптимизации) модели.

AVK>Паша, зуб даю, генезис боксинга совершенно иной. Не общий корень привел к боксингу, а наоборот, наличие автобоксинга позволило на логическом уровне ввести общий корень. Чтобы понять это достаточно взглянуть на Java, где никакого общего корня для value-типов отродясь не было, зато боксинг в определенном классе приложений присутствует в лучшем виде, только ручной (см. к примеру класс java.lang.Integer).
Так value типы и есть оптимизация из-за которой понадобился боксинг...
Назови хоть одну причину (кроме производительность и потребления памяти те забиваем на оптимизацию на уровне языка пусть jit все разруливает как ему хочется) по которой int не может быть ссылочным типом.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[12]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 22:37
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>Так value типы и есть оптимизация из-за которой понадобился боксинг...

WH>Назови хоть одну причину (кроме производительность и потребления памяти те забиваем на оптимизацию на уровне языка пусть jit все разруливает как ему хочется) по которой int не может быть ссылочным типом.

Так изначально то речь шла про то что автобоксинг это следствие оптимизации. На самом же деле причиной возникновения автобоксинга (а не value типов!) она не была.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[11]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.05 19:00
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>heron:interface/c++:templates это статическое связывание — нахождение адреса функции в compile/link time.

CS>с#:interface это динамическое связывание — нахождение функции в runtime.

Ну, а как на счет предсказания избыточности виртуальности и устранение ее при jit-компиляции или компиляции при инсталляции?

Весдь единственный недостаток runtime-полиморфизма это более медленный вызов методов и отсуствие возможности инлайнинга. При наличии описанной выше оптимизации в итоге получаем:
1. Гибкость runtime-полиморфизма (всегда!).
2. Скорость статического полиморфизма (там где это принципиально возможно).
3. Отсуствия необходимости засорять голову раздумьями какой из видов полиморфизма нужен.

В итоге получаем возможность недумая получать все что нужно.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 12.01.05 01:25
Оценка: :)
VladD2,

> Дык Шарп ростет из Явы. В яве уже были примитивные вэлью-типы. Так что оптимизация была сделана до него. А АВК говорит о том, что ПК неврено назвал боксинг оптимизацией.


ПК боксинг оптимизацией не называл, а сказал, что боксинг является следствием оптимизации. Почувствуйте разницу. Если рассматривать боксинг в плане быстродействия, то его скорее можно назвать пессимизацией
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[14]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 22:13
Оценка: :)
Здравствуйте, VladD2, Вы писали:

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


Как сказал некий рыцарь Ланцелот из фильма "Убить дракона",

Я начал завидовать рабам. Они все знают заранее. У них тверррдые убеждения. Наверное потому, что у них нет выбора. А рыцарь — он всегда на растутье дорог.

McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[35]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.01.05 22:05
Оценка: +1
Здравствуйте, McSeem2, Вы писали:

MS>Но как только дело доходит до хоть сколько-нибудь серьезных high-performance задач


Задача задаче рознь. Отнюдь не все high-performance задачи это числомолотилки. И отключать мозги тоже не получится. Поверь — существует масса очень сложных задач, для которых быстрое перелопачивание памяти не главное.
И вобще — не нравится мне твой снобизм. То одни товарищи тут убеждали что прикладники заведомо глупее писателей драйверов, теперь вот ты про отключение мозгов заговорил. Не стоит делать картину черно-белой. Попробуй вон к примеру решить любую задачку для януса из тех что на повестке дня, а потом мы посмотрим как ты без мозгов напрограммируешь.
... << RSDN@Home 1.1.4 beta 3 rev. 283>>
AVK Blog
Re[39]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 15.01.05 00:00
Оценка: +1
Здравствуйте, McSeem2, Вы писали:

AVK>>И что тогда в этом плохого?


MS>Именно то, что позволяет халтурить.


А я называю это больше времени уделять основной задаче.

MS> Ты — высокоорганизованный и высокоморальный экземпляр. А сколько халтурщиков слетается на эту профанацию?


Халтурщики, они видишь ли, просто есть. И на чем халтурить — на С++ или C# им совершенно без разницы, уж поверь.

MS>Наверное, это перестанет быть препятствием только тогда, когда вся эта безопасность будет обеспечиваться на уровне железа. Что там говорил Gaperton про аппаратные Java-машины на майнфреймах IBM?


А у нас вот к примеру на текущем проекте все упирается совсем не в нетовский код. Или в янусе — за все тормоза тоже исключительно неуправляемый код ответственнен, тормозов из-за джита или GC еще ни разу не было.

MS>А самый крутой консультант — знаешь какой?


Знаю. Такой как я

MS>>>Навеяло: <b>История одного байта</b>

MS>>>Вот я — примерно из этой категории. Это не хорошо и не плохо. Это просто есть.

AVK>>Всего лишь свидетельство узости мышления. Ничего интересного.


MS>Точно так же я мог бы объявить и тебя в "узости мышления" и нежелании видеть красоту в чем-то другом, кроме дот-нет.


Почему? Я ведь не утверждаю что С++ годится только для дурацких программ, а настоящая элита юзает дотнет.
... << RSDN@Home 1.1.4 beta 3 rev. 283>>
AVK Blog
Re[31]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.05 01:08
Оценка: :)
Здравствуйте, McSeem2, Вы писали:

MS>Просто Павел уже достиг следующей стадии просветления, пока что недоступной тебе


Ну, с твоего орлиного полета виднее.

MS> Если говорить очень-очень утрированно, то это звучит так:


MS>Первый уровень. "Не понимаю, зачем вообще нужно это наследование".

MS>Второй уровень. "Единственный способ написать правильную программу — это использовать наследование".
MS>Третий уровень. "Концепция наследования — это атрофизм, не имеющий ничего общего с решаемыми задачами, и чем его меньше — тем лучше".

Ну, жалаю благополучно добраться до первого уровня.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[38]: Unintrusive Retroactive Polymorphism
От: WolfHound  
Дата: 23.01.05 15:45
Оценка: :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Это проходит Это тоже стадии

AVK>Стадия первая: нравится вобще что то писать
AVK>Стадия вторая: просто писать не интересно, надо писать то что не могут другие. Например хитрые драйвера, вирусы.
AVK>Стадия третья: писать всякую фигню уже не интересно, начинаешь писать то что нужно реально, но при этом так, чтобы круче чего нибудь общепринятого. Например по скорости.
AVK>Стадия четвертая: заниматься оптимизацией надоедает. Начинаешь писать фреймворки.
AVK>Стадия пятая: наконец то главным критерием становится решение задачи за минимальные сроки с максимальным качеством
AVK>Стадия шестая: становишься консультантом
А еще левелы есть? А то я уже на пятом
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 05.01.05 05:20
Оценка:
c-smile,

> Наткнулся вот на Heron Programming Language

> В котором замечена интересная концепция интерфейсов (вернее их как бы отсутствия)
>

> retrofit polymorphism : Heron does not require a class to explicitly state which interfaces it implements, interface implementation is determined by whether the function signatures match


Гм... Структурная совместимость типов. Скажем, в C++ выражена шаблонами. В чем новизна подхода Heron?.. Правильно ли я понял, что в том, что подход "легализован" на уровне "основного" синтаксиса языка?

> Показалось интересным.


+1. Спасибо.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Unintrusive Retroactive Polymorphism
От: Зверёк Харьковский  
Дата: 05.01.05 07:12
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Наткнулся вот на Heron Programming Language

wow! очень занятно!
сам слушаю и вам рекомендую: Настя — Ветер
FAQ — це мiй ай-кью!
Re[3]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 05.01.05 21:40
Оценка:
c-smile,

> В .NET и Java получение ссылки на интерфейс от объекта:

>
> ISomething ismt = (ISomething)obj;
>

> вельми дорогостоящая операция.

А если в C# obj — value-тип, то использование полученной ссылки на интерфейс еще и чревато нарушением ожиданий программиста, т.к. ismt ссылается на (неявно созданную) копию, а не оригинальный obj.

> В Heron же операция получения интерфейса

>
> animal = @dog;
>

> это фактически образование (compile time) таблицы method references — (this,funcptr)

И что интересно, здесь, в отличие от примера выше с value-типами в C#, все будет работать, как ожидается. Т.е. изменения, осуществленные через ссылку на интерфейс animal, отразятся на объекте dog.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.05 22:02
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>А если в C# obj — value-тип, то использование полученной ссылки на интерфейс еще и чревато нарушением ожиданий программиста,


Вобще то любой нормальный программист о боксинге знает.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[6]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 05.01.05 23:25
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> Вобще то любой нормальный программист о боксинге знает.


ПК>Это не означает, что он его везде ожидает


Ну это примерно как вызов виртуальной функции в конструкторе в плюсах. Там типа тоже программист ожидает что все будет работать .
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[6]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 06.01.05 00:20
Оценка:
AndrewVK,

> CS>Когда я "забираю" интерфейс у какого-нибудь класса я при компиляции знаю его состав функций (сигнатуры)

> CS>и могу эффективно построить интерфейсную таблицу.
> CS>
> CS>IAnimal animal;
> CS>


> А где гарантия что ты у класса вобще когда либо попросишь этот интерфейс? Или компилятор выполняет перемножение всех классов и всех интерфейсов и строит для всех валидных комбинаций таблицы?


Нет, вместо этого он строит "интерфейсную таблицу" только в момент, когда встретит приведение класса к интерфейсу.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 00:53
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, c-smile, Вы писали:


CS>>Дело в том что в C# статического полиморфизма (templates) нет как класса.


AVK>Статический полиморфизм бывает отнюдь не только ввиде плюсовых шаблонов. Перегрузка функций, к примеру, это тоже статический полиморфизм. Кроме того правила неявной реализации интерфейсов в дотнете тоже очень похожи и делаются как раз компилятором. Собственно в случае неполиморфного кода конечный код в шарпе и в вышеупомянутом языке будет очень похож.


"Перегрузка функций" что имеется ввиду?


AVK>Все относительно. Размер imap равен количеству загруженных на момент загрузки класса интерфейсов. Поскольку интерфейсов и классов как правило довольно конечное количество, то реальный перерасход памяти ничтожный. Опять же — все равно твое предположение совершенно неверно, поскольку дорогостояща в шарпе механика интерфейсов, но никак не механика приведения, о которой ты вел речь.


Спасибо, т.е. как я понимаю динамическое построение этих imap перенесено в load time?

CS>>Можешь прояснить такой момент: скажем у меня есть в сборке N интерфейсов и M классов.

CS>>Как я понимаю по твоей схеме каждый класс должен включать N entries под все возможные интерфейсы.
CS>>Т.е. имеем фактически N*M таблицу. Я правильно все понял?

AVK>Нет. Во-первых сборки тут совершенно не при чем. Во-вторых N = количеству загруженных на момент загрузки класса интерфейсов.


Ясно. Т.е. ClassLoader как сущность "зарезана" сразу. Я правильно понял?

CS>>Ну при использовании templates динамическая виртуальность заменяется на статическую. Что заведомо более эффективно.


AVK>Если на этапе компиляции известен и тип и шаблон.


Да конечно. Но это известно в 99% случаев. Т.е. на 99% эффективно.
Для случаев когда не известно или когда это вредит принципиально (модульная независиомость, межязыковые интерфейсы)
есть всякие разные полезные механизмы.

CS>>Тот же самый ATL/WTL построен как раз на принципах минимизации исп. vtbl.

AVK>Я в курсе. ИМХО экономия на спичках.

В тех облястях где мне приходится работать эти "спички" называются шведскими. Каждая по 6 дюймов.

AVK>>>Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.

CS>>Я совсем не понимаю что ты имеешь ввиду под "полиморфный код".

AVK>
AVK>class Base {}
AVK>class C : Base, IA {}
AVK>interface IA {}
AVK>...
AVK>Base b = new C();
AVK>IA ia = (IA)b; // здесь компилятор отрезолвить интерфейс не может
AVK>


А для чего его резолвить если он не используется? А если он используется то должен быть объявлен.
Или я не понял опять чего?

CS>>Когда я "забираю" интерфейс у какого-нибудь класса я при компиляции знаю его состав функций (сигнатуры)

CS>>и могу эффективно построить интерфейсную таблицу.
CS>>
CS>>IAnimal animal;
CS>>


AVK>А где гарантия что ты у класса вобще когда либо попросишь этот интерфейс? Или компилятор выполняет перемножение всех классов и всех интерфейсов и строит для всех валидных комбинаций таблицы?


Зачем ему перемножать?

IAnimal — это просто список сигнатур функций в compile time. В runtime это указатель на статическую таблицу адресов.
Получение (суть построение) такого списка ( таблицы адресов методов) для данного класса — тривиальная задача компилятора/компоновщика.

CS>>в рантайм пустой (null) но присвоение устанавливает ему this плюс адрес на некую статическую таблицу построенную в

CS>>compile time.
AVK>Т.е. при динамической загрузке это работать не будет.

Ты имеешь ввиду late binding в стиле IDispatch?
Если да, то я могу точно также динамически построить эту таблицу например по списку экспорта DLL.

Давай я еще раз подчеркну основные фенечки:

Polymorphism without Space Overhead
Because polymorphism is provided externally to a class, it means that any class can be used polymorphically and also that there is no overhead of vtable pointers within a class. Most OOP languages, if not all, require a significant overhead to provide polymorphic behaviour.

The only caveat is that the interface references are typically twice the width of an an ordinary reference ( technically this is not neccessarily the case, as I will explain below ). On the other hand the overhead of multiple interface implementation in other languages is considerably more significant.

Polymorphism only when Needed
Another advantage of the Heron interfaces approach, is that you don't need to incur any of the cost of run-time polymorphism, until when and if you explicitly require it. That cost includes the inability to inline functions, the performance hit of dynamic dispatch and the space overhead of function dispatch tables.



AVK>Честно говоря особой полезности я так и не ощутил. Очень сомнительная фича.

Для .NET, согласен, бенифитов не будет при выбранноей архитектуре. Более того — я так понимаю принципиально невыполнимая.
Re[7]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 12:06
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Нет, вместо этого он строит "интерфейсную таблицу" только в момент, когда встретит приведение класса к интерфейсу.


Т.е. либо в полиморфном коде это не работает, либо он делает это в рантайме.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[7]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 12:06
Оценка:
Здравствуйте, c-smile, Вы писали:

AVK>>Статический полиморфизм бывает отнюдь не только ввиде плюсовых шаблонов. Перегрузка функций, к примеру, это тоже статический полиморфизм. Кроме того правила неявной реализации интерфейсов в дотнете тоже очень похожи и делаются как раз компилятором. Собственно в случае неполиморфного кода конечный код в шарпе и в вышеупомянутом языке будет очень похож.


CS>"Перегрузка функций" что имеется ввиду?


Обычное объявление функций с одинаковым именем и разными параметрами. Пример использования этого полиморфизма — паттерн посетитель.

CS>Спасибо, т.е. как я понимаю динамическое построение этих imap перенесено в load time?


Да.

AVK>>Нет. Во-первых сборки тут совершенно не при чем. Во-вторых N = количеству загруженных на момент загрузки класса интерфейсов.


CS>Ясно. Т.е. ClassLoader как сущность "зарезана" сразу. Я правильно понял?


Да. В дотнете все несколько иначе устроено по сравнению с джавой, хотя домен загрузки в неявном виде присутствует.

AVK>>Если на этапе компиляции известен и тип и шаблон.


CS>Да конечно. Но это известно в 99% случаев. Т.е. на 99% эффективно.


Зависит от приложения. Но как только к примеру в сервере приложений переходим на динамический деплоймент, ни о каких 99% говорить уже не приходится. То же самое в дизайн-тайме.

CS>Для случаев когда не известно или когда это вредит принципиально (модульная независиомость, межязыковые интерфейсы)

CS>есть всякие разные полезные механизмы.

Ага, например СОМ. Беда только в том что это сильно усложняет поддержку компонентности.

CS>>>Тот же самый ATL/WTL построен как раз на принципах минимизации исп. vtbl.

AVK>>Я в курсе. ИМХО экономия на спичках.

CS>В тех облястях где мне приходится работать эти "спички" называются шведскими. Каждая по 6 дюймов.


Ну например замена WndProc на статический код разумна разве что только на каких нибудь мобильных устройствах. Win GUI давно не та область, где настолько критично быстродействие.

AVK>>
AVK>>class Base {}
AVK>>class C : Base, IA {}
AVK>>interface IA {}
AVK>>...
AVK>>Base b = new C();
AVK>>IA ia = (IA)b; // здесь компилятор отрезолвить интерфейс не может
AVK>>


CS>А для чего его резолвить если он не используется?


Почему не используется? Ну добавь в конец вызов какого нибудь метода IA.

CS>А если он используется то должен быть объявлен.


Кто объявлен? Интерфейс? Так он в примере объявлен. Просто компилятор не может знать что в итоге в программе будет запрос IA у класса С.

AVK>>А где гарантия что ты у класса вобще когда либо попросишь этот интерфейс? Или компилятор выполняет перемножение всех классов и всех интерфейсов и строит для всех валидных комбинаций таблицы?


CS>Зачем ему перемножать?


CS>IAnimal — это просто список сигнатур функций в compile time. В runtime это указатель на статическую таблицу адресов.


Но для каждого класса эта таблица будет своей!

CS>Получение (суть построение) такого списка ( таблицы адресов методов) для данного класса — тривиальная задача компилятора/компоновщика.


Но ты же не знаешь у какого класса какой интерфейс мы попросим. В результате тебе придется строить такие таблицы для всех валидных комбинаций классов и интерфейсов. Итого имея 100 интерфейсов и 100 классов, которые по сигнатуре к ним подходят, получим что нужно будет построить 10000 таких таблиц.

CS>>>в рантайм пустой (null) но присвоение устанавливает ему this плюс адрес на некую статическую таблицу построенную в

CS>>>compile time.
AVK>>Т.е. при динамической загрузке это работать не будет.

CS>Ты имеешь ввиду late binding в стиле IDispatch?

CS>Если да, то я могу точно также динамически построить эту таблицу например по списку экспорта DLL.

И получится дотнет, только тормознее .

CS>Давай я еще раз подчеркну основные фенечки:

CS>

CS>Polymorphism without Space Overhead
CS>Because polymorphism is provided externally to a class, it means that any class can be used polymorphically and also that there is no overhead of vtable pointers within a class. Most OOP languages, if not all, require a significant overhead to provide polymorphic behaviour.

CS>The only caveat is that the interface references are typically twice the width of an an ordinary reference ( technically this is not neccessarily the case, as I will explain below ). On the other hand the overhead of multiple interface implementation in other languages is considerably more significant.

CS>Polymorphism only when Needed
CS>Another advantage of the Heron interfaces approach, is that you don't need to incur any of the cost of run-time polymorphism, until when and if you explicitly require it. That cost includes the inability to inline functions, the performance hit of dynamic dispatch and the space overhead of function dispatch tables.


Ну собственно в дотнете все эти бенефиты присутствуют, притом побочных эффектов куда меньше.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[8]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 12:06
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Не совсем: тамошнему поведению объяснение исключительно в пожелании так сделать, в стремлении к безопасности, т.е. предотвратить работу с несконструированным классом. Боксинг же — следствие оптимизации.


Какой оптимизации? Чего то я видимо недопонимаю. Автобоксинг никакого отношения к оптимизации не имеет. Это просто такая фишка, которую обычно делают вручную, когда хотят написать полиморфный код, использующий примитивные типы. К примеру держишь ты в памяти строку из БД. А там и int, и float, и string, и byte[]. И хранить это нужно в одной коллекции. Вот тут тебе и придется либо боксить, либо приводить все к void*. .NET всего лишь умеет это делать прозрачно. И оптимизация тут вобще никаким боком.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[8]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 06.01.05 15:30
Оценка:
AndrewVK,

> ПК> Нет, вместо этого он строит "интерфейсную таблицу" только в момент, когда встретит приведение класса к интерфейсу.


> Т.е. либо в полиморфном коде это не работает, либо он делает это в рантайме.


Делается все это во время компиляции. Работает ли это "в полиморфном коде" — зависит от определения "полиморфного кода". Если речь идет о коде, работающем через ссылки на интерфейсы, то работать будет. Если о чем-то другом — тогда я тебя просто не понимаю.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 06.01.05 15:35
Оценка:
AndrewVK,

> ПК> Не совсем: тамошнему поведению объяснение исключительно в пожелании так сделать, в стремлении к безопасности, т.е. предотвратить работу с несконструированным классом. Боксинг же — следствие оптимизации.


> Какой оптимизации?


Оптимизация была сделана ранее: примитивные типы отделили от остальных, хотя на логическом уровне оставили их наследниками Object. Вот это и было оптимизацией. Боксинг — следствие принятой (для оптимизации) модели.

> К примеру держишь ты в памяти строку из БД. А там и int, и float, и string, и byte[]. И хранить это нужно в одной коллекции. Вот тут тебе и придется либо боксить, либо приводить все к void*.


Верно. Но есть и другие случаи полиморфной работы с объектами разных типов, где можно было бы обойтись без боксинга. В предложенной модели это организуется легко путем привязки интерфейсов в момент преобразования, а не в момент проектирования типов.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 17:40
Оценка:
Здравствуйте, AndrewVK, Вы писали:


CS>>IAnimal — это просто список сигнатур функций в compile time. В runtime это указатель на статическую таблицу адресов.


AVK>Но для каждого класса эта таблица будет своей!


CS>>Получение (суть построение) такого списка ( таблицы адресов методов) для данного класса — тривиальная задача компилятора/компоновщика.


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


Ты не понял. Еще раз — это фактически механизм template instantiation чего в С# в принципе нет.

template<typename T>
void foo(T t)
{
  t.bar();
}


Эта декларация не значит того что я генерю вызовы bar() для всех возможных классов, правда?
Т.е. интерфейсы строятся on demand — только тогда когда я этого прошу и хочу.

CS>>Давай я еще раз подчеркну основные фенечки:

CS>>

CS>>Polymorphism without Space Overhead
CS>>Because polymorphism is provided externally to a class, it means that any class can be used polymorphically and also that there is no overhead of vtable pointers within a class. Most OOP languages, if not all, require a significant overhead to provide polymorphic behaviour.

CS>>The only caveat is that the interface references are typically twice the width of an an ordinary reference ( technically this is not neccessarily the case, as I will explain below ). On the other hand the overhead of multiple interface implementation in other languages is considerably more significant.

CS>>Polymorphism only when Needed
CS>>Another advantage of the Heron interfaces approach, is that you don't need to incur any of the cost of run-time polymorphism, until when and if you explicitly require it. That cost includes the inability to inline functions, the performance hit of dynamic dispatch and the space overhead of function dispatch tables.


AVK>Ну собственно в дотнете все эти бенефиты присутствуют, притом побочных эффектов куда меньше.


Извини, но последний раз эту фразу я слышал в варианте "все равно его не брошу потому что он хороший" примерно с тем же уровнем аргументации.

Ну как так можно?
Ты же сам говоришь про побочные эффекты....
Этот неуклюжий боксинг, imap и все остальное просто не нужны при наличии template/heron::interface. Или это не понятно?
Re[9]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 19:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Делается все это во время компиляции. Работает ли это "в полиморфном коде" — зависит от определения "полиморфного кода". Если речь идет о коде, работающем через ссылки на интерфейсы, то работать будет. Если о чем-то другом — тогда я тебя просто не понимаю.


Я пример привел.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[10]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 19:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Оптимизация была сделана ранее: примитивные типы отделили от остальных, хотя на логическом уровне оставили их наследниками Object. Вот это и было оптимизацией. Боксинг — следствие принятой (для оптимизации) модели.


Паша, зуб даю, генезис боксинга совершенно иной. Не общий корень привел к боксингу, а наоборот, наличие автобоксинга позволило на логическом уровне ввести общий корень. Чтобы понять это достаточно взглянуть на Java, где никакого общего корня для value-типов отродясь не было, зато боксинг в определенном классе приложений присутствует в лучшем виде, только ручной (см. к примеру класс java.lang.Integer).

>> К примеру держишь ты в памяти строку из БД. А там и int, и float, и string, и byte[]. И хранить это нужно в одной коллекции. Вот тут тебе и придется либо боксить, либо приводить все к void*.


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


Например?

ПК> В предложенной модели это организуется легко путем привязки интерфейсов в момент преобразования, а не в момент проектирования типов.


А в дотнете дженериками.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[11]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 20:28
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А в дотнете дженериками.


Две большие разницы как говорят в Одессе.

Generics and templates have a minor overlap in functionality. They both make it possible to create parameterized types which make it possible to create type safe collections. That’s where the similarity stops. First, let’s look at some features templates allow and how they are interpreted. I’ll assume that you know the syntax for templates.

Templates are instantiated at compile-time with the source code.
Templates are type safe.
Templates allow user-defined specialization.
Templates allow non-type parameters.
Templates use “lazy structural constraints”.
Templates support mix-ins.
Templates are instantiated at compile-time. This is huge. Anyone who really wants to understand the limitations of either generics or templates needs to know this.


Далее про блеск и нищету куртизанок читаем здесь:
http://blogs.msdn.com/branbray/archive/2003/11/19/51023.aspx
Re[10]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 20:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Теперь поговорим о реализации... VMT...


Забудь про VMT.

heron:interface/c++:templates это статическое связывание — нахождение адреса функции в compile/link time.
с#:interface это динамическое связывание — нахождение функции в runtime.

Я не знаю уже как это объяснить, я пасс. Anybody else?

Я думаю имеет смысл прочесть сравнение templates vs. generics.
http://blogs.msdn.com/branbray/archive/2003/11/19/51023.aspx
Это как раз в тему.
Re[10]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 21:28
Оценка:
AVK>Это ты похоже чего то непонимаешь. Еще раз пример, более подробно:
AVK>
AVK>class Base {}
AVK>interface IA
AVK>{
AVK>    void Foo();
AVK>}
AVK>class X : Base, IA
AVK>{
AVK>    void Bar1(); // адрес метода в памяти 0001
AVK>    void Foo(); // адрес метода в памяти 0002
AVK>}
AVK>class Y : Base, IA
AVK>{
AVK>    void Foo(); // адрес метода в памяти 0003
AVK>    void Bar2(); // адрес метода в памяти 0004
AVK>}
AVK>...
AVK>Base[] bs = new Base[]{new X(). new Y()};
AVK>(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
AVK>(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003
AVK>


Heron:


class X {
  void Bar1(); 
  void Foo(); 
}
class Y {
  void Bar2(); 
  void Foo(); 
}

interface IFoo
{
   void Foo();
}

IFoo foos[] = { new X(), new Y() } 
/* в этой строке произойдет построение локальных интерфейсных
таблиц IFoo для классов X и Y и ссылки на них сохранятся в экземлярах IFoo */

foos[0].Foo();
foos[1].Foo();


Как ты можешь заметить VMT (виртуальное наследование) здесь не нужны.
Т.е. Base тебе не нужен в принципе.

Объявляя IFoo ты просто говоришь: мне нужны адреса объектов и адреса их методов Foo из разных классов.
Re[11]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 22:17
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Как ты можешь заметить VMT (виртуальное наследование) здесь не нужны.


Какой ты хитрый. Я тебя не спрашиваю как мне полиморфный код сделать неполиморфным. Для примера делать это бессмысленно, поскольку это игрушечный код. Убери к примеру из одного из классов метод Foo () (и вызов его соотв.), а в контейнере класс оставь, и все, приехали. Я тебя спрашивал как в Хероне будет реализован тот код что я привел. Если не знаешь как, так и скажи, а не увиливай от ответа.

CS>Т.е. Base тебе не нужен в принципе.


Я сам буду решать, что мне нужно. Вот к примеру типичный вариант использования интерфейсов.
interface ISupportInitialize
{
    void Initialize();
}

class Control {}

class SomeCustomControl : Control, ISupportInitialize
{
    public void Initialize();
}

...

foreach (ControlDescription cd in ControlDescriptions)
{
    Control c = CreateControl(cd);
    ISupportInitialize isi = c as ISupportInitialize;
    if (isi != null)
        isi.Initialize();
}
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[12]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 06.01.05 22:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Какой ты хитрый. Я тебя не спрашиваю как мне полиморфный код сделать неполиморфным. Для примера делать это бессмысленно, поскольку это игрушечный код. Убери к примеру из одного из классов метод Foo () (и вызов его соотв.), а в контейнере класс оставь, и все, приехали.


А правда, что будет? Я так полагаю, что просто компилятор заругается вот в этой строке:

IFoo foos[] = { new X(), new Y() }


Аналогично тому, как C++ ругается на попытку инстанциировать и использовать шаблон с аргументом, у которого чего-то не хватает.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[13]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 06.01.05 22:51
Оценка:
Здравствуйте, McSeem2, Вы писали:

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


MS>А правда, что будет? Я так полагаю, что просто компилятор заругается вот в этой строке:


MS>
MS>IFoo foos[] = { new X(), new Y() } 
MS>


MS>Аналогично тому, как C++ ругается на попытку инстанциировать и использовать шаблон с аргументом, у которого чего-то не хватает.


Да именно так и будет. Т.е. IFoo интерфейс не может быть построен для класса у которого
нет функции Foo. Иными словами : класс Z не удовлетворяет спецификации интерфейса IW.

Собственно heron:interface это есть описание опять же некоего шаблона которому должен
удовлетворять класс.

template в C++ делает примерно то же самое но неявно. Эта вот неявность например
приводит к логическим конфликтам когда два метода int Foo() и void Foo() неразличимы для механизма C++:templates

template<typename T>
  void Bar(T& t) {  
   t.Foo(); // здесь проблема - какую Foo подставлять.
}


С interface было бы проще — там можно четко указать сигнатуру. Т.е.


interface IW 
{
  int Foo();
}

void Bar(IW t) 
{  
   t.Foo(); // здесь проблемы нет
}
Re[13]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 23:06
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>А правда, что будет? Я так полагаю, что просто компилятор заругается вот в этой строке:


Я говорил об исходном примере. Там компилятор ругатся не будет.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[14]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 06.01.05 23:10
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Я говорил об исходном примере. Там компилятор ругатся не будет.


Я что-то запутался, какой конкретно "исходный пример" имеется в виду. Можно его еще раз в студию?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[15]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.01.05 23:14
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Я что-то запутался, какой конкретно "исходный пример" имеется в виду. Можно его еще раз в студию?


class Base {}

interface IA
{
    void Foo();
}

class X : Base, IA
{
    void Bar1(); // адрес метода в памяти 0001
    void Foo(); // адрес метода в памяти 0002
}

class Y : Base, IA
{
    void Foo(); // адрес метода в памяти 0003
    void Bar2(); // адрес метода в памяти 0004
}

...

Base[] bs = new Base[]{new X(). new Y()};
(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[16]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 06.01.05 23:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>
AVK>class Base {}

AVK>interface IA
AVK>{
AVK>    void Foo();
AVK>}

AVK>class X : Base, IA
AVK>{
AVK>    void Bar1(); // адрес метода в памяти 0001
AVK>    void Foo(); // адрес метода в памяти 0002
AVK>}

AVK>class Y : Base, IA
AVK>{
AVK>    void Foo(); // адрес метода в памяти 0003
AVK>    void Bar2(); // адрес метода в памяти 0004
AVK>}

AVK>...

AVK>Base[] bs = new Base[]{new X(). new Y()};
AVK>(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
AVK>(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003
AVK>


Понятно. В рамках херона (или как его там), ошибка будет здесь:

AVK>
AVK>(IA)bs[0].Foo(); // здесь должен быть вызов по адресу 0002
AVK>(IA)bs[1].Foo(); // а здесь должен быть вызов по адресу 0003
AVK>


Причем, вне зависимости от каких-либо X,Y. Поскольку Base не имеет сигнатур, описанных в IA, то и использование Base в качестве интерфеса становится невалидным. Это статический, compile time полиморфизм, почти то же что и шаблоны, но с более строгой спецификацией сигнатур интерфейсных функций.

А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?
Я имею в виду — кто эту бяку обнаружит?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[17]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 00:01
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Т.е. ты утверждаешь что вот это вот валидная конструкция?


Забавно . Нет. Неужели ты не понял о чем речь? Еще раз задаю вопрос — будет ли в Хероне работать мой пример без изменений? И если будет то каким образом?
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[13]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 00:01
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это не я хитрый, а автор Heron'a умный.


Он тут не при чем. Я задал тебе конкретный вопрос и до сих пор не получил ответа.

AVK>>Я сам буду решать, что мне нужно. Вот к примеру типичный вариант использования интерфейсов.


CS>Ничего ты не можешь решать.


Забавно

CS>Статический полиморфизм тебе не дан большими дядями.


Я тебе уже говорил — статический полиморфизм это не только шаблоны. Кстати, было бы интересно посмотреть на ассемблерный код приведенного тобой примера.

CS>Т.е. для примера предлагаемого тобой (ниже) я могу выбрать наиболее оптимальное и эффективное решение.


Мне не надо другое решение. Мне нужен конкретный ответ на конкретный вопрос — реализуемо ли это решение на Хероновских интерфейсах.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[17]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 00:23
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>... Это статический, compile time полиморфизм, почти то же что и шаблоны, но с более строгой спецификацией сигнатур интерфейсных функций.


Тут некий симбиоз:
Операция получения интерфейса — статитческая. Но сама интерфейсная ссылка которя уже
есть нечто типа

IRef<typename A>
{
A *pa;
void* methods[] = {
void (*A::Foo)();
int (*A::Bar1)();
int (*A::Bar2)(int);
....
};
}

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

В принципе это то что в c-smile было определено как object-method-reference — тип
значения содержащий и this и method указатели как один агрегат.

Т.е. всякого рода events и listeners делались просто:

observable.onclick = observer@click_handler_method;

В случае же с heron все еще красивее: имплементация сигналов (signal) например это просто


interface IOnClick {
  void onclick();
}

class Observable 
{
  IOnClick onclick;
}

class Observer
{
  void onclick() { printf("Gotcha!"); }
}

Observable observable;
Observer   observer;

observable.onclick = @observer;


По моему очень бы С++ выиграл от таких возможностей.
Re[18]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 00:38
Оценка:
Здравствуйте, AndrewVK, Вы писали:

MS>>Причем, вне зависимости от каких-либо X,Y. Поскольку Base не имеет сигнатур, описанных в IA, то и использование Base в качестве интерфеса становится невалидным.


AVK>Собственно это я и хотел услышать.


Дык! Я вообще не понимаю, о чем такой мощный флейм. Есть статический полиморфизм, есть динамический полиморфизм, между ними существует фундаментальная разница. В C# это все свалено в одну кучу и дядя-компилятор сам решает (по вторичным половым признакам), чего же тебе на самом деле надо.

А в свете того, что "Unintrusive Retroactive Polymorphism" является принципиально статическим и все происходит в compile time, то фраза

А какие от этого бенефиты, кроме повышения зависимости от опечаток?

теряет всякий смысл.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[14]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 07.01.05 00:38
Оценка:
AndrewVK,

> Мне не надо другое решение. Мне нужен конкретный ответ на конкретный вопрос — реализуемо ли это решение на Хероновских интерфейсах.


Нет, но это реализуемо на обычных абстрактных классах C++ при помощи dynamic_cast. Хероновские интерфейсы для других нужд.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[19]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 00:40
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Смею тебя уверить что именно компилятор ругнется. Типа: IA не имплементирован полностью в классе X.


Ты имеешь в виду C#? Если да, то что-то не верится. А если Heron, то он ругнется не на X а еще на Base.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[20]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 00:47
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Ты имеешь в виду C#? Если да, то что-то не верится.


Пардон. Это AndrewVK неверно ответил на вопрос и ввел меня в заблуждение. Конечно же, компилятор. В run-time будет исключение, если X забудут унаследовать от IA.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[18]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 01:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

CS>>Т.е. ты утверждаешь что вот это вот валидная конструкция?


AVK>Забавно . Нет. Неужели ты не понял о чем речь? Еще раз задаю вопрос — будет ли в Хероне работать мой пример без изменений? И если будет то каким образом?


Не будет, конечно же. AFAIU, вопросы позднего связывания данной (хероновской) конструкцией вообще не решаются. Наверняка там есть какие-то другие конструкции для этого, поскольку динамический полиморфизм заслуженно признан полезным и нужным.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[19]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 03:10
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Дык! Я вообще не понимаю, о чем такой мощный флейм. Есть статический полиморфизм, есть динамический полиморфизм, между ними существует фундаментальная разница. В C# это все свалено в одну кучу и дядя-компилятор сам решает (по вторичным половым признакам), чего же тебе на самом деле надо.


Ну, дык я и пытаюсь эту фундаментальную разницу объяснить.
...эх...ну в общем все как всегда...
Re[3]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.01.05 03:56
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>это фактически образование (compile time) таблицы method references — (this,funcptr)

CS>Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

Здорово (я не шучу). Это действительно можно было бы использовать для реализации идеи ограничений (констрэйнов) для параметов шаблонов С++ и тем самым хоть немного сняло бы сложность этого языка. Но... но рантайм полиморфизм через такой мехазнизв вроде как не возможен, а это резко усложнит ОО-дизайн и в итоге может привести к проблемам.

CS>Я считаю что механизм полезен и окажет свое воздействие на С++.


А вот вот в это я уже совсем не верю. С++ похоже уже будет развиваться только в сторону усложения. К тому же когда появится новый стандарт никому не ясно.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 03:58
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>
CS>>IRef<typename A> 
CS>>{
CS>>  A *pa;
CS>>  void* methods[] = {   
CS>>    void (*A::Foo)();
CS>>    int  (*A::Bar1)();
CS>>    int  (*A::Bar2)(int);
CS>>    ....
CS>>  };
CS>>}
MS>


MS>Что-то мне это навевает... Старую-древнюю имплементацию виртуальных функций в C++, где каждый объект хранил не указатель на vtbl, а саму vtbl целиком.


Я наверное неочевидно написал...

На самом деле так:
sizeof(IRef) == sizeof(void*) * 2; — два указателя: this и function table.

Т.е. по размеру один указатель на интерфейс эквивалентен member function pointer в C++
с чем уже все смирились

MS>В общем и целом, понадобилось много лет, чтобы осознать, что подобная схема имеет свои преимущества. Тем более, что как говорит Vlad2, память сейчас — это вообще не ресурс .

MS>Но они, конечно же, презрительно ухмыльнутся и скажут, "да ччо вы тут вааще возитесь, на спичках экономите — в си-шарпе уже все сделато и придумато".
MS>Не работает, правда ни хрена, но это же мелочи. Главное — идея!

)
Re[4]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 07.01.05 04:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, c-smile, Вы писали:


CS>>это фактически образование (compile time) таблицы method references — (this,funcptr)

CS>>Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

VD>Здорово (я не шучу). Это действительно можно было бы использовать для реализации идеи ограничений (констрэйнов) для параметов шаблонов С++ и тем самым хоть немного сняло бы сложность этого языка. Но... но рантайм полиморфизм через такой мехазнизв вроде как не возможен, а это резко усложнит ОО-дизайн и в итоге может привести к проблемам.


Угу, мне тоже понравилось. Не часто принципиальные идеи появляются.

Про рантайм: так как interface reference (a la Heron) это
пара {this, function table pointer} то на них красиво делаются
delegates (closures) например.

interface reference это как бы мост меж двух миров templates (static polymorph) и virtual (dynamic polymorph).

CS>>Я считаю что механизм полезен и окажет свое воздействие на С++.


VD>А вот вот в это я уже совсем не верю. С++ похоже уже будет развиваться только в сторону усложения. К тому же когда появится новый стандарт никому не ясно.


Есть такое дело со стандартами. И это наверное разумно. Не знаю.
Re[11]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 07.01.05 05:01
Оценка:
AndrewVK,

> ПК> Оптимизация была сделана ранее: примитивные типы отделили от остальных, хотя на логическом уровне оставили их наследниками Object. Вот это и было оптимизацией. Боксинг — следствие принятой (для оптимизации) модели.


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


А зачем изначально по-твоему было введено разделение на reverence- и value- типы? Скажем, в том же SmallTalk, тоже объектно-ориентированном языке, такого разделения нет. Там все типы — наследники Object.

>>> К примеру держишь ты в памяти строку из БД. А там и int, и float, и string, и byte[]. И хранить это нужно в одной коллекции. Вот тут тебе и придется либо боксить, либо приводить все к void*.


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


> Например?


Например, передать ссылку на базовый интерфейс в функцию, чтобы она через этот интерфейс данный объект изменила.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 06:34
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А то что слишком часто нам приходится петь песню про "sic transit gloria mundi" и компонентные технологии ...

CS>... все, все, молчу ...

По поводу "компонентных технологий" противоречие заключается в том, что современный C++ давно перерос парадигму о раздельной компиляции. Не говоря даже о шаблонах, динамический полиморфизм в эту парадигму уже не вписывается. Помню была десериализация, автоматически создающая нужные классы из потока через хитро организованную фабрику классов (по типу MFC). Так там самая большая засада была в том, что для всех классов надо было объявлять некие фиктивные объекты, чтобы линкер их подцепил, иначе заместо объекта будет создана пустышка, которая ни на что не годится.

CS>Ниччо, еще пара тройка Александреску и комитет шо хош утвердит лиш бы не смотреть на сие безобразие.


Ну да, еще Занавеску с Позаранку. Да, нужны, нужны доблестные братья румыны в комитете
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[15]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 11:14
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>но это реализуемо на обычных абстрактных классах C++ при помощи dynamic_cast.


А при чем тут С++?
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[19]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 11:14
Оценка:
Здравствуйте, c-smile, Вы писали:

MS>>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>>Я имею в виду — кто эту бяку обнаружит?

AVK>>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


CS>Смею тебя уверить что именно компилятор ругнется. Типа: IA не имплементирован полностью в классе X.


Читай внимательно вопрос.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[7]: Unintrusive Retroactive Polymorphism
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 07.01.05 11:43
Оценка:
Здравствуйте, AndrewVK, Вы писали:

>>> Вобще то любой нормальный программист о боксинге знает.

ПК>>Это не означает, что он его везде ожидает
AVK>Ну это примерно как вызов виртуальной функции в конструкторе в плюсах. Там типа тоже программист ожидает что все будет работать .

Вообще-то, любой нормальный программист на плюсах знает, что может нарваться в этом случае на pure virtual call.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[16]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 07.01.05 13:57
Оценка:
AndrewVK,

> ПК> но это реализуемо на обычных абстрактных классах C++ при помощи dynamic_cast.


> А при чем тут С++?


Потому что Херон вырос из надстройки над C++, и я не удивлюсь, если он включит в себя и более традиционные для C++ "интерфейсы", либо же вольется назад в C++ в виде части языка.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[23]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 17:43
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>>Я имею в виду — кто эту бяку обнаружит?

AVK>>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


MS>Ну и вот. "Ответ не верный. Ваше очко переходит залу"...


ЧТо вы из меня дурака делаете. Ты спросил про C#, я тебе ответил. Что здесь неверно то?
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[24]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 18:34
Оценка:
Здравствуйте, AndrewVK, Вы писали:

MS>>>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>>>Я имею в виду — кто эту бяку обнаружит?

AVK>>>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


MS>>Ну и вот. "Ответ не верный. Ваше очко переходит залу"...


AVK>ЧТо вы из меня дурака делаете. Ты спросил про C#, я тебе ответил. Что здесь неверно то?


Дык этта... Как там в известном мультике

Бросай ружье, да всплывай...


Вопрос был о том, где обнаружится ошибка, на стадии компиляции или на стадии выполнения, если у класса X удалить метод Foo(). Ты утверждаешь, что компилятор не может это обнаружить, а будет исключение во время выполнения. Утвержение является ложным, поскольку C# заставляет явно определять все методы интерфейса при наследовании от этого интерфейса.

Незнание предметной области не освобождает от ответственности.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[25]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 20:02
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вопрос был о том, где обнаружится ошибка, на стадии компиляции или на стадии выполнения, если у класса X удалить метод Foo(). Ты утверждаешь, что компилятор не может это обнаружить, а будет исключение во время выполнения. Утвержение является ложным, поскольку C# заставляет явно определять все методы интерфейса при наследовании от этого интерфейса.


Имелось ввиду из объявления тоже удалить. Весь смысл был в том чтобы нельзя было заменить Base[] на IFoo[]
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[26]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 07.01.05 20:46
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Имелось ввиду из объявления тоже удалить. Весь смысл был в том чтобы нельзя было заменить Base[] на IFoo[]


То есть, имелось в виду вот так:
   class Base {}
   interface IA
   {
      void Foo();
   }
   class X : Base//, IA
   {
      public void Bar1(){}
      //public void Foo(){}
   }
   class Y : Base, IA
   {
      public void Foo(){}
      public void Bar2(){}
   }
   . . .
   Base[] bs = new Base[]{new X(), new Y()};
   ((IA)bs[0]).Foo(); // здесь должен быть вызов по адресу 0002
   ((IA)bs[1]).Foo(); // а здесь должен быть


Дык это не "из объявления тоже удалить", это значит "удадить интерфейс как таковой из класса". В этом случае, что есть там метод Foo, что нет его — все едино.

Я так ничего и не понял. Приведенный код действительно компилируется и действительно вываливается во время выполнения по "System.InvalidCastException: Specified cast is not valid.". Но это не имеет никакого отношения к словам

Убери к примеру из одного из классов метод Foo () (и вызов его соотв.), а в контейнере класс оставь, и все, приехали.


В хероне же подобная ситуация невозможна, поскольку адреса функций разрешаются на этапе компиляции, соответственно, Base нельзя привести к IA ни под каким видом. Для реализации классического динамического полиморфизма там используется какой-то другой механизм, подозреваю, что классический C++ный.

Или все-таки имелось в виду что-то другое?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[27]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.01.05 22:37
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Я так ничего и не понял. Приведенный код действительно компилируется и действительно вываливается во время выполнения по "System.InvalidCastException: Specified cast is not valid.". Но это не имеет никакого отношения к словам

MS>

MS>Убери к примеру из одного из классов метод Foo () (и вызов его соотв.), а в контейнере класс оставь, и все, приехали.


Эта фраза была сказана к тому, что преобразование, сделанное с примером c-smile, неправомерно.

MS>В хероне же подобная ситуация невозможна, поскольку адреса функций разрешаются на этапе компиляции, соответственно, Base нельзя привести к IA ни под каким видом.


Именно это я и хотел услышать.
... << RSDN@Home 1.1.4 beta 3 rev. 272>>
AVK Blog
Re[18]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.05 19:00
Оценка:
Здравствуйте, AndrewVK, Вы писали:

MS>>А, кстати, что произойдет в C# в описанной ситуации (у класса X удалили void Foo())?

MS>>Я имею в виду — кто эту бяку обнаружит?

AVK>Естественно не компилятор, у него такой возможности просто нет. Вылетит TypeCastException.


Согласен. Это как раз тот случай где без динамического полиморфизма никуда.

Но это только если исправить море допущенных ошибок .
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.01.05 19:00
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Ну и вот. "Ответ не верный. Ваше очко переходит залу"...


Блин. Это не вопрос веры. Почитай стандарт на язык. А то просто возьми код исправь ошибки и протестиру. Вот тебе чтобы не мучиться работающий вариант:
using System;

class Program
{
    static void Main(string[] args)
    {
        Base[] bs = new Base[]{new X(), new Y()};
        ((IA)bs[0]).Foo(); // 0002
        ((IA)bs[1]).Foo(); // 0003
    }
}

class Base {}

interface IA
{
    void Foo();
}

class X : Base, IA
{
    public void Bar1() { } // 0001
    public void Foo() { } // 0002
}

class Y : Base//, IA
{
    //public void Foo() { } // 0003
    public void Bar2() { } // 0004
}


Все компилируется на ура. В ранмайме ессэсно вылет.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Вопрос был о том, где обнаружится ошибка, на стадии компиляции или на стадии выполнения, если у класса X удалить метод Foo(). Ты утверждаешь, что компилятор не может это обнаружить, а будет исключение во время выполнения. Утвержение является ложным, поскольку C# заставляет явно определять все методы интерфейса при наследовании от этого интерфейса.


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

Массив же специально "Base[]".

MS>Незнание предметной области не освобождает от ответственности.


Чья бы корова мычала...
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ПК>>но это реализуемо на обычных абстрактных классах C++ при помощи dynamic_cast.


AVK> А при чем тут С++?


Да, да! Причем тут баня?!
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Потому что Херон вырос из надстройки над C++, и я не удивлюсь, если он включит в себя и более традиционные для C++ "интерфейсы", либо же вольется назад в C++ в виде части языка.


Откровенно гоовря такие интерфейсы в глобальном смысле заплатка, но С++ они бы могли помочь если бы с их помощью можно было задавать констрэйны для классов. Это хотя и заплатка, но очень нужная плюсам. Правда как всегда остается проблема обратной совместимости, но тут бы помогла бы идея пометки новых конструкций некими признаками (типа ансэйф в Шарпе).
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>А зачем изначально по-твоему было введено разделение на reverence- и value- типы? Скажем, в том же SmallTalk, тоже объектно-ориентированном языке, такого разделения нет. Там все типы — наследники Object.


Там и статической типизации нет. В общем, предпосылкой для введения вэлью-типов конечно являлась и производительность. Но... не только она и в обсуждаемой теме речь не о введении вэлью-типов, а о введении автоматического боксинга. Введение вэлью-тиов было сделано еще в Яве и Пасклае (ну, и в С). Шарп же попылатся (и довольно удачно) скрестить идею вэлью-типов с идеей "все — объект" из Смолтока. В итоге получается решение потенциально предоставляющее и высокую производительность, и безопасность типов (полную), и гибкость как в Смолтоке. Естественно идеал по прежденму не достигнут, но шаг к нему сделан очень значительный.

ПК>Например, передать ссылку на базовый интерфейс в функцию, чтобы она через этот интерфейс данный объект изменила.


Да, это было бы красиво. Но к сожалению это достижимо только хаком, и ребята из МС на это не пошли. Хотя если передавать не сам интерфейс а вэлью-тип и не абы куда, а в дженерик у которого есть констрэйн на этот интерфейс, то все очень даже достижима. Одна беда... в бэтах скорость такого вызова даже ниже чем у простого интерфейса (не очень качественная реализация). Но потенциально возможна полная оптимизация в продь до инлайнинга метода интерфейса. Причем сам дженерик на это никак не завязан. Рантайм сам поймет нужно ли ему создавать специализацию или можно воспользоваться динамическим полиморфизмом.

Я думаю, что будущее именно за таким подходом. В общем, пара мегабаксов в оптимизирующие компиляторы и перевод компиляции на стадию инсталляции и дело в шляпе. Мы имеем "полиморфизм без ремарок" и наивысшую скорость. Ну, а там дело за малым. Добавить автоматизацию подключения дополнительных реализаций и ввести средства метапрограммирования...
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Так value типы и есть оптимизация из-за которой понадобился боксинг...

WH>Назови хоть одну причину (кроме производительность и потребления памяти те забиваем на оптимизацию на уровне языка пусть jit все разруливает как ему хочется) по которой int не может быть ссылочным типом.

Дык Шарп ростет из Явы. В яве уже были примитивные вэлью-типы. Так что оптимизация была сделана до него. А АВК говорит о том, что ПК неврено назвал боксинг оптимизацией. Это "синтаксический сахар" цель которого воплотить идею Смолтока — "Все — объект!".

Вот только идея не доведена до логического завершения. По хорошему для боксед-объектов нужно было бы реализовать весь интерфейс забоксеного типа. Вот тогда полиморфизм был бы мама дорогая. Но тогда бы действительно было трудно понять где кончается динамическая типизация и начинается статическая. Видимо Хебельберг это понял и побоялся того что реальные решения с использовнием Шарпа окажутся слишком медленные (причем нечаяно).

ЗЫ

Ты кстати, где? Что-то тебя после перезда совсем не слышно. Заехал бы как-нибудь... рассказал бы как дела...
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 01:20
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Про рантайм: так как interface reference (a la Heron) это

CS>пара {this, function table pointer} то на них красиво делаются

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

CS>delegates (closures) например.


Не надо делать сущьности высшего порядка на "чем-то". Пусть они будут реализованы штатно! У компилятора и информации больше и возможностей.

CS>interface reference это как бы мост меж двух миров templates (static polymorph) и virtual (dynamic polymorph).


Вот как такой мост мне эта идея не нравится. АВК правильно говорит, слишком уж фича завязана на компайл-тайм.

CS>Есть такое дело со стандартами. И это наверное разумно. Не знаю.


Незнаю. Я раньше надеялся на то что С++ подправят и будет конфетка, а не язык, но теперь уже надежда ушла. Думаю проще другие средства адаптировать чем ловить тараканов в С++.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 12.01.05 01:35
Оценка:
VladD2,

> <...> Введение вэлью-тиов было сделано еще в Яве и Пасклае (ну, и в С)


Речь идет не о введении value-типов, а о разделении на value- и reference- типы. В Паскале и C такого разделения нет.

> ПК> Например, передать ссылку на базовый интерфейс в функцию, чтобы она через этот интерфейс данный объект изменила.


> Да, это было бы красиво. Но к сожалению это достижимо только хаком <...>


В Heron это делается безо всяких хаков, просто и красиво. С сохранением динамического полиморфизма для интерфейсов. Чем упрекать других в косности, лучше бы глянул повнимательнее: там по сравнению с C#/Java/whatever, действительно, оригинальная концепция реализации полиморфизма.

> если передавать не сам интерфейс а вэлью-тип и не абы куда, а в дженерик у которого есть констрэйн на этот интерфейс, то все очень даже достижима. Одна беда... в бэтах скорость такого вызова даже ниже чем у простого интерфейса (не очень качественная реализация)


На первый взгляд пока что там и без generics скорость даже простейших абстракций типа IntWrapper не блещет.

> Я думаю, что будущее именно за таким подходом. В общем, пара мегабаксов в оптимизирующие компиляторы и перевод компиляции на стадию инсталляции и дело в шляпе. Мы имеем "полиморфизм без ремарок" и наивысшую скорость. Ну, а там дело за малым. Добавить автоматизацию подключения дополнительных реализаций и ввести средства метапрограммирования...


Ну, судя по beta 1, Нью-Васюки пока откладываются.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 01:40
Оценка:
Здравствуйте, VladD2, Вы писали:

MS>>Вопрос был о том, где обнаружится ошибка, на стадии компиляции или на стадии выполнения, если у класса X удалить метод Foo(). Ты утверждаешь, что компилятор не может это обнаружить, а будет исключение во время выполнения. Утвержение является ложным, поскольку C# заставляет явно определять все методы интерфейса при наследовании от этого интерфейса.


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


Влад, у вас с Andrew какие-то не-лады с определением причинно-следственных связей, что мне и не давало мне покоя. Если удалить наследование интерфейса, то удаляь метод уже не не нужно — он уже ни на что не влияет. В C# первичным является наследование от интерфейса (intrusive), в Хероне — наличие методов с нужными сигнатурами (unintrusive). Вот и всех делов.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Unintrusive Retroactive Polymorphism
От: Шахтер Интернет  
Дата: 12.01.05 02:16
Оценка:
Здравствуйте, c-smile, Вы писали:

Хочешь чего-нибудь такого?

class C
 {
  public:
  
   int method1();
   double method2();
 };

struct MethodMap
 {
  int (::*method1)();
  double (::*method2)();
  
  template <class T>
  explicit MethodMap(T &x)
   {
    method1 = x .* &T::method1 ;
    method2 = x .* &T::method2 ;
   }
 };

/* main() */ 

int main()
 {
  C c;
  
  MethodMap map(c);
  
  int x=map.method1();
  double y=map.method2();
 
  return 0;
 }
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[24]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 02:21
Оценка:
Здравствуйте, VladD2, Вы писали:

MS>>Ну и вот. "Ответ не верный. Ваше очко переходит залу"...


VD>Блин. Это не вопрос веры.


Допустил грубую граматическую ошибку, за что извиняюсь. Правильно звучит, конечно же "Ответ неверный". А вопросы "веры" здесь действительно ни при чем.

Надеюсь, не нужно объяснять разницу между понятиями "верный — неверный" и "верю — не верю"?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[25]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 02:25
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это неправильный вариант. Это удаление наследования от IA у класса Y, в то время, как [url=http://rsdn.ru/Forum/Message.aspx?mid=977486&amp;only=1
Автор: McSeem2
Дата: 07.01.05
речь шла[/url] об удалении члена Foo() из класса X.


ПК>Так что еще одно очко переходит залу


Я не знаю что у тебя там с очками, но надо очень сильно стораться чтобы не понять о чем говорил АВК. Он тут уже тридцатый пост поытается объяснить примитивные вещи — что или не будет рантайм-полиморфизма, или будут тормоза а-ля рефлекшон (из-за возни с информацией о типах в рантайме).
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 02:25
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>VladD2,


>> <...> Введение вэлью-тиов было сделано еще в Яве и Пасклае (ну, и в С)


ПК>Речь идет не о введении value-типов, а о разделении на value- и reference- типы. В Паскале и C такого разделения нет.


Речь шала о боксинге и анбоксинге. Это тебя уже потянуло неизвестно куда. А что касается нет/есть, то тут все проде понятно. Вместо всего этого в С есть проходы по памяти и сэкс с адресной арифметикой.

Этак мы до ассмеблера договоримся. Там даже типов данных как таковых нет. И что?

ПК>В Heron это делается безо всяких хаков, просто и красиво. С сохранением динамического полиморфизма для интерфейсов. Чем упрекать других в косности, лучше бы глянул повнимательнее: там по сравнению с C#/Java/whatever, действительно, оригинальная концепция реализации полиморфизма.


Я уже глянул. Там или статический полиморфизм и соотвественно не гибкость или задница со скоростью в следствии интерпретакции. И то, и то нехороший компромис. Я уже тут раза три говорил, что мне бы больше пронравилась идея втоматического устранения виртуальности компилятором. Думаю это вопрос 2-3 лет. Так что стоит ли копья ломать еще большой вопрос.

ПК>На первый взгляд пока что там и без generics скорость даже простейших абстракций типа IntWrapper не блещет.


На первый вгляд на первый взгляд
Автор: VladD2
Дата: 12.01.05
там ошибки в тестах. Да и ситуация больно надуманная. Я таких задач не встречал. Скорость вызова виртуального метода раз в 6 ниже обычного (особенно при инлайнинге). Делегаты во втором фрэймворке еще где-то в 2-4 раза медленее. Итого если ты занимашся постоянными сортировками интов, то умнее просто испоьзовать ручную (или сгенерированную) реализацию. В остальных же случаях стоимость виртуального вызова не сравнима с выполняемым кодом, так что и обсуждать нечего. В реальных разницы практически не заметно. На тот же янус постоянно жалуются, но тормозит то там Jet кторый как ты понимаешь самый что ни на есть анменеджед.

Ну, и опять же если ты нарвался на узкое место которое действительно серьзено тормозит код, то никто не мешает открыть МС++ и создать на нем нужные тонко потимизированные места. Далее сделать библиотечку и юзать ее в Шарпе. За-то 99% времени наслаждаешся простотой и спокойствием обращая время только на решаемую задачу.

ПК>Ну, судя по beta 1, Нью-Васюки пока откладываются.


Да в общем, более чем нормально. Ты уперся в синтетические тесты на проблемных задачах (где кстати, на поверку все более чем зашибитьс, опять же см. мой ответ
Автор: VladD2
Дата: 12.01.05
). На практике же основной код возится с морем частностей которые прекрасно оптимизируеются. Ну, и (опять повторяюсь) генерация кода плюс МС++ на крайняк спасают отцов русской демакратии. Кстати, тот факт что лично я отказался от использования С++ в том же древесном контроле созданном для Януса, и то что более нигде я так и не применил МС++ говорит, о том, что это реально в общем то и не нужно. Но чувствовать, что всегда есть "запасная дверь" очень приятно.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 04:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Согласен. Это как раз тот случай где без динамического полиморфизма никуда.

VD>Но это только если исправить море допущенных ошибок .

Не придирайся к мелочам. Идея кода была понятна даже мне, чайнику в C#: http://www.rsdn.ru/Forum/Message.aspx?mid=977733&amp;only=1
Автор: McSeem2
Дата: 07.01.05
(обрати внимание на дату сообщения).
Недоумение вызвала лишь фраза об удалении метода в коде на C#, которе должно было якобы привести к ошибке времени выполнения. Это вызвало искреннее недоумение. А на самом деле оказалось, что дело совсем в другом — что надо удалять не метод, а сам интерфейс целиком, что кардинальным образом меняет структуру зависимостей. Ну сколько можно долдонить об одном и том-же?!

"Бросай ружье, да всплывай поскорей" здесь (26K)
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 05:33
Оценка:
Здравствуйте, c-smile, Вы писали:

Интерсная и очень показательная переписка "Heron"("christopher diggins") <-> David Abrahams (boost consalting, главный meta programmer )

здесь

David Abrahams сказал 2004-04-25 18:53:07 PST

I believe I could write macros to allow you to generate baz with:

DECLARE_INTERFACE(
baz,
((int)(foo)(int))
((int)(bar)(char const*))
);

David Abrahams еще сказал 2004-04-30 11:13:06 PST

If I get a few minutes maybe I'll hack them up for fun.


Чего-то не видать результата. Ну да и ладно

Похоже David в тумане метапрограмизма не проникся идеей которя на мой взгляд футдаментально-положительная.
Re[2]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 05:35
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ага
Причем сильно хочу.
Сейчас это все приходится руками делать...
Re[3]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 05:53
Оценка:
Здравствуйте, Костя Ещенко, Вы писали:

КЕ>здесь оно выглядит примерно так как он сказал.


Угу, только
  BOOST_INTERFACE_BEGIN(IShape)
    BOOST_INTERFACE_CONST_FUNCTION0(GetX, int)
    BOOST_INTERFACE_CONST_FUNCTION0(GetY, int)
    BOOST_INTERFACE_CONST_FUNCTION0(GetArea, double)
    BOOST_INTERFACE_FUNCTION2(SetXY, void, (int, x), (int, y))
    BOOST_INTERFACE_FUNCTION2(OffSetXY, void, (int, x), (int, y))
    BOOST_INTERFACE_CONST_FUNCTION0(GetName, const char*)
  BOOST_INTERFACE_END(IShape)

не радует сильно.

Хотя если подходить с позиций "шашечки или ехать" то наверное пойдет.
Чего-то правда компайлер уходит в кому на трех таких объявлениях... heavy use of templates наверное
Re[3]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 06:24
Оценка:
И для тех кто не дошел до этой ссылки
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1510.pdf

Это видение Страуструпа на проблему дискриминации параметров templates.
"heron" interfaces позволяют элегантно решить и эту проблему.
Re[26]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 12.01.05 06:36
Оценка:
VladD2,

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


Это не так. Для интерфейсов можно сохранить "полный" полиморфизм времени исполнения. В самом деле: зачем пытаться полиморфно работать во время исполнения с конкретными классами? Там где нужен полиморфизм времени исполнения, "ходят" интерфейсы Единственный тонкий момент, пока для меня в Хероне не очевидный, заключается в управлении временем жизни объектов, к которым привязаны интерфейсы. Нужно смотреть
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 07:12
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это не так. Для интерфейсов можно сохранить "полный" полиморфизм времени исполнения. В самом деле: зачем пытаться полиморфно работать во время исполнения с конкретными классами? Там где нужен полиморфизм времени исполнения, "ходят" интерфейсы Единственный тонкий момент, пока для меня в Хероне не очевидный, заключается в управлении временем жизни объектов, к которым привязаны интерфейсы. Нужно смотреть


Extending the Lifetime of temporaries
Using an interface variable as an lvalue extends the lifetime of that temporary in the same way that assigning a temporary to a reference does.

Re[28]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 12.01.05 07:41
Оценка:
c-smile,

> ПК> Единственный тонкий момент, пока для меня в Хероне не очевидный, заключается в управлении временем жизни объектов, к которым привязаны интерфейсы. Нужно смотреть


>

> Extending the Lifetime of temporaries
> Using an interface variable as an lvalue extends the lifetime of that temporary in the same way that assigning a temporary to a reference does.


С временем жизни локальных объектов все более-менее понятно. А вот, что делать, когда время жизни интерфейса превышает время жизни функции? Например, возврат интерфейса из функции...
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[13]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 21:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Не единственный. А если говорить не о runtime полиморфизме вообще,


Ну, продемонстрируй что я получу от них чего я не могу получить на сегодня в Шарпе (кроме потенциального ускорения)?

ПК>а конкретно о виртуальных функциях, то вот преимущества интерфейсов Heron (или соответствующие недостатки виртуальных функций), как их видит автор, за вычетом соображений о быстродействии:


ПК>http://www.heron-language.com/interfaces.html


Полностью согласен с АВК. Автору бы прежде чем переизобретать велосипен познакомиться бы с тем как все сделано в Шарпе. Может и желаение отпало бы.

В общем, я своего мнения не изменил. Это действительно интересный взгляд. Но он имеет явные недостакти. Возможно подобный механизм мог бы поднять качество С++, но для нового языка он хуже чем интерфейсы + делегаты я-ла Шарп. Ну, а скорость дело наживное.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 21:37
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Влад, у вас с Andrew какие-то не-лады с определением причинно-следственных связей,


У вас проблемы с пониманием. От вам 30-тое сообщение пытается обяснить, что схема менее гибка, так как или небуедет полноценного рантайм-полиморфизма, или будут дикие накладные расходы в рантайме.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.01.05 21:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это не так. Для интерфейсов можно сохранить "полный" полиморфизм времени исполнения.


Полиморфизм нужен не только для интерфейсов. Модель типа будет не полной если нельзя будет сделать код вроде:
ClassA a = new B();
object o = a;
((Itf)o).Call();

при условии, что а не реализует интерфейс Itf (в терминах Хренорона не содержит нужных функций), а B порожден от A и реализует нужный интерфейс (содержит нужные функции).

А неполная модель уже есть убогость. И вообще с точки зрения программиста, если абстрагироваться от скорости исполнения, нет никакой разницы рантаймный полиморфизм или статический. Важен сам факт. Учитывая это знание о типе полиморфизма есть зло. И от него нужно избавляться. А подход Хренорона как раз приводит нас обратно к таковому знанию.

Итого (повторяюсь в 3-ий раз) — для С++ такой механизм скорее всего был бы благом. Но для нового, безкомпромисного языка он являеться злом.

ПК> В самом деле: зачем пытаться полиморфно работать во время исполнения с конкретными классами?


Вот. Как раз проявление мышления на уровне компилятора. Ты подминил понятие полиморфизм и динамический полиморфизм и ведеш какие-то рассуждения. Реально полиморфизм или есть, или его нет. И лично я, не хочу думать о его природе и скорости. Я хочу иметь компилятор который сам все разрулит и даст мне спокойно писать универсальный и красивый код.

ПК> Там где нужен полиморфизм времени исполнения, "ходят" интерфейсы


Вот и нафиг все это. Пусть лошать... тьфу ты... компилятор и рантайм думают. А я буду думать о решаемой задаче.

ПК>Единственный тонкий момент, пока для меня в Хероне не очевидный, заключается в управлении временем жизни объектов, к которым привязаны интерфейсы. Нужно смотреть


Для тех для кого память больше не ресурс — это не вопрос.
... << RSDN@Home 1.1.4 beta 3 rev. 273>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 12.01.05 21:42
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это видение Страуструпа...


"видение Страуструпа" — это пять!

Конечно же, из серии "ударения шутят"...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[29]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 21:46
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

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



А то же самое что и в ситуации:

void foo(bar* p)
{
bar& r = *p;
...
...
delete p;
...
r.call(); // тыц-тыц-тырырым, мана-мана...
}

Т.е. interface reference есть reference. по замыслу её даже можно dunamic_cast в класс от которого взят интерфейс.
Re[28]: Unintrusive Retroactive Polymorphism
От: c-smile Канада http://terrainformatica.com
Дата: 12.01.05 22:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Полиморфизм нужен не только для интерфейсов. Модель типа будет не полной если нельзя будет сделать код вроде:

VD>
VD>ClassA a = new B();
VD>object o = a;
VD>((Itf)o).Call();
VD>

VD>при условии, что а не реализует интерфейс Itf (в терминах Хренорона не содержит нужных функций), а B порожден от A и реализует нужный интерфейс (содержит нужные функции).

Такое преобразование — очень дорогое удовольствие и я бы хотел чтобы система ограждала от подобных решений.
Для таких конструкций есть scripting и VisualBasic c IDispatch.

Твой пример это не полиморфизм (будем считать это определением полиморфизма)

Поли-морфизм это "несколько" и "форма".

Твой cast на object литает объект формы. Вообще.

Т.е. чтобы это работало кто-то должен определить что есть

operator Itf(object& o)



Иначе оно не скомпилируется, Что есть правильно.
Re[28]: Unintrusive Retroactive Polymorphism
От: Павел Кузнецов  
Дата: 13.01.05 04:08
Оценка:
VladD2,

> ПК> Это не так. Для интерфейсов можно сохранить "полный" полиморфизм времени исполнения.


> Полиморфизм нужен не только для интерфейсов. Модель типа будет не полной если нельзя будет сделать код вроде:

>
> ClassA a = new B();
> object o = a;
> ((Itf)o).Call();
>


Выделенная строка — насколько я понимаю идею автора обсуждаемого языка, пример того, что просто-напросто не имеет смысла делать в языке типа Heron. Вместо этого, если нужно работать через "базу", B будет "приводиться" к какому-нибудь интерфейсу или что-то в таком роде.

> И вообще с точки зрения программиста, если абстрагироваться от скорости исполнения, нет никакой разницы рантаймный полиморфизм или статический.


Принципиальная разница есть: чем меньше в программе динамического полиморфизма, тем проще и полнее можно верифицировать ее корректность. В т.ч. для динамического полиморфизма ошибки проявляются во время исполнения.

> ПК> В самом деле: зачем пытаться полиморфно работать во время исполнения с конкретными классами?


> Вот. Как раз проявление мышления на уровне компилятора.


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

> Реально полиморфизм или есть, или его нет. И лично я, не хочу думать о его природе и скорости. Я хочу иметь компилятор который сам все разрулит и даст мне спокойно писать универсальный и красивый код.


Поиски компонента TProgrammer продолжались...
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это если смотреть на проблему с позиций несимметричного-диметилполиморфизма, а если смотреть на эту проблему незатуманенным фрейморковкой взглядом банальной эрудици то все будет пучком.

CS>Я так думаю.

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

CS>Достаточно ли энтропии в моем ответе?


Тебе виднее.

CS>Я понимаю что в .NET мышление осуществляется глобальными и крупными категориями вида "рантайм-полиморфизма"...


Да нет. Не понимешь. Дизайнеры дотнета просто вообще хотя исключить эти ненужные понятия. Полиморфизма более чем достаточно. А рантайм или компайлтайм — это пусть у разработчиков компиляторов и оптимизаторов болит.

Это я называю грамотным дизайном с рассчетом на будущее. И такой дизайн мне по душе.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка:
Здравствуйте, c-smile, Вы писали:

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


Рассуждения о дороговизне высасоны из пальца.

CS>Для таких конструкций есть scripting и VisualBasic c IDispatch.


А вот это действительно очень дорогое решение. Проверенно на практике.

CS>Твой пример это не полиморфизм


Агащазблин.

CS> (будем считать это определением полиморфизма)


Я предпочитаю классику. Но и в этой ссылке не нашел ничего новго.

CS>Поли-морфизм это "несколько" и "форма".


О, как?!

CS>Твой cast на object литает объект формы. Вообще.


Что, простите?

CS>Т.е. чтобы это работало кто-то должен определить что есть


CS>
CS>operator Itf(object& o)
CS>




CS>Иначе оно не скомпилируется, Что есть правильно.


Нда. Ну, нет так нет. Тебе виднее.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.01.05 23:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Выделенная строка — насколько я понимаю идею автора обсуждаемого языка, пример того, что просто-напросто не имеет смысла делать в языке типа Heron. Вместо этого, если нужно работать через "базу", B будет "приводиться" к какому-нибудь интерфейсу или что-то в таком роде.


Ну, и это явно не гибко.

>> И вообще с точки зрения программиста, если абстрагироваться от скорости исполнения, нет никакой разницы рантаймный полиморфизм или статический.


ПК>Принципиальная разница есть: чем меньше в программе динамического полиморфизма, тем проще и полнее можно верифицировать ее корректность.


Вот такую антиобъектную ересь я от тебя не ждал. Всю жизнь хорошие архитекторы закладывались на абстракцию и считали любые звсисимости не нее вредом. А тут оказывается, что это зло.

ПК> В т.ч. для динамического полиморфизма ошибки проявляются во время исполнения.


Вовсе нет. Все что можно проверить при компиляции можно при ней и проверять. А если уж есть намеренное обращение к вещам которые проверяются только в рантайме, то и нечего тут обсуждать. Главное чтобы такие проверки были.

Еще раз повторю свою мысль. Программист просто не должен оперировать понятимями "динамический полиморфизм" и т.п. Для него есть полиморфизм, а все проблемы пусть решает компилятор. Рантай же был есть и будет. Иначе вообще нет смысла в программх. Можно настроить таблиц решений на все случаи жизни и закрыть на этом тему вычислений.

>> Вот. Как раз проявление мышления на уровне компилятора.


ПК>Это уровень концепций.


Не. На уровне оптимизатора компилятора. Хтя для кого-то это тоже концептуальный уровень.

ПК> В такой модели наследование классов — наследование реализации, иерархии интерфейсов — динамический полиморфизм. Суть отделение мух от котлет на уровне логики.


Боюсь, что идея Хрона — это не более чем попытка выкрутиться из паутины насставленной шаблонами С++. Для этого идея бесспорно хороша. Но она не универсальна и имеет проблемы. Так что я все же предпочел бы решение с явными интерфейсами...

ПК> Упрощение оптимизации — приятный бонус.


...Хотя от приятных бонусов тоже не отказался бы.

>> Реально полиморфизм или есть, или его нет. И лично я, не хочу думать о его природе и скорости. Я хочу иметь компилятор который сам все разрулит и даст мне спокойно писать универсальный и красивый код.


ПК>Поиски компонента TProgrammer продолжались...


Не нужно накливать ярлыки на оппонентов. О панацеях никто не говорит. Я просто анализирую два решения. Главным образом их перспективность.

Мне нравятся концептуально чистые идеи. Чем меньше "если", тем лучше.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[31]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.01.05 20:27
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Первый уровень. "Не понимаю, зачем вообще нужно это наследование".

MS>Второй уровень. "Единственный способ написать правильную программу — это использовать наследование".
MS>Третий уровень. "Концепция наследования — это атрофизм, не имеющий ничего общего с решаемыми задачами, и чем его меньше — тем лучше".
Четвертый уровень: "А все таки польза от наследования есть"

ПК>>> В т.ч. для динамического полиморфизма ошибки проявляются во время исполнения.

MS>Именно так оно и есть. Лично для меня нет никакой разницы, падает ли приложение по GPF или по .Net exception.

А для меня есть. Видимо потому что написание серверов накладывает свой отпечаток на мировоззрение
... << RSDN@Home 1.1.4 beta 3 rev. 283>>
AVK Blog
Re[33]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.01.05 21:01
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Нет. Как я уже сказал, четверый — это люди совсем без башни, изобретающие новые концепции, в то время, когда "все что можно было изобрести — давным давно изобретено"


Тем не менее на практике не все так примитивно, как ты расписал.

AVK>>А для меня есть. Видимо потому что написание серверов накладывает свой отпечаток на мировоззрение


MS>Это я конечно же перегнул. Разница есть. В случае GPF — сразу кирдык, а при System.IndexOutOfRangeException можно хотя бы состроить хорошую мину при плохой игре.


Дело не в мине. Опять ты думаешь категориями десктопов. А для сервера, если запрос завершится ошибкой, это как правило не страшно. А вот если будет GPF то все, суши весла. Если был проход по памяти дальше сервер жить не будет.
... << RSDN@Home 1.1.4 beta 3 rev. 283>>
AVK Blog
Re[36]: Unintrusive Retroactive Polymorphism
От: McSeem2 США http://www.antigrain.com
Дата: 14.01.05 22:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Задача задаче рознь. Отнюдь не все high-performance задачи это числомолотилки. И отключать мозги тоже не получится. Поверь — существует масса очень сложных задач, для которых быстрое перелопачивание памяти не главное.


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

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


Извини, Андрей — я не хотел тебя обидеть. Наверное, я просто заразился этим вирусом от некоторых собеседников в этом форуме.

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


Такие "войны" — это совершенно нормальное явление. Без него было бы скучно.
Навеяло: <b>История одного байта</b>
Вот я — примерно из этой категории. Это не хорошо и не плохо. Это просто есть.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[37]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 14.01.05 23:03
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Верю. Я говорю об "отключении мозгов" лишь в плане опасности/безопасности при написании кода, не более того.


И что тогда в этом плохого? И почему ты считаешь что это всегда будет препятствием для высокопроизводительного кода?

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


Это проходит Это тоже стадии
Стадия первая: нравится вобще что то писать
Стадия вторая: просто писать не интересно, надо писать то что не могут другие. Например хитрые драйвера, вирусы.
Стадия третья: писать всякую фигню уже не интересно, начинаешь писать то что нужно реально, но при этом так, чтобы круче чего нибудь общепринятого. Например по скорости.
Стадия четвертая: заниматься оптимизацией надоедает. Начинаешь писать фреймворки.
Стадия пятая: наконец то главным критерием становится решение задачи за минимальные сроки с максимальным качеством
Стадия шестая: становишься консультантом

MS> Отсюда и только отсюда — и недоверие к C# как к универсальному языку, в том числе и для решения наукоемких задач.


Любой универсальный язык имеет границы применения. Для дотнета эти границы достаточно очевидны.

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


MS>Извини, Андрей — я не хотел тебя обидеть. Наверное, я просто заразился этим вирусом от некоторых собеседников в этом форуме.


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

MS>Такие "войны" — это совершенно нормальное явление. Без него было бы скучно.


Возможно. Удивительно что ты решил ими заняться. Должен вроде бы прекрасно знать, что квалификация программиста не зависит от решаемых им задач.

MS>Навеяло: <b>История одного байта</b>

MS>Вот я — примерно из этой категории. Это не хорошо и не плохо. Это просто есть.

Всего лишь свидетельство узости мышления. Ничего интересного.
... << RSDN@Home 1.1.4 beta 3 rev. 283>>
AVK Blog
Re[33]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.01.05 01:08
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Нет. Как я уже сказал, четверый — это люди совсем без башни, изобретающие новые концепции, в то время, когда "все что можно было изобрести — давным давно изобретено"


О! Мудрые слова! Мне всегда импонировали люди с творчиским мироваозрением. И мне искренне жалко всех "рожденных ползать".
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Unintrusive Retroactive Polymorphism
От: _vovin http://www.pragmatic-architect.com
Дата: 19.01.05 12:18
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>3) Отсюда для интерфейсов нужна двойная виртуальность. Разруливается это на практике обычно так:

AVK> а) Ресолвим имена методов в рантайме. Так собственно работает IDispatch. Очень гибко, но весьма медленно.
AVK> б) Для класса строится таблица соответствия индексов в vmt класса и vmt интерфейса. Собственно именно этот способ используется в дотнете. Самый быстрый способ, не требует приведения типов, но довольно проблематична реализация в компайл-тайме.
AVK> в) Для класса создается несколько VMT, по одной на каждый интерфейс. Этот способ применяется в C++ и Дельфи. Довольно быстрый, но требует определенной химии в рантайме для определения нужной VMT.

Как-то все сложно получается.
В действительности достаточно тривиальная вариация Polymorphic Inline Cache способна реализовать это наиболее простым и эффективным способом. Несколько проверок и один статический вызов, что может быть лучше.
Для случая Megamorphic call-site можно делать откат на одну из статических схем, в которой стоимость вызова постоянна для любых случаев.
Re: Unintrusive Retroactive Polymorphism - недоделано
От: Костя Ещенко Россия  
Дата: 20.01.05 04:19
Оценка:
Вот подумалось, что подход Херона не доведен до логического завершения. Он не позволяет оснастить произвольный класс произвольным же интерфейсом не внося изменений ни в класс, ни в интерфейс.

Представим, что есть объект класса A и интерфейс IB, причем они не имеют методов с совпадающими типами и именами. Даже лучше так — пусть класс А является просто структурой данных. Чтобы оснастить экземпляр этой структуры интерфейсом IB, должна быть возможность создавать реализацию интерфейса из набора любых (свободных) функций с подходящим типом, перечисляя их явным образом. Пример:
// структура и ее экземпляр, никак не связанa с IB
struct A
{
  int data;
};

A a = { 25 };

// интерфейс, никак не связан с A
interface IB
{
  int foo() const;
  void bar(int);
};

// оснащение объекта интерфейсом - придется определить реализации функций интерфейса
int foo_impl(A const& a) { return a.data; }
void bar_impl(A& a, int i) { a.data = i; }

IB pa = ref<IB, &foo_impl, &bar_impl>(&a);

// работа через интерфейс
pa.bar(10);
int i = pa.foo();

Если вместо явного определения foo_impl/bar_impl можно было бы использовать лямбда-функции, то было бы совсем душевно. А автоматичекое создание реализации интерфейса из методов класса с подходящими типом/именем как это сделано в Хероне, является просто сокращенной записью всего этого, синтаксическим сахаром.

Таким образом, между классом и интерфейсами вклинивается еще одна независимая сущность — vtbl — реализатор (адаптер?) интерфейса. И для одного класса в принципе возможно несколько реализаций одного и того же интерфейса (несколько vtbl), хотя мне пока неясно, зачем это может понадобиться.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: Unintrusive Retroactive Polymorphism - недоделано
От: c-smile Канада http://terrainformatica.com
Дата: 24.01.05 03:06
Оценка:
Здравствуйте, Костя Ещенко, Вы писали:

КЕ>
КЕ>// структура и ее экземпляр, никак не связанa с IB
КЕ>struct A
КЕ>{
КЕ>  int data;
КЕ>};

КЕ>A a = { 25 };

КЕ>// интерфейс, никак не связан с A
КЕ>interface IB
КЕ>{
КЕ>  int foo() const;
КЕ>  void bar(int);
КЕ>};
КЕ>



А чем это в принципе отличается от

struct A
{
  int data;
};

struct IB: A
{
  int foo() const;
  void bar(int);
};


? (если я все правильно понял)
Re[3]: Unintrusive Retroactive Polymorphism - недоделано
От: Костя Ещенко Россия  
Дата: 25.01.05 00:52
Оценка:
Здравствуйте, c-smile, Вы писали:

КЕ>>
КЕ>>// структура и ее экземпляр, никак не связанa с IB
КЕ>>struct A
КЕ>>{
КЕ>>  int data;
КЕ>>};

КЕ>>A a = { 25 };

КЕ>>// интерфейс, никак не связан с A
КЕ>>interface IB
КЕ>>{
КЕ>>  int foo() const;
КЕ>>  void bar(int);
КЕ>>};
КЕ>>



CS>А чем это в принципе отличается от


CS>
CS>struct A
CS>{
CS>  int data;
CS>};

CS>struct IB: A
CS>{
CS>  int foo() const;
CS>  void bar(int);
CS>};
CS>


CS>? (если я все правильно понял)


Тем что у меня IB не является потомком A. IB — просто интерфейс, который можно прикрутить к любому типу без его изменения.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[39]: Unintrusive Retroactive Polymorphism
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.01.05 03:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А еще левелы есть? А то я уже на пятом


Ага. Выход на пенсию.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[40]: Unintrusive Retroactive Polymorphism
От: WolfHound  
Дата: 29.01.05 12:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Ага. Выход на пенсию.

Ну вот скоро качаться будет некуда
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Unintrusive Retroactive Polymorphism
От: Quintanar Россия  
Дата: 04.05.05 15:42
Оценка:
Здравствуйте, c-smile, Вы писали:

Простите за назойливость, но такая модель давно реализована в OCaml.


class a1 = object
  method m1 y = y + 1
end;;

class a2 = object
  method m1 z = z^" tail"
  method xxx w = w/3
end;;

let f obj elem = obj#m1 elem in
  (f (new a1) 1, f (new a2) "test");; -- yields (2,"test tail")
Re: Unintrusive Retroactive Polymorphism
От: FR  
Дата: 05.12.07 08:40
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Наткнулся вот на Heron Programming Language


Есть вопрос ты за ним следишь?
Интересный язык, но мне показалось, или так и есть, что он скорее мертв чем жив?
Re[3]: Unintrusive Retroactive Polymorphism
От: FR  
Дата: 05.12.07 09:28
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Скорее мертв. Автор Heron сейчас активно занимается Форто-подобным языком с выводом типов.


Это как же нужно укурится чтобы создать гибрид ML и Forth?
Спасибо очень интересно на этот кошмар посмотреть
Re[2]: Unintrusive Retroactive Polymorphism
От: minorlogic Украина  
Дата: 06.12.07 07:39
Оценка:
Видимо разница в ЯВНОМ выделении интрефейса , чего в шаблонах нет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Unintrusive Retroactive Polymorphism
От: minorlogic Украина  
Дата: 06.12.07 07:43
Оценка:
Вот о таком полиморфизме я мечтаю для С++. Но только чтобы статический и динамический полиморфизм использовали один и тот же синтаксис( по крайней мере где возможно). А уж компилятор сам будет разбираться где он знает тип на этапеи компиляции а где необходим косвенный вызов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[3]: Unintrusive Retroactive Polymorphism
От: Константин Б. Россия  
Дата: 06.12.07 16:22
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Видимо разница в ЯВНОМ выделении интрефейса , чего в шаблонах нет.


Эх... Подождал бы с месяц и было бы ровно три года =)
... << RSDN@Home 1.2.0 alpha rev. 784>>
Re[4]: Unintrusive Retroactive Polymorphism
От: vdimas Россия  
Дата: 10.12.07 09:54
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ну а когда на этапе приведения при работе JIT заранее о результате неизвестно, там будет единственное обращение к interface map по константному смещению (любой интерфейс в imap всех классов всегда расположен по одному и тому же смещению).


А что происходит, когда кол-во интерфейсов в загруженных типах идёт на десятки тысяч?


CS>>это фактически образование (compile time) таблицы method references — (this,funcptr)

CS>>Соответсвенно вызов такого "виртуального" метода — это вызов обычной невиртуальной функции.

AVK>Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.


Наверно, в случае полиморфного метода будет сгенерирован косвенный вызов?
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[5]: Unintrusive Retroactive Polymorphism
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.12.07 10:20
Оценка:
Здравствуйте, vdimas, Вы писали:

V>А что происходит, когда кол-во интерфейсов в загруженных типах идёт на десятки тысяч?


Ничего страшного.

AVK>>Т.е. в случае полиморфного кода это не работает? Тогда полезность этой фичи вобще непонятна.


V>Наверно, в случае полиморфного метода будет сгенерирован косвенный вызов?


Вопрос не ко мне.
... << RSDN@Home 1.2.0 alpha rev. 725>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.