Re[7]: Будущее C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.06.03 06:43
Оценка: 1 (1) :))
Здравствуйте, WolfHound, Вы писали:

_>>Удивляюсь, как можно приводить абсолютно чудовищный код и утверждать, что это круто.

WH>Я это привел к тому что: Делегаты в .NET не позволяют цеплять функции с другими сигнатурами даже если существует не явное приведение,

И это правильно. Типобезопасность рулит

WH>нельзя из делегата вернуть значение,


Кто сказал? А я не знал, возвращал. Теперь буду осторожнее.
... << RSDN@Home 1.1 alpha 1 >>
AVK Blog
Re[6]: Будущее C#
От: mihailik Украина  
Дата: 26.06.03 15:18
Оценка:
M>А нет ли какой-нибудь толковой статьи на эту тему? Почему шаблоны так уж "откроют путь к совершенству"? Вроде вполне ограниченная технология на непредвзятый взгляд.

WH>Скорее не опытный ИМХО. Александреску читал?


Не читал. Это статья или толстая книга? Статью бы.

WH>boost потрошил?


Ха! Это получается заплатить вперёд, раньше чем увижу, нужны ли мне стулья.
... << RSDN@Home 1.0 beta 7a >>
Re[6]: Будущее C#
От: mihailik Украина  
Дата: 26.06.03 15:18
Оценка: 1 (1)
VD>Делегаты делают то ради чего они и были созданы. Делают они это элегантно, но не шустро.

Я ещё немного поковырялся в Rotor. Значит, делегатский метод Invoke компилируется в x86-инструкции. В этих инструкциях проверка количества подцепленных функций (multicast/signlecast) и вызов.

То есть, это пара лишних indirection и одна проверка — для signle-cast.

Интерестно, что мультикасты в Rotor хранятся в linked list, а в Mono в массиве. Вроде бы в массиве лучше, ведь при создании объекта-делегата точно известно количество "кастов".

Кроме того, в Mono делегатский метод Invoke компилируется не в x86, а в IL — в отличие от Rotor.

Подробности:

Rotor 2002-11-01
— clr\src\vm\i386\cgenx86.cpp
— строка 3633
— StubLinkerCPU::EmitMulticastInvoke

Mono mono-024
— mono\metadata\marshal.c
— строка 1442
— mono_marshal_get_delegate_invoke
... << RSDN@Home 1.0 beta 7a >>
Re: Будущее C#
От: Mikhail_T  
Дата: 26.06.03 15:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как считает общественность, реально ли появление в будущем, когда в C# будут введены шаблоны и другие средства, мощных библиотек, аналогов boost?


Шаблоны в С# вполне реальны я бы даже сказал что их поевление это гарантировано.
На МСДН есть стать про будашее C# так шаблоны собираються реализовать в самом ближайшем будощем работы над ними уже ведуться.
Re[7]: Будущее C#
От: WolfHound  
Дата: 26.06.03 18:14
Оценка:
Здравствуйте, mihailik, Вы писали:

M>Не читал. Это статья или толстая книга? Статью бы.

Это книга А5 на 330 страниц. Не много но читать тяжело крышу сносит особенно по началу.
http://www.moderncppdesign.com/

M>Ха! Это получается заплатить вперёд, раньше чем увижу, нужны ли мне стулья.

А до прочтения книги ты там ни чего не поймешь, да и после трудно.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Будущее C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.06.03 06:14
Оценка:
Здравствуйте, Mikhail_T, Вы писали:

M_T>Шаблоны в С# вполне реальны я бы даже сказал что их поевление это гарантировано.

M_T>На МСДН есть стать про будашее C# так шаблоны собираються реализовать в самом ближайшем будощем работы над ними уже ведуться.

Работы над ними уже проведены и шаблоны доступны в специальной версии ротора.
... << RSDN@Home 1.1 alpha 1 >>
AVK Blog
Re[6]: Будущее C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 27.06.03 08:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Причем это решение еще и боле типбезопасно.


Какие-то странные у некоторых людей понятия о типобезопасности. Вот, скажем, implicit operator T() типобезопасен? А встроенное преобразование int в long типобезопасно? Почему мы можем вызвать метод с параметром типа long, передав ему int, но не можем присвоить delegate void d(int) свою void f(long)?
Re[7]: Будущее C#
От: Lloyd Россия  
Дата: 27.06.03 08:37
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Какие-то странные у некоторых людей понятия о типобезопасности. Вот, скажем, implicit operator T() типобезопасен? А встроенное преобразование int в long типобезопасно? Почему мы можем вызвать метод с параметром типа long, передав ему int, но не можем присвоить delegate void d(int) свою void f(long)?


Потому что компилятор в состоянии увидеть, что передали параметр не того типа и сделать приведение. Для случая с делегатами это не так.
Re[8]: Будущее C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 27.06.03 08:51
Оценка:
Здравствуйте, Lloyd, Вы писали:

_>>Какие-то странные у некоторых людей понятия о типобезопасности. Вот, скажем, implicit operator T() типобезопасен? А встроенное преобразование int в long типобезопасно? Почему мы можем вызвать метод с параметром типа long, передав ему int, но не можем присвоить delegate void d(int) свою void f(long)?

L>Потому что компилятор в состоянии увидеть, что передали параметр не того типа и сделать приведение. Для случая с делегатами это не так.

Для случая с делегатами компилятор в состоянии сделать thunk, который сейчас приходится делать руками. В boost/signal это работает.
Re[9]: Будущее C#
От: Lloyd Россия  
Дата: 27.06.03 09:14
Оценка: +1
Здравствуйте, desperado_gmbh, Вы писали:

_>Для случая с делегатами компилятор в состоянии сделать thunk, который сейчас приходится делать руками. В boost/signal это работает.


C++ в этом плане более статичен. В Net-е можно создать делегат на метод, который в момент компиляции вовсе недоступен.
Re[10]: Будущее C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 27.06.03 10:23
Оценка:
Здравствуйте, Lloyd, Вы писали:

_>>Для случая с делегатами компилятор в состоянии сделать thunk, который сейчас приходится делать руками. В boost/signal это работает.

L>C++ в этом плане более статичен. В Net-е можно создать делегат на метод, который в момент компиляции вовсе недоступен.

Разница между delegate double op(double i, double f) и boost::signal<double(double,double)> op чисто синтаксическая, никакой большей статичности не наблюдается.

Ключевое место — op oper = new op(Add). Там все доступно.
Re[3]: Будущее C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.06.03 13:28
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Работы над ними уже проведены и шаблоны доступны в специальной версии ротора.


Это не те шаблоны, что будут в дотнете. Все из МС в одни голос говорят, что ресерч ресерчем, а МС МС-ом.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Будущее C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.06.03 13:28
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Какие-то странные у некоторых людей понятия о типобезопасности.


Нормальные.

_> Вот, скажем, implicit operator T() типобезопасен? А встроенное преобразование int в long типобезопасно?


В С++ int и long синонимы (под 32-битными платформами). А вообще приведение безопастно если оно не может привести к переполнениям или обрезаниям. В дотнете приведения тоже работают. Ты можешь передать в делегат int вместо double-а. Но вот приводить один делегат к другому (имеющему другой список параметров) — это опасное действие. И правильно, что оно запрещено.

_> Почему мы можем вызвать метод с параметром типа long, передав ему int, но не можем присвоить delegate void d(int) свою void f(long)?


В отличии от С++ в дотнете без проблем код вызывающий делегаты из массива может находиться в другом исполнимом файле. А код запихивающий методы в массив в дурогом. И кроме контроля типов нет никакой гарантии, что в рантайме не "грохнет".
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Будущее C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.06.03 13:28
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Для случая с делегатами компилятор в состоянии сделать thunk, который сейчас приходится делать руками. В boost/signal это работает.


Главная твоя проблема, что твой ум привык к примитивности С++ в котором компилятор всегда знает все. Дотнет же проектировался как компонентная среда. И обязан обеспечивать функциональность в отсуствии исходников. Плюсы я уже перечислял: компонентность, прозрачность для RPC и асинхронной обработки.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Будущее C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.06.03 13:28
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Разница между delegate double op(double i, double f) и boost::signal<double(double,double)> op чисто синтаксическая, никакой большей статичности не наблюдается.


_>Ключевое место — op oper = new op(Add). Там все доступно.


Да? Ну, тогда создай нам такой же код но чтобы сигнал был объявлен и вызывлся в одной длл, а в другой к нему добавлялся метод (из другой же длл-и).
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Будущее C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.06.03 13:28
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А до прочтения книги ты там ни чего не поймешь, да и после трудно.


Забавное достоинство.

Это кстати одна из главных проблем С++ как языка.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Будущее C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 27.06.03 13:59
Оценка:
Здравствуйте, VladD2, Вы писали:

_>>Разница между delegate double op(double i, double f) и boost::signal<double(double,double)> op чисто синтаксическая, никакой большей статичности не наблюдается.

_>>Ключевое место — op oper = new op(Add). Там все доступно.
VD>Да? Ну, тогда создай нам такой же код но чтобы сигнал был объявлен и вызывлся в одной длл, а в другой к нему добавлялся метод (из другой же длл-и).

А в чем проблема-то, кроме того, что работа с dll вообще в c++ сделана криво? __declspec(dllexport) boost::signal<double(double,double)> op.
Re[8]: Будущее C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 27.06.03 14:09
Оценка: +1
Здравствуйте, VladD2, Вы писали:

_>> Вот, скажем, implicit operator T() типобезопасен? А встроенное преобразование int в long типобезопасно?

VD>В С++ int и long синонимы (под 32-битными платформами).

Я про c#, раз уж написал про implicit operator.

VD>А вообще приведение безопастно если оно не может привести к переполнениям или обрезаниям. В дотнете приведения тоже работают. Ты можешь передать в делегат int вместо double-а. Но вот приводить один делегат к другому (имеющему другой список параметров) — это опасное действие.


Безопасное действие при контравариантности типов параметров. Вон Form[] можно привевсти к Control[] — работает ковариантность. Здесь же наоборот — у нас есть метод void(Control) и мы хотим прицепить его к делегату void(Form). Где здесь опасность?

_>> Почему мы можем вызвать метод с параметром типа long, передав ему int, но не можем присвоить delegate void d(int) свою void f(long)?

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

Для понимания строки "op oper = new op(Add)" в этом самом другом файле компилятору c# необходимо знать тип делегата op и тип функции Add. Если они совпадают, все компилится. Если не совпадают, но имеют контравариантные типы, то сейчас происходит ошибка, и, чтобы ее избежать, нам надо руками писать переходник. Полностью типобезопасный, кстати. Почему бы эту рутинную работу не сделать компилятору за нас, если даже на стандартных плюсах можно соорудить типобезопасный signal, делающий то же самое?
Re[4]: Будущее C#
От: sergerus  
Дата: 27.06.03 20:12
Оценка:
Здравствуйте, VladD2, Вы писали:

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


AVK>Работы над ними уже проведены и шаблоны доступны в специальной версии ротора.


VD>Это не те шаблоны, что будут в дотнете. Все из МС в одни голос говорят, что ресерч ресерчем, а МС МС-ом.


C# Programming Language &mdash; Future Features

это некий документ от microsoft о будущем языка с#

надеюсь что пригодится
... << RSDN@Home 1.0 beta 7a >>
Re[9]: Будущее C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.06.03 20:55
Оценка:
Здравствуйте, desperado_gmbh, Вы писали:

_>Для понимания строки "op oper = new op(Add)" в этом самом другом файле компилятору c# необходимо знать тип делегата op и тип функции Add. Если они совпадают, все компилится. Если не совпадают, но имеют контравариантные типы, то сейчас происходит ошибка, и, чтобы ее избежать, нам надо руками писать переходник. Полностью типобезопасный, кстати. Почему бы эту рутинную работу не сделать компилятору за нас, если даже на стандартных плюсах можно соорудить типобезопасный signal, делающий то же самое?


А на кого возложить type casting при вызове такого делегата?
... << RSDN@Home 1.1 alpha 1 (np: тихо) >>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.