C# - необходимость?
От: _Lestat_ Россия  
Дата: 11.02.05 06:36
Оценка: :)
C# написан, специально для того, чтобы разрабатывать приложения на платформе .NET. Т.о. если я собираюсь работать в этой области, то здесь спрос на разработчиков выше именно в том случае, если они как можно лучше удовлетворяют идеологии языка? Т.е.: CLR, Framework Class Library и т.д. и т.п., а самое главное C#? И в конце концов C++ в данной области будет редкостью. Просто я хочу начать долгий по времени разработки проект на C++ и боюсь как бы со временем C++ не стал архаизмом в .NET. И кроме того, если устроюсь куда-нибудь, не хотелось бы чтобы везде требовалось знание C#, а я вот такой — на C++ пишу.

11.02.05 13:12: Перенесено модератором из '.NET' — TK
Backup not found: (A)bort (R)etry (P)anic
Re: C# - необходимость?
От: Chardex Россия  
Дата: 11.02.05 07:33
Оценка:
Здравствуйте, _Lestat_, Вы писали:

_L_>C# написан, специально для того, чтобы разрабатывать приложения на платформе .NET. Т.о. если я собираюсь работать в этой области, то здесь спрос на разработчиков выше именно в том случае, если они как можно лучше удовлетворяют идеологии языка? Т.е.: CLR, Framework Class Library и т.д. и т.п., а самое главное C#? И в конце концов C++ в данной области будет редкостью. Просто я хочу начать долгий по времени разработки проект на C++ и боюсь как бы со временем C++ не стал архаизмом в .NET. И кроме того, если устроюсь куда-нибудь, не хотелось бы чтобы везде требовалось знание C#, а я вот такой — на C++ пишу.

Не понял я до конца вопроса
Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#
Re[2]: C# - необходимость?
От: Mamut Швеция http://dmitriid.com
Дата: 11.02.05 09:05
Оценка:
C>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#

Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.
... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


dmitriid.comGitHubLinkedIn
Re[3]: C# - необходимость?
От: Chardex Россия  
Дата: 11.02.05 09:17
Оценка:
Здравствуйте, Mamut, Вы писали:

C>>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


M>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

Я че-то не понял поста
Т.е. mc++ проект я смогу добавить файл на C#, а наоборот нет?
Re[4]: C# - необходимость?
От: Mamut Швеция http://dmitriid.com
Дата: 11.02.05 09:32
Оценка: +1
Здравствуйте, Chardex, Вы писали:

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


C>>>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


M>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

C>Я че-то не понял поста
C>Т.е. mc++ проект я смогу добавить файл на C#, а наоборот нет?

Ага. То есть, в проекте C++ могут мирно сосуществовать файлы на, скажем, C++, C# и VB.NET. При этом во время дебага можно точки останова ставить в любом файле и отладчик будет там покорно останавливаться. В репортаже это выглядело неимоверно круто, но мужик сказал, что такое будет доступно только из C++ проектов
... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


dmitriid.comGitHubLinkedIn
Re: C# - необходимость?
От: 0xDEADBEEF Ниоткуда  
Дата: 11.02.05 12:35
Оценка:
Hello, _Lestat_!
You wrote on Fri, 11 Feb 2005 06:36:37 GMT:

L> C# написан, специально для того, чтобы разрабатывать приложения на

L> платформе .NET. Т.о. если я собираюсь работать в этой области, то здесь
L> спрос на разработчиков выше именно в том случае, если они как можно
L> лучше удовлетворяют идеологии языка?
ИМХО, платформа и язык — разные понятия.
Например, существует компилятор Java в прямо в исполнимый код (GCJ) на базе GCC. Есть Java для .NET платформы — J#. Аналогично, никто не мешает реализовать компилятор C# в исполнимый код (если каки в попе достаточно).

Есть, однако, одна проблема, что в Java, что в C# — дело в том, что они как "языки программирования" per se, не представляют особенной ценности. Их "выразительная способность" не особенно велика по сравнению со, скажем, С++ или Perl (ой мама).

То, что реально придает им ценность — это развитая и продуманная библиотека времени исполнения — зачастую реализованная "внеязыковыми" — (JNI или Interop).

Мораль — написать компилятор данного языка в то-что-ты-хочешь, задача вполне обозримая и посильная. Но такой компилятор особой ценности иметь не будет. Для того чтобы он эту ценность приобрел, надо написать еще всю runtime library — а это задача довольно трудоемкая и противоречивая т.к., например для C# стандартизована только небольшая часть библиотеки а такие вещи как Windows Forms или ADO.NET — увы, нет.

Кстати, яркий пример такой проблемы — это GCJ — там реализована только часть Java Runtime. А вот AWT и Swing (и еще куча всяких базовых библиотек) или реализованы частично или с кучей багов. Из-за этого, собственно, GCJ популярностью особой и не пользуется. Хотя, лично для меня идея компиляции Java в исполнимый код — очень привлекательная... Я бы и от C# на той же самой базе не отказался — такой, скажем, C# for Java Runtime (аналогично J#)... Мелкософт удавится
Posted via RSDN NNTP Server 1.9
__________
16.There is no cause so right that one cannot find a fool following it.
Re[2]: C# - необходимость?
От: Cyberax Марс  
Дата: 11.02.05 12:58
Оценка:
0xDEADBEEF пишет:

> Кстати, яркий пример такой проблемы — это GCJ — там реализована только

> часть Java Runtime. А вот AWT и Swing (и еще куча всяких базовых
> библиотек) или реализованы частично или с кучей багов. Из-за этого,
> собственно, GCJ популярностью особой и не пользуется. Хотя, лично для
> меня идея компиляции Java в исполнимый код — очень привлекательная...
> Я бы и от C# на той же самой базе не отказался — такой, скажем, C# for
> Java Runtime (аналогично J#)... Мелкософт удавится

Посмотри на mainsoft

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[2]: C# - необходимость?
От: fplab Россия http://fplab.h10.ru http://fplab.blogspot.com/
Дата: 11.02.05 13:22
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Кстати, яркий пример такой проблемы — это GCJ — там реализована только часть Java Runtime. А вот AWT и Swing (и еще куча всяких базовых библиотек) или реализованы частично или с кучей багов. Из-за этого, собственно, GCJ популярностью особой и не пользуется. Хотя, лично для меня идея компиляции Java в исполнимый код — очень привлекательная... Я бы и от C# на той же самой базе не отказался — такой, скажем, C# for Java Runtime (аналогично J#)... Мелкософт удавится


Да ? А какая такая куча багов в AWT и SWING. Просветите, если не сложно ?
Приходиться заниматься гадостью — зарабатывать на жизнь честным трудом (Б.Шоу)
Re: C# - необходимость?
От: GlebZ Россия  
Дата: 11.02.05 13:23
Оценка: +1
Здравствуйте, _Lestat_, Вы писали:

_L_>C# написан, специально для того, чтобы разрабатывать приложения на платформе .NET. Т.о. если я собираюсь работать в этой области, то здесь спрос на разработчиков выше именно в том случае, если они как можно лучше удовлетворяют идеологии языка? Т.е.: CLR, Framework Class Library и т.д. и т.п., а самое главное C#? И в конце концов C++ в данной области будет редкостью. Просто я хочу начать долгий по времени разработки проект на C++ и боюсь как бы со временем C++ не стал архаизмом в .NET. И кроме того, если устроюсь куда-нибудь, не хотелось бы чтобы везде требовалось знание C#, а я вот такой — на C++ пишу.


Вопрос:Чем похожи женщина-математик и морская свинка.
Ответ:И та и другая не является ни тем ни другим.


Пускай женщины-математики не обижаются, анекдот рассказала женщина-математик по которой можно сделать строго обратное утверждения.
Точно так же и MC++. Он никогда не будет С++ и никогда не станет абсолютно родным для Net языком. Поэтому не стоит им заморачиваться. А то что касается что изучать? А то и другое. И на родных платформах. И то и другое является очень интересной темой. Не только языки, но и библиотеки вокруг. В С# — Net Framework. в C++ различные API.

С уважением, Gleb.

PS: У меня есть подозрения, что человек при переходе с C# на С++ автоматически будет придерживаться более правильного дизайна. В большинстве случаев он будет использовать не указатели, и ссылки (как и задумывалось Страуструпом).
Re[3]: C# - необходимость?
От: GlebZ Россия  
Дата: 11.02.05 13:25
Оценка:
M>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.
А смысл?

С уважением, Gleb.
Re[3]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.02.05 13:31
Оценка:
Здравствуйте, Mamut, Вы писали:

C>>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


M>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

То бишь абсолютно все???? Их список постоянно увеличивается. Представляю полиглота одновременно программирующего на 50 и более языках
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[3]: C# - необходимость?
От: 0xDEADBEEF Ниоткуда  
Дата: 11.02.05 13:36
Оценка:
Hello, fplab!
You wrote in conference rsdn.philosophy on Fri, 11 Feb 2005 13:22:17 GMT:

f> Здравствуйте, 0xDEADBEEF, Вы писали:


DEA>> Кстати, яркий пример такой проблемы — это GCJ — там реализована только часть Java Runtime.


f> Да ? А какая такая куча багов в AWT и SWING. Просветите, если не сложно ?

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

А за подробностями добро пожаловать в http://gcc.gnu.org/bugzilla и там по ссылкам.
Не мешает также посмотреть на http://gcc.gnu.org/java
Posted via RSDN NNTP Server 1.9
__________
16.There is no cause so right that one cannot find a fool following it.
Re[4]: C# - необходимость?
От: Mamut Швеция http://dmitriid.com
Дата: 11.02.05 13:40
Оценка:
Здравствуйте, GlebZ, Вы писали:

M>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

GZ>А смысл?

GZ>С уважением, Gleb.


Для объединения усилий программистов, работающих на разных языках
... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


dmitriid.comGitHubLinkedIn
Re[4]: C# - необходимость?
От: Mamut Швеция http://dmitriid.com
Дата: 11.02.05 13:40
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


C>>>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


M>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

S> То бишь абсолютно все???? Их список постоянно увеличивается. Представляю полиглота одновременно программирующего на 50 и более языках

Ну это для комманд, где могут встречаться программисты, работающие на разных языках
... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


dmitriid.comGitHubLinkedIn
Re[5]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.02.05 13:51
Оценка:
Здравствуйте, Mamut, Вы писали:

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


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


C>>>>Он. собственно в чем? Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


M>>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

S>> То бишь абсолютно все???? Их список постоянно увеличивается. Представляю полиглота одновременно программирующего на 50 и более языках

M>Ну это для комманд, где могут встречаться программисты, работающие на разных языках

Не обязательно. Сам бы использовал несколько языков одновременно поддерживающие те или иные фичи. Но мой скептицизм касается сложности интеграции всех Net совместимых языков для одновременной отладки. Хотя .....
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[6]: C# - необходимость?
От: Mamut Швеция http://dmitriid.com
Дата: 11.02.05 14:01
Оценка: 5 (1)
M>>Ну это для комманд, где могут встречаться программисты, работающие на разных языках
S> Не обязательно. Сам бы использовал несколько языков одновременно поддерживающие те или иные фичи. Но мой скептицизм касается сложности интеграции всех Net совместимых языков для одновременной отладки. Хотя .....

Выглядит это вкусно

scott_currie_2004_cross_language_demo.wmv (26 MB)
... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


dmitriid.comGitHubLinkedIn
Re[5]: C# - необходимость?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.02.05 14:06
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Ну это для комманд, где могут встречаться программисты, работающие на разных языках

Надо понимать, что по сути пиши на разных языках делай тестирующий класс для них же а на C++ запускай их отладку вызовом методов этого класса предварительно подключив все модули ?????
Тогда почему только С++????
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
и солнце б утром не вставало, когда бы не было меня
Re[2]: C# - необходимость?
От: Павел Кузнецов  
Дата: 11.02.05 14:16
Оценка: :)
GlebZ,

> Точно так же и MC++. Он никогда не будет С++ и никогда не станет абсолютно родным для Net языком.


Ну, касательно MC++ вопросов нет, тем более что он уже deprecated. А вот в отношении C++/CLI, который Microsoft ныне очень бурно развивает, вопросы таки есть:
  • Что означает "быть родным для Net языком", и почему этого не произойдет для C++/CLI?
  • Что означает, что C++/CLI никогда не будет C++?
    Posted via RSDN NNTP Server 1.9
  • Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[6]: C# - необходимость?
    От: Mamut Швеция http://dmitriid.com
    Дата: 11.02.05 14:23
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

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


    M>>Ну это для комманд, где могут встречаться программисты, работающие на разных языках

    S> Надо понимать, что по сути пиши на разных языках делай тестирующий класс для них же а на C++ запускай их отладку вызовом методов этого класса предварительно подключив все модули ?????
    S> Тогда почему только С++????

    Скажем так. Например, есть набор классов, написанный твоим напарником на VB.NET, а проект ты пишешь на C#. И вот тебе надо страшно использовать функциональность того класса, а компилировать его в отдельную сборку, да еще ее потом подключать к проекту да еще.... В общем, морока. А в Whidbey — загнал их все в один проект и пользуй, как тебе надо.

    Но это все — теория Эххх.... Будет круто, если и partial классы тоже можно будет на разных языках писать *зажмурился в предвкушении*. Правда, не уверен, что такое будет
    ... << RSDN@Home 1.1.4 beta 3 rev. 281>> ... <<Winamp is playing "Что играет? Где играет? Где ВинАмп, я вас спрашиваю?">> ...


    dmitriid.comGitHubLinkedIn
    Re[2]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 11.02.05 14:32
    Оценка: 2 (1)
    Chardex,

    > _L_> C# написан, специально для того, чтобы разрабатывать приложения на платформе .NET. Т.о. если я собираюсь работать в этой области, то здесь спрос на разработчиков выше именно в том случае, если они как можно лучше удовлетворяют идеологии языка? Т.е.: CLR, Framework Class Library и т.д. и т.п., а самое главное C#?


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

    > я хочу начать долгий по времени разработки проект на C++ и боюсь как бы со временем C++ не стал архаизмом в .NET.


    Это совсем не так. В настоящее время Microsoft очень активно развивает C++/CLI. Из этого языка доступно большее число возможностей платформы .Net, чем из других .Net языков (по крайней мере в настоящее время), и C++/CLI позиционируется компанией Microsoft как основной системный язык .Net.

    > Мне кажется, что MC++ не станет архаизмом, но сам бы стал писать на C#


    MC++ (Managed Extensions for C++) уже стал архаизмом, т.к., собственно, был временным решением для обеспечения хоть какого-то доступа к .Net из C++. Основным средством для работы с .Net из C++ позиционируется C++/CLI. Впрочем, естественно, это не означает, что программистам, использовавшим MC++ придется потратить много средств для перехода на C++/CLI: Стэн Липпман написал транслятор для перевода программ с MC++ на C++/CLI. В результате написания транслятора родилось интересное пособие, суммирующее разницу между MC++ и C++/CLI.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[7]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 11.02.05 14:34
    Оценка: +1
    Здравствуйте, Mamut, Вы писали:

    M>Скажем так. Например, есть набор классов, написанный твоим напарником на VB.NET, а проект ты пишешь на C#. И вот тебе надо страшно использовать функциональность того класса, а компилировать его в отдельную сборку, да еще ее потом подключать к проекту да еще.... В общем, морока. А в Whidbey — загнал их все в один проект и пользуй, как тебе надо.


    M>Но это все — теория Эххх.... Будет круто, если и partial классы тоже можно будет на разных языках писать *зажмурился в предвкушении*. Правда, не уверен, что такое будет

    Это я все прекрасно понял. Что касается VB.NET и C# я думаю они справятся, что же касается Delphi, Pithon,Oberon итд.
    Пока помоему они даже в студию не интегрируются (могу ошибаться). Хотя это действительно было бы прекрасно.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[3]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 11.02.05 14:42
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>GlebZ,


    >> Точно так же и MC++. Он никогда не будет С++ и никогда не станет абсолютно родным для Net языком.


    ПК>Ну, касательно MC++ вопросов нет, тем более что он уже deprecated. А вот в отношении C++/CLI, который Microsoft ныне очень бурно развивает, вопросы таки есть:

    ПК>
  • Что означает "быть родным для Net языком", и почему этого не произойдет для C++/CLI?
    Что такое указатель в С++/CLI?
    ПК>
  • Что означает, что C++/CLI никогда не будет C++?
    Что такое указатель в С++/CLI?

    С уважением, Gleb.
  • Re[3]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 11.02.05 15:20
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Как то не очень удобно ИМХО смотреть на признаки ссылочности для объектов. Если для С++ объекты могут быть как в стеке так и в куче, то для Net это невозможно (или может что и упустил ????) и излишние ^ немного напрягают.
    Кстати в том же Delphi для указателей на структуры совсем необязательно разименовывать указатели
    P^.ttt будет выглядеть как P.ttt
    Просто интересно, чем такая запись для объектов предпочтительна ?????
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[3]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 11.02.05 15:40
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

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


    Знаешь, для JVM тоже писалось очень много языков. Например. Только где они сейчас. Никому не нужны. То же самое будет и с Net. Останутся например VB и С#, а остальное все отомрет. Кому они нужны, если оформятся определенные стандарты написания программ под платформу. Несколько субъективное мнение, но C++/CLI, MC++, как его не зови тоже должен уйти со сцены. Как никому не нужный инструмент. Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.

    С уважением, Gleb.

    PS: Мне достаточно жаль людей которые повелись на байку что C++ код можно легко портировать под Net. Если бы у меня стояла такая задача, я бы портировал под C#. Трудоемкость не сильно бы возрасла, но код бы смотрелся и управлялся значительно лучше.
    Re[5]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 11.02.05 16:56
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Ага. То есть, в проекте C++ могут мирно сосуществовать файлы на, скажем, C++, C# и VB.NET.


    Непонятно как это физически будет реализовано. Будет какой то аналог ILMerge? Или просто будет возможность создавать многофайловые сборки?

    M> При этом во время дебага можно точки останова ставить в любом файле и отладчик будет там покорно останавливаться. В репортаже это выглядело неимоверно круто, но мужик сказал, что такое будет доступно только из C++ проектов


    Это можно и сейчас в любом проекте. Ты видимо что то путаешь.
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[7]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 11.02.05 16:56
    Оценка:
    Здравствуйте, Mamut, Вы писали:

    M>Будет круто, если и partial классы тоже можно будет на разных языках писать


    Вот это вряд ли. partial это чисто синтаксическая фича компиляторов.
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[4]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 12.02.05 00:57
    Оценка: 4 (2)
    Serginio1,

    > Как то не очень удобно ИМХО смотреть на признаки ссылочности для объектов. Если для С++ объекты могут быть как в стеке так и в куче, то для Net это невозможно (или может что и упустил ????)


    В C++/CLI можно делать так:
       void foo(int count)
       {
         HungryForResources resource_waster (count);
         resource_waster.eatAsMuchAsYouNeed();
       }

    чему в C# эквивалентом является такое:
       void foo(int count)
       {
         using (HungryForResources resource_waster = new HungryForResources (count))
         {
           resource_waster.eatAsMuchAsYouNeed();
         }
       }

    Также это работает для базовых классов и данных-членов, автоматизации вызова Dispose() для которых, пожалуй, в C# нет.

    > и излишние ^ немного напрягают.


    Тут есть еще разные соображения. Например: как сохранить "забоксенное" типизированное значение value-типа в C#? Что-то мне, глядя на неявные ссылки, кажется, что никак. В C++/CLI так:
    int i = 10;
    
    int^ i_boxed = i;
    
    // Далее можно использовать "забоксенное" значение i без повторного боксинга.
    . . .
    
    // Можно даже получить прямую ссылку на целое, лежащее в боксе:
    
    int% i_ref = %i_boxed;


    В общем, значки *, &, ^, % и т.п. нужны для того, чтобы можно было точнее отразить происходящее, и чтобы можно было точно выражать, о каком именно типе идет речь. В этом случае компилятор сможет защитить программиста от множества ошибок и непреднамеренных преобразований (например, boxing обозначен намного более явно, чем в C#, т.к. int и int^ — различные типы).

    Стоит еще вспомнить, что T^, T% и т.п. могут быть аргументами шаблонов. В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от обычного, и наоборот, члены ref class'ов в обычных классах, и наоборот, и т.п. В общем, если рассмотреть все возможные варианты комбинации "managed" классов с "обычными" типами и различными чертами языка, то должно становиться ясно, что "угадайка" со стороны компилятора, что же именно имел в виду программист в данном случае, работать не будет.

    > Кстати в том же Delphi для указателей на структуры совсем необязательно разименовывать указатели

    > P^.ttt будет выглядеть как P.ttt
    > Просто интересно, чем такая запись для объектов предпочтительна ?????

    Использование -> вместо . для доступа к членам через handles (^) — решение достаточно произвольное. Вариант с точкой рассматривался, но, насколько я понял, авторы C++/CLI решили, что: (1) использование -> для объектов, созданных через gcnew по аналогии с new более последовательно; (2) различие в использовании с доступом через ссылки (%) тоже имеет смысл.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[4]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 12.02.05 01:02
    Оценка: 4 (2) :)
    GlebZ,

    > Несколько субъективное мнение, но C++/CLI, MC++, как его не зови тоже должен уйти со сцены. Как никому не нужный инструмент.


    Твои заявления о никому не нужных инструментах находятся в некотором диссонансе с высказываниями представителей Microsoft. Я позволю себе процитировать некоторые из них:

    http://blogs.msdn.com/branbray/archive/2003/11/07/51007.aspx

    At the PDC, I was asked whether C# thinks they’re in the middle. The answer is absolutely! A few years ago, the usability team at Microsoft developed personas for programmers in each of the languages. The Visual Basic developer was the “opportunistic programmer”, the C# developer was the “pragmatic programmer”, and the C++ developer was kind of guy who knew the whole system.


    http://groups.google.com/groups?selm=OlswMDOuBHA.2428%40tkmsftngp03

    Yes, managed code is the direction we are going in moving forward for all the places where it makes sense. However extrapolating that to mean C# is simply not true. We are spending a lot of resources to make sure C++ is a primary development language on the .Net platform and are seeing a lot of internal adoption of C++ to write managed code inside of Microsoft. In the RTM version the primary focus of MC++ is to enable you take integrate easily with existing code, but in future releases you will see us focusing much more on making C++ take up the traditional role it serves role as the high end language for system level programming and for expert level programming on the .Net platform.


    http://pluralsight.com/blogs/hsutter/archive/2004/10/05/2672.aspx

    In VS 2005, C++ is the systems programming language for .NET. If you already know C++, there is no need to use another language, although you're free to use whatever language you like for all or any part of your application. C++ is not the simplest .NET language, just the most powerful one that exposes the most .NET CLR features and that usually generates the best optimized IL.


    http://msdn.microsoft.com/msdnmag/issues/05/01/coptimizations/

    C++ gives the programmer unprecedented flexibility to write high-performance managed code, and it does it all in a way that is natural to C++ programmers. There are many languages available for .NET-enabled programming; if you care about maximum performance, Visual C++ is the obvious choice.


    И т.д., и т.п.

    Похоже, ты ведешь речь о чем-то другом... C++/CLI это вовсе не новое название для MC++, это совсем другой, новый, язык, на разработку которого Microsoft в течение последних двух лет потратила достаточно много ресурсов, чтобы вот так просто спихивать его "со сцены". К тому же, как это ни забавно, заметная часть исследований, направленных на улучшение "внутренней механики" .Net исходит как раз от разработчиков VC++ (Phoenix, уточнение Dispose Pattern и т.п.) Так что кто как, а в Microsoft очень даже полагаются на использование C++ для разработок под .Net.

    > Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.


    Очень интересно, откуда же взяться объявлениям, если язык еще не выпущен? C++/CLI будет доступен только с выходом Visual Studio 2005 (aka Whidbey).
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[6]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 12.02.05 04:06
    Оценка:
    AndrewVK,

    > M> Ага. То есть, в проекте C++ могут мирно сосуществовать файлы на, скажем, C++, C# и VB.NET.


    > Непонятно как это физически будет реализовано. Будет какой то аналог ILMerge? Или просто будет возможность создавать многофайловые сборки?


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

    В общем-то не удивительно, что значительная часть людей от MC++ в программировании под .Net отвернулась, перейдя на C#, а теперь в MS ожидают обратного притока тех, кто может захотеть использовать C++/CLI.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[7]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 12.02.05 08:41
    Оценка: :))
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>В общем-то не удивительно, что значительная часть людей от MC++ в программировании под .Net отвернулась, перейдя на C#, а теперь в MS ожидают обратного притока тех, кто может захотеть использовать C++/CLI.


    Не все так просто. Ситуация намного хитрее. Команда C# по прежнему уверена что это основной язык для .NET. Команда C++/CLI разумеется считает что основной язык будет C++. Вопрос только в том какая из них победит.
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[5]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 12.02.05 08:44
    Оценка: 36 (1) +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>GlebZ,


    ПК>Твои заявления о никому не нужных инструментах находятся в некотором диссонансе с высказываниями представителей Microsoft. Я позволю себе процитировать некоторые из них:

    [skipped]
    Я давно уже работаю на платформе Microsoft, за 12 лет уже успел наслушаться. Как только запахнет маркетингом, надо фильтровать базар. Поэтому на этой основе всегда стараюсь всегда сначала выработать свое мнение(которое не всегда совпадает с мнением Microsoft).

    ПК>Похоже, ты ведешь речь о чем-то другом... C++/CLI это вовсе не новое название для MC++, это совсем другой, новый, язык, на разработку которого Microsoft в течение последних двух лет потратила достаточно много ресурсов, чтобы вот так просто спихивать его "со сцены". К тому же, как это ни забавно, заметная часть исследований, направленных на улучшение "внутренней механики" .Net исходит как раз от разработчиков VC++ (Phoenix, уточнение Dispose Pattern и т.п.) Так что кто как, а в Microsoft очень даже полагаются на использование C++ для разработок под .Net.

    MC++ должен умереть не оставив следов. Этот ублюдок нежизнеспопобен. Что касается С++/CLI — то это еще один язык с C++ похожим синтаксисом но при этом не являющийся С++. Единственный его плюс — это явное управление боксингом. Что очень неудобно в С#. У всех языков на платформе Net есть ограничение — одноплатформенность. Он должен легко портироваться в MSIL и выполнять его правила и ограничения. Поэтому ты никогда не сможешь получить не value объект в стеке, или также легко реализовать множественное наследование. При этом еще динамическое связывание между сборками — еще одно ограничение. В то же время нельзя запрещать аттрибуты. Простого портирования ни из С++ в С++/CLI, ни в обратную сторону ждать не приходится . Итого получается что C++/CLI еще один язык с C++-подобным синтаксисом. Как и С# и Java.

    >> Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.


    ПК>Очень интересно, откуда же взяться объявлениям, если язык еще не выпущен? C++/CLI будет доступен только с выходом Visual Studio 2005 (aka Whidbey).

    Да будет та же самая проблема что и с MC++. С++ и С++/CLI — разные языки. Его также приходится изучать как и С#. API Windows, MFC не имеют ничего похожего с Net Framework. А именно работа с разными API и занимает наиболее большое кол-во времени разработки. Эффективность выполнения не может быть выше чем это эффективность компиляции MSIL. В результате — С# с его более простым синтаксисом значительно более подходит для разработки для Net и портирование с С++ на С# практически равнозначно по затратам как и портирование из C++ на С++/CLI. С точки зрения построения бизнес-приложений, вместо С++/CLI использовать С# эффективнее. Говорить о системном применении в среде Net говорить особо не приходится. Наличие управления боксингом — недостаточный плюс (хотя весьма весомый). Возможность использования unmanaged кода — вот достаточно весомый аргумент для построения системных вещей. Но за это слишком большая плата — потеря многоплатформенности.

    С уважением, Gleb.

    PS: все это было мое имхо.
    PSS:ожидать от Phoenix то чего в природе не может быть-не приходится(тоже мое имхо)
    Re[8]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 12.02.05 16:13
    Оценка:
    AndrewVK,

    > Команда C# по прежнему уверена что это основной язык для .NET.


    Похоже, это не совсем так. Впрочем, все зависит от трактовки понятия "основной".
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[9]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 12.02.05 16:40
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    >> Команда C# по прежнему уверена что это основной язык для .NET.


    ПК>Похоже, это не совсем так.

    Там только про C++ team. А вот это:

    Well, for one C++ developers are really multilingual developers. They use the programming language best suited for a task. A C++ programmer also tends to understand the whole system, and doesn’t mind reading MSIL or assembly code. C++ developers also think in much broader contexts – they think about the architecture of the whole program, rather than just single pieces. C++ developers also tend to appreciate lower level components that can be combined to create simpler components. (It’s really very difficult to create components with more utility from higher level components that have less utility). C++ programmers tend to think about performance more often, and understand the dependencies in their programs. C++ programmers try to maximize tools available to get things done more efficiently (be it, sed, awk, profilers, lint tools, perl scripts, etc.) C++ programmers will also build tools to get the job done when a tool is not available.

    Ну очень уж пахнет фанатизмом, что, собственно, только подтверждает то что я сказал ранее — каждый кулик хвалит свое болото.
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[10]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 12.02.05 17:31
    Оценка:
    AndrewVK,

    >>> Команда C# по прежнему уверена что это основной язык для .NET.


    > ПК>Похоже, это не совсем так.

    > Там только про C++ team.

    At the PDC, I was asked whether C# thinks they’re in the middle. The answer is absolutely! A few years ago, the usability team at Microsoft developed personas for programmers in each of the languages. The Visual Basic developer was the “opportunistic programmer”, the C# developer was the “pragmatic programmer”, and the C++ developer was kind of guy who knew the whole system.


    Но если ты полагаешь, что команда VC++ тебя дезинформирует, можно зайти на сайт Visual C# (хотя команде C# тоже нельзя верить: многие из них вышли из команды VC++ ).

    http://msdn.microsoft.com/vcsharp/productinfo/

    Visual C# .NET 2003 is the comprehensive tool set for creating XML Web services and Microsoft .NET-connected applications for Windows and the Web using the component-oriented C# development language. View product information, including case studies, news and reviews, and system requirements. Plus, get information on how to obtain this robust development package offering beginning and intermediate developers with C++ or Java experience a modern language and environment for creating next-generation software.


    > А вот это: <...> Ну очень уж пахнет фанатизмом


    Это компенсация marketing BS, исходящего от пропагандистов C# Шучу.

    Конечно, Брэндон несколько пристрастен; с другой стороны, во многом он прав. Даже по поводу использования многих языков. Например, недавно Миша Бергал заметил, что ему в повседневной работе нужно использовать как минимум 6-7 языков: C++, Python, JavaScript, SQL, AppleScript, C#, XSLT. Недавно был еще Perl, но от него удалось избавиться в пользу Python. Я без XSLT в работе пока обхожусь совсем, но у меня еще добавляется ассемблер, с которым, благо, встречаешься редко, и больше в аспекте чтения, чем написания. С C# и AppleScript тоже вижусь достаточно редко. Некоторые ребята еще используют Лисп, чтобы писать расширения к Emacs.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[11]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 12.02.05 17:46
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>

    At the PDC, I was asked whether C# thinks they’re in the middle. The answer is absolutely!

    И что? Чуть ниже он поясняет, что с его точки зрения означает in the middle.

    ПК>Но если ты полагаешь, что команда VC++ тебя дезинформирует

    Я полагаю что это как нельзя лучше иллюстрирует мои слова.

    ПК>http://msdn.microsoft.com/vcsharp/productinfo/
    ПК>[q]Visual C# .NET 2003 is the comprehensive tool set for creating XML Web services

    Маркетинговый булшит явно.

    ПК>Конечно, Брэндон несколько пристрастен; с другой стороны, во многом он прав.

    Ага, особенно вот это мне понравилось:
    [q]C++ developers also think in much broader contexts – they think about the architecture of the whole program, rather than just single pieces.

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

    ПК> Даже по поводу использования многих языков. Например, недавно Миша Бергал заметил, что ему в повседневной работе нужно использовать как минимум 6-7 языков: C++, Python, JavaScript, SQL, AppleScript, C#, XSLT.


    Мне тоже не сильно меньше (вот к примеру последний месяц — C#, Java, XSLT, Ant, SQL, XSD, NSIS Script, причем два последних я до этого не использовал всерьез). Начинаем мерять чья пиписка длиннее? Или может все таки заявления о том что используемый язык определяет кругозор идут в лес вместе с заявителями?

    ПК>Я без XSLT в работе пока обхожусь совсем,


    Зря. На редкость пригождающаяся в самых неожиданных местах технология.

    ПК> но у меня еще добавляется ассемблер, с которым, благо, встречаешься редко, и больше в аспекте чтения, чем написания. С C# и AppleScript тоже вижусь достаточно редко. Некоторые ребята еще используют Лисп, чтобы писать расширения к Emacs.


    Ну и, вывод то какой? Только С++ программисты настоящие программисты?
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[8]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Не все так просто. Ситуация намного хитрее. Команда C# по прежнему уверена что это основной язык для .NET. Команда C++/CLI разумеется считает что основной язык будет C++. Вопрос только в том какая из них победит.


    Ага. В МСДН Маг уже есть пробные заливы C++/CLI под названием "С++ Рулез" (я ну шучу). И рядом такие глубокие статьи по кишкам дотнета с кодом... разумется на Шарпе.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Похоже, это не совсем так. Впрочем, все зависит от трактовки понятия "основной".


    Не, ну, ты уже совсем в каком-то виртуальном мире живешь. Ты погляди на то начем все библиотеки к дотнету написаны. Даже в Авалоне (хотя его явно делала команда близкая к системе) основной код на Шарпе. На МС++ (скорее всего как раз CLI) сборки есть, но они все сплошь интеропные. То есть если нужно трахаться с С-ишным АПИ, то народ берет С++, если нет, то забивает на него.

    И это не хошо, ни плохо. Это есть.

    ЗЫ

    Кстати, насколько мне известно С++ Team в МС брошена на разработку оптимизатора для 64-битного дотнета. Забавно будет поглядеть на плоды. Пока что говорят тормозит он не по детски.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    ПК>>Похоже, это не совсем так.

    AVK>Там только про C++ team. А вот это:
    AVK>

    AVK>Well, for one C++ developers are really multilingual developers. They use the programming language best suited for a task. A C++ programmer also tends to understand the whole system, and doesn’t mind reading MSIL or assembly code. C++ developers also think in much broader contexts – they think about the architecture of the whole program, rather than just single pieces. C++ developers also tend to appreciate lower level components that can be combined to create simpler components. (It’s really very difficult to create components with more utility from higher level components that have less utility). C++ programmers tend to think about performance more often, and understand the dependencies in their programs. C++ programmers try to maximize tools available to get things done more efficiently (be it, sed, awk, profilers, lint tools, perl scripts, etc.) C++ programmers will also build tools to get the job done when a tool is not available.

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

    Ага. По этому определению программисты делятся на ламеров и С++-программистов. Эдак любой приличный программист явяется С++-программистом. Даже если С++ в глаза не видел.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Конечно, Брэндон несколько пристрастен; с другой стороны, во многом он прав. Даже по поводу использования многих языков. Например, недавно Миша Бергал заметил, что ему в повседневной работе нужно использовать как минимум 6-7 языков: C++, Python, JavaScript, SQL, AppleScript, C#, XSLT. Недавно был еще Perl, но от него удалось избавиться в пользу Python. Я без XSLT в работе пока обхожусь совсем, но у меня еще добавляется ассемблер, с которым, благо, встречаешься редко, и больше в аспекте чтения, чем написания. С C# и AppleScript тоже вижусь достаточно редко. Некоторые ребята еще используют Лисп, чтобы писать расширения к Emacs.


    Ну, то есть ты согласен с выоводм этого друга что ты не являешся настоящим С++-программистом так как используешь не 7 языков:

    И вообще, если человек испоьзует 7 языков, то среди них обязан быть С++?
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка: :)
    Здравствуйте, GlebZ, Вы писали:

    M>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

    GZ>А смысл?

    Смысл очень простой. С++-ников послели бы на хрен если бы всем пришлось писать все на С++. А так проектв вроде С++-ный, а народ сможет писать его на то на чем будет удобно.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Не стоит забывать, что возможности .Net шире, чем подмножество, доступное из C#.


    Это тоже распространенное заблуждение. Основные возможности практически напрямую выливаются в Шарпе. За кадром остается только малосущественные возможности и откровенно низкоуровневые. Для них и существуют МС++ и МСИЛ.

    ПК>Это совсем не так. В настоящее время Microsoft очень активно развивает C++/CLI. Из этого языка доступно большее число возможностей платформы .Net, чем из других .Net языков (по крайней мере в настоящее время), и C++/CLI позиционируется компанией Microsoft как основной системный язык .Net.


    Ну, ты моньяк. Так верить в такие сказки...
    В общем, если рекламная компания не про С++, то это сакс и т.п., но если про С++, то ты проглатываешь ее без молейшего сомнения.

    ПК>MC++ (Managed Extensions for C++) уже стал архаизмом, т.к.


    Ничего. За то у C++/CLI. Ей только предстоит стать архаизмом.

    ПК>, собственно, был временным решением


    Да? И откуда такие сведения? Вот в книге "Programming with managed extencion for Microsoft Visual C++ .NET" Richard Grimes во всю уверял, что МС++ — это супер язык. Весь из бебя паэр-фул, системный и гибки. А тут оказывается промежуточное решение.

    Просто народ не принял МС++. Ну, не дает он в болшинстве случаев приемуществ перед Шарпом.

    Думаю, и C++/CLI тоже будет угатована судьба системной прослойки и языка для тех кто сильно присох к С++. Со временем или появится еще один язык, или тот же Шарп разовьется и C++/CLI как и МС++ уйдет в историю.

    ПК> для обеспечения хоть какого-то доступа к .Net из C++. Основным средством для работы с .Net из C++ позиционируется C++/CLI.


    А чем был плох доступ в МС++?

    ЗЫ

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

    В общем, C++/CLI конечно зймет достойное место на переходном этапе. Но не думаю, что он способен стать основным языком. Дурацкие перегруженные конструкции вроде "ref interface class" не способствуют урощению восприятия. А значит, большинство людей потрахавшись снова выберет простые решения.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от обычного, и наоборот, члены ref class'ов в обычных классах, и наоборот, и т.п.


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

    ПК> В общем, если рассмотреть все возможные варианты комбинации "managed" классов с "обычными"


    О, как! "Обычними". А чем же это менеджед не обычны? Может все же менеджед с анменеджед? Но тогда вопрос, а на хрена козе баян? Зачем вообще (кроме как для интеропа) нужны анменеджед-классы?

    У меня ответ только один. МС++ предназначен для сурового интеропа. В нем он король. А в остальных случаях все это изврат и лишнее усложение.

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


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

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

    ПК>Использование -> вместо . для доступа к членам через handles (^) — решение достаточно произвольное. Вариант с точкой рассматривался, но, насколько я понял, авторы C++/CLI решили, что: (1) использование -> для объектов, созданных через gcnew по аналогии с new более последовательно; (2) различие в использовании с доступом через ссылки (%) тоже имеет смысл.


    Да пытались закосить под обычный С++. Чтобы у народа крыша не поехала окончательно. Она у него и так поедет от всех этих крышек и процентов.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 12.02.05 23:22
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>PSS:ожидать от Phoenix то чего в природе не может быть-не приходится(тоже мое имхо)


    Вот тут ты заблуждаешся, с остальным согласен.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[3]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 13.02.05 01:27
    Оценка: 4 (1) +3
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Ну, касательно MC++ вопросов нет, тем более что он уже deprecated. А вот в отношении C++/CLI, который Microsoft ныне очень бурно развивает, вопросы таки есть:


    Да они есть только у тебя. Тебе очень хочется, чтобы реклама МС оказалась правдой. А правда в том, что МС нужно как можно быстрее пересадить всех программистов под дотнет. И правила в этой игре отсуствуют.

    ПК>
  • Что означает "быть родным для Net языком",

    Означет быть языком проектировавшимся в расчете на эту платформу. C# не даром так популярен. Он не только проектировался для дотнета, но и дотнет проектировался под C#. Все концепции и паттерны либо подгонялись под него, либо встраивались в него.

    ПК> и почему этого не произойдет для C++/CLI?


    Потому-что это гибрид ежа с ужем. Это C# + С++ в одном флаконе. Человеку постоянно прийдется переключаться между стилям программирования для управляемого мира, и для старого доброго С++. Разработчики C++/CLI конечно постораются скрыть швы, но реально — это сделать невозможно. Управяемые типы буду резко отличаться от неуправляемых. Ну, и плюс ко всему ужасный синтаксив вроде interface class, value class и т.п.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
  • Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 02:06
    Оценка:
    VladD2,

    > ПК> В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от обычного, и наоборот, члены ref class'ов в обычных классах, и наоборот, и т.п.


    > Вот тэто чущь. Тим может быть или мэнеджед или анменеджед.


    Перечитываем цитату в тщетных попытках найти слово unmanaged...

    > ПК> В общем, если рассмотреть все возможные варианты комбинации "managed" классов с "обычными"


    > О, как! "Обычними". А чем же это менеджед не обычны? Может все же менеджед с анменеджед?


    Нет, именно с "обычными". "managed" было взято в кавычки, т.к. мне лень было расписывать, что имеется в виду ref и value классы.

    > Но тогда вопрос, а на хрена козе баян? Зачем вообще (кроме как для интеропа) нужны анменеджед-классы?


    Например, кроссплатформенное приложение. Если есть возможность использовать совместно с ref и value классами CLI "обычные" классы C++, это делает разработку кроссплатформенного кода неизмеримо легче. К сожалению, в Whidbey эта возможность присутствовать не будет. Собираются реализовать в следующей версии.

    > У меня ответ только один. МС++ предназначен для сурового интеропа. В нем он король. А в остальных случаях все это изврат и лишнее усложение.


    Ну, кому "лишнее усложнение", а кому и "дополнительные возможности" или "большая выразительная точность". Хочется простоты — выбираем VB.Net, хочется чуть побольше возможностей — берем C#. Хочется еще больше — C++/CLI. "Каждый выбирает для себя".

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


    > Ага. Врочем как никто в здравом уме не будет трахаться со всеми этим крысками и процентами если это все ничего не будет давать.


    Давай рассмотрим простой пример, чтобы было совсем понятно. Вкратце: хочется написать generic контейнер, в котором могут храниться объекты в т.ч. и value классов. У контейнера будет operator[]. Далее, допустим, мы хотим модифицировать один из объектов контейнера:
    Container<MyStruct> vec;
    vec.Add(new MyStruct(10, 20));
    vec[0].X += 1;

    Вопрос: как объявить в C# operator[] (или как оно там обозначается), чтобы была возможна операция, указанная выше. Предупреждая возражения о принципиальной невозможности, предлагаю вспомнить, например, "встроенные" массивы C#, в которых это замечательно работает. Итак, как на C# сделать свой аналог встроенного массива, в котором можно делать, как в примере выше?

    В C++/CLI это (предположительно) будет выглядеть так:
    generic<class T>
    class Container
    {
    public:
       . . .
       T% operator[](int index);
       . . .
    };
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[6]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 02:17
    Оценка: +1
    GlebZ,

    > MC++ должен умереть не оставив следов. Этот ублюдок нежизнеспопобен.


    +1

    > Что касается С++/CLI — то это еще один язык с C++ похожим синтаксисом но при этом не являющийся С++. Единственный его плюс — это явное управление боксингом. Что очень неудобно в С#.


    Не единственный, есть еще много аспектов: кроме боксинга, возможность оперировать ссылками на managed объекты (см. пример в конце соседнего сообщения
    Автор: Павел Кузнецов
    Дата: 13.02.05
    ), большие возможности для управления ресурсами (deterministic finalization), шаблоны (в т.ч. шаблоны ref или value классов, возможно шаблоны generic классов — в отношении последнего не уверен), в перспективе — возможность использовать в managed коде не только ref и value классы, но и "обычные" классы C++ (managed, но ни ref, ни value), намного более легкое и эффективное взаимодействие с unmanaged кодом.

    > Простого портирования ни из С++ в С++/CLI, ни в обратную сторону ждать не приходится. Итого получается что C++/CLI еще один язык с C++-подобным синтаксисом. Как и С# и Java.


    Это не так.

    1 day to port the entire Quake 2 source base. (Nearly all of to port the entire Quake 2 source base. (Nearly all of the effort was to translate from C to C++, and had nothing to do with our compiler or the .NET platform.)


    Сколько будет длиться перенос Quake 2 на C# или Java?..

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


    Скорее, наоборот, это возможность реальной кроссплатформенности, т.к. ожидать скорого реального распространения CLI на других платформах, достаточного для реализации desktop приложений, боюсь, не приходится. Кроме того, не надо смешивать unmanaged и managed в виде "обычных" классов и функций C++: в последнем случае использование общих кусков кода значительного объема между managed приложениями под Windows и unmanaged приложениями на других платформах вполне реально. В случае C# или VB.Net вряд ли это так.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 02:29
    Оценка:
    AndrewVK,

    >

    C++ developers also think in much broader contexts – they think about the architecture of the whole program, rather than just single pieces.

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

    Дык, речь-то идет о том, для кого проектировался язык Это были картинки, разработанные командами VB.Net, C# и C++/CLI для того, чтобы было легче идентифицировать свою аудиторию. В частности, возможность легко использовать в проектах C++/CLI другие языки .Net вполне согласуется с нарисованной картинкой.

    > ПК> недавно Миша Бергал заметил, что ему в повседневной работе нужно использовать как минимум 6-7 языков: C++, Python, JavaScript, SQL, AppleScript, C#, XSLT.


    > Мне тоже не сильно меньше (вот к примеру последний месяц — C#, Java, XSLT, Ant, SQL, XSD, NSIS Script, причем два последних я до этого не использовал всерьез). Начинаем мерять чья пиписка длиннее?


    Нет, пытаемся выудить рациональное зерно из слов Брэндона. Я полагаю, что то, что он хотел сказать, означает, что язык C++/CLI проектировался и для таких программистов, как ты. Т.е. тебе, возможно, будет иметь смысл посмотреть на C++/CLI повнимательнее.

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


    Такие заявления — безусловно.

    > ПК>Я без XSLT в работе пока обхожусь совсем,


    > Зря. На редкость пригождающаяся в самых неожиданных местах технология.


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

    > ПК> но у меня еще добавляется ассемблер, с которым, благо, встречаешься редко, и больше в аспекте чтения, чем написания. С C# и AppleScript тоже вижусь достаточно редко. Некоторые ребята еще используют Лисп, чтобы писать расширения к Emacs.


    > Ну и, вывод то какой? Только С++ программисты настоящие программисты?


    Нет, что это является одной из характерных черт тех, под кого проектировались C++ и C++/CLI.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[7]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 13.02.05 06:29
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>VladD2,


    >> ПК> В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от обычного, и наоборот, члены ref class'ов в обычных классах, и наоборот, и т.п.


    >> Вот тэто чущь. Тим может быть или мэнеджед или анменеджед.


    ПК>Перечитываем цитату в тщетных попытках найти слово unmanaged...


    И что же по-втоему тогда означет "унаследованный от обычного"? Пашь, типы телятся на анменеджед и менеджед. Ну, примитивные вэлью-типы конечно можно отбросить, так как они идентичны. Менеджед — означает может управляться ЖЦ. Только и всего.

    ПК>Нет, именно с "обычными". "managed" было взято в кавычки, т.к. мне лень было расписывать, что имеется в виду ref и value классы.


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

    ПК>Например, кроссплатформенное приложение. Если есть возможность использовать совместно с ref и value классами CLI "обычные" классы C++, это делает разработку кроссплатформенного кода неизмеримо легче. К сожалению, в Whidbey эта возможность присутствовать не будет. Собираются реализовать в следующей версии.


    Опять ерунда какая-то. Так что такое "обычные" классы если они противопоставляются менеджед-типм? И чем же это кросплатформенность станет выше? Ведь класс без интеропа принципиально будер работать на любой платформе где есть дотнет.

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


    Выразительно скорее меньшая. Это твои личные предпочтения. А вот большие возможности опять таки прояляются только в инеропе. В остальном как бы и без них все ОК. Даже без них обычно проще.

    ПК> Хочется простоты — выбираем VB.Net, хочется чуть побольше возможностей — берем C#. Хочется еще больше — C++/CLI. "Каждый выбирает для себя".


    Да возможности то в сэйф режиме у VB и Шарпа почти идентичные. Так что это скорее выбор вкуса. Так что без интеропа и анменеджед-кода C++/CLI выбор мазахита. Ну, если только нужно малой кровью портировать С++-ное приложение.

    Если бы C++/CLI что-то давал на практике, то все сборки МС давно бы писались на нем. Те 2-4% больших возможностей проще запаковать в отдельную сборку созданную на C++/CLI. Вот так они и поступают.

    ПК>Давай рассмотрим простой пример, чтобы было совсем понятно. Вкратце: хочется написать generic контейнер, в котором могут храниться объекты в т.ч. и value классов. У контейнера будет operator[]. Далее, допустим, мы хотим модифицировать один из объектов контейнера:

    ПК>
    ПК>Container<MyStruct> vec;
    ПК>vec.Add(new MyStruct(10, 20));
    ПК>vec[0].X += 1;
    ПК>

    ПК>Вопрос: как объявить в C# operator[] (или как оно там обозначается), чтобы была возможна операция, указанная выше. Предупреждая возражения о принципиальной невозможности, предлагаю вспомнить, например, "встроенные" массивы C#, в которых это замечательно работает. Итак, как на C# сделать свой аналог встроенного массива, в котором можно делать, как в примере выше?

    ПК>В C++/CLI это (предположительно) будет выглядеть так:

    ПК>
    ПК>generic<class T>
    ПК>class Container
    ПК>{
    ПК>public:
    ПК>   . . .
    ПК>   T% operator[](int index);
    ПК>   . . .
    ПК>};
    ПК>


    Пашь, это анменеджед тип. В менеджед ты не смощешь объявить оператор. А получить доступ в принципе можно. Для этого нужно в контейнере сделать методы вроде:
    deledate void Modify(ref T elem);
    
    void ModifyAt(Modify modify, int index)
    {
        modify(ref _internalArray[index]);
    }


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

    И вообще, в любом языке есть свои паттерны. Придерживаясь их у тебя не будет проблем. Ну, а то что тебе эти паттерные не знаком, или кажутся странными, так это с непривычки.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 13.02.05 06:29
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>в перспективе — возможность использовать в managed коде не только ref и value классы, но и "обычные" классы C++ (managed, но ни ref, ни value), намного более легкое и эффективное взаимодействие с unmanaged кодом.


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

    Что же касается менеджед-кода, то менеджед-код — это всего лишь код откомпилированный в МСИЛ. В нем и сейчас можно использовать любые типы. Хоть указатели на void.

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

    ПК>Это не так.

    ПК>

    1 day to port the entire Quake 2 source base. (Nearly all of to port the entire Quake 2 source base. (Nearly all of the effort was to translate from C to C++, and had nothing to do with our compiler or the .NET platform.)


    ПК>Сколько будет длиться перенос Quake 2 на C# или Java?..


    Логично. Язык созданный для интеропа рулит в своей области. Вот только ты сам говорил, что это не полный порт. Что мол данные анменеджед. А полный порт окажется быстрее на Шарп.

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


    Да как бы бэты ВинФормсов уже есть. Да и не все приложения требуют ГУИ. Есть еще серверы/сервисы. Например, то же АСП.НЭТ прекрасно работает под Линуксом.

    А вот C++/CLI тут не помошник. Это не C++! Нельзя написать менеджед-приложение которое без изменений можно будет скомпилировать в нэйтив-С++.

    ПК> Кроме того, не надо смешивать unmanaged и managed в виде "обычных" классов и функций C++: в последнем случае использование общих кусков кода значительного объема между managed приложениями под Windows и unmanaged приложениями на других платформах вполне реально. В случае C# или VB.Net вряд ли это так.


    Похоже ты сам не понимашь что говоришь. Я вот затруднясь тебя понять.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 07:13
    Оценка: +1
    VladD2,

    > ПК> в перспективе — возможность использовать в managed коде не только ref и value классы, но и "обычные" классы C++ (managed, но ни ref, ни value), намного более легкое и эффективное взаимодействие с unmanaged кодом.


    > Ты уже второй раз повторяешь эту ерись. Запомни на будущее "обычные классы" есть анменеджед-типы. Их нельзя размещать внутри менеджед-типов или наоборот. Только по ссылке. Не повторяй постоенно эту ерунду. (*) Это принципиальное ограничение.


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

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


    В "управляемый хип" их можно поместить в соответствующих обертках — не вопрос.

    > А вот C++/CLI тут не помошник. Это не C++! Нельзя написать менеджед-приложение которое без изменений можно будет скомпилировать в нэйтив-С++.


    Менеджед приложение с native классами? Почему нельзя? Мне кажется, что можно. По крайней мере, полагаю, что можно добиться, чтобы между managed и unmanaged версией были очень значительные общие куски кода.

    > ПК> Кроме того, не надо смешивать unmanaged и managed в виде "обычных" классов и функций C++: в последнем случае использование общих кусков кода значительного объема между managed приложениями под Windows и unmanaged приложениями на других платформах вполне реально. В случае C# или VB.Net вряд ли это так.


    > Похоже ты сам не понимашь что говоришь. Я вот затруднясь тебя понять.


    В переводе на используемые тобой термины (наверное, правильные) это означало, что не надо считать, что использование native класов обязательно приводит к тому, что приложение станет unmanaged. Это далеко не обязательно так. Далее, используя возможность включения в программу на C++/CLI значительных фрагментов кода, идентичного тому, что будет в соответствующих unmanaged приложениях на других платформах, можно будет добиться значительно меньшего дублирования кода, чем в случае C# или VB.Net.




    (*) Слушай, Влад, заканчивай бросаться фразами типа: "Ты уже второй раз повторяешь эту ерись.", "Не повторяй постоенно эту ерунду" — уже серьезно начинает утомлять. Неужели ты, действительно, хочешь, чтоб с тобой общались в таком же духе? Могу организовать, только скажи.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[8]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 07:45
    Оценка:
    VladD2,

    > И что же по-втоему тогда означет "унаследованный от обычного"? Пашь, типы телятся на анменеджед и менеджед. Ну, примитивные вэлью-типы конечно можно отбросить, так как они идентичны. Менеджед — означает может управляться ЖЦ. Только и всего.


    Ок, принимаю твою терминологию. Похоже, она правильная. Я просто пытался выразить, что код при этом unmanaged не становится. С перегрузкой термина managed/unmanaged для разных значений был не знаком. Таким образом, выше, в твоих терминах, написано:

    В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от unmanaged, и наоборот, члены managed классов в unmanaged классах, и наоборот, и т.п.

    > что такое "обычные" классы если они противопоставляются менеджед-типм? И чем же это кросплатформенность станет выше?


    Тем, что можно будет без изменений использовать значительные фрагменты кода как на Windows, под .Net, так и на других платформах, где реализаций CLI нет или же они недостаточно полны.

    > Если бы C++/CLI что-то давал на практике, то все сборки МС давно бы писались на нем.


    Он слишком недавно для этого сделан (точнее, еще не доделан). По утверждениям VC++ team в MS С++ для разработок под .Net начинают использовать все больше.

    > ПК>В C++/CLI это (предположительно) будет выглядеть так:

    > ПК>
    > ПК>generic<class T>
    > ПК>class Container
    > ПК>{
    > ПК>public:
    > ПК>   . . .
    > ПК>   T% operator[](int index);
    > ПК>   . . .
    > ПК>};
    > ПК>

    >
    > Пашь, это анменеджед тип.

    Ну, добавим ref. Не вопрос.

    > В менеджед ты не смощешь объявить оператор.


    Ну, индексер какой-нибудь, или как оно у вас называется. О, даже нашел, как в C# это выглядит:
    public T this[ int index ] {get; set;}

    Вот и сделай теперь, чтоб возвращалось не значение, а ссылка (managed pointer в терминологии IL, правда, насколько я знаю, это non CLS compliant). Насколько мне известно, в C# это сделать не получится. Для C++/CLI, насколько я понимаю, можно делать так:
    property T% default[int] {
       T% get(int index) { . . . }
       void set(T% value, int index) { . . . }
    }


    > А получить доступ в принципе можно. Для этого нужно в контейнере сделать методы вроде:

    >
    > deledate void Modify(ref T elem);
    >
    > void ModifyAt(Modify modify, int index)
    > {
    >     modify(ref _internalArray[index]);
    > }
    >


    Хочу, чтоб работало так же, как встроенный массив

    > И вообще, в любом языке есть свои паттерны.


    В лес такие паттерны. Тем более, что на C++/CLI, если я правильно понимаю, можно такой класс сварганить, и, наверное, можно будет даже использовать его из C#, безо всяких паттернов. Ведь как-то индексация встроенных массивов в .Net сделана, почему нам нельзя?

    Если это средствами properties в managed типах делать нельзя, тем больше оснований использовать unmanaged типы в managed коде, даже без соображений совместимости с другими платформами. В той же STL/CLI, насколько я понимаю, такие вещи можно делать влегкую.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[9]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 08:00
    Оценка:
    P.S. Только что заметил интересный момент, упущенный при первом прочтении...

    >> А получить доступ в принципе можно. Для этого нужно в контейнере сделать методы вроде:

    >>
    >> deledate void Modify(ref T elem);
    >>
    >> void ModifyAt(Modify modify, int index)
    >> {
    >>     modify(ref _internalArray[index]);
    >> }
    >>


    Такие паттерны в лес два раза: далеко не факт, что в качестве основы реализации будет встроенный массив

    В C++/CLI, если не indexed property, то хоть функцию-член можно сделать, которая ссылку будет возвращать.

    Хотя что-то это кино в .Net с танцами с бубном вокруг элементарных вещей все меньше нравится... Похоже на какие-то достаточно произвольные ограничения на ровном месте: функции-члены ссылки (managed pointer) возвращать могут, а indexed property — нет
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 13.02.05 09:09
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Дык, речь-то идет о том, для кого проектировался язык


    Да нет, там все довольно ясно. О том для кого — это самое начало абзаца. А тот изумительный спич предваряется следующей фразой:

    What makes C# and C++ programmers different?


    ПК> Это были картинки, разработанные командами VB.Net, C# и C++/CLI для того, чтобы было легче идентифицировать свою аудиторию.


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

    ПК>Нет, пытаемся выудить рациональное зерно из слов Брэндона.


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

    ПК> Я полагаю, что то, что он хотел сказать, означает, что язык C++/CLI проектировался и для таких программистов, как ты. Т.е. тебе, возможно, будет иметь смысл посмотреть на C++/CLI повнимательнее.


    Я его смотрел и наверняка буду смотреть еще. Но перспективы того, что он будет использоваться мной в качестве основного невелики. Поскольку я примерно представляю возможности и того и другого на практике, и не позволяю себе считать программистов на каком либо из языков менее квалифицированными чем на другом. И вопли некоторых фанаствующих господ из C++ Team вряд ли сильно на мое мнение повлияют. Вон Коробкин тоже своими сервисами задолбал по самое нехочу, вот только эти самые сервисы пока что еще из штанишек для простеньких приложений не вылезли.

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


    ПК>Такие заявления — безусловно.


    Любишь ловить рыбу в мутной воде?

    >> Ну и, вывод то какой? Только С++ программисты настоящие программисты?


    ПК>Нет, что это является одной из характерных черт тех, под кого проектировались C++ и C++/CLI.


    Т.е. если язык мне не подходит, то можно сделать вывод что либо я не тяну на такие замечательные качества, что описаны в сем опусе, либо получается пока у них фигово.
    ... << RSDN@Home 1.1.4 beta 4 rev. 319>>
    AVK Blog
    Re[14]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 16:43
    Оценка: +1
    AndrewVK,

    > ПК> Это были картинки, разработанные командами VB.Net, C# и C++/CLI для того, чтобы было легче идентифицировать свою аудиторию.


    > Там такого не написано, не сочиняй.


    "Не сочиняй" звучит несколько грубовато. Особенно учитывая, что там это таки было:

    At the PDC, I was asked whether C# thinks they’re in the middle. The answer is absolutely! A few years ago, the usability team at Microsoft developed personas for programmers in each of the languages. The Visual Basic developer was <...>


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


    > ПК> Такие заявления — безусловно.


    > Любишь ловить рыбу в мутной воде?


    В смысле? Я с тобой совершенно согласен в том, что "заявления о том что используемый язык определяет кругозор идут в лес вместе с заявителями".

    > ПК> что это является одной из характерных черт тех, под кого проектировались C++ и C++/CLI.


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


    Это не единственные варианты, но т.к. настроен ты явно по-боевому, то лучше мы этот разговор свернем.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[15]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 13.02.05 17:48
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Это не единственные варианты, но т.к. настроен ты явно по-боевому, то лучше мы этот разговор свернем.


    У вас в спорах с Владом пошла уже откровенная демагогия. И подобные ссылки в качестве доказательств очень характерный тому показатель. Лично я бы постыдился давать ссылки на подобное. Но у вас похоже пошла уже игра без правил. Непонятно только зачем это нужно.
    ... << RSDN@Home 1.1.4 beta 4 rev. 322>>
    AVK Blog
    Re[16]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 17:56
    Оценка:
    AndrewVK,

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


    Если в качестве аргумента, что утверждение: "Команда C# по прежнему уверена что это основной язык для .NET" — может не соответствовать действительности, то, имхо, вполне нормальный аргумент. Впрочем, зависит от того, что понимать под "основной язык для .NET".
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[17]: C# - необходимость?
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 13.02.05 18:01
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

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


    ПК>Если в качестве аргумента, что утверждение: "Команда C# по прежнему уверена что это основной язык для .NET" — может не соответствовать действительности, то, имхо, вполне нормальный аргумент.


    Я так не считаю.

    ПК> Впрочем, зависит от того, что понимать под "основной язык для .NET".


    Ну да, это твое фирменное — перевести все на спор о терминах.
    ... << RSDN@Home 1.1.4 beta 4 rev. 322>>
    AVK Blog
    Re[5]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 13.02.05 20:19
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    M>>>Согласно одному из видеорепортажей на Channel9, проекты С++ будут единственными, поддерживающими исходные файлы на разных .НЕТ-совместимых языках.

    GZ>>А смысл?

    VD>Смысл очень простой. С++-ников послели бы на хрен если бы всем пришлось писать все на С++. А так проектв вроде С++-ный, а народ сможет писать его на то на чем будет удобно.

    +1

    Кто мешает это сделать для всех проектов? Это действительно притягивание C++/CLI за уши. Только все равно, смысла в этом ноль. Тяжело читать VB.NET сырцы написанного соседом, если сам в течении недели писал на С#.

    С уважением, Gleb.
    Re[7]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 13.02.05 20:20
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    GZ>>PSS:ожидать от Phoenix то чего в природе не может быть-не приходится(тоже мое имхо)


    VD>Вот тут ты заблуждаешся, с остальным согласен.


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

    С уважением, Gleb.
    Re[6]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 13.02.05 20:48
    Оценка:
    GlebZ,

    > Кто мешает это сделать для всех проектов?


    Насколько я понимаю, компоновщик автоматически вызывается только для C++ проектов.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[3]: C# - необходимость?
    От: alexeiz  
    Дата: 14.02.05 04:04
    Оценка: 16 (1)
    "Павел Кузнецов" <5834@users.rsdn.ru> wrote in message
    news:1022428@news.rsdn.ru
    > Это совсем не так. В настоящее время Microsoft
    > очень активно развивает<br />
    <span class='lineQuote level1'>&gt; C++/CLI</span>
    . Из этого языка доступно большее число возможностей

    > платформы .Net, чем из других .Net языков (по крайней мере в
    > настоящее время), и C++/CLI позиционируется компанией Microsoft как
    > основной системный язык .Net.

    Эх, добавлю свою ложку дёгтя в бочку мёда C++/CLI. Есть одна фича в C#, отсутствующая в C++/CLI. Это некоторые специальные constraints для generic типов. Например, new, class или struct:

    class A< T > : where T : struct { ... }


    Эти вещи появятся в C++/CLI только в следующей версии (post Whidbey). В текущей версии для них просто не хватило времени.

    Хотя, полноты ради, нужно сказать, что множество этих constraints, доступное из IL даже больше, чем то, что доступно из C#. Поэтому, есть основание думать, что C++/CLI в следующей версии переплюнет C# и в этой области.
    Posted via RSDN NNTP Server 1.9
    Re[4]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 14.02.05 19:20
    Оценка: 8 (1) -1
    pkGlebZ,

    > ПК> в отношении C++/CLI, который Microsoft ныне очень бурно развивает, вопросы таки есть:

    > ПК>
  • Что означает "быть родным для Net языком", и почему этого не произойдет для C++/CLI?
    > Что такое указатель в С++/CLI?

    > ПК>
  • Что означает, что C++/CLI никогда не будет C++?
    > Что такое указатель в С++/CLI?

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

    Указатели в стандарте C++/CLI в целом являются тем же самым, что и указатели в стандарте самой платформы CLI. Точнее, указателей даже несколько (цифры — номера пунктов черновика стандарта CLI):
    • T* — "pointer" в терминологии C++ и C++/CLI, "unmanaged pointer" в терминологии CLI, эквивалентен обозначению * в IL, см. 13.4.1 Unmanaged Pointers
    • T& — "reference" в терминологии C++, почти эквивалентно "unmanaged pointer" в терминологии CLI за исключением того, что ссылки в C++ не могут быть нулевыми (по крайней мере в текущей версии спецификации) и не могут быть "перепривязаны" к новому объекту после инициализации (плюс есть еще нюансы с временем жизни объектов, но это уже не уровень платформы).
    • T^ — "handle" в терминологии C++/CLI, "object reference" в терминологии CLI, эквивалентен обозначению O в IL, см. 12.1.1.2 Managed Pointer Types; почти эквивалентно ссылке в C#.
    • T% — "tracking reference" в терминологии C++/CLI, "managed pointer" в терминологии CLI; почти эквивалентен обозначению ref в C# ("почти" т.к. в C#, если я не ошибаюсь, нельзя, например, иметь ref в типе возвращаемого значения метода).
    • interior_ptr<T>, "managed pointer" в терминологии CLI.
    • pin_ptr<T>, RAII обертка для "защиты" указателей от лапок GC.

    Теперь, когда ответы на твои вопросы, надеюсь, даны, могу я рассчитывать на ответы на свои вопросы?
    Posted via RSDN NNTP Server 2.0 alpha
  • Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[9]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Как оно будет "внутри" — отдельный вопрос.


    Ясно. Ну, тогда ты хоть говори что-то типа "виртуально встроены". А то ведь не ясно что ты имешь в виду.

    ПК> С точки зрения пользователя будет выглядеть как наследование и размещение по значению, при этом все виртуальные вызовы и т.п. будут работать, как ожидается, и подобъекты будут разрушаться также, как и в случае использования из "обычных" классов. См. например этот документ, страницы 23-27.


    А, ну, то есть эмуляция? Это конечно возможно. Но что-то меня берут большие сомнения. С++ вроде как позиционируется как язык раскрывающий кишки, а если он будет делать разного рода эмуляции, то боюсь, что многие отвернуться от него.

    ПК>В "управляемый хип" их можно поместить в соответствующих обертках — не вопрос.


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

    В обратную сторону уже будет GCHandle. Эта шутука по серьезнее будет. Это уже не какие-то нат 12 байт лишней памяти. Это уже серьзный оверхэд. Пару тысяч таких приколов и пиши пропало.

    Так что C++/CLI с отдной строны упростит переход на дотнет, а сдругой увеличит количество граблей.

    ПК>Менеджед приложение с native классами? Почему нельзя?


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

    ПК> Мне кажется, что можно. По крайней мере, полагаю, что можно добиться, чтобы между managed и unmanaged версией были очень значительные общие куски кода.


    Да это и сейчас можно. МС++ позволяет перекомпилировть 99% кода. Вот только никто не рвется. Ну, нет в этом нужды.

    Я вот в начале сделал контрол у которого бэкэнд (витруальный грид) был написан на С++, а фронт-этнд (логика дерева использующего внешнюю древесную модель) была создана на шарпе. В итоге, переписывая контрол под второй фрэймворк, я отказался от С++-ной части и заменил бэк-энд на МС-ный контрол который этому времени позволил использовать виртуальный режим. МС-ный контрол тоже на Шарпе написан. Так что теперь весь прокт на Шарпе. И проблем резко поубавилось. Причем об этом просили очень многие Янусисты. Ну, неудобно С++-ные сборки использовать. Там и с Юникодом проблемы. И компилятор лишний нужен. И знаний в С++ не у всех хаватет.

    ПК>В переводе на используемые тобой термины (наверное, правильные) это означало, что не надо считать, что использование native класов обязательно приводит к тому, что приложение станет unmanaged.


    Несомнненно. Тут действительно есть путанница. Менеджед-код — это МСИЛ. Менеджед-типы — это типы способные жить под управлением ЖЦ. А менеджед-приложение — это все же скорее именно менеджед-код. Хотя тот же C++/CLI вводит новые градации Pure и Safe. Обе подразумевают что не используют анменеджед-типов. Первый потому как обязан быть польньстью дотнетным, а второй так как не допускает нетипобезомасные конструкции.

    ПК> Это далеко не обязательно так. Далее, используя возможность включения в программу на C++/CLI значительных фрагментов кода, идентичного тому, что будет в соответствующих unmanaged приложениях на других платформах, можно будет добиться значительно меньшего дублирования кода, чем в случае C# или VB.Net.


    Думаю, что таким макаром можно быдет только добавлять прикольные финтифлюшки к имеющимся анменеджед-приложениям. Не более того. Ну, например, к ворду прикрутят модерновые диалоги открытия файлов и сделают пару прикольных фенечек на ХАМЛ-е. Но само приложение останется таким же глючным и с тем же функционалом. Если же они примут решение сделать чисто менеджед-Ворд, то тут МС++ уже не даст ничего нового.

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

    ПК>


    ПК>(*) Слушай, Влад, заканчивай бросаться фразами типа: "Ты уже второй раз повторяешь эту ерись.", "Не повторяй постоенно эту ерунду" — уже серьезно начинает утомлять. Неужели ты, действительно, хочешь, чтоб с тобой общались в таком же духе? Могу организовать, только скажи.


    ОК, действительно слишком резко. Извини. Но ты все же обращай внимания на замечания. А то как-то тебе говоришь, а ты без обяснений снова повторяешь довольно э... как-это-по-русски?
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Ок, принимаю твою терминологию. Похоже, она правильная. Я просто пытался выразить, что код при этом unmanaged не становится. С перегрузкой термина managed/unmanaged для разных значений был не знаком. Таким образом, выше, в твоих терминах, написано:


    ПК>В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от unmanaged, и наоборот, члены managed классов в unmanaged классах, и наоборот, и т.п.


    Понятно. Кстати, не используй италик. Читать очень тяжело.

    Тогда нужно пояснять, что "виртуально-смешанных". Так как физически это невозможно. Я прочел ту призентааху и понял, что:
    1. Это только планы.
    2. Это эмуляция приводящая к заментному оверхэду. Объекты реально хранятся по ссылке и делаются обертки. Ну, и таких предков скорее всего не будет видно в остальном управляемом виде. Ну, или оверхэд будет такой, что ведущие собаководы будет советовать не юзать данную фичу.

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


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

    ПК>Он слишком недавно для этого сделан (точнее, еще не доделан).


    Как сказать. Не раньше чем писались сборки для Лонгхорна.

    ПК>По утверждениям VC++ team в MS С++ для разработок под .Net начинают использовать все больше.


    Я этого как-то не заметил. МС++-ные сборки очень хорошо отличаются. В них море грязи. И таких сборок в Лонгхорне я видел не много. В основном это был суровый интероп.

    Конечно МС++ в МС будет использваться. Ведь там куча С++-программистов многих из которых в ближайшее время прийдется преесодить за дотнет. Просто не разумно выбрасывать время и деньги на ветер. Но вот если есть выбор, то для разработки под дотнет народ сам выбирает Шарп. Для библиотек Шарп вообще предпочтительнее, так как просто гарантирует, что быблиотеки будут совместимыми со свеми языками дотнета. Язык то практический родной для него. А вот на Васике или МС++ уже прийдется вводить серьезный контроль. На них есть куча несовместимых с CLI конструкций. Плюс МС++, даже причесанный — это все равно море "шума". Все эти ->, ^, %, ref class, interface class, array<XXX>... все это всего лишь мусор. Шаблоны же на практике не так часто будут использваться. И выходит, что из-за гипотетических возможностией прийдется постоянно созирцать целое море не нужной грязи. Кому это нужно? Нужно быть очень сильно привязанным к С++ чтобы терпеть все это.

    Далее народ будет потихоничку пробовать шарп. Сначала конечно будет дико не уютно, но со временем они поймут, что все точно так же неуютно и в МС++, только они это еще не полностью осоздали. Потом они привыкнут к подходам дотнета и еще раз взглянут на Шарп. При повтроном приближении окажется, что не все так плохо. Что все тоже самое и в МС++, но в то же время код на Шарпе чище и проще. Короче, через Х итераций большинство просто пересядят на Шарп и скажет — "Один хрен я в основном ограничен не языком, а платформой. Шарп позволяет все что нужно для этой платформы и на нем намного проще работать. Так зачем же я буду трахаться?!".

    >> Пашь, это анменеджед тип.


    ПК>Ну, добавим ref. Не вопрос.


    Не, не добавим. Уже само наличие не по дотнетному пергруженного оператора делает его не CLS-совместимым. Да и ссылка на середину объекта довольно дорогое удовольствие. Ты скорее проиграшь в скорости. Тогда уж проще будет вытащить вэлью-тип, изменить его, и засунуть обратно.

    >> В менеджед ты не смощешь объявить оператор.


    ПК>Ну, индексер какой-нибудь, или как оно у вас называется. О, даже нашел, как в C# это выглядит:

    ПК>
    ПК>public T this[ int index ] {get; set;}
    ПК>

    ПК>Вот и сделай теперь, чтоб возвращалось не значение, а ссылка (managed pointer в терминологии IL, правда, насколько я знаю, это non CLS compliant). Насколько мне известно, в C# это сделать не получится. Для C++/CLI, насколько я понимаю, можно делать так:
    ПК>
    ПК>property T% default[int] {
    ПК>   T% get(int index) { . . . }
    ПК>   void set(T% value, int index) { . . . }
    ПК>}
    ПК>

    Наверно, должно быть T% вторым параметром. И это не CLS-совместимый код. Эдак можно и в шарпе:
        unsafe class A
        { 
            int[] _array = new int[10];
    
            public int* this[int i]
            {
                get 
                {
                    fixed (int * p = &_array[i])
                        return p;
                }
            }
        }
    
        class Program
        {
            unsafe static void Main(string[] args)
            {
                A a = new A();
                int* p = a[1];
                *p += 2;
            }
        }

    только это тоже ансэйв.

    Как я понимаю не ввели ссылки в шарп чтобы не объяснять потом, почему нельзя сделать ссылочное поле. Ну, и что бы не поощьрять неудобные для ЖЦ конструкции.

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

    ПК>Хочу, чтоб работало так же, как встроенный массив


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

    >> И вообще, в любом языке есть свои паттерны.


    ПК>В лес такие паттерны.


    Ты еще не слышал какие, а уже в лес. Практика показывает, что писать на Шарпе проще и комфортнее. И мелкие гадости отнюдь не так страшны как тебе кажется.

    ПК> Тем более, что на C++/CLI, если я правильно понимаю, можно такой класс сварганить, и, наверное, можно будет даже использовать его из C#, безо всяких паттернов. Ведь как-то индексация встроенных массивов в .Net сделана, почему нам нельзя?


    Нельзя. Это не CLS-совместимый код. Шарп даже не сможет распознаь индексера и увидить только метод "set_Item(int, ref int)". А "get", ради которого все и затевалось он даже не заметит.

    ПК>Если это средствами properties в managed типах делать нельзя, тем больше оснований использовать unmanaged типы в managed коде, даже без соображений совместимости с другими платформами. В той же STL/CLI, насколько я понимаю, такие вещи можно делать влегкую.


    Как я понимаю, осноные контейнеры СТЛ как раз будут превращаться в менеджед типы. Хотя четр его знает. Вот только за каким фигом вообще они сдалить? Дотнетные контейнеры не хуже. Наружу же прийдется выставлять именно дотнетные.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>Кто мешает это сделать для всех проектов? Это действительно притягивание C++/CLI за уши. Только все равно, смысла в этом ноль. Тяжело читать VB.NET сырцы написанного соседом, если сам в течении недели писал на С#.


    Я так понял, что специально этого никто не делал. Просто С++-ный линкер заимел возможность мержить сборки. Кстати, подобные утилиты были и до него.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Насколько я понимаю, компоновщик автоматически вызывается только для C++ проектов.


    Гы. Он только у С++ и существует. У всех остальных однопроходная схема компиляции. Никаких объектников и ни какого гемороя.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Такие паттерны в лес два раза: далеко не факт, что в качестве основы реализации будет встроенный массив


    ПК>В C++/CLI, если не indexed property, то хоть функцию-член можно сделать, которая ссылку будет возвращать.


    По сути никакой разрицы с возвратом ссылки, только без проблем для ЖЦ.

    ПК>Хотя что-то это кино в .Net с танцами с бубном вокруг элементарных вещей все меньше нравится...


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

    ПК> Похоже на какие-то достаточно произвольные ограничения на ровном месте: функции-члены ссылки (managed pointer) возвращать могут, а indexed property — нет


    Да в Шарпе и функции не могут. Дело в том, что нельзя хранить в полях такие ссылки. А это уже концептуально не чистое решение. В Шаре концептуальную чистоту блюдут силнее банального удобства. Вот видимо и решили не вводить ссылки. Хотя никаких физических проблем нет. Ведь указатель же вернуть можно без проблем. Стало быть остается только семантику ссылки рантаймом обработывать. В С++ же с концептуальной целостностью все ОК. Ее там никогда не было. Вот и встроили все на благо универсальности.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 14:18
    Оценка:
    Здравствуйте, alexeiz, Вы писали:


    A>Эти вещи появятся в C++/CLI только в следующей версии (post Whidbey). В текущей версии для них просто не хватило времени.


    Сдается мне, что это не та проблема, чтобы не решить ее в этой версии.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: C# - необходимость?
    От: henson Россия http://www.njt-rails.com
    Дата: 15.02.05 15:07
    Оценка: +1
    Здравствуйте, GlebZ, Вы писали:

    GZ>PS: У меня есть подозрения, что человек при переходе с C# на С++ автоматически будет придерживаться более правильного дизайна. В большинстве случаев он будет использовать не указатели, и ссылки (как и задумывалось Страуструпом).


    Года два пишу на Java и C#, которые по стилю программирования для меня очень похожи.
    Но понадобилось тут написать кое-что на C++ под Symbian и кажется, что уже кажется, что этот язык значительный шаг назад, как по скорости разработки, так и по логике самого процесса. Наибольшие задержки в работе возникают в связи с многообразием различных макросов, повальным переопределением базовых типов данных, не всегда прозрачными действиями препроцессора и разделением классов на хидеры (h) и тело (cpp). Конечно C++ язык очень гибкий и для него есть хорошие компиляторы, но для задач общего назначения IMHO лучше понятная объектная модель и C#/Java в придачу.

    P.S. До этого лет 8 писал на C++, поэтому на недостаток опыта трудно пенять
    Re[10]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 15:50
    Оценка: +1
    VladD2,

    > ПК>В перспективе предполагается ввести возможность создания смешанных классов: ref class, унаследованный от unmanaged, и наоборот, члены managed классов в unmanaged классах, и наоборот, и т.п.

    >
    > Понятно. Кстати, не используй италик. Читать очень тяжело.

    Странно... Видимо, у тебя что-то со шрифтами. Попробовал в трех браузерах, все замечательно читается:


    > ПК> Он слишком недавно для этого сделан (точнее, еще не доделан).


    > Как сказать. Не раньше чем писались сборки для Лонгхорна.


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

    > МС++, даже причесанный — это все равно море "шума". Все эти ->, ^, %, ref class, interface class, array<XXX>... все это всего лишь мусор.


    Влад, аргументация такого уровня — несерьезно. Это из серии споров, что лучше: begin ... end или { ... }. Особенно на фоне того, что эти дополнительные обозначения таки дают дополнительные возможности.

    > Шаблоны же на практике не так часто будут использваться.




    > через Х итераций большинство просто пересядят на Шарп и скажет — "Один хрен я в основном ограничен не языком, а платформой.


    Это не так: ограничен ты только в том, что выставляешь "наружу". В этом (межязыковом взаимодействии) всегда были ограничения. Главная разница в использовании C++ и C# — возможности, доступные тебе "внутри" сборок.

    > Шарп позволяет все что нужно для этой платформы


    (1) Смотря, что делать. (2) Ряд вещей проще делать на C++/CLI: шаблоны, управление ресурсами, и т.п.

    > само наличие не по дотнетному пергруженного оператора делает его не CLS-совместимым.


    Это оттого, что я не знал, какой синтаксис нужен. Перепиши в виде индексированного свойства — и все пироги.

    > Да и ссылка на середину объекта довольно дорогое удовольствие. Ты скорее проиграшь в скорости.


    Ты явно проигнорировал упоминание встроенных массивов. Они работают именно так, как нужно.

    > ПК>
    > ПК>property T% default[int] {
    > ПК>   T% get(int index) { . . . }
    > ПК>   void set(T% value, int index) { . . . }
    > ПК>}
    > ПК>

    > Наверно, должно быть T% вторым параметром.

    В примере в MSDN было именно так. Посмотрел в тест, который написал, пока игрался (и это работало в C++/CLI)... Именно так, как написано

    > И это не CLS-совместимый код. Эдак можно и в шарпе:

    >
    >     unsafe class A
    >     {
    >         int[] _array = new int[10];
    >
    >         public int* this[int i]
    >         {
    >             get
    >             {
    >                 fixed (int * p = &_array[i])
    >                     return p;
    >             }
    >         }
    >     }
    >


    Это, если я правильно понимаю, unmanaged указатель. В таком случае, разница принципиальная.

    > только это тоже ансэйв.


    В том-то и дело, что в C# это unsafe. В C++ указанное выше safe (по крайней мере, компилируется с ключом /clr:safe без вопросов), хотя и не CLS-compliant. Забавно, что cледующее, если я правильно понимаю, является CLS-compliant:
    S% access(int index)
    {
       return arr_[index];
    }

    во всяком случае, я не нашел в стандарте CLI или C++/CLI упоминаний обратного. Правда, C# это дело потреблять отказался Так что одно из двух: я чего-то не нашел, либо C# не все CLS-compliant потреблять умеет...

    > ПК> Хочу, чтоб работало так же, как встроенный массив


    > Хотеть не вредно. Индексеры — это свойства. И у них адреса брать нельзя (на С++ тоже).


    Не надо брать адрес свойства. Достаточно, чтобы оно для модификаций возвращало/принимало managed pointer.

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


    Немного не понял. Что именно не получается сделать?

    >>> И вообще, в любом языке есть свои паттерны.


    > ПК>В лес такие паттерны.


    > Ты еще не слышал какие, а уже в лес.


    В данном случае такие == подобные предложенному с контейнерами.

    > Практика показывает, что писать на Шарпе проще и комфортнее.


    Дык, ты ж никогда не пробовал C++/CLI в том же объеме, что и C# — так что это не практика, это теория

    > ПК> Тем более, что на C++/CLI, если я правильно понимаю, можно такой класс сварганить, и, наверное, можно будет даже использовать его из C#, безо всяких паттернов. Ведь как-то индексация встроенных массивов в .Net сделана, почему нам нельзя?


    > Нельзя. Это не CLS-совместимый код. Шарп даже не сможет распознаь индексера и увидить только метод "set_Item(int, ref int)". А "get", ради которого все и затевалось он даже не заметит.


    Не все затевается для C# Много вещей предназначены для "внутреннего" использования. И не хочется их ограничивать, только из-за того, что кто-то вовне чего-то там "не поймет"

    > Как я понимаю, осноные контейнеры СТЛ как раз будут превращаться в менеджед типы. Хотя четр его знает. Вот только за каким фигом вообще они сдалить? Дотнетные контейнеры не хуже.


    Это кому как.

    > Наружу же прийдется выставлять именно дотнетные.


    Для "наружных" пользователей те же контейнеры STL/CLI можно будет отдавать как IList<T> и т.п.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[3]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 15.02.05 15:52
    Оценка: +2
    Здравствуйте, henson, Вы писали:

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


    GZ>>PS: У меня есть подозрения, что человек при переходе с C# на С++ автоматически будет придерживаться более правильного дизайна. В большинстве случаев он будет использовать не указатели, и ссылки (как и задумывалось Страуструпом).


    H>Года два пишу на Java и C#, которые по стилю программирования для меня очень похожи.

    H>Но понадобилось тут написать кое-что на C++ под Symbian и кажется, что уже кажется, что этот язык значительный шаг назад, как по скорости разработки, так и по логике самого процесса. Наибольшие задержки в работе возникают в связи с многообразием различных макросов, повальным переопределением базовых типов данных, не всегда прозрачными действиями препроцессора и разделением классов на хидеры (h) и тело (cpp). Конечно C++ язык очень гибкий и для него есть хорошие компиляторы, но для задач общего назначения IMHO лучше понятная объектная модель и C#/Java в придачу.

    Я тоже его получил когда пришлось возвращаться к своим старым программам на Паскале. Ну все в нем уже не понравилось. Наверное у программера есть понятие родного языка. Для меня сейчас это С++ и C#. Для кого-то это например VB6. Переходя на другой язык, начинаешь применять приемы присущие другому языку. А поскольку это иногда невозможно, или делается совсем другим способом и средствами, то уже появляется предвзятое мнение. Разделение классов на h и cpp для меня не такой уж большой недостаток (а чаще достоинство). Рука набита пользоваться VS где можно одновременно создавать и описание и тело. Многообразие различных макросов — в большинстве своем они мне известны. К тому же я умею ими пользоваться когда мне это нкжно. Шаблоны очень удобная штука (к ним долго нужно привыкать, но и легко отвыкнуть). Когда садишься за родной С++, то в голове что-то переключается. Когда садишься за C#, то сразу начинаешь пользоваться property, более продвинутой системой компонентности. Сборки, делегаты, value-не value объекты и все так далее. Я не чуствую себя ущемленным ни в одном из этих языков. Но как только надо что-то сделать в Delphi — каюк. Отвык я от него. И то не так, и это не то. И конструктора — бред, и деструкторы — маразм. И в хелпарь лазишь за функциями, о незнании которых любой дельфист плюнул бы в лицо. А все дело в том, что отвык от языка. 3 года назад, когда я делал достаточно большой проект на нем, и знал его на зубок, и ничего мне странным и нелогичным не казалось.

    PS: Вообще-то я говорил (даже правильнее говорить предполагал) совсем другую вещь.
    Re[10]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 16:09
    Оценка:
    VladD2,

    > <...>


    Поскипанное прочитано, но отвечать, по крайней мере, сейчас я не буду.

    > C++/CLI вводит новые градации Pure и Safe. Обе подразумевают что не используют анменеджед-типов.


    Нет, это не так. И /clr:pure, и /clr:safe замечательно "едят" unmanaged типы. Например, в таком виде:
         struct Unmanaged { };
    
         public value struct S
         {
             int x;
             int y;
             Unmanaged u;
         };


    > Первый потому как обязан быть польньстью дотнетным,


    Явно не соответствует действительности: /clr:pure означает, что код будет только managed. Это вовсе не означает, что нельзя использовать unmanaged классы.

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


    Unmanaged типы вовсе не означают отсутствие контроля типизации. /clr:safe означает, что код будет managed и verifiable. Это точно так же не исключает использования unmanaged типов.

    > Ведь даже банальный контроль типов требует отаказаться от анменеджед-тиопв.


    Не требует. Запрещены только "опасные" преобразования и т.п.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[5]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 16:23
    Оценка:
    VladD2,

    > A> Эти вещи появятся в C++/CLI только в следующей версии (post Whidbey). В текущей версии для них просто не хватило времени.


    > Сдается мне, что это не та проблема, чтобы не решить ее в этой версии.


    Вчера общался с разработчиками. Сказали, что отложена, т.к. не получилось придумать легкий в реализации синтаксис (вспоминаем о тяжелом наследии древнего кода в VC++, плюс о конечности ресурсов разработчиков). Если фичу будут требовать многие пользователи беты — сделают.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[5]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 15.02.05 18:00
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Извини за задержку с ответом, сначала смотрел C++/CLI более досконально.
    Давай попробуем убрать из С++/CLI — компилируемый чистый unmanagment код. Почему — так? Потому что мы получаем чистый C++ язык непосредственно компилируемый в машинные коды.
    Начнем со второго:
    2. Что означает, что C++/CLI никогда не будет C++?
    Ответ ты дал сам — T^, T%, разница в T& и т.д.

    1. Есть в Net два понятия. Первое — то что можно компилируется в MSIL, второе — то что этот код является CLS совметимым и может использоваться из других языков. Сейчас обсуждаемый T% таковым не является (точнее не всегда является). Он может содержать как ссылку на unmanagment, он может содержать ссылку на boxed значение — доступ к которому невозможно обработать CLS языком. Или он вообще не может быть null.

    Отдельно о возвращаемом параметре.
    Про unmanaged pointer говорить не стоит, проблема понятна. Проблема состоит в том, что нормальное место хранение value-типа либо стек, либо в памяти некоторого неvalue объекта. В других местах, cls язык просто не сможет с ним работать. Допустим, value структура у тебя храниться в стеке процедуры. Для возврата значения, ты должен поместить его в хип (путем боксирования). Ты возвращаешь его в вызывающую процедуру, значение находится в хипе, а по типу вызывающая процедура знает что это value тип, и его место в стеке. Притом это уже скопированное значение, так как это CLS язык. CLS языки не умеют работать с box value типами. (заметь, есть еще разница с С++ — не то что ref struct, а ref class не может иметь конструктор копирования). Поэтому return value_object без копирования в CLS невозможно. Есть некоторая хитрость типа ссылки interface которая может работать с value в хипе, но по моему — это пятая нога приделанная ненароком. С не value классами выполняется именно описанная тобой конструкция, что есть CLS совместимо.(проверить ничего не могу, сейчас не на чем).

    Итого — разница между MC++ и С++/CLI.
    1. Более переработанный интерфейс. Что занятно, сделали боксинг через (object)a — как в С#. Интерфейс за некоторыми исключениями классный.
    2. Возможность прозрачного компилирования unmanagement кода написанного на старых языках. Это прозрачным портированием назвать очень трудно. Это просто бессмысленный перегон из одного линкера в другой.

    Наиболее интересные (для меня) отличия C# и C++/CLI.
    1. С++/CLI позволяет делать not CLS код. В некоторых случаях это может делать и C# (в unsafe например), но здесь это проявлено особо. В результате потеря межязыковой совместимости.
    2. Может компилировать unmanage код. В результате потеря межязыковой и межплатформенной совместимости.
    3. Совсем другая система ссылок. Я не могу сказать что в C# вообще существует система ссылок. Единственное когда она там нужна — передача результата по параметрам из вызываемой функции(то есть ref и out). В остальном все сделано настолько прозрачно, что особо об этом не задумываешься.(кроме ахилесовы пяты которую ты упомянул, а точнее возможность работы с boxed значениями). Я честно говоря не могу сказать что лучше. Отсутсвие ссылок, или их явное присутсвие (которое в подавляющем большинстве случаев не нужно, но очень гадит визуально код). Хотя иногда очень хотелось бы явно знать что объект в хипе или стеке.

    С уважением, Gleb.
    После твоих сообщений, посмотрел про T%. Действительно очень мощная штука. Единственное смущает: A tracking reference cannot be assigned null. Благодаря тебе обратил внимание и получил много интересной информации (за что в благодарность и ставлю оценку).
    Re[11]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 15.02.05 18:07
    Оценка: 16 (1)
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>В том-то и дело, что в C# это unsafe. В C++ указанное выше safe (по крайней мере, компилируется с ключом /clr:safe без вопросов), хотя и не CLS-compliant. Забавно, что cледующее, если я правильно понимаю, является CLS-compliant:

    ПК>
    ПК>S% access(int index)
    ПК>{
    ПК>   return arr_[index];
    ПК>}
    ПК>

    ПК>во всяком случае, я не нашел в стандарте CLI или C++/CLI упоминаний обратного. Правда, C# это дело потреблять отказался Так что одно из двух: я чего-то не нашел, либо C# не все CLS-compliant потреблять умеет...

    Попробуй аттрибут CLSCompiliant. Для справки http://msdn2.microsoft.com/library/swe24087.aspx$$url0$$. И попробуй когда S является value и ref типом. Самому очень интересно возьмет хотя бы для ref.

    С уважением, Gleb.
    Re[6]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 15.02.05 18:14
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    GZ>С уважением, Gleb.

    GZ>После твоих сообщений, посмотрел про T%. Действительно очень мощная штука. Единственное смущает: A tracking reference cannot be assigned null. Благодаря тебе обратил внимание и получил много интересной информации (за что в благодарность и ставлю оценку).
    operator+ vs Sum(ref...);
    Автор: Сергей Губанов
    Дата: 09.02.05


    Такой оператор хорош для валуе типов большого объема. Но учитывая инлайнинг выигрыш может оказаться фиговым
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[7]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 15.02.05 18:17
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

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


    GZ>>С уважением, Gleb.

    GZ>>После твоих сообщений, посмотрел про T%. Действительно очень мощная штука. Единственное смущает: A tracking reference cannot be assigned null. Благодаря тебе обратил внимание и получил много интересной информации (за что в благодарность и ставлю оценку).
    S> operator+ vs Sum(ref...);
    Автор: Сергей Губанов
    Дата: 09.02.05


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

    Во-первых, там сравнивается несравнимое.
    Во-вторых, ты это к чему?

    С уважением, Gleb.
    Re[8]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 15.02.05 18:22
    Оценка:
    Здравствуйте, GlebZ, Вы писали:

    Я так понимаю что T%
    T% Get() == void Get(ref T t)
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[9]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 15.02.05 18:32
    Оценка: 10 (1)
    Здравствуйте, Serginio1, Вы писали:

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


    S> Я так понимаю что T%

    S> T% Get() == void Get(ref T t)
    Нет. здесь. Эта шняга значительно круче.

    С уважением, Gleb.
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 19:14
    Оценка:
    GlebZ,

    > ПК> Забавно, что cледующее, если я правильно понимаю, является CLS-compliant:

    > ПК>
    > ПК>S% access(int index)
    > ПК>{
    > ПК>   return arr_[index];
    > ПК>}
    > ПК>

    > ПК> во всяком случае, я не нашел в стандарте CLI или C++/CLI упоминаний обратного. Правда, C# это дело потреблять отказался Так что одно из двух: я чего-то не нашел, либо C# не все CLS-compliant потреблять умеет...

    > Попробуй аттрибут CLSCompiliant. Для справки здесь.


    Спасибо!

    > И попробуй когда S является value и ref типом. Самому очень интересно возьмет хотя бы для ref.


    Думаю, эта возможность еще не реализована, или в ней ошибки: если включить данный атрибут на классе с индексированным свойством, возвращающим T%, то компилятор молчит, хотя в документации четко сказано, что, по крайней мере для свойств, это non CLS-compliant.

    P.S. Сейчас свяжусь с разработчиками по поводу статуса данной возможности...
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[9]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 19:31
    Оценка:
    Serginio1,

    > Я так понимаю что T%

    > T% Get() == void Get(ref T t)

    Имхо, это разные вещи: в первом случае клиенту возвращается managed указатель, пользуясь которым он может модифицировать объект типа T. Во втором случае клиент передает managed указатель на что-то, чем он обладает, и что сможет модифицировать функция Get.

    Кроме того, различается характер возможных модификаций: в первом случае можно модифицировать объект, но нельзя заменить его на другой. Во втором, если T — ref class, можно как модифицировать сам объект, так и изменить ссылку, которую передали, так что она начнет указывать на другой объект.

    Т.е. разницу в возможностях модификаций для ref классов на C++/CLI можно продемонстрировать так:

    void Get(T%); // можно модифицировать только сам объект, "перепривязать" ссылку нельзя


    void Get(T^%); // можно модифицировать как объект, так и "перепривязать" ссылку
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[6]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 15.02.05 21:55
    Оценка:
    GlebZ,

    > 2. Что означает, что C++/CLI никогда не будет C++?

    > Ответ ты дал сам — T^, T%, разница в T& и т.д.

    ОК. Т.е. говоря "C++/CLI никогда не будет C++" ты имел в виду, что C++/CLI будет продолжать оставаться отдельным языком, и с ISO С++ не сольется? Согласен, это маловероятно. Но не вижу, как это мешает использованию C++/CLI на платформе .Net.

    > 1. Есть в Net два понятия. Первое — то что можно компилируется в MSIL, второе — то что этот код является CLS совметимым и может использоваться из других языков. Сейчас обсуждаемый T% таковым не является (точнее не всегда является). Он может содержать как ссылку на unmanagment, он может содержать ссылку на boxed значение — доступ к которому невозможно обработать CLS языком. Или он вообще не может быть null.


    Насколько я понимаю, CLS-compliant относится не к коду, а к внешним "интерфейсам" сборки (интерфейс в более широком смысле, чем, скажем, interface в C#, а именно: набор доступных типов, набор сигнатур функций-членов классов и т.п.). Соответственно, не вижу никаких проблем в том, чтобы выставить из сборки "наружу" CLS-compliant "интерфейс", а "внутри" использовать большее количество возможностей платформы.

    Кроме того, тот же C# в этом отношении исключением не является. Скажем, насколько я понял, во второй версии планируется добавление возможности задания разного доступа к accessors of properties:

    http://msdn.microsoft.com/chats/transcripts/vstudio/vstudio_111804.aspx

    Q: When do you plan to allow different scope keywords for property get and set blocks? I.e. public getters with protected/private setters?
    A: The next release (Whidbey or VS 2005) should have it. The current beta 1 and various "Community Tech Preview" releases should already have it...


    Эта возможность является non CLS-compliant:

    CLS Rule 25: The accessibility of a property’s accessors shall be identical. (§8.11.3)


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

    > CLS языки не умеют работать с box value типами


    Ага, уже разобрался:

    CLS Rule 3: Boxed value types are not CLS-compliant. (§8.2.4.)


    > Поэтому return value_object без копирования в CLS невозможно.


    T% вовсе не означает боксинга, это managed pointer. И я не вижу в спецификации правила делающего возврат managed указателя non CLS-compliant, кроме случая с properties, что оговорено отдельно:

    CLS Rule 27: The type of a property shall be the return type of the getter and the type of the last argument of the setter. The types of the parameters of the property shall be the types of the parameters to the getter and the types of all but the final parameter of the setter. All of these types shall be CLS-compliant, and shall not be managed pointers (i.e., shall not be passed by reference). (§8.11.3)


    > 1. С++/CLI позволяет делать not CLS код. В некоторых случаях это может делать и C# (в unsafe например), но здесь это проявлено особо. В результате потеря межязыковой совместимости.


    Потеря языковой совместимости была бы в случае, если бы C++/CLI не позволял делать CLS-compliant "интерфейсы". Т.к. он делать CLS-compliant типы, методы и т.п. позволяет, то я проблемы не вижу.

    > 2. Может компилировать unmanage код. В результате потеря межязыковой и межплатформенной совместимости.


    Может. Но по умолчанию весь код managed, хотя и не обязательно CLS-compliant. В частности, использование unmanaged типов не приводит к тому, что код становится unmanaged. Точно также сам по себе не становится unmanaged код, полученный в результате переноса исходного кода из native приложения, если этот код перекомпилируется, а не используется в виде unmanaged библиотеки. Т.е. если мы, допустим, возьмем готовую библиотеку на C++ и перекомпилируем в режиме /clr, то мы получим managed код, который можно будет использовать в новом проекте на C++/CLI, и при этом соответствующая проекту сборка вполне может быть как managed (как mixed, так и pure или safe), так и CLS-compliant.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[11]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 22:03
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Странно... Видимо, у тебя что-то со шрифтами.


    У меня все в пордяке. Но италик на экране читается фигово. Лучше его не испоьзовать. Выразительных средств и без него достаточно.

    >> МС++, даже причесанный — это все равно море "шума". Все эти ->, ^, %, ref class, interface class, array<XXX>... все это всего лишь мусор.


    ПК>Влад, аргументация такого уровня — несерьезно. Это из серии споров, что лучше: begin ... end или { ... }. Особенно на фоне того, что эти дополнительные обозначения таки дают дополнительные возможности.


    Что я тебе могу сказать? Может тебе это и наормально. Для меня это грязь и шум. Думаю, для большинства тоже. Ну, а то что тебе не нарвится аргументация. Было бы страно если было бы на оборот.

    >> через Х итераций большинство просто пересядят на Шарп и скажет — "Один хрен я в основном ограничен не языком, а платформой.


    ПК>Это не так: ограничен ты только в том, что выставляешь "наружу". В этом (межязыковом взаимодействии) всегда были ограничения. Главная разница в использовании C++ и C# — возможности, доступные тебе "внутри" сборок.


    Это так, Пашь. И через пару лет ты это прочувствуеш в лучшем виде.

    >> Шарп позволяет все что нужно для этой платформы


    ПК>(1) Смотря, что делать. (2) Ряд вещей проще делать на C++/CLI: шаблоны, управление ресурсами, и т.п.


    Да не нужно никому твое управление ресурсами. Все эти навороты делаются чтобы привлечь таких как ты. Кто еще не привык к тому, что память больше не ресурс. Скачай те же исходники R#-а. Погляди какие там проблемы с управлением ресурсами. Потом скачай Янус...

    ПК>Это оттого, что я не знал, какой синтаксис нужен. Перепиши в виде индексированного свойства — и все пироги.


    Пашь, ссылки сами по себе не CLS-совместимы.

    ПК>Ты явно проигнорировал упоминание встроенных массивов. Они работают именно так, как нужно.


    Что ты называешь встроенными массивами?

    ПК>В примере в MSDN было именно так. Посмотрел в тест, который написал, пока игрался (и это работало в C++/CLI)... Именно так, как написано


    Я вот попробовал, и не работает.

    ПК>Это, если я правильно понимаю, unmanaged указатель.


    Неправильно понимашь. Это мнедедеж-указатель.

    ПК>В том-то и дело, что в C# это unsafe. В C++ указанное выше safe (по крайней мере, компилируется с ключом /clr:safe без вопросов), хотя и не CLS-compliant. Забавно, что cледующее, если я правильно понимаю, является CLS-compliant:

    ПК>
    ПК>S% access(int index)
    ПК>{
    ПК>   return arr_[index];
    ПК>}
    ПК>

    ПК>во всяком случае, я не нашел в стандарте CLI или C++/CLI упоминаний обратного. Правда, C# это дело потреблять отказался

    Если C#, то можешь смело считаь это не CLS-совместимым. Весь смысл CLS-compliant в том, чтобы можно было экспортировать методы и типы в другие языки. Причем Шарп — это своеобразная лакмусова бумажка, так как этот язык ближе всего к CLS-compliant.

    Короче, я декомпильнул код и получил вот такое описание гетера:
    public unsafe ref int get_Item(int index)
    {
          return (int) &(this._array[index]);
    }

    То есть это не только не CLS-совместимо, но и ансэйф.


    ПК>Не надо брать адрес свойства. Достаточно, чтобы оно для модификаций возвращало/принимало managed pointer.


    Блин, вся идея упрвляемого кода заключаетс в надежности. Указатели — это приговор надежности. Так что для дотнета — это дурь.

    ПК>Немного не понял. Что именно не получается сделать?


    Чтобы сементика была как при модификации по месту, а на самом деле бы производилось бы вынимание вэлью-типа, его модификация и помещение его обратно. Ну, например, как при инкременте свойства:
    obj.Prop++;


    ПК>Дык, ты ж никогда не пробовал C++/CLI в том же объеме, что и C# — так что это не практика, это теория


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

    Наоборот получил некоторое количество огорчения. Так попытка создать вектор менеджед-ссылок обламалась:
    std::vector<A^> vector;

    Сказали, что немогут использовать new для A^ и указали на:
    template<class _T1,
        class _T2> inline
        void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
        {    // construct object at _Ptr with value _Val
        void _FARQ *_Vptr = _Ptr;
        ::new (_Vptr) _T1(_Val);
        }


    ПК>Не все затевается для C# Много вещей предназначены для "внутреннего" использования. И не хочется их ограничивать, только из-за того, что кто-то вовне чего-то там "не поймет"


    И ты будишь сифонить мужду внутренним и внешним миром? И чем это отличается от создания оберток в сегодняшнем МС++?

    ПК>Это кому как.


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

    ПК>Для "наружных" пользователей те же контейнеры STL/CLI можно будет отдавать как IList<T> и т.п.


    Пока-что я даже не смог положить ссылочный тип в эти контейнеры. А уж как они смогут из сурового анменеджеда сделать менеджед IList<T> я вообще не представляю.

    Это вообще в какой версии должно появиться? А то у меня бэта два и все эти сказки так сказками и остались.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 22:03
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Нет, это не так. И /clr:pure, и /clr:safe замечательно "едят" unmanaged типы. Например, в таком виде:

    ПК>
    ПК>     struct Unmanaged { };
    
    ПК>     public value struct S
    ПК>     {
    ПК>         int x;
    ПК>         int y;
    ПК>         Unmanaged u;
    ПК>     };
    ПК>


    Ага. Но не в этой жизни. А в этой:

    d:\MyProjects\Tests\CppAsm\CppAsm\CppAsm.h(15) : error C4368: cannot define 'u' as a member of managed 'CppAsm::S': mixed types are not supported


    >> Первый потому как обязан быть польньстью дотнетным,


    ПК>Явно не соответствует действительности: /clr:pure означает, что код будет только managed. Это вовсе не означает, что нельзя использовать unmanaged классы.


    Ну, возможно. Но "сэйф" точно не должно позволять никаких вольностей вроде стл.

    ПК>Unmanaged типы вовсе не означают отсутствие контроля типизации. /clr:safe означает, что код будет managed и verifiable. Это точно так же не исключает использования unmanaged типов.


    При попытке вставить пустую анменеджед-структуру компилятор выдает:

    d:\MyProjects\Tests\CppAsm\CppAsm\CppAsm.h(9) : error C4959: cannot define unmanaged struct 'CppAsm::Unmanaged' in /clr:safe because accessing its members yields unverifiable code


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

    >> Ведь даже банальный контроль типов требует отаказаться от анменеджед-тиопв.


    ПК>Не требует. Запрещены только "опасные" преобразования и т.п.


    Не, Пашь. Сэйф — это значит "все анменеджед-типы идут лесом, так как их нельзя проверить". Типизация С++ тут идет лесом. Исполняться ведь код будет под управлением CLR, а ему о знаниях С++ ничего не известно. Собвстенно компилятор это и рассказал.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.02.05 22:03
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Вчера общался с разработчиками. Сказали, что отложена, т.к. не получилось придумать легкий в реализации синтаксис (вспоминаем о тяжелом наследии древнего кода в VC++, плюс о конечности ресурсов разработчиков).


    Чё там придумывать то? Содрали бы Шарповский и все. Бред какой-то.

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

    ПК>Если фичу будут требовать многие пользователи беты — сделают.


    Гы. Бете жить то всего ничего. В общем, я тут схожусь во мнении со Станиславским.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: C# - необходимость?
    От: alexeiz  
    Дата: 15.02.05 22:54
    Оценка: +1 :)
    Здравствуйте, VladD2, Вы писали:

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


    ...
    VD>Короче, я декомпильнул код и получил вот такое описание гетера:
    VD>
    VD>public unsafe ref int get_Item(int index)
    VD>{
    VD>      return (int) &(this._array[index]);
    VD>}
    VD>

    VD>То есть это не только не CLS-совместимо, но и ансэйф.

    Тебе-ж вроде сказали, что /clr:safe это компилирует. А что там какой-то декомпилятор выдаст — это уже его личное дело.

    ...

    ПК>>Дык, ты ж никогда не пробовал C++/CLI в том же объеме, что и C# — так что это не практика, это теория


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


    VD>Наоборот получил некоторое количество огорчения. Так попытка создать вектор менеджед-ссылок обламалась:

    VD>
    VD>std::vector<A^> vector;
    VD>

    VD>Сказали, что немогут использовать new для A^ и указали на:
    ...

    Если у тебя только до этого руки дошли, то считай что ты на уровне 3 в игре из 200.

    ...

    ПК>>Для "наружных" пользователей те же контейнеры STL/CLI можно будет отдавать как IList<T> и т.п.


    VD>Пока-что я даже не смог положить ссылочный тип в эти контейнеры. А уж как они смогут из сурового анменеджеда сделать менеджед IList<T> я вообще не представляю.


    Из сурового анменеджеда получится не менее суровый менеджед. Вообще-то, ссылка уже несколько раз пролетала:
    http://msdn.microsoft.com/visualc/whidbey/default.aspx?pull=/library/en-us/dnvs05/html/stl-netprimer.asp

    VD>Это вообще в какой версии должно появиться? А то у меня бэта два и все эти сказки так сказками и остались.


    У тебя Beta 2? Что-то слабо верится . В Beta 2 это должно появиться.
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 00:24
    Оценка:
    VladD2,

    >>> Шарп позволяет все что нужно для этой платформы


    > ПК> (1) Смотря, что делать. (2) Ряд вещей проще делать на C++/CLI: шаблоны, управление ресурсами, и т.п.


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


    Память (хоть и не согласен) — байт с ней. В данном случае речь шла об остальных ресурсах, которые нужно освобождать/закрывать вовремя. В C++/CLI для автоматизации управления ресурсами возможностей больше.

    > ПК> Это оттого, что я не знал, какой синтаксис нужен. Перепиши в виде индексированного свойства — и все пироги.


    > Пашь, ссылки сами по себе не CLS-совместимы.


    Это не так. Ссылки не CLS-совместимы только в случае использования внутри properties. Но в данном случае это все равно. Ты говорил, что этот класс unmanaged. Это не так, он будет managed, если исправить синтаксис, но, как и сразу упоминалось, останется не CLS-compliant.

    > ПК>Ты явно проигнорировал упоминание встроенных массивов. Они работают именно так, как нужно.

    >
    > Что ты называешь встроенными массивами?

    T[] в C#.

    > ПК> В примере в MSDN было именно так. Посмотрел в тест, который написал, пока игрался (и это работало в C++/CLI)... Именно так, как написано


    > Я вот попробовал, и не работает.


    На C++/CLI? Может, нужно скачать какой-нибудь beta refresh

    > ПК> во всяком случае, я не нашел в стандарте CLI или C++/CLI упоминаний обратного. Правда, C# это дело потреблять отказался


    > Если C#, то можешь смело считаь это не CLS-совместимым. Весь смысл CLS-compliant в том, чтобы можно было экспортировать методы и типы в другие языки. Причем Шарп — это своеобразная лакмусова бумажка, так как этот язык ближе всего к CLS-compliant.


    Не факт. В этом отношении я верю только спецификации CLI или любой "стандартной" утилите, верифицирующей этот факт (должна же быть такая?). В спецификации я такого не нашел. Найдешь — будет так. До тех пор, по умолчанию, считаем, что просто C# это решил не поддерживать, не ставя CLS-compliance выше своих внутренних целей. А то что это так, видно как минимум из того, в C# 2.0 вводят non CLS-compliant возможность (разный доступ к accessors of properties); наверное, и раньше такие возможности в C# были, просто мне они неизвестны.

    > Короче, я декомпильнул код и получил вот такое описание гетера:

    >
    > public unsafe ref int get_Item(int index)
    > {
    >       return (int) &(this._array[index]);
    > }
    >

    > То есть это не только не CLS-совместимо, но и ансэйф.

    Пока не найдена цитата из спецификации, я склонен полагать это артефактом декомпиляции, т.к. в C# нет способа выразить то, что нужно. Вот что дает Reflector в виде IL:
    .property cpp_cli.S& named
    {
           .get instance cpp_cli.S& cpp_cli.C::get_named(int32)
           .set instance void cpp_cli.C::set_named(int32, cpp_cli.S&)
    }

    никаких unsafe, & — обычный unmanaged указатель.

    > ПК> Не надо брать адрес свойства. Достаточно, чтобы оно для модификаций возвращало/принимало managed pointer.


    > Блин, вся идея упрвляемого кода заключаетс в надежности. Указатели — это приговор надежности. Так что для дотнета — это дурь.


    Это твое личное мнение. Спецификация CLI managed указатели не запрещает. И даже не говорит, что код, их содержащий, является не type-safe или не verifiable.

    >
    > std::vector<A^> vector;
    >

    > Сказали, что немогут использовать new для A^ и указали на:

    Нужно использовать stdcli::vector<A^> (#include &lt;cli/vector&gt;). Не уверен, что он доступен в beta, в релизе точно будет.

    > ПК> Не все затевается для C# Много вещей предназначены для "внутреннего" использования. И не хочется их ограничивать, только из-за того, что кто-то вовне чего-то там "не поймет"


    > И ты будишь сифонить мужду внутренним и внешним миром? И чем это отличается от создания оберток в сегодняшнем МС++?


    Тем, что код будет managed, а если есть желание, то и safe.

    > ПК>Для "наружных" пользователей те же контейнеры STL/CLI можно будет отдавать как IList<T> и т.п.


    > Пока-что я даже не смог положить ссылочный тип в эти контейнеры.


    Ты пробовал другие контейнеры.

    > А уж как они смогут из сурового анменеджеда сделать менеджед IList<T> я вообще не представляю.


    stdcli::vector и т.п. — полностью managed код. safe and verifiable.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[7]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 00:36
    Оценка:
    VladD2,

    > ПК> Вчера общался с разработчиками. Сказали, что отложена, т.к. не получилось придумать легкий в реализации синтаксис (вспоминаем о тяжелом наследии древнего кода в VC++, плюс о конечности ресурсов разработчиков).


    > Чё там придумывать то? Содрали бы Шарповский и все. Бред какой-то.


    Далеко не факт, что синтаксис, принятый в C# легок в текущей реализации VC++.

    > Скорее всего просто проблем по горло вот и не до таких мелочей.


    И это тоже.

    > Но без этого же возможности создания дженериков на С++ будут ограниченными.


    System::Activator::CreateInstance<T> спасет отца русской демократии Плюс, в C++, учитывая наличие шаблонов, есть и другие способы легкого разрешения проблемы.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 00:49
    Оценка:
    VladD2,

    > ПК>Нет, это не так. И /clr:pure, и /clr:safe замечательно "едят" unmanaged типы. Например, в таком виде:

    > ПК>
    > ПК>     struct Unmanaged { };
    >
    > ПК>     public value struct S
    > ПК>     {
    > ПК>         int x;
    > ПК>         int y;
    > ПК>         Unmanaged u;
    > ПК>     };
    > ПК>


    > Ага. Но не в этой жизни. А в этой:

    >

    d:\MyProjects\Tests\CppAsm\CppAsm\CppAsm.h(15) : error C4368: cannot define 'u' as a member of managed 'CppAsm::S': mixed types are not supported


    У тебя, вероятно, более старая версия VC++ (у меня — 14.00.40607.85).

    >>> Первый потому как обязан быть польньстью дотнетным,


    > ПК> Явно не соответствует действительности: /clr:pure означает, что код будет только managed. Это вовсе не означает, что нельзя использовать unmanaged классы.


    > Ну, возможно. Но "сэйф" точно не должно позволять никаких вольностей вроде стл.


    Это еще почему? Для managed режима там специальная STL/CLI есть, #include <cli/vector> и т.п. Смотри соседнее сообщение
    Автор: Павел Кузнецов
    Дата: 16.02.05
    на предмет ссылок.

    > ПК>Unmanaged типы вовсе не означают отсутствие контроля типизации. /clr:safe означает, что код будет managed и verifiable. Это точно так же не исключает использования unmanaged типов.


    > При попытке вставить пустую анменеджед-структуру компилятор выдает: <...>


    У меня компилирует на ура:
    . . .
    
    namespace cpp_cli
    {
         struct Unmanaged { };
    
         public value struct S
         {
             int x;
             int y;
             Unmanaged u;
         };
    
         . . .


    ------ Rebuild All started: Project: cpp_cli, Configuration: Debug Win32 ------
    Deleting intermediate and output files for project 'cpp_cli', configuration 'Debug|Win32'
    Compiling...
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.40607.85 for 80x86
    Copyright (C) Microsoft Corporation. All rights reserved.
    cl /Od /AI "D:\Users\Pavel\test\CLI\cpp_cli\Debug" /D "WIN32" /D "_DEBUG" /D "_WINDLL" /D "_MBCS" /FD /EHa /MDd /GS /Yu"stdafx.h" /Fp"Debug/cpp_cli.pch" /Fo"Debug/" /Fd"Debug/vc80.pdb" /W4 /c /Zi /clr:safe /TP /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.40607\System.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.40607\System.Data.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.40607\System.XML.dll"
    .\cpp_cli.cpp
    .\AssemblyInfo.cpp
    cpp_cli.cpp
    AssemblyInfo.cpp
    Generating Code...
    Compiling resources...
    Linking...
    Merging manifest files...
    cpp_cli — 0 error(s), 0 warning(s)
    ========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========


    >

    d:\MyProjects\Tests\CppAsm\CppAsm\CppAsm.h(9) : error C4959: cannot define unmanaged struct 'CppAsm::Unmanaged' in /clr:safe because accessing its members yields unverifiable code


    > ПК>Не требует. Запрещены только "опасные" преобразования и т.п.


    > Не, Пашь. Сэйф — это значит "все анменеджед-типы идут лесом, так как их нельзя проверить".


    пока я думаю, что более старая версия VC++ у тебя

    > Типизация С++ тут идет лесом. Исполняться ведь код будет под управлением CLR, а ему о знаниях С++ ничего не известно.


    Известно-известно: C++ компилируется в IL.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 02:20
    Оценка:
    P.S.

    > Пока не найдена цитата из спецификации, я склонен полагать это артефактом декомпиляции, т.к. в C# нет способа выразить то, что нужно. Вот что дает Reflector в виде IL:

    >
    > .property cpp_cli.S& named
    > {
    >        .get instance cpp_cli.S& cpp_cli.C::get_named(int32)
    >        .set instance void cpp_cli.C::set_named(int32, cpp_cli.S&)
    > }
    >

    > никаких unsafe, & — обычный unmanaged указатель.

    Насчет CLS-compliance пока ничего не видно (т.к. набор правил небольшой, все-таки полагаю, что это на CLS-compliance не влияет), но уже ясно, что вызов данного метода не verifiable (т.е. таки unsafe):

    III.1.8.1.2.1 A method can be defined as returning a managed pointer, but calls upon such methods are not verifiable.


    Правда, не потому что это нельзя было сделать, а просто решили не заморачиваться:

    [Rationale: Some uses of returning a managed pointer are perfectly verifiable (e.g., returning a reference to a field in an object); but some not (e.g., returning a pointer to a local variable of the called method). Tracking this in the general case is a burden, and therefore not included in this standard. end rationale]

    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 02:21
    Оценка:
    Здравствуйте, alexeiz, Вы писали:

    A>Тебе-ж вроде сказали, что /clr:safe это компилирует. А что там какой-то декомпилятор выдаст — это уже его личное дело.


    Смотри сообщение рядом. С /clr:safe метка анэсэйф снелась. Вилимр у крмпиоятора глюки.

    A>Если у тебя только до этого руки дошли, то считай что ты на уровне 3 в игре из 200.


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

    A>Из сурового анменеджеда получится не менее суровый менеджед. Вообще-то, ссылка уже несколько раз пролетала:

    A>http://msdn.microsoft.com/visualc/whidbey/default.aspx?pull=/library/en-us/dnvs05/html/stl-netprimer.asp

    Ясно. Ключевое слово там:
    #include <cli/vector>

    Жаль только, что они этот файлик положить забыли.

    A>У тебя Beta 2? Что-то слабо верится .


    Твои проблемы.

    A> В Beta 2 это должно появиться.


    Может к офицальному выходу в марте и появится. А сейчас точно хрен. Я сделал поиск по подкаталогам нашел только:
    D:\VS2005\SmartDevices\SDK\PocketPC2003\Include\vector
    D:\VS2005\SmartDevices\SDK\Smartphone2003\Include\vector
    D:\VS2005\VC\ce\include\vector
    D:\VS2005\VC\crt\src\vector
    D:\VS2005\VC\include\vector

    В общем, количество стл-ей будет плодиться и размножаться.

    ЗЫ

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

    ПК>Память (хоть и не согласен) — байт с ней. В данном случае речь шла об остальных ресурсах, которые нужно освобождать/закрывать вовремя. В C++/CLI для автоматизации управления ресурсами возможностей больше.


    Я по этому поводу уже все сказал и не раз. Высасываешь проблему из пальца.

    ПК>Это не так. Ссылки не CLS-совместимы только в случае использования внутри properties. Но в данном случае это все равно. Ты говорил, что этот класс unmanaged. Это не так, он будет managed, если исправить синтаксис, но, как и сразу упоминалось, останется не CLS-compliant.


    Ссылки возращать нельзя. А сами по себе они конечно допустимы. ref и out — это они и есть.

    >> ПК>Ты явно проигнорировал упоминание встроенных массивов. Они работают именно так, как нужно.

    >>
    >> Что ты называешь встроенными массивами?

    ПК>T[] в C#.


    И что с ними? Синтаксис на индексеры похож? Ну, дык у полей тоже синтаксис похож на свойства. Однако поля по ссылке можно передавать, а свойства нет.

    ПК>На C++/CLI? Может, нужно скачать какой-нибудь beta refresh


    Пока вроде нет. Ну, да подождем офицальную бэту 2. В марте вроде обещали.

    ПК>Не факт.


    Факт.

    ПК> В этом отношении я верю только спецификации CLI или любой "стандартной" утилите, верифицирующей этот факт (должна же быть такая?).


    Ага. csc.exe называется. Даже придумали такой атрибут ClsComplane (или что-то вроде). Если на сборку задать, то должен материться на все места специально не помеченные этим атрибутом с фолсом.

    ПК> В спецификации я такого не нашел. Найдешь — будет так.


    И искать не будут. Все что не совместимо с Шарпом автоматом несовместимо. Впрочем как и с ВБ. Вся суть этой совместимости в том, чтобы совместимые сборки были видны в любых языках без ограничений. ВБ и Шарп этому требованию удолветворяют. В МС++ были проблемы.

    ПК>Нужно использовать stdcli::vector<A^> (#include &lt;cli/vector&gt;). Не уверен, что он доступен в beta, в релизе точно будет.


    И где его взять? Пока такой не пробегал.

    ПК>Тем, что код будет managed, а если есть желание, то и safe.


    Геморрой будет. И если, есть желание то крупный.

    ПК>Ты пробовал другие контейнеры.


    А нету их. Видимо статья на совсем внутренних билдах основана.

    ПК>stdcli::vector и т.п. — полностью managed код. safe and verifiable.


    Ну, будем надеяться. Хотя конечно изврат еще тот. Код не совместим, библиотеки дублиются за то "по нашему" по стльному.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 02:21
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>У тебя, вероятно, более старая версия VC++ (у меня — 14.00.40607.85).


    Агащасблин 14.00.41115.19

    Это у гого старя еще нужно выяснить. Я потому и смотреть начал, что хоть что-то из сказок заработало. Хотя бы менеджед-объекты с диспозом в стэке стали жить.

    >> Ну, возможно. Но "сэйф" точно не должно позволять никаких вольностей вроде стл.


    ПК>Это еще почему? Для managed режима там специальная STL/CLI есть, #include <cli/vector> и т.п. Смотри соседнее сообщение
    Автор: Павел Кузнецов
    Дата: 16.02.05
    на предмет ссылок.


    Со специльным — нет вопросов. Ты же о антенеджед-типах речь вел. Так вот они отменяются.

    ПК>У меня компилирует на ура:

    ПК>
    ПК>. . .
    
    ПК>namespace cpp_cli
    ПК>{
    ПК>     struct Unmanaged { };
    
    ПК>     public value struct S
    ПК>     {
    ПК>         int x;
    ПК>         int y;
    ПК>         Unmanaged u;
    ПК>     };
    
    ПК>     . . .
    ПК>



    Значит баг... уже исправленный в новой версии.

    ПК> пока я думаю, что более старая версия VC++ у тебя


    Ну, думай. У тебя вообще похоже бэта 1.

    >> Типизация С++ тут идет лесом. Исполняться ведь код будет под управлением CLR, а ему о знаниях С++ ничего не известно.


    ПК>Известно-известно: C++ компилируется в IL.


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

    ПК>Далеко не факт, что синтаксис, принятый в C# легок в текущей реализации VC++.


    Ну, если весь компилятор в заплатках, то конечно проблемы возможны. Я например, встроил в прасер R# констрэйны часа за два.

    ПК>System::Activator::CreateInstance<T> спасет отца русской демократии Плюс, в C++, учитывая наличие шаблонов, есть и другие способы легкого разрешения проблемы.


    А причем тут это? Констрэйн на структуры — это совсем другое. Это ограничение применимости дженерика только вэлью-типами.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: C# - необходимость?
    От: alexeiz  
    Дата: 16.02.05 03:03
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    A>>У тебя Beta 2? Что-то слабо верится .



    VD>Твои проблемы.


    Какой build?

    A>> В Beta 2 это должно появиться.


    VD>Может к офицальному выходу в марте и появится. А сейчас точно хрен. Я сделал поиск по подкаталогам нашел только:


    Промежуточные build'ы в этом смысле мало значения имеют.

    VD>ЗЫ


    VD>Вообще, забавно было бы глянуть как они извернулись.


    Понятно, как:

    namespace cli {
    template < typename T >
    ref class vector : public System::Collections::Generic::IList< T >, ...
    { ... }; }


    И понеслась.
    Re[14]: C# - необходимость?
    От: alexeiz  
    Дата: 16.02.05 03:08
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    ПК>>У тебя, вероятно, более старая версия VC++ (у меня — 14.00.40607.85).


    VD>Агащасблин 14.00.41115.19


    Эта версия собрана в середине ноября. До марта как-то далековато будет.
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 03:35
    Оценка:
    GlebZ,

    GZ> аттрибут CLSCompiliant


    Законтачил с разработчиками. Сказали, что пришлось эту возможность оставить за бортом. Изначально было реализовано в виде набора правил для FxCop, но из-за проблем с интеграцией сего инструмента с VC++ эту дорожку пришлось оставить, и текущих планов реализовывать эту функциональность для VS2005 нет. Возможно, набор правил для FxCop будет доступен в дальнейшем для скачивания.
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: C# - необходимость?
    От: alexeiz  
    Дата: 16.02.05 03:58
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>У тебя, вероятно, более старая версия VC++ (у меня — 14.00.40607.85).


    Павел, тебе нужно refresh установить. Build 40904: http://www.microsoft.com/downloads/details.aspx?FamilyID=afd04ff1-9d16-439a-9a5e-e13eb0341923&amp;displaylang=en

    Но, там одна тонкость есть. /clr:pure в нём не работает.
    Re[14]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 05:14
    Оценка:
    VladD2,

    >>> ПК> Ты явно проигнорировал упоминание встроенных массивов. Они работают именно так, как нужно.


    >>> Что ты называешь встроенными массивами?


    > ПК>T[] в C#.


    > И что с ними?


    С ними то, что операция [] возвращает managed указатель. Если бы это приводило к проблемам с производительностью, как ты утверждал, то вряд ли было бы принято такое решение.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[13]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 16.02.05 09:36
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>GlebZ,


    GZ>> аттрибут CLSCompiliant


    ПК>Законтачил с разработчиками. Сказали, что пришлось эту возможность оставить за бортом.

    А вот это действительно плохо. Оссобенно для C++/CLI.
    ПК>Изначально было реализовано в виде набора правил для FxCop, но из-за проблем с интеграцией сего инструмента с VC++ эту дорожку пришлось оставить, и текущих планов реализовывать эту функциональность для VS2005 нет. Возможно, набор правил для FxCop будет доступен в дальнейшем для скачивания.
    Самое смешное, что в текущих проектах первым делом FxCop очень ругался — почему у вас не проставлен аттрибут CLSCompliant

    С уважением, Gleb.
    Re[10]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 16.02.05 09:53
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Прошу прощения чего то съехала крыша.

    T% я себе представляю как

         struct Ref
         {
          object obj;
            int OffSet;
         
         }


    Для статических и стековых переменных obj==null а OffSet абсолютный адресс.
    То есть я могу хранить ссылку как на поле объекта, элемент массива Value типа и при этом обезапашиваяясь от сборки GC.

    В связи с этим предположением Вопрос Может ли быть поле объекта такого типа с последующим переприсваиванием
    Например объявив поле в предке указав на какую либо статическую переменную (т.к. переменная не должна быть Null) и переопределять ее в предках ?????

    Заранее прошу не кидать в меня тухлыми яйцами и помидорами
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[7]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 16.02.05 13:15
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Кроме того, тот же C# в этом отношении исключением не является. Скажем, насколько я понял, во второй версии планируется добавление возможности задания разного доступа к accessors of properties:


    ПК>http://msdn.microsoft.com/chats/transcripts/vstudio/vstudio_111804.aspx

    ПК>

    Q: When do you plan to allow different scope keywords for property get and set blocks? I.e. public getters with protected/private setters?
    ПК>A: The next release (Whidbey or VS 2005) should have it. The current beta 1 and various "Community Tech Preview" releases should already have it...


    ПК>Эта возможность является non CLS-compliant:


    ПК>

    CLS Rule 25: The accessibility of a property’s accessors shall be identical. (§8.11.3)


    Занятно. Есть такая шняга. Непонятно все таки как она сочетается.(но раздельный доступ к ацессорам вещь хорошая. А вот возможности accessorов в языках реализованы не полностью).

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


    >> Поэтому return value_object без копирования в CLS невозможно.


    ПК>T% вовсе не означает боксинга, это managed pointer. И я не вижу в спецификации правила делающего возврат managed указателя non CLS-compliant, кроме случая с properties, что оговорено отдельно:


    ПК>

    CLS Rule 27: The type of a property shall be the return type of the getter and the type of the last argument of the setter. The types of the parameters of the property shall be the types of the parameters to the getter and the types of all but the final parameter of the setter. All of these types shall be CLS-compliant, and shall not be managed pointers (i.e., shall not be passed by reference). (§8.11.3)


    В С# есть такой принцип, внешний объект не может менять внутренние данные (проще говорить value типы) неконтролируемо от объекта владельца. То есть жестко зашито что не может быть нарушения инкапсуляции. Я думаю это также требование CLS.

    >> 1. С++/CLI позволяет делать not CLS код. В некоторых случаях это может делать и C# (в unsafe например), но здесь это проявлено особо. В результате потеря межязыковой совместимости.


    ПК>Потеря языковой совместимости была бы в случае, если бы C++/CLI не позволял делать CLS-compliant "интерфейсы". Т.к. он делать CLS-compliant типы, методы и т.п. позволяет, то я проблемы не вижу.

    Наверное ты прав.

    >> 2. Может компилировать unmanage код. В результате потеря межязыковой и межплатформенной совместимости.


    ПК>Может. Но по умолчанию весь код managed, хотя и не обязательно CLS-compliant. В частности, использование unmanaged типов не приводит к тому, что код становится unmanaged. Точно также сам по себе не становится unmanaged код, полученный в результате переноса исходного кода из native приложения, если этот код перекомпилируется, а не используется в виде unmanaged библиотеки. Т.е. если мы, допустим, возьмем готовую библиотеку на C++ и перекомпилируем в режиме /clr, то мы получим managed код, который можно будет использовать в новом проекте на C++/CLI, и при этом соответствующая проекту сборка вполне может быть как managed (как mixed, так и pure или safe), так и CLS-compliant.

    А если сборка запускается на проце у которого не обратная а прямая последовательность байтов в слове, или другой формат указателей на память. Все что не подвластно JIT (а unmanaged практически неподвластно), то платформо-зависимо.
    Вообще можно развести код на 3 категории:
    1. Managed и verified — типобезопасных код генерируемый JIT компилятором из СIL.
    2. Unsafe — нетипобезопасных код генерируемый JIT компилятором из CIL.
    3. Unmanage — код генерируемый не из CIL, и соответсвенно JIT не может им управлять. Такой код всегда платформозависимый.
    В той информации которая мне доступна, я не увидел что стандартные классы (без ref и value) могут компилироваться в 1 или 2 категорию с помощью ключа /crl. То есть по сути — это всего лишь общее линкование кода на уровне процессора для native классов и кода на уровне CIL для ref и value.

    Где ты надыбал стандарт CLS? Что то я его не найду. На ECMA — лежит то же самое что поставляется с SDK. Кстати я там увидел нечто занятное Ecma International Moves to Standardize C++ Binding for CLI.

    С уважением, Gleb.
    Re[14]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 13:44
    Оценка:
    alexeiz,

    > ПК> У тебя, вероятно, более старая версия VC++ (у меня — 14.00.40607.85).


    > Павел, тебе нужно refresh установить. Build 40904: http://www.microsoft.com/downloads/details.aspx?FamilyID=afd04ff1-9d16-439a-9a5e-e13eb0341923&amp;displaylang=en


    Ага, спасибо, наконец, собрался это сделать. Here it comes...

    > Но, там одна тонкость есть. /clr:pure в нём не работает.


    Oops... Ладно, не очень и нужно было
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[8]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 14:36
    Оценка: 15 (1)
    GlebZ,

    > ПК> если мы, допустим, возьмем готовую библиотеку на C++ и перекомпилируем в режиме /clr, то мы получим managed код, который можно будет использовать в новом проекте на C++/CLI, и при этом соответствующая проекту сборка вполне может быть как managed (как mixed, так и pure или safe), так и CLS-compliant.


    Поправка: как выяснилось, safe, по крайней мере пока, мы вряд ли получим. (Pure) managed — легко.

    > 1. Managed и verified — типобезопасных код генерируемый JIT компилятором из СIL.

    > 2. Unsafe — нетипобезопасных код генерируемый JIT компилятором из CIL.

    Пожалуй, не "нетипобезопасный", а "не являющийся доказуемо типобезопасным средствами, описанными в спецификации CLI"

    > 3. Unmanage — код генерируемый не из CIL, и соответсвенно JIT не может им управлять. Такой код всегда платформозависимый.


    > В той информации которая мне доступна, я не увидел что стандартные классы (без ref и value) могут компилироваться в 1 или 2 категорию с помощью ключа /crl. То есть по сути — это всего лишь общее линкование кода на уровне процессора для native классов и кода на уровне CIL для ref и value.


    Давай попробуем на Visual Studio 2005 beta (естественно, код на C++/CLI):
         struct Unmanaged
         {
             int x;
             int y;
         };

    int C::foo()
    {
         Unmanaged u = { 10, 20 };
         u.x = u.x + u.y;
         return u.x;
    }

    Вот IL для C::foo, полученный из скомпилированной сборки с помощью Reflector:
    .method public static int32 foo() cil managed
    {
           // Code Size: 30 byte(s)
           .maxstack 4
           .locals (
                 int32 num1,
                 cpp_cli.Unmanaged unmanaged1)
           L_0000: ldloca.s unmanaged1
           L_0002: ldc.i4.s 10
           L_0004: stind.i4
           L_0005: ldloca.s unmanaged1
           L_0007: ldc.i4.4
           L_0008: add
           L_0009: ldc.i4.s 20
           L_000b: stind.i4
           L_000c: ldloca.s unmanaged1
           L_000e: ldloca.s unmanaged1
           L_0010: ldind.i4
           L_0011: ldloca.s unmanaged1
           L_0013: ldc.i4.4
           L_0014: add
           L_0015: ldind.i4
           L_0016: add
           L_0017: stind.i4
           L_0018: ldloca.s unmanaged1
           L_001a: ldind.i4
           L_001b: stloc.0
           L_001c: ldloc.0
           L_001d: ret
    }


    > Где ты надыбал стандарт CLS?


    http://msdn.microsoft.com/net/ecma/

    Далее — Working Draft 2.9.1, Partition I. CLS Rules для удобства собраны в пункте 11 (страница 74).

    > Что то я его не найду. На ECMA — лежит то же самое что поставляется с SDK. Кстати я там увидел нечто занятное Ecma International Moves to Standardize C++ Binding for CLI.


    Кста, относительно свежие черновики стандарта C++/CLI (во всяком случае, новее, чем то, что лежит на http://msdn.microsoft.com) собраны на сайте Plum Hall. Там же есть статейка "C++/CLI, Ecma TC39/TG5, and SC22/WG21", напечатанная в CVu в апреле 2004.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[15]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 18:00
    Оценка:
    Здравствуйте, alexeiz, Вы писали:

    VD>>Агащасблин 14.00.41115.19


    A>Эта версия собрана в середине ноября. До марта как-то далековато будет.


    А у нас уже март? Что имеем, на то и смотрим. Ежу понятно, что это не окончательный бэта 2. Иначе бы оно так не глючило. Но на всех лэбаках гордая надпись "бэта 2.".
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 18:00
    Оценка:
    Здравствуйте, alexeiz, Вы писали:


    A>Какой build?


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

    A>Промежуточные build'ы в этом смысле мало значения имеют.


    Да я и не утверждаю, что чего-то не будет. Забавен сам факт, того что впихивается все это в попыхах. Это не бэты. Это альфы. Просто в составе VS есть несколько продуктов. Дотнет и Шарп явно довольно стабильны и тянут на бэту. А вот разные Team System-ы и C++/CLI — это явно недоделанные продукты — альфы.

    По хорошему МС нужно было бы разделять их или начинать новый виток развития дотнета и Шарпа. А то получается, что они ждут С++-ников и др. Хотя может оно и к лучшему. А вось получится более стабильный продукт. Все же меня очень порадовало, что в бэте 2 откатили несколько непродуманных изменений сделанных в предыдущих билдах.

    A>Понятно, как:


    A>
    A>namespace cli {
    A>template < typename T >
    A>ref class vector : public System::Collections::Generic::IList< T >, ...
    A>{ ... }; }
    A>


    A>И понеслась.


    Не, как я понял основные проблемы с аллокаторами и т.п. Вот на это и интересно было бы поглядеть.

    В общем, похоже они создали новую библиотеку интерфесно похожую (но не идентичную) исходному СТЛ-ю. Я от них ждал, что они все же сохранят единый код и разрулят неувязки на дефайнах и т.п.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 18:00
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>С ними то, что операция [] возвращает managed указатель. Если бы это приводило к проблемам с производительностью, как ты утверждал, то вряд ли было бы принято такое решение.


    Ты явно что-то путашь. Нет никакой операции [] что-то возвращающей. Управляемые массивы поддерживаются CLR напрямую. Есть МСИЛ-команды загрузки элемента, вренее его адреса. Причем эти инструкции безопасны и верефицируемы. Джит вместо них пораждает довольно эффективный код.

    В случае же с указателями все сложнее. Это уже требует от джита и CLR в целом дополнительного контроля. В общем, как бы то нибыло CLR запрещает хранение ссылок не на начало объектов в других объектах. А без этого подель ссылки становится неполноценной и запутнной. Думаю именно из-за нарушения концептуальной целостности ссылка и не была введена в Шарп. Ну, а в С++ ввели так как язык по определению более низкоуровневый. В старом МС++ это вписывалось в его концепции. Но для нового уже получается неувязочка. С одной стороны идет явное упрощение языка. Появляются кучи конструкций которые могут порождать далего не оптимальный код, но при этом выглядят очень просто. В этом контексте такие обрезанные решения выглядят не очень крассиво.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 16.02.05 19:29
    Оценка:
    VladD2,

    > ПК> С ними то, что операция [] возвращает managed указатель. Если бы это приводило к проблемам с производительностью, как ты утверждал, то вряд ли было бы принято такое решение.


    > Ты явно что-то путашь. Нет никакой операции [] что-то возвращающей.


    Есть, конечно. Есть языковая конструкция x[y] для встроенных массивов ("операция []"), у нее есть результат ("возвращает"). В частности, в спецификации C# по этому поводу написано:

    The result of evaluating an array access is a variable of the element type of the array, namely the array element selected by the value(s) of the expression(s) in the expression-list.

    далее,

    12.4 A variable-reference is an expression that is classified as a variable. A variable-reference denotes a storage location that can be accessed both to fetch the current value and to store a new value. <...> [Note: In C and C++, a variable-reference is known as an lvalue. end note]

    Иными словами, variable в терминах C# соответствует lvalue в терминах C++. Соответственно, результатом операции [] для встроенных массивов является lvalue, обозначающее соответствующий элемент.

    > Управляемые массивы поддерживаются CLR напрямую. Есть МСИЛ-команды загрузки элемента, вренее его адреса.


    Ессно:
    private static void baz(S[] arr)
    {
            arr[3].x = 10;
    }


    .method private hidebysig static void baz([cpp_cli]cpp_cli.S[] arr) cil managed
    {
            // Code Size: 15 byte(s)
            .maxstack 8
            L_0000: ldarg.0
            L_0001: ldc.i4.3
            L_0002: ldelema [cpp_cli]cpp_cli.S
            L_0007: ldc.i4.s 10
            L_0009: stfld int32 [cpp_cli]cpp_cli.S::x
            L_000e: ret
    }


    Результатом ldlema и является managed pointer:

    4.9 ldelema
    <...>
    The ldelema instruction loads the address of the element with index index (of type int32 or native int) in the zero-based one-dimensional array array (of element type class) and places it on the top of the stack. Arrays are objects and hence represented by a value of type O. The return address is a managed pointer (type &).


    C++/CLI просто дает возможность вернуть полученное lvalue. Все дела

    > В случае же с указателями все сложнее. Это уже требует от джита и CLR в целом дополнительного контроля.


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

    A method can be defined as returning a managed pointer, but calls upon such methods are not verifiable. When returning byrefs, verification is done at the return site, not at the call site.

    [Rationale: Some uses of returning a managed pointer are perfectly verifiable (e.g., returning a reference to a field in an object); but some not (e.g., returning a pointer to a local variable of the called method). Tracking this in the general case is a burden, and therefore not included in this standard. end rationale]


    > В общем, как бы то нибыло CLR запрещает хранение ссылок не на начало объектов в других объектах.


    А это тут причем? Зачастую достаточно возможности оперировать ими внутри своей функции.

    > В старом МС++ это вписывалось в его концепции. Но для нового уже получается неувязочка. С одной стороны идет явное упрощение языка.


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

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


    Это никого не заботит, и не заботило. dynamic_cast<>, например, тоже может порождать далеко неоптимальный код. Вопрос в том, мешает ли предоставленная возможность эффективности в случаях, когда ей не пользуются.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[10]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 20:53
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Имхо, это разные вещи: в первом случае клиенту возвращается managed указатель, пользуясь которым он может модифицировать объект типа T. Во втором случае клиент передает managed указатель на что-то, чем он обладает, и что сможет модифицировать функция Get.


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

    По сути такие приколы удобны для алгоритмов которые как раз хорошо ложатся на функциональный стиль. Так что единственная беда в данном случае — это производительность делегатов и интерфейсов.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 20:53
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Кроме того, тот же C# в этом отношении исключением не является. Скажем, насколько я понял, во второй версии планируется добавление возможности задания разного доступа к accessors of properties:


    Они подали все изменения на стандартизацию. Так что через некоторое время он будет стандартным. В Шарпе не стандартными остаются джагед-массивы и ряд других приколов. Но в основном он очень близок к совместимости в безопасном режиме.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.02.05 20:53
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Кста, относительно свежие черновики стандарта C++/CLI (во всяком случае, новее, чем то, что лежит на http://msdn.microsoft.com) собраны на сайте Plum Hall. Там же есть статейка "C++/CLI, Ecma TC39/TG5, and SC22/WG21", напечатанная в CVu в апреле 2004.


    Слабал бы статейку по C++/CLI.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: C# - необходимость?
    От: alexeiz  
    Дата: 16.02.05 22:15
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

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


    A>>Промежуточные build'ы в этом смысле мало значения имеют.


    VD>Да я и не утверждаю, что чего-то не будет. Забавен сам факт, того что впихивается все это в попыхах. Это не бэты. Это альфы. Просто в составе VS есть несколько продуктов. Дотнет и Шарп явно довольно стабильны и тянут на бэту. А вот разные Team System-ы и C++/CLI — это явно недоделанные продукты — альфы.


    Для реализации STL/CLI нужна солидная поддержка со стороны компилятора. А она хромала по крайней мере до недавнего времени. Я не сомниваюсь, что STL/CLI уже разрабатывается достаточно долго. Только в окончательный продукт его пока не включали.

    ...
    VD>Не, как я понял основные проблемы с аллокаторами и т.п. Вот на это и интересно было бы поглядеть.

    Аллокаторов там не будет.

    VD>В общем, похоже они создали новую библиотеку интерфесно похожую (но не идентичную) исходному СТЛ-ю.


    Зачем? Что нам нужно от STL/CLI? Контейнеры, которые могут быть отдельными классами, и от которых даже не требуется идентичного интерфейса. И итераторы, которые работают с алгоритмами из стандартной библиотеки. Это и ожидается.

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


    "неувязки на дефайнах" — это характерно для твоего понимания C++.
    Re[17]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 17.02.05 05:40
    Оценка: +1
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Результатом ldlema и является managed pointer:

    ПК>

    4.9 ldelema
    ПК><...>
    ПК>The ldelema instruction loads the address of the element with index index (of type int32 or native int) in the zero-based one-dimensional array array (of element type class) and places it on the top of the stack. Arrays are objects and hence represented by a value of type O. The return address is a managed pointer (type &).


    ПК>C++/CLI просто дает возможность вернуть полученное lvalue. Все дела

    Видишь ли, в чем дело. Инструкция ldelema поддерживается самой средой. И среда совершенно точно знает, откуда взят этот управляемый указатель. И что все сценарии его использования безопасны. Позволю себе напомнить о существовании инструкций типа ldloca и ldarga. Их результаты, очевидно, можно передавать только вниз по стеку. При этом отличить результат ldarga от ldelema в текущей версии фреймворка невозможно. Я не специалист по формальным теориям виртуальных машин и доказательствам корректности, так что не могу сказать, стоило ли ввести соответствующие подтипы О для верификации, и возможно ли это было вообще.
    Поэтому единственный способ генерировать валидируемый мсил, оставляя возможности возврата ссылок из методов — это инлайнить все такие методы.
    В принципе, практически все сценарии использования таких методов приходящие мне на ум вполне подразумевают инлайнинг. Но с другой стороны, это опять ограничит возможности программиста. Нельзя, к примеру, будет объявить интерфейс, оборудованный ссылочным индексером. Нельзя будет сделать такой метод не-internal. В общем, горе одно, а не фича.

    ПК>Вполне можно было ввести этот контроль при проверке определения соответствующей функции, просто им лень стало это делать:

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

    Кстати, вообще правила верификации MSIL разрабатывались таким образом, чтобы, к примеру, гарантированно можно было построить однопроходный верификатор. И я подозреваю — неспроста.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[9]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 17.02.05 10:50
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Давай попробуем на Visual Studio 2005 beta (естественно, код на C++/CLI):

    ПК>
    ПК>     struct Unmanaged
    ПК>     {
    ПК>         int x;
    ПК>         int y;
    ПК>     };
    ПК>

    ПК>
    ПК>int C::foo()
    ПК>{
    ПК>     Unmanaged u = { 10, 20 };
    ПК>     u.x = u.x + u.y;
    ПК>     return u.x;
    ПК>}
    ПК>

    ПК>Вот IL для C::foo, полученный из скомпилированной сборки с помощью Reflector:
    ПК>
    ПК>.method public static int32 foo() cil managed
    ПК>{
    ПК>       // Code Size: 30 byte(s)
    ПК>       .maxstack 4
    ПК>       .locals (
    ПК>             int32 num1,
    ПК>             cpp_cli.Unmanaged unmanaged1)
    ПК>       L_0000: ldloca.s unmanaged1
    ПК>       L_0002: ldc.i4.s 10
    ПК>       L_0004: stind.i4
    ПК>       L_0005: ldloca.s unmanaged1
    ПК>       L_0007: ldc.i4.4
    ПК>       L_0008: add
    ПК>       L_0009: ldc.i4.s 20
    ПК>       L_000b: stind.i4
    ПК>       L_000c: ldloca.s unmanaged1
    ПК>       L_000e: ldloca.s unmanaged1
    ПК>       L_0010: ldind.i4
    ПК>       L_0011: ldloca.s unmanaged1
    ПК>       L_0013: ldc.i4.4
    ПК>       L_0014: add
    ПК>       L_0015: ldind.i4
    ПК>       L_0016: add
    ПК>       L_0017: stind.i4
    ПК>       L_0018: ldloca.s unmanaged1
    ПК>       L_001a: ldind.i4
    ПК>       L_001b: stloc.0
    ПК>       L_001c: ldloc.0
    ПК>       L_001d: ret
    ПК>}
    ПК>


    Это всего лишь показатель того, что данные в стеке менеджед процедуры должны быть управляемы. Попробуй добавить некоторый метод в структуру, и вызвать ее. Хорошо будет если он проинлайнится в CIL, плохо если он железно будет выполняться в unmanaged.


    >> Где ты надыбал стандарт CLS?


    Thanks .

    С уважением, Gleb.
    Re[18]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 11:43
    Оценка:
    Здравствуйте, Sinclair, Вы писали:


    S>Поэтому единственный способ генерировать валидируемый мсил, оставляя возможности возврата ссылок из методов — это инлайнить все такие методы.

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

    ПК>>Вполне можно было ввести этот контроль при проверке определения соответствующей функции, просто им лень стало это делать:

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

    Лучше ответь Re[10]: C# &mdash; необходимость?
    Автор: Serginio1
    Дата: 16.02.05


    Воообще ссылки удобны не только при работе со структурами но и с помощью их введения дополнительной авбстракции.
    И не вижу более полного использования ссылок в том числе и интерфейсах (правда как там будет с ремотигом, но внутри домена думаю проблем особых нет)
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[19]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 17.02.05 12:40
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    S> Лучше ответь Re[10]: C# &mdash; необходимость?
    Автор: Serginio1
    Дата: 16.02.05

    Я там не вижу вопроса. Только поток сознания.
    S> Воообще ссылки удобны не только при работе со структурами но и с помощью их введения дополнительной авбстракции.
    S> И не вижу более полного использования ссылок в том числе и интерфейсах (правда как там будет с ремотигом, но внутри домена думаю проблем особых нет)
    Гм. Ты, похоже, рассуждаешь на несколько другую тему. Обсуждается совершенно конкретный вопрос о возможности сделать аналог, к примеру, встроенного массива.
    Встроенный массив отличается от любого другого тем, что он позволяет транслировать вот такие вещи
    int[] intArray = new int[10];
    intArray[5] += 4; // <-------

    в очень-очень эффективный код. Он отличается от кода, порождаемого С++, только наличием проверки на выход за границы массива (две инструкции x86).
    Невстроенные массивы порождают совершенно другой код! Вместо инкремента ячейки идет честная загрузка, модификация, и сохранение. Т.е. мы имеем два лишних копирования.
    Основой для возможностей С++ по оптимизации таких вещей является способность возвращать из оператора [] int& — ссылку на int.
    Увы, валидатор дотнета такие трюки явно запрещает. Ссылки можно получить в стек только используя инструкции MSIL: ldloca, ldarga, ldelema, ldflda, ldsflda, и еще какие-то (наизусть не помню). Возвращать их из пользовательского кода нельзя. Ты явно называешь ссылкой какую-то намного более высокоуровневую абстракцию. С высокоуровнеми абстракциями никаких проблем нет, кроме оверхеда различной степени жуткости (см. напр. скорость вызова делегатов по сравнению с прямым вызовом виртуального метода).
    Более полное использование ссылок в интерфейсах могло бы разрешить нам порождение сверхвысокоэффективных многомерных массивов вэлью-типов обобщеннным способом.
    Если бы мы могли сделать вот такой интерфейс:
    public interface IBitmap<PointType>
    {
      public int Height;
        public int Width;
        public PointType& this[int x, int y]{ get;}
    }

    то это было бы офигеть как круто в смысле производительности. Смысл в том, что мы все равно достаем из него адрес точки в памяти, точно так же, как делали это индексацией линейного массива. Вот только определение этого адреса по X и Y делается для каждого класса по-своему.
    А офигеть как круто это было бы потому, что тогда можно было бы написать вот такой блендер:
    public class AlphaBlend
    {
      public void DoBlend<Point>(Bitmap target, Bitmap blended)
            where Bitmap: IBitmap<Point>
            {
            ...
            }
    }

    Который бы нафиг манипулиовал напрямую точками IBitmap.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[20]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 13:33
    Оценка:
    Здравствуйте, Sinclair, Вы писали:


    Это все понятно.
    S>Основой для возможностей С++ по оптимизации таких вещей является способность возвращать из оператора [] int& — ссылку на int.
    S>Увы, валидатор дотнета такие трюки явно запрещает. Ссылки можно получить в стек только используя инструкции MSIL: ldloca, ldarga, ldelema, ldflda, ldsflda, и еще какие-то (наизусть не помню). Возвращать их из пользовательского кода нельзя. Ты явно называешь ссылкой какую-то намного более высокоуровневую абстракцию. С высокоуровнеми абстракциями никаких проблем нет, кроме оверхеда различной степени жуткости (см. напр. скорость вызова делегатов по сравнению с прямым вызовом виртуального метода).
    Ну делегаты это еще та песня. Универсальность губит все.
    Впринципе нужны 3 типа делегатов
    1. просто ссылка на статический метод
    2. структура аля дельфевый TMethod на обектный метод
    3. Действующие мультиделегаты

    первые 2 по сути и являются ссылками
    Для примера http://www.rsdn.ru/forum/?mid=390648
    Автор: Serginio1
    Дата: 23.09.03
    дает вполне приемлемый овехэд.
    Умные указали (назовем их так) должны инлайнится при большом количестве вызовов по аналогии с дельфевым with, где адрес слазу кладется в регистр.


    S>то это было бы офигеть как круто в смысле производительности. Смысл в том, что мы все равно достаем из него адрес точки в памяти, точно так же, как делали это индексацией линейного массива. Вот только определение этого адреса по X и Y делается для каждого класса по-своему.

    S>А офигеть как круто это было бы потому, что тогда можно было бы написать вот такой блендер:
    S>
    S>public class AlphaBlend
    S>{
    S>  public void DoBlend<Point>(Bitmap target, Bitmap blended)
    S>        where Bitmap: IBitmap<Point>
    S>        {
    S>        ...
    S>        }
    S>}
    S>

    S>Который бы нафиг манипулиовал напрямую точками IBitmap.
    И чем это плохо????
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[21]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 17.02.05 13:59
    Оценка:
    Здравствуйте, Serginio1, Вы писали:
    S> И чем это плохо????
    Плохо тем, что это не верифицируется. Потому, что нет способа убедиться, что ты вернул из пользовательского кода не просто управляемый указатель, а управляемый указатель на валидный объект. К сожалению, инструкции ldarga и ldloca портят всю картину.

    На самом деле, для кулдевелоперов есть-таки лазейка. Можно локализовать такой код в сборке, которой выдается привилегия игнорировать верификацию.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[18]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.02.05 13:59
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Нельзя, к примеру, будет объявить интерфейс, оборудованный ссылочным индексером. Нельзя будет сделать такой метод не-internal. В общем, горе одно, а не фича.


    Делать ссылки можно только в стэке. Так что как раз ссылочный индекс (хоть это и бессмысленно) как раз сделать можно. А вот сделать поле-ссылку нельзя. И это уже системное ограничение реализации ЖЦ в дотнете.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.02.05 13:59
    Оценка: 15 (1)
    Здравствуйте, Serginio1, Вы писали:

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


    S> Прошу прощения чего то съехала крыша.


    S> T% я себе представляю как


    S>
    S>     struct Ref
    S>     {
    S>      object obj;
    S>        int OffSet;
         
    S>     }
    S>



    Забавно, что ты почти угодал.
    Почитай вот это http://www.codeproject.com/dotnet/pointers.asp (раздел System.TypedReference). И вообще пошукай на слово __reftype.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 14:07
    Оценка:
    VladD2,

    > S> T% я себе представляю как

    > S>
    > S>     struct Ref
    > S>     {
    > S>      object obj;
    > S>        int OffSet;
    >     
    > S>     }
    > S>

    > Забавно, что ты почти угодал.
    > Почитай вот это http://www.codeproject.com/dotnet/pointers.asp (раздел System.TypedReference).

    Не смущай человека: TypedReference и T% — совершенно разные вещи.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[22]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 14:13
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

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

    S>> И чем это плохо????
    S>Плохо тем, что это не верифицируется. Потому, что нет способа убедиться, что ты вернул из пользовательского кода не просто управляемый указатель, а управляемый указатель на валидный объект. К сожалению, инструкции ldarga и ldloca портят всю картину.
    Ну дык возврат стековой переменной должен быть пресечен уже на этапе компиляции. Или я не о том.
    Что в данном случае верификация????

    S>На самом деле, для кулдевелоперов есть-таки лазейка. Можно локализовать такой код в сборке, которой выдается привилегия игнорировать верификацию.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[12]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 14:25
    Оценка:
    Здравствуйте, VladD2, Вы писали:


    VD>Забавно, что ты почти угодал.

    VD>Почитай вот это http://www.codeproject.com/dotnet/pointers.asp (раздел System.TypedReference). И вообще пошукай на слово __reftype.

    Не это по сути Re: Ссылочные и размерные типы
    Автор: Serginio1
    Дата: 17.02.05


    Даешь ссылку не только в стеке.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[20]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.02.05 14:36
    Оценка: 11 (2)
    Здравствуйте, Sinclair, Вы писали:

    S>Более полное использование ссылок в интерфейсах могло бы разрешить нам порождение сверхвысокоэффективных многомерных массивов вэлью-типов обобщеннным способом.

    S>Если бы мы могли сделать вот такой интерфейс:
    S>
    S>public interface IBitmap<PointType>
    S>{
    S>  public int Height;
    S>    public int Width;
    S>    public PointType& this[int x, int y]{ get;}
    S>}
    S>

    S>то это было бы офигеть как круто в смысле производительности.

    А что было бы в смысле инкапсуляции? Ведь ты сразу октываешь возможность прямой модификации памяти. Вся инкапсуляция идет лесом.

    Тут было бы разумно сделать следующее. Наложить на компилятор обязанности эмулировать модификацию поместу. Возомжно даже ввести в свойства новую семантику обеспечивающую такую модификацию. Ну, например:
    class A<T>
    {
        T[] _array;
        
        public T this[int index]
        { 
            get { return _array[index]; }
            set { _array[index] = value; }
            replace
            {
                yeld return _array[index];
            }
        }
    }

    Тогда можно было и инкапсуляцию сохранить:
    class A<T>
    {
        T[] _array;
        
        public T this[int index]
        { 
            get { return _array[index]; }
            set { _array[index] = value; }
            replace
            {
                T temp = _array[index];
                yeld return temp;
                if (!Check(temp))
                    throw new Exception("Попытка установить ошибочное значение!");
                _array[index] =    temp;
            }
        }
    }

    И эффектино обрабатывать случаи модификации по месту, так как оптимизировать ее уже было бы делом техники.

    Возможно даж можно обойтись без расширения техники. В принципе ведь джит может определять, что свойства являются прямыми эксесорами к ячейкам памяти и видя модификацию по месту (которую он сейчас отвергает) просто оптимизировать код. Более того нечто похожее происходит при работе с простыми типами и просыми свойствами. Надо лишь распространить эту практику и дальше. Тогда и ссылки будут не нужны, и эффектиность с удосбтвом поднимутся.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.02.05 15:08
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Не смущай человека: TypedReference и T% — совершенно разные вещи.


    Не, Пашь, я тебе уже хрен знает сколько времени пытаюсь объяснить, что это одно и тоже. Жц не может просто указателями пользоваться если они не на начало объекта в хипе указывают. Иначе сбивается алгоритм перестановки объектов в памяти. Так что джит видя возврат ссылки лепит приблизительно такую конструкцию. И эффектиность этого дела, по словам народа копающегося в ЖЦ, далека от прямых ссылок.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.02.05 15:08
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    S> Даешь ссылку не только в стеке.


    Это невозможно при данном устройстве ЖЦ. Да и вредно с точки зрения инкапсуляции.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 15:16
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    S>> Даешь ссылку не только в стеке.


    VD>Это невозможно при данном устройстве ЖЦ. Да и вредно с точки зрения инкапсуляции.


    Ну делегаты по своей сути тоже являются своего рода ссылками. И ничего. Приведенная мной структура будет съедобна для ЖЦ, тип известен нужно только смещение. Или ввели бы по аналогии с делегатами типизированные FieldInfo
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[14]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 16:07
    Оценка:
    VladD2,

    > ПК>Не смущай человека: TypedReference и T% — совершенно разные вещи.


    > Не, Пашь, я тебе уже хрен знает сколько времени пытаюсь объяснить, что это одно и тоже. Жц не может просто указателями пользоваться если они не на начало объекта в хипе указывают. Иначе сбивается алгоритм перестановки объектов в памяти. Так что джит видя возврат ссылки лепит приблизительно такую конструкцию.


    О! Так это не оговорка, а заблуждение Смотри сюда:
    public ref class A
    {
    public:
         int% a();
    
    private:
         int x_; // чтоб i_ было не в начале объекта
         int i_;
    };

    В другом файле, чтоб не инлайнил:
    int% A::a()
    {
         return i_;
    }

    вызов:
    void C::test()
    {
         A a;
         a.a() = 15;
    }

    Смотрим, во что это выливается в IL:
    .method public instance int32& a() cil managed
    {
           // Code Size: 9 byte(s)
           .maxstack 1
           .locals (
                 int32& numRef1)
           L_0000: ldarg.0
           L_0001: ldflda int32 cpp_cli.A::i_
           L_0006: stloc.0
           L_0007: ldloc.0
           L_0008: ret
    }

    вызов:
    .method public static void test() cil managed
    {
           // Code Size: 18 byte(s)
           .maxstack 2
           .locals (
                 cpp_cli.A a1)
           L_0000: ldnull
           L_0001: stloc.0
           L_0002: newobj instance void cpp_cli.A::.ctor()
           L_0007: stloc.0
           L_0008: ldloc.0
           L_0009: call instance int32& cpp_cli.A::a()
           L_000e: ldc.i4.s 15
           L_0010: stind.i4
           L_0011: ret
    }

    Пока никаких TypedReference, обычные managed pointers.

    Едем дальше. Вот во что это выливается после работы JIT:
    int% A::a()
    {
         return i_;
    00000000  push        edi
    00000001  push        esi
    00000002  test        dword ptr [esp+FFFFFBC0h],eax
    00000009  mov         edi,ecx
    0000000b  cmp         dword ptr ds:[001D8314h],0
    00000012  je          00000019
    00000014  call        760C389D
    00000019  xor         esi,esi
    0000001b  lea         eax,[edi+8]
    0000001e  cmp         ecx,dword ptr [eax]
    00000020  mov         esi,eax
    }
    00000022  mov         eax,esi
    00000024  pop         esi
    00000025  pop         edi
    00000026  ret

    вызов:
    void C::test()
    {
    00000000  push        edi
    00000001  push        esi
    00000002  test        dword ptr [esp+FFFFFBC0h],eax
    00000009  cmp         dword ptr ds:[001D8314h],0
    00000010  je          00000017
    00000012  call        760C3935
    00000017  xor         edi,edi
    00000019  xor         edi,edi
         A a;
    0000001b  mov         ecx,3696CD8h
    00000020  call        FD2FE2C4
    00000025  mov         esi,eax
    00000027  mov         ecx,esi
    00000029  call        dword ptr ds:[03696D10h]
    0000002f  mov         edi,esi
         a.a() = 15;
    00000031  mov         ecx,edi
    00000033  call        dword ptr ds:[03696D0Ch]
    00000039  mov         esi,eax
    0000003b  mov         dword ptr [esi],0Fh 
    }
    00000041  nop
    00000042  pop         esi
    00000043  pop         edi
    00000044  ret

    И снова никаких TypedReference, после JIT остались одни "голые" указатели

    > И эффектиность этого дела, по словам народа копающегося в ЖЦ, далека от прямых ссылок.


    Как можно заметить, эффективность самих операций вполне нормальная. По сути прямые ссылки (точнее, указатели) и есть.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[18]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 16:20
    Оценка:
    Sinclair,

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


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

    > ПК>Вполне можно было ввести этот контроль при проверке определения соответствующей функции, просто им лень стало это делать:


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


    Вот пример алгоритма: http://www.nesterovsky-bros.com/html/css2/Byref%20verification.html

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


    Алгоритм выше, по крайней мере на первый взгляд, вполне вписывается в эти условия...
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[22]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 16:32
    Оценка:
    Sinclair,

    > S> И чем это плохо????


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


    Подозреваю, что это не совсем так. Стандарт CLI не требует верифицировать подобное использование managed pointers, но это не означает, что некоторая реализация не сможет этого делать. Более того, стандарт явным образом разрешает реализациям расширять правила, определяющие что есть verifiable code. Полагаю, что реализация от Microsoft делает что-то в таком роде, т.к. C++/CLI замечательно компилирует возврат "правильных" managed pointers в режиме /clr:safe. При этом на возврат "неправильного" managed pointer (например, указывающего на стек):
    int% A::a()
    {
         int i;
         return i;
    }

    ругается таким образом:
    d:\users\pavel\test\cli\cpp_cli\a.cpp(9) : error C4801:
         Return by reference is not verifiable: gc-lvalue is from an unknown source
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[15]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 16:36
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Не так не интересно
    ПК>void C::test()
    ПК>{
    ПК> A a;
    int% b=a.a();

    // что то делаем создаем объекты вызываем GC.Collect

    b = 15;
    ПК>
    ПК>}
    ПК>[/c]
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[23]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 16:42
    Оценка:
    P.S.

    > стандарт явным образом разрешает реализациям расширять правила, определяющие что есть verifiable code. Полагаю, что реализация от Microsoft делает что-то в таком роде, т.к. C++/CLI замечательно компилирует возврат "правильных" managed pointers в режиме /clr:safe.


    Да, кстати, вызовы этих функций тоже замечательно компилируются в режиме /clr:safe. Добавляю это замечание, т.к. по "стандартному" алгоритму неверифицируемыми считаются именно вызовы.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[16]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 16:58
    Оценка:
    Serginio1,

    > Не так не интересно

    > ПК>void C::test()
    > ПК>{
    > ПК> A a;
    > int% b=a.a();
    >
    > // что то делаем создаем объекты вызываем GC.Collect
    >
    > b = 15;
    > ПК>
    > ПК>}
    > ПК>[/c]

    Легко (при этом, замечу, компилируемся в режиме /clr:safe):
    void C::test()
    {
         A a;
         int% b = a.a();
    
         array<A^>^ arr = gcnew array<A^>(100);
    
         for ( int i = 0; i < 100; ++i )
             arr[i] = gcnew A();
    
         for ( int i = 0; i < 100; ++i )
             arr[i] = gcnew A();
    
         GC::Collect();
    
         b = 15;
    }


    .method public static void test() cil managed
    {
           // Code Size: 79 byte(s)
           .maxstack 3
           .locals (
                 int32 num1,
                 int32 num2,
                 cpp_cli.A[] aArray1,
                 int32& numRef1,
                 cpp_cli.A a1)
           L_0000: newobj instance void cpp_cli.A::.ctor()
           L_0005: stloc.s a1
          L_0007: ldloc.s a1
           L_0009: call instance int32& cpp_cli.A::a()
           L_000e: stloc.3
           L_000f: ldc.i4.s 100
           L_0011: newarr cpp_cli.A
           L_0016: stloc.2
           L_0017: ldc.i4.0
           L_0018: stloc.1
           L_0019: br.s L_001f
           L_001b: ldloc.1
           L_001c: ldc.i4.1
           L_001d: add
           L_001e: stloc.1
           L_001f: ldloc.1
           L_0020: ldc.i4.s 100
           L_0022: bge.s L_002e
           L_0024: ldloc.2
           L_0025: ldloc.1
           L_0026: newobj instance void cpp_cli.A::.ctor()
           L_002b: stelem.ref
           L_002c: br.s L_001b
           L_002e: ldc.i4.0
           L_002f: stloc.0
           L_0030: br.s L_0036
           L_0032: ldloc.0
           L_0033: ldc.i4.1
           L_0034: add
           L_0035: stloc.0
           L_0036: ldloc.0
           L_0037: ldc.i4.s 100
           L_0039: bge.s L_0045
           L_003b: ldloc.2
           L_003c: ldloc.0
           L_003d: newobj instance void cpp_cli.A::.ctor()
           L_0042: stelem.ref
           L_0043: br.s L_0032
           L_0045: call void [mscorlib]System.GC::Collect()
          L_004a: ldloc.3
           L_004b: ldc.i4.s 15
           L_004d: stind.i4
           L_004e: ret
    }


    void C::test()
    {
         A a;
    00000000  sub         esp,8
    00000003  push        edi
    00000004  push        esi
    00000005  push        ebx
    00000006  push        ebp
    00000007  test        dword ptr [esp+FFFFFBC0h],eax
    0000000e  cmp         dword ptr ds:[001DB7C4h],0
    00000015  je          0000001C
    00000017  call        760C4305
    0000001c  xor         edi,edi
    0000001e  xor         esi,esi
    00000020  xor         ebp,ebp
    00000022  mov         dword ptr [esp+10h],0
    0000002a  mov         dword ptr [esp+14h],0
    00000032  mov         ecx,3696370h
    00000037  call        FD2FEC94
    0000003c  mov         ebx,eax
    0000003e  mov         ecx,ebx
    00000040  call        dword ptr ds:[036963A8h]
    00000046  mov         dword ptr [esp+14h],ebx
        int% b = a.a();
    0000004a  mov         ecx,dword ptr [esp+14h]
    0000004e  call        dword ptr ds:[036963A4h]
    00000054  mov         ebx,eax
    00000056  mov         dword ptr [esp+10h],ebx 
    
         array<A^>^ arr = gcnew array<A^>(100);
    0000005a  mov         edx,64h
    0000005f  mov         ecx,37494AAh
    00000064  call        FD2FEE24
    00000069  mov         ebp,eax
    
         for ( int i = 0; i < 100; ++i )
    0000006b  xor         esi,esi
    0000006d  jmp         00000070
    0000006f  inc         esi
    00000070  cmp         esi,64h
    00000073  jge         00000095
             arr[i] = gcnew A();
    00000075  mov         ecx,3696370h
    0000007a  call        FD2FEC94
    0000007f  mov         ebx,eax
    00000081  mov         ecx,ebx
    00000083  call        dword ptr ds:[036963A8h]
    00000089  push        ebx
    0000008a  mov         edx,esi
    0000008c  mov         ecx,ebp
    0000008e  call        75EBBBF8
    00000093  jmp         0000006F
    
         for ( int i = 0; i < 100; ++i )
    00000095  xor         edi,edi
    00000097  jmp         0000009A
    00000099  inc         edi
    0000009a  cmp         edi,64h
    0000009d  jge         000000BF
             arr[i] = gcnew A();
    0000009f  mov         ecx,3696370h
    000000a4  call        FD2FEC94
    000000a9  mov         ebx,eax
    000000ab  mov         ecx,ebx
    000000ad  call        dword ptr ds:[036963A8h]
    000000b3  push        ebx
    000000b4  mov         edx,edi
    000000b6  mov         ecx,ebp
    000000b8  call        75EBBBF8
    000000bd  jmp         00000099
    
         GC::Collect();
    000000bf  call        7534D2DC
    
        b = 15;
    000000c4  mov         eax,dword ptr [esp+10h]
    000000c8  mov         dword ptr [eax],0Fh 
    }
    000000ce  nop
    000000cf  pop         ebp
    000000d0  pop         ebx
    000000d1  pop         esi
    000000d2  pop         edi
    000000d3  add         esp,8
    000000d6  ret


    Насколько я понимаю, GC замечательно отслеживает managed pointers, находящиеся в стеке, и изменяет их, если нужно. На то они и [b]managed pointers[b] Собственно, это и написано в спецификации.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[17]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 17:05
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    void C::test()
    {

    array<A^>^ arr = gcnew array<A^>(100);
    A^ a= gcnew A();
    int% b = a.a();

    array<A^>^ arr = gcnew array<A^>(100);

    for ( int i = 0; i < 100; ++i )
    arr[i] = gcnew A();

    for ( int i = 0; i < 100; ++i )
    arr[i] = gcnew A();

    GC::Collect();

    b = 15;
    }

    а это стековая переменная
    Интересно посмотреть на ссылку экземпляра класса. Так как он должен поддвергнуться сборке мусора
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[18]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 17:21
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    Да еще. Лучше вызывать метод в котором будут порждаться и собираться мусор, желателлно с некоторой сортировкой массива объектов для изменения ссылок. Причем после сбороа мусора повторить операцию (на райт бариер за одно посмотреть). Что бы крыша у GC съехала. А в таком виде GC достаточно хорошо оптимизирует
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[18]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 17:22
    Оценка:
    Serginio1,

    > <...>

    >
    > а это стековая переменная

    Нет, это экземпляр ref класса. Просто C++/CLI позволяет не писать gcnew, если использовать синтаксис "как будто в стеке" для ref классов.

    > Интересно посмотреть на ссылку экземпляра класса. Так как он должен поддвергнуться сборке мусора


    Попробовал. В этом примере значения b одинаковы в начале и конце функции. При этом указывают они туда, куда надо: a->a() при записи в b меняется соответствующим образом.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[19]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 17:24
    Оценка:
    Serginio1,

    > Да еще. Лучше вызывать метод в котором будут порждаться и собираться мусор, желателлно с некоторой сортировкой массива объектов для изменения ссылок. Причем после сбороа мусора повторить операцию (на райт бариер за одно посмотреть). Что бы крыша у GC съехала. А в таком виде GC достаточно хорошо оптимизирует


    Можно конкретный примерчик? Если на C++/CLI непривычно, можешь на C# (за исключением T%, ессно). А то я уже нить потерял...
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[20]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 17:49
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    public class IntClass
        { 
            public int value;
            public IntClass(int val)
            {
                value = val;
            }
        }
        
    static void sort(IntClass[] IntClassArray)
            {
                // сортировка вставками
                for (int i = 1; i < IntClassArray.Length; i++)
                {
                    Int32 L = 0;
                    Int32 R = i;
                    int key = IntClassArray[i].value;
    
                    while (L < R)
                    {
                        int Midl = (L + R) >>1;
    
                        if (IntClassArray[Midl].value <= key)
                            L = Midl + 1;
                        else
                            R = Midl;
                    }
    
                    IntClass temp = IntClassArray[i];
    
                    for (int j = i; j > R; j--)
                        IntClassArray[j] = IntClassArray[j - 1];
    
                    IntClassArray[R] = temp;
                }
            }
            
     public void unsortarray(IntClass[] OrigArray)
            {
                Int32 j, k, tempbuff;
                Random r = new Random(666666);
    
                for (Int32 i = 0; i < OrigArray.Length; i++)
                {
                    j = r.Next(OrigArray.Length - 1);
                    k = r.Next(OrigArray.Length - 1);
                    tempbuff = OrigArray[j];
                    OrigArray[j] = OrigArray[k];
                    OrigArray[k] = tempbuff;
                }
            }
            
            test()
            {
             IntClass[] OrigArray = new IntClass[1000000];
              for (i=0; i < OrigArray.length;i++)
                  OrigArray[]= new IntClass(i);
                    
                    int% b=OrigArray[0];
                    Gc.Collect();
                    
                    unsortarray(OrigArray);
                    
                    Gc.Collect();
                    
                    unsortarray(OrigArray);
                    
                     sort(OrigArray);
                    int value=OrigArray[0].x;
                    if (i.value<>x) throw
                    
                    
            
            }

    Что то в этом роде
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[21]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 18:02
    Оценка: +1
    Здравствуйте, Serginio1, Вы писали:

    Помоему я там ноликом ошибся 100 хватит за глаза.
    http://gzip.rsdn.ru/Forum/?mid=646279
    Автор: Serginio1
    Дата: 19.05.04
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[19]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 17.02.05 18:17
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Что-то я торможу, вы хотите сказать что программа вида:

    void C::test()
    {
         A a=new gcnew A();
         int% b = a.a();
         a=null;
         GC::Collect();
         b = 15;
    }


    Возможна????

    С уважением, Gleb.
    Re[21]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 18:18
    Оценка:
    Serginio1,

    >
    > <...>
    >

    > Что то в этом роде

    Попробовал. Адрес не меняется
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[21]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 18:22
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    Прошу прощения ошибочка

    S> int% b=OrigArray[0].value;

    S> Gc.Collect();

    S> unsortarray(OrigArray);


    S> Gc.Collect();


    S> unsortarray(OrigArray);


    S> sort(OrigArray);

    S> int value=OrigArray[0].value;
    S> if (b<>x) throw



    S> }

    S>[/c#]

    S> Что то в этом роде

    При этом нулевой элемент встанет на место но после долгих перемещений.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[22]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 17.02.05 18:29
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Serginio1,


    >>
    >> <...>
    >>

    >> Что то в этом роде

    ПК>Попробовал. Адрес не меняется


    Вот этот алгоритм точно меняет адресс http://gzip.rsdn.ru/Forum/Message.aspx?mid=701354&amp;only=1
    Автор: Serginio1
    Дата: 30.06.04


    При малых значениях размерности массива.
    const int ad = 1 <<6;
    const int BeginSize = 1 << 10;

    Прошу прощения за доставленные хлопоты. Очень интересно а под рукой ничего нет. Сам бы с удовольствием поэкспериментировал.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[20]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 18:31
    Оценка:
    GlebZ,

    > Что-то я торможу, вы хотите сказать что программа вида:

    >
    > void C::test()
    > {
    >      A a=new gcnew A();
    >      int% b = a.a();
    >      a=null;
    >      GC::Collect();
    >      b = 15;
    > }
    >


    Да. Если чуть-чуть подправить:
    void C::test()
    {
          A^ a = gcnew A();
          int% b = a->a();
          a = nullptr;
          GC::Collect();
          b = 15;
    }

    то преспокойненько компилируется (/clr:safe) и исполняется. Согласно спецификации CLI, managed pointers не могут быть null. Соответственно, GC не будет удалять созданный объект, пока есть managed pointer, указывающий на него.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[22]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 18:32
    Оценка:
    Serginio1,

    > Прошу прощения ошибочка

    >
                     
    > S>                int% b=OrigArray[0].value;
    > S>


    Да, там и еще были блошки. Я их все поправил перед тем, как исполнять. Адрес b не изменятся.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[23]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 17.02.05 18:36
    Оценка:
    Serginio1,

    > Вот этот алгоритм точно меняет адресс http://gzip.rsdn.ru/Forum/Message.aspx?mid=701354&amp;only=1
    Автор: Serginio1
    Дата: 30.06.04


    Ok, вечером попробую

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


    Порядок, мне и самому интересно
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[22]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 00:06
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Попробовал. Адрес не меняется


    Вот то-то и станно. Я тоже твой пример поглядел... чуть подправил:
        A ^ a = gcnew A();
        int gen = GC::GetGeneration(a);
        GC::Collect();
        gen = GC::GetGeneration(a);
        GC::Collect();
        gen = GC::GetGeneration(a);
        a->a() = 15;

    по идее при каждом Collect() объект должен перемещаться в другой хип (хип другого поколения). Так вот при этом у него по любому должен меняться адрес.

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

    В общем, химиячут что-то гады. Или отлачик фигню показывает.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[21]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 00:06
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>то преспокойненько компилируется (/clr:safe) и исполняется. Согласно спецификации CLI, managed pointers не могут быть null. Соответственно, GC не будет удалять созданный объект, пока есть managed pointer, указывающий на него.


    Это не указатели. Это карты доступности объеков.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[23]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 18.02.05 04:03
    Оценка: +1
    Здравствуйте, Serginio1, Вы писали:
    S>>Плохо тем, что это не верифицируется. Потому, что нет способа убедиться, что ты вернул из пользовательского кода не просто управляемый указатель, а управляемый указатель на валидный объект. К сожалению, инструкции ldarga и ldloca портят всю картину.
    S> Ну дык возврат стековой переменной должен быть пресечен уже на этапе компиляции. Или я не о том.
    Ты не о том. Не важно, что там делает компилятор. В C# тебе синтаксис вообще не позволит даже декларировать такой метод.
    S> Что в данном случае верификация????
    Гм. Есть формально определенный процесс верификации CIL-кода. Грубо говоря, ты не можешь загрузить сборку, в которой лежит код, не проходящий верификацию. И эта верификация ломается, как только ты пытаешься объявить метод возвращающим ссылку. Хотя ты можешь породить такой код — нестандартным компилятором, руками, или ilasm-ом.

    S>>На самом деле, для кулдевелоперов есть-таки лазейка. Можно локализовать такой код в сборке, которой выдается привилегия игнорировать верификацию.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[19]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 18.02.05 04:03
    Оценка:
    Здравствуйте, VladD2, Вы писали:
    VD>Делать ссылки можно только в стэке. Так что как раз ссылочный индекс (хоть это и бессмысленно) как раз сделать можно.
    Это небессмысленно. Это невозможно — верификатор не пропустит такой код.
    VD>А вот сделать поле-ссылку нельзя. И это уже системное ограничение реализации ЖЦ в дотнете.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[23]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 18.02.05 10:31
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Так вот поколения меняются, а адрес нет.


    VD>В общем, химиячут что-то гады. Или отлачик фигню показывает.


    Здесь интересен сам механизм.

    Так для фиксированных объектов GC запрещает их перемещение, но при этом есть область этой фиксации, в том числе и передаваемых по ссылке значением.

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

    В твоем коде все достаточно прозрачно и компилятор сам может все разрулить и проинлайнить.
    Другое дело если возвращать не поле о объявляемого объекта а например по третьей точке.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[24]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 18.02.05 10:36
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>> Что в данном случае верификация????

    S>Гм. Есть формально определенный процесс верификации CIL-кода. Грубо говоря, ты не можешь загрузить сборку, в которой лежит код, не проходящий верификацию. И эта верификация ломается, как только ты пытаешься объявить метод возвращающим ссылку. Хотя ты можешь породить такой код — нестандартным компилятором, руками, или ilasm-ом.

    Как то баловался с Delphi.Net с указателями. Так вот в Delphi небыло fixed при этом передавалась неотпинненый указатель.
    Так вот если все происходило в одном методе все прекрасно как только данный указатель передовался в другую процедуру приложение просто падало. При этом с этим указателем совершались адресная арифметика.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[20]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 18:34
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Это небессмысленно. Это невозможно — верификатор не пропустит такой код.


    Такой как раз пропустит. Возвращать ссылки нельзя, а на вход — пожалуйста.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[24]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 18:34
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    S> Так для фиксированных объектов GC запрещает их перемещение, но при этом есть область этой фиксации, в том числе и передаваемых по ссылке значением.


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

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

    S> Другая ситуация с возвращаемым по ссылке значениям. В данном случае ссылка сама должна следить за фиксацией объекта а значит и иметь информацию о нем.


    Нет там никаких фиксаций. Ну, по крайней мере не должно быть. К тому же ЖЦ четко показывает, что объекты между поколениями перемещаются, а в связи с внутренним устройсвом перемещение объектов между поколением обязано приводить к перемещению объектов в другие области памяти. Таким образом скорее всего врет отладчик. Адрес рельно меняется, но отладчик просто показывает старый ардес.

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


    Инлайн тут не причем.

    S> Другое дело если возвращать не поле о объявляемого объекта а например по третьей точке.


    Об это и речь. Иначе бы это было вообще обычное поведение ЖЦ и о ссылках говорить было бы бессмысленно.

    Кстати, TypedReference делает почти тоже самое. Просто в мсил вставляется дополнительная информация, а сам объект исчезает.

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

    Чтобы проверить свое предположения я скормил сборку PEVerify.exe:
    d:\MyProjects\Tests\CppAsm\debug>d:\VS2005\SDK\v2.0\Bin\PEVerify.exe CppAsm.dll
    
    Microsoft (R) .NET Framework PE Verifier.  Version  2.0.41115.19
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    d:\myprojects\tests\cppasm\cppasm\cppasm.h(34) : [IL]: Error: [d:\MyProjects\Tes
    ts\CppAsm\debug\CppAsm.dll : CppAsm.A::get][offset 0x0000000C] Return type is BY
    REF, TypedReference, ArgHandle, or ArgIterator.
    d:\myprojects\tests\cppasm\cppasm\cppasm.h(38) : [IL]: Error: [d:\MyProjects\Tes
    ts\CppAsm\debug\CppAsm.dll : CppAsm.A::get_Item][offset 0x0000000C] Return type
    is BYREF, TypedReference, ArgHandle, or ArgIterator.
    2 Errors Verifying CppAsm.dll


    Короче все это мало чем отличается от работы с указателями в ансэйфе Шарпа.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[25]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 18.02.05 19:04
    Оценка: :)
    VladD2,

    > Кстати, я тут проверил... возврат ссылки из функции — это не верефицируемая операция


    Неверифицируемая стандартным алгоритмом, описанным в спецификации CLI. Но это не означает, что эта операция неверифицируема реализацией Microsoft. В частности, чтобы это проверить, нужно пользоваться не утилитой PEVerify, проверяющей код на верифицируемость стандартным алгоритмом, а попробовать использовать подобную сборку в контексте, где разрешен запуск только верифицируемого кода.

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


    Конкретная реализация (например, Microsoft CLR) вполне может
    Автор: Павел Кузнецов
    Дата: 17.02.05
    верифицировать
    Автор: Павел Кузнецов
    Дата: 17.02.05
    большее количество случаев, как прямо оговарено спецификацией.

    The implementation might also run other programs provided it is able to show they do not violate memory safety (typically because they use a verification algorithm that makes use of specific knowledge about the implementation).

    [Note: While a compliant implementation is required to accept and run any program this verification algorithm states is verifiable, there might be programs that are accepted as verifiable by a given implementation but which this verification algorithm will fail to consider verifiable. Such programs will run in the given implementation but need not be considered verifiable by other implementations.

    For example, an implementation of the CLI might choose to correctly track full signatures on method pointers and permit programs to execute the calli instruction even though this is not permitted by the verification algorithm specified here.

    Implementers of the CLI are urged to provide a means for testing whether programs generated on their implementation meet this portable verifiability standard. They are also urged to specify where their verification algorithms are more permissive than this standard. end note]


    > Чтобы проверить свое предположения я скормил сборку PEVerify.exe:


    Эта утилита, в соответствии с пожеланием спецификации CLI, процитированным выше, проверяет верифицируемость стандартным алгоритмом.

    Implementation Specific (Microsoft)

    The various implementations of the CLI produced by Microsoft use slightly different verification algorithms. In all cases, however, the PEVerify program (part of the SDK) implements the portable verification algorithm as specified in this Standard. Programmers are urged to run PEVerify over all code before shipping it for possible use on other implementations of the CLI.


    > Короче все это мало чем отличается от работы с указателями в ансэйфе Шарпа.


    Отличается: с точки зрения реализации Microsoft сам по себе возврат unmanaged pointers, судя по всему, не приводит к тому, что код перестает быть верифицируемым.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[15]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 19:24
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>О! Так это не оговорка, а заблуждение Смотри сюда:


    Тут я вразился не очень корректно. Конечно это не одно и тоже в буквальном смысле. Но TypedReference именно что использует менеджед-ссылку внутри себя плюс добавляет поле описывающее тип объекта на который указывает ссылка.

    Жаль только, что TypedReference даже в ансэфе нельзя возвратить из функции.

    Что касается того, что МС++ — это компилирует в сэйф-режиме, так это глюк. Тут я подробно об этом написал:
    Re[24]: C# &mdash; необходимость?
    Автор: VladD2
    Дата: 18.02.05
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 18.02.05 19:26
    Оценка:
    VladD2,

    > Что касается того, что МС++ — это компилирует в сэйф-режиме, так это глюк. Тут я подробно об этом написал:

    > Re[24]: C# &mdash; необходимость?
    Автор: VladD2
    Дата: 18.02.05


    Это не глюк, это "фича": см. ответ
    Автор: Павел Кузнецов
    Дата: 18.02.05
    на свое сообщение.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[26]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 20:17
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    Не выдумывай. Лучше сообще орлам что компилятор делают. Думаю, они знаю что делать.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[25]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 18.02.05 20:17
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    S> Как то баловался с Delphi.Net с указателями. Так вот в Delphi небыло fixed при этом передавалась неотпинненый указатель.

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

    Указатели разные бывают. Бывают управляемые, а бывают нет. Кстат, ссылки все же отличаются от указателей. Сссылки в качестве параметров — это вполне безопасная операция. Небозопасной она становится при возврате из функции или помещении в тело объекта.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[27]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 18.02.05 20:45
    Оценка:
    VladD2,

    > Не выдумывай.


    Твоя самоуверенность меня просто удивляет... Нет, чтобы разобраться, как следует (например, попробовать использовать полученную сборку в соответствующем контексте), продолжаешь упорствовать на ровном месте.

    > Лучше сообще орлам что компилятор делают. Думаю, они знаю что делать.


    Чтобы убедиться в том, что это сознательно добавленная возможность, а не ошибка, лучше попробуй вернуть в режиме /clr:safe, например, ссылку на локальную переменную, а потом почитай справку о возникшей ошибке:

    error C4801: Return by reference is not verifiable: gc-lvalue is from an unknown source


    <...> A reference can only be verifiably returned when it can be tracked by the verifier from creation to return point and when it is a reference to an element of an array, or a member of a class. <...>

    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[28]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.02.05 00:35
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>VladD2,


    >> Не выдумывай.


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


    В каком нафиг контексте? Еще раз повторяю, не выдумывай. Верификация процесс описанный.

    >> Лучше сообще орлам что компилятор делают. Думаю, они знаю что делать.


    ПК>Чтобы убедиться в том, что это сознательно добавленная возможность, а не ошибка, лучше попробуй вернуть в режиме /clr:safe, например, ссылку на локальную переменную, а потом почитай справку о возникшей ошибке:


    ПК>

    error C4801: Return by reference is not verifiable: gc-lvalue is from an unknown source


    ПК>

    <...> A reference can only be verifiably returned when it can be tracked by the verifier from creation to return point and when it is a reference to an element of an array, or a member of a class. <...>


    Это ничего не доказывает. Еще раз повторяю напиши орлам. Посмотрим что они скажут.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.02.05 00:35
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Это не глюк, это "фича": см. ответ
    Автор: Павел Кузнецов
    Дата: 18.02.05
    на свое сообщение.


    Это не ответ.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[26]: C# - необходимость?
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 21.02.05 09:35
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Неверифицируемая стандартным алгоритмом, описанным в спецификации CLI. Но это не означает, что эта операция неверифицируема реализацией Microsoft. В частности, чтобы это проверить, нужно пользоваться не утилитой PEVerify, проверяющей код на верифицируемость стандартным алгоритмом, а попробовать использовать подобную сборку в контексте, где разрешен запуск только верифицируемого кода.


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


    ПК>Конкретная реализация (например, Microsoft CLR) вполне может
    Автор: Павел Кузнецов
    Дата: 17.02.05
    верифицировать
    Автор: Павел Кузнецов
    Дата: 17.02.05
    большее количество случаев, как прямо оговарено спецификацией.


    Павел, ты совершенно прав. Спецификация говорит совершенно четко о том, что PEVerify реализована с максимальной паранойей, позволенной стандартом. Реализациям фреймворка разрешено быть более либеральными за счет повышения интеллекта. Лазейка оставлена.
    Вот только меня настораживают потенциальные проблемы с портируемостью подобного кода. Используя такие решения, ты начинаешь зависеть от реализации фреймворка. Для некоторых приложений это подойдет — например, если мы рассуждаем о встроенном софте для видеокамеры. Там можно не только конкретную реализацию фреймворка, там можно номер билда фиксировать.
    Но, опять же, в подобном случае у нас есть полный контроль над софтом, и можно позволить себе аккуратно подписать сборку и попросить при инсталляции выдать ей разрешение на обход верификации. Это будет более надежно, чем надеяться на то, что у верификатора хватит ума понять, что "ничего такого мы в виду не имели".
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[25]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 21.02.05 12:38
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    S>> Так для фиксированных объектов GC запрещает их перемещение, но при этом есть область этой фиксации, в том числе и передаваемых по ссылке значением.


    VD>Ничего он запрещать не должен. Ссылка есть ссылка. Просто если она не на начало объекта, то у ЖЦ прибаляется работы. Он должен хранить информацию, что в таких-то ячейках могут быть ссылки и какого типа эти ссыли, и в придачу, хранить отступ этой самой ссылки от начала объекта. Далее года объекты перемещаются нужно всего лишь корректировать указатели с учетом этих отступов.

    VD>Отсюда, кстати, и вытекает невозможность размещения ссылок в других объектах. Иначе неясно как и где хранить информацию об отступе.
    Рихтер утверждает обратное " ... фиксированные объекты не трогаются GC ". Хотя и в твоем случае я согласен, все зависит от реализации.
    Хочется докопаться до истины. Но в твоем случае раз есть привязка к объекту то нет причин делать указатели и ссылки только стековыми.
    А привязку например можно сделать ввиде структуры или объекта приведенного мной.

    S>> Другая ситуация с возвращаемым по ссылке значениям. В данном случае ссылка сама должна следить за фиксацией объекта а значит и иметь информацию о нем.


    VD>Нет там никаких фиксаций. Ну, по крайней мере не должно быть. К тому же ЖЦ четко показывает, что объекты между поколениями перемещаются, а в связи с внутренним устройсвом перемещение объектов между поколением обязано приводить к перемещению объектов в другие области памяти. Таким образом скорее всего врет отладчик. Адрес рельно меняется, но отладчик просто показывает старый ардес.



    VD>Короче все это мало чем отличается от работы с указателями в ансэйфе Шарпа.

    У меня тоже впечатление, но может ПК доберется до истины.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[26]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 21.02.05 22:02
    Оценка:
    Здравствуйте, Serginio1, Вы писали:

    S>Рихтер утверждает обратное " ... фиксированные объекты не трогаются GC ". Хотя и в твоем случае я согласен, все зависит от реализации.


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

    S> Хочется докопаться до истины. Но в твоем случае раз есть привязка к объекту то нет причин делать указатели и ссылки только стековыми.

    S> А привязку например можно сделать ввиде структуры или объекта приведенного мной.

    Я не понял о чем ты говоришь.

    VD>>Короче все это мало чем отличается от работы с указателями в ансэйфе Шарпа.

    S> У меня тоже впечатление, но может ПК доберется до истины.

    А чё так зло?
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[29]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 21.02.05 23:20
    Оценка:
    VladD2,

    > ПК> например, попробовать использовать полученную сборку в соответствующем контексте


    > В каком нафиг контексте?


    В контексте, где требуется, чтобы сборка была верифицируемой. Таким образом ты мог бы узнать, как реально работает алгоритм верификации в CLR, а не как он описан в стандарте CLI.

    > ПК> Чтобы убедиться в том, что это сознательно добавленная возможность, а не ошибка, лучше попробуй вернуть в режиме /clr:safe, например, ссылку на локальную переменную, а потом почитай справку о возникшей ошибке:


    > ПК>

    error C4801: Return by reference is not verifiable: gc-lvalue is from an unknown source


    > ПК>

    <...> A reference can only be verifiably returned when it can be tracked by the verifier from creation to return point and when it is a reference to an element of an array, or a member of a class. <...>


    > Это ничего не доказывает. Еще раз повторяю напиши орлам. Посмотрим что они скажут.


    Написал. Ответили, что алгоритм верификации в CLR позволяет вызывать функции, возвращающие managed указатели, но удостоверяется, что результат, возвращаемый такой функцией, соответствует определенным требованиям. В общем, как и написано выше по ветке. Дополнительная информация: на эту возможность полагается реализация STL/CLI.

    Соответствующие исправления в стандарте CLI ожидаются в некотором будущем. Их обещала подготовить и внести группа, занимающаяся CLR. Изменения, собственно, в стандарт (CLI) попадают небыстро; во всяком случае, значительно медленнее, чем в реализацию (CLR).
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[27]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 22.02.05 00:03
    Оценка:
    Sinclair,

    > ПК>Конкретная реализация (например, Microsoft CLR) вполне может
    Автор: Павел Кузнецов
    Дата: 17.02.05
    верифицировать
    Автор: Павел Кузнецов
    Дата: 17.02.05
    большее количество случаев, как прямо оговарено спецификацией.


    > Павел, ты совершенно прав. Спецификация говорит совершенно четко о том, что PEVerify реализована с максимальной паранойей, позволенной стандартом. Реализациям фреймворка разрешено быть более либеральными за счет повышения интеллекта. Лазейка оставлена.


    > Вот только меня настораживают потенциальные проблемы с портируемостью подобного кода. <...>


    Да, меня это тоже немного (*) смущало. В скором (**) времени можно ожидать
    Автор: Павел Кузнецов
    Дата: 22.02.05
    соответствующие уточнения алгоритма верификации в стандарте CLI.



    (*) Я пока скептически отношусь к переносимости .Net приложений (по крайней мере настольных).
    (**) "Скором" по меркам процессов стандартизации: подозреваю, что речь шла о следующей версии спецификации.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[27]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 22.02.05 00:16
    Оценка:
    VladD2,

    > S>Рихтер утверждает обратное " ... фиксированные объекты не трогаются GC ". Хотя и в твоем случае я согласен, все зависит от реализации.


    > Я не знаю откуда это взял Рихтер, да и полную цитату бы хотелось увидеть.

    > Я говорю об устройстве ЖЦ описанном разработчиками этого самого ЖЦ.

    Гм... Я смотрю в спецификацию C# (25.3), там написано то же самое:

    The address-of operator (§25.5.4) and the fixed statement (§25.6) divide variables into two categories: Fixed variables and moveable variables. Fixed variables reside in storage locations that are unaffected by operation of the garbage collector.

    Я туда смотрю?

    Насколько я понял fixed в C# == pinned в терминах CLI и pin_ptr в терминах C++/CLI.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[28]: C# - необходимость?
    От: Шахтер Интернет  
    Дата: 22.02.05 02:27
    Оценка: 1 (1)
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>VladD2,


    >> S>Рихтер утверждает обратное " ... фиксированные объекты не трогаются GC ". Хотя и в твоем случае я согласен, все зависит от реализации.


    >> Я не знаю откуда это взял Рихтер, да и полную цитату бы хотелось увидеть.

    >> Я говорю об устройстве ЖЦ описанном разработчиками этого самого ЖЦ.

    ПК>Гм... Я смотрю в спецификацию C# (25.3), там написано то же самое:

    ПК>

    The address-of operator (§25.5.4) and the fixed statement (§25.6) divide variables into two categories: Fixed variables and moveable variables. Fixed variables reside in storage locations that are unaffected by operation of the garbage collector.

    ПК>Я туда смотрю?

    ПК>Насколько я понял fixed в C# == pinned в терминах CLI и pin_ptr в терминах C++/CLI.


    Всё верно. Пиннинг и ввели для того, чтобы можно было на время пришпилить объект, чтобы он не дёргался по хипу, и спокойно ездить по нему указателем, например.
    ... << RSDN@Home 1.1.0 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[27]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 22.02.05 11:49
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    S>>Рихтер утверждает обратное " ... фиксированные объекты не трогаются GC ". Хотя и в твоем случае я согласен, все зависит от реализации.


    Это в конце статьи по поводу выполнения унманагед кода выделенный для внимания.

    VD>>>Короче все это мало чем отличается от работы с указателями в ансэйфе Шарпа.

    S>> У меня тоже впечатление, но может ПК доберется до истины.

    VD>А чё так зло?


    Да хочется понять. Плохо что либо делать без понимания.
    Кстати хорошо заного прочитывать Рихтера ( а про фиксированные объекты он говорил про унманагед код). Кстати там еще прописал, что если старые объекты не собираются если они еще не преодолели отметку сбора, то при просмотре начиная от корней внутренние поля не просматриваются, а для того чтобы не потнрять эти старые объекты при модификации устанавливается флаг. Поэтому сразу вопросы
    1. Уместнее хранить этот флаг в поле SyncBlock а в самом блоке хранить тоже флаг для последующего просмотра ихмененных объектов. Так как старые объекты изменяются нечасто это былобы выгодно. И при этом если объект изменен просто сравнить поле с флагом изменяемости если изменен то не надо прописывать в синкблок иначе прописать.
    При сборе мусора пройтись по синкблок таблице и построить дерево достижимых объекто 0 уровня.
    При этом подходе не былдо бы такого жуткого write bariera существующего на данном этапе.

    2. Указатели в C# можно применять только к структурам не имеющем в своем составе ссылочных типов. А вот что касается ref параметров и ref ссылок тоже вопрос либо если ссылка передается как поле объекта он может сразу помечаться как изменненный при его фиксации либо ссылка сама должна следить за объектом.

    Влад если тебе не влом набери этот код. Интересно фиксируются ссылки или нет.

    unsafe public class ElementBigArray
    {
    public byte[] ar;
    public int adress;
    unsafe public ElementBigArray( int Capacity)
    {
    ar= new byte[Capacity];
    fixed ( byte* p = ar)
    {
    adress = (int) p;

    }


    }
    }
    public class BigArray
    {
    const int ad = 1;
    const int BeginSize = 1 << 10;
    public ElementBigArray[] BA;
    public BigArray(int Capacity)
    {
    BA = new ElementBigArray[Capacity];

    }

    public void Fill(int Begin, int count)
    {
    for (int i= Begin, j=Begin+count; i<j; i++)
    BA[i] = new ElementBigArray(BeginSize+i*ad);


    }
    public void Прорядить(int Begin, int count)
    {
    for (int i= Begin, j=Begin+count; i<j; i+=2)
    BA[i].ar=null;

    GC.Collect();
    GC.WaitForPendingFinalizers();

    GC.Collect();
    GC.WaitForPendingFinalizers();


    }

    public byte% ПолучитьСсылку(int index)
    {
    return BA[i].ar[0];
    }

    unsafe public void CheckAdress(int index)
    {
    fixed ( byte* p=BA[index].ar)
    {
    int newadr= (int) p;
    if (BA[index].adress == newadr)
    throw( new Exception(string.Format(" ?? ????? ?????? {0} <> {1}",BA[i].adress,newadr)));

    }

    }


    }


    И соответственно вызов



    int sizeBa=1000;
    int step = 1000;
    BigArray BA = new BigArray(1000);

    BA.Fill(0,step);
    byte% ссылка= BA .ПолучитьСсылку(step-1);
    BA .Прорядить(0,step)
    BA.CheckAdress(step-1);
    ссылка=1;


    При нормальном поведении адреса должны быть разными. Если объек фиксируется мы сразу это поймем
    и солнце б утром не вставало, когда бы не было меня
    Re[24]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 22.02.05 16:14
    Оценка: :)
    Здравствуйте, Павел Кузнецов, Вы писали:

    Кстати а у Вас там справляют День Красной Армии????
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[25]: 23 февраля
    От: Павел Кузнецов  
    Дата: 22.02.05 16:54
    Оценка: +1 :)
    Здравствуйте, Serginio1, Вы писали:

    S> Кстати а у Вас там справляют День Красной Армии????


    По желанию. У нас в конторе все инженеры русские, так что, по крайней мере, не забудут
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[26]: 23 февраля
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 22.02.05 17:22
    Оценка: +1 :)
    Здравствуйте, Павел Кузнецов, Вы писали:

    Тогда Поздравляю Всех с Днем Защитников Отечества. Пью не за себя а за Своих Дедов и Прадедов. Как бы там ни было Россияне Великая нация прежде всего своими предками которыми Мы должны соответствовать. Кстати нет смайлика с Водкой. Большое упущение.
    Прошу простить меня за излишнюю эмоциональность. Потерял счет ...
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[30]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.02.05 22:23
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Соответствующие исправления в стандарте CLI ожидаются в некотором будущем. Их обещала подготовить и внести группа, занимающаяся CLR. Изменения, собственно, в стандарт (CLI) попадают небыстро; во всяком случае, значительно медленнее, чем в реализацию (CLR).


    Ну, вот когда подобные изменения появятся, то и можно будет говорить о чем-то. А пока есть баг в компиляторе. Опции копиляции не соотвествуют ожиданиям.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[28]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.02.05 22:23
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Да, меня это тоже немного (*) смущало. В скором (**) времени можно ожидать
    Автор: Павел Кузнецов
    Дата: 22.02.05
    соответствующие уточнения алгоритма верификации в стандарте CLI.


    Алгоритым в стандартах никого не интересуют. Есть реальная реализация. И всех интересует присуствие всего что нужно в ней. Это не абстрактый С++ который есть только на бумаге. Это реальная технология.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[28]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 22.02.05 22:23
    Оценка:
    Здравствуйте, Павел Кузнецов, Вы писали:

    ПК>Гм... Я смотрю в спецификацию C# (25.3), там написано то же самое:

    ПК>

    The address-of operator (§25.5.4) and the fixed statement (§25.6) divide variables into two categories: Fixed variables and moveable variables. Fixed variables reside in storage locations that are unaffected by operation of the garbage collector.

    ПК>Я туда смотрю?

    ПК>Насколько я понял fixed в C# == pinned в терминах CLI и pin_ptr в терминах C++/CLI.


    Интересно про стэк ты не задумывлася?
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[29]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 22.02.05 23:38
    Оценка:
    VladD2,

    > ПК>Да, меня это тоже немного (*) смущало. В скором (**) времени можно ожидать
    Автор: Павел Кузнецов
    Дата: 22.02.05
    соответствующие уточнения алгоритма верификации в стандарте CLI.


    > Алгоритым в стандартах никого не интересуют. Есть реальная реализация. И всех интересует присуствие всего что нужно в ней. Это не абстрактый С++ который есть только на бумаге. Это реальная технология.


    Тогда не понимаю, о чем ты вообще говоришь: в конкретной реализации (CLR) верификация допускает вызов функций, возвращающих managed указатели.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[29]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 22.02.05 23:39
    Оценка:
    VladD2,

    > ПК>Гм... Я смотрю в спецификацию C# (25.3), там написано то же самое:

    > ПК>

    The address-of operator (§25.5.4) and the fixed statement (§25.6) divide variables into two categories: Fixed variables and moveable variables. Fixed variables reside in storage locations that are unaffected by operation of the garbage collector.

    > ПК>Я туда смотрю?

    > ПК> Насколько я понял fixed в C# == pinned в терминах CLI и pin_ptr в терминах C++/CLI.


    > Интересно про стэк ты не задумывлася?


    Регулярно. А к чему ты это говоришь в данном случае?
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[31]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 22.02.05 23:47
    Оценка:
    VladD2,

    > ПК> Соответствующие исправления в стандарте CLI ожидаются в некотором будущем. Их обещала подготовить и внести группа, занимающаяся CLR. Изменения, собственно, в стандарт (CLI) попадают небыстро; во всяком случае, значительно медленнее, чем в реализацию (CLR).


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


    Эти изменения уже есть в CLR. Опция компилятора /clr:safe соответствует ожиданиям. А именно: код является верифицируемым с точки зрения CLR. Является ли он верифицируемым с точки зрения упрощенного алгоритма CLI — другой вопрос. Ответ на него дает PEVerify.
    Posted via RSDN NNTP Server 2.0 alpha
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[8]: C# - необходимость?
    От: DJ KARIES Россия  
    Дата: 24.02.05 15:43
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Не все так просто. Ситуация намного хитрее. Команда C# по прежнему уверена что это основной язык для .NET. Команда C++/CLI разумеется считает что основной язык будет C++. Вопрос только в том какая из них победит.

    Да. А потом Микрософт, как всегда, всех кинет. И сделает основным языком VB.NET или, что ещё хуже, F#.NET.
    ... << http://dkdens.narod.ru :: http://retroforth.org >>
    Re[27]: C# - необходимость?
    От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
    Дата: 28.02.05 10:56
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    Провел небольшой тестик для ref и fixed на дефрагментацию. Прошу прощение за дублирование кода. Лень ...

    public struct Element
        { 
         public int FirstAdress,LastAdress;
         public byte[] ar;
    
            Element(int Size)
            { 
              ar= new byte[Size];
              FirstAdress=LastAdress=0;
            
            }
    
        }
    
        public class TestRef
        { 
            Element[] ArrayElement;
            const int BeginSize = 1 << 10;
            public TestRef(Element[] Ae)
            { 
                ArrayElement = Ae;
                 for (int i=0; i<ArrayElement.Length; i++)
                 ArrayElement[i].ar= new byte[BeginSize+i];
            }
    
            unsafe public void SetFirstAdress()
            { 
                for (int i = 1; i < ArrayElement.Length; i += 2)
                  fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
                  { ArrayElement[i].FirstAdress = (int)f; 
                  f[3] = (byte)i;
                    
                  }
            
            }
            unsafe public int GetAddress(int i)
            {
                int Result;
                fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
                { Result= (int)f; }
                return Result;
            }
            unsafe public void SetLastAdress()
            {
                for (int i = 1; i < ArrayElement.Length; i += 2)
                    fixed (byte * f = (byte*) &ArrayElement[i].ar[0])
                    { ArrayElement[i].LastAdress = (int)f; }
            }
    
            public void Прорядить()
            { 
                for (int i = 0; i < ArrayElement.Length; i += 2)
                 { ArrayElement[i].ar =null; }
                
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
    
            public void TestRefElement( ref byte elem)
            { 
                SetFirstAdress();
                Прорядить();
                SetLastAdress();
                elem ++;
            
            }
    
            unsafe public void TestFixedElement(int index)
            {
                fixed (byte * f = (byte*) &ArrayElement[index].ar[3])
                {
                    SetFirstAdress();
                    Прорядить();
                    SetLastAdress();
                    *f=(byte)(*f+1);
                }
            }
        }


    И соответственно вызов.

     private void button2_Click(object sender, System.EventArgs e)
            {
                Element[] elements = new Element[10000];
                TestRef TR = new TestRef(elements);
                Random r = new Random(666666);
                int index = r.Next(elements.Length - 1) | 1;
                int adr = TR.GetAddress(index);
                TR.TestRefElement(ref elements[index].ar[3]);
    
                     for (int i=1; i<elements.Length; i+=2)
                         if (elements[i].FirstAdress==elements[i].LastAdress)
                             textBox1.AppendText("Index=" + i.ToString() + Environment.NewLine);
                    
                     byte EtalonValue = (byte)((byte)index + 1);
                     textBox1.AppendText(String.Format("Index ={0} FirstAdress={1} <> {2}  -- Значение {3} == {4}    {5}" + Environment.NewLine,index,elements[index].FirstAdress,elements[index].LastAdress,elements[index].ar[3],EtalonValue,adr));
    
                    
                 }
            private void button3_Click(object sender, System.EventArgs e)
                 {
                     Element[] elements = new Element[10000];
                     TestRef TR = new TestRef(elements);
                     Random r = new Random(666666);
                     int index = r.Next(elements.Length - 1) | 1;
                     int adr = TR.GetAddress(index);
                     
                     TR.TestFixedElement(index);
                     for (int i = 1; i < elements.Length; i += 2)
                         if (elements[i].FirstAdress == elements[i].LastAdress) 
                             textBox1.AppendText("Index=" + i.ToString() + Environment.NewLine); 
                     byte EtalonValue = (byte)((byte)index + 1);
                     textBox1.AppendText(String.Format("Index ={0} FirstAdress={1} == {2}  -- Значение {3} == {4}    {5}" + Environment.NewLine, index, elements[index].FirstAdress, elements[index].LastAdress, elements[index].ar[3], EtalonValue, adr));
                 }
        }


    Для фиксированного указателя адресс объекта не меняется, все остальные дефрагментируются.
    Для ref все объекты дефрагментируются.
    Логично предположить, что ссылка имеет такую структуру Re[10]: C# &mdash; необходимость?
    Автор: Serginio1
    Дата: 16.02.05



    Надо посмотреть ассемблерный код. В любом случае не вижу проблем с хранение ссылок в поле объекта, и возврат ссылки как значение функции. Так или иначе она управляемая.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    и солнце б утром не вставало, когда бы не было меня
    Re[4]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 06.03.05 20:46
    Оценка: 6 (1)
    Здравствуйте, GlebZ, Вы писали:

    GZ>Знаешь, для JVM тоже писалось очень много языков. Например.


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

    GZ> Только где они сейчас. Никому не нужны. То же самое будет и с Net. Останутся например VB и С#, а остальное все отомрет.


    Уже 2. Если учесть, что С++-ников сильно недолюбливающих все остальное не так уж и мало и то, что дотнет похоже не отвратим , то несомненно у новой версии МС++ есть будующее. Лидиром ему, по-моему, не стать, но свою долю рынка он отъест. Особенно учитывая его возможности по переносу унаследованного кода.

    А ведь есть еще и иследовательские проекты. Те же функциональные языки могут оказаться очень востребованными если процессорная гонка и правда пойдет по пути увеличения количества ядер на одном камне.

    GZ> Кому они нужны, если оформятся определенные стандарты написания программ под платформу. Несколько субъективное мнение, но C++/CLI, MC++, как его не зови тоже должен уйти со сцены. Как никому не нужный инструмент. Уже сейчас не много найдешь объявлений — требуется программист на С++ для Net.


    Однако если ты знаешь еще и С++, то это несомненно будет положительным фактором при приеме на работу.

    GZ>PS: Мне достаточно жаль людей которые повелись на байку что C++ код можно легко портировать под Net. Если бы у меня стояла такая задача, я бы портировал под C#. Трудоемкость не сильно бы возрасла, но код бы смотрелся и управлялся значительно лучше.


    Гы. Так может поступить только тот у кого много бабок и времени. Портирование на Шарп — это сто процентное алгоритмическое переписывание. Может от этого качество продукта и повысится, но обойдется это в копеечку.

    Вот представь себе. Есть у конторы продукт вроде Ворда или Визио... захотела она выпустить релиз для новой ОС. А что это значит? А значит это, что диаложки (коих не много, но все же) нужно в Авалон портировать. Разные 3D-фичи добавить. Новые фишки из ОС заюзать. Но при этом основная логика приложения не изменилас ведь. Не правда ли? А раз так, то можно просто втупую перекомпилировать все приложение в мсил и потихоничку заменять те самые диаложки на Авалоновские формы.

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

    Попробую провести анализ использования языков в самом МС. Например, возьмем Авалоновские сборки (версии 6.0.4030):

    Microsoft.Windows.EventTracing.dll - C#
    PresentationBuildTasks.dll         - C#
    PresentationCore.dll               - C# + MC++
    PresentationCore2.dll              - MC++
    PresentationFramework.dll          - C#
    PresentationUI.dll                 - C#
    TabletCore.dll                     - C#
    TabletFramework.dll                - C#
    WindowsBase.dll                    - C#
    WindowsFormsIntegration.dll        - C#
    WindowsUIAutomation.dll            - C#
    WindowsUIAutomationProxies.dll     - C#


    Причем PresentationCore и PresentationCore2 — это сборки осуществлюящие много низкоуровневого взаимодействия с ОС. Публичных управляемых классов в этих сборках не много. В PresentationCore вообще 90% составляют классы написанные на C#, однако МС++ кода явно хватает. И в основном он занимается двумя вещами:
    1. Вопросами производительности. Например, в PresentationCore2 есть вот такой классик:
    internal class Mth
    {
        // Methods
        public Mth();
        public static unsafe ushort Calc90degClosestRotationFactor(transMatrix* matrix);
        public static unsafe ushort Calc90degRotationFactor(transMatrix* matrix);
        public static unsafe ushort Calc90degRotationFactorForEmboldening(transMatrix* matrix);
        private static unsafe int CompDiv(int src1, int* src2);
        private static unsafe void CompMul(int src1, int src2, int* dst);
        public static int CountLowZeros(uint n);
        public static int Div26Dot6(int num, int den);
        public static int DivShiftLong(int sValue, short sFactor);
        public static short DivShiftShort(short sValue, short sFactor);
        public static int FixDiv(int __unnamed000, int __unnamed001);
        public static int FixMul(int __unnamed000, int __unnamed001);
        public static int FixRatio(short sA, short sB);
        public static unsafe void FixXYMul(int* x, int* y, transMatrix* matrix);
        public static int FracDiv(int __unnamed000, int __unnamed001);
        public static int FracMul(int __unnamed000, int __unnamed001);
        public static int FracSqrt(int __unnamed000);
        public static unsafe int GeneralRotation(transMatrix* matrix);
        public static int GetShift(uint n);
        public static unsafe int Identity(transMatrix* matrix);
        public static unsafe void IntelMul(int lNumPts, int* fxX, int* fxY, transMatrix* trans, int fxXStretch, int fxYStretch);
        public static unsafe int IsMatrixStretched(transMatrix* trans);
        public static int LongMulDiv(int a, int b, int c);
        public static int max_abs(int a, int b);
        private static int Max45Trick(int x, int y);
        public static int Mul26Dot6(int a, int b);
        public static short MulDivShorts(short x, short y, short z);
        public static unsafe void MxConcat2x2(transMatrix* matrixA, transMatrix* matrixB);
        public static unsafe void MxScaleAB(int sx, int sy, transMatrix* matrixB);
        public static unsafe int PositiveRectangle(transMatrix* matrix);
        public static unsafe int PositiveSquare(transMatrix* matrix);
        public static int PowerOf2(int __unnamed000);
        public static unsafe void ReduceMatrix(transMatrix* trans);
        public static int SameStretch(int fxScaleX, int fxScaleY);
        public static short ShortFracDiv(short x, short y);
        public static short ShortFracDot(short x, short y);
        public static int ShortFracMul(int x, short y);
        public static short ShortFracMulDiv(short __unnamed000, short __unnamed001, short __unnamed002);
        public static int ShortMulDiv(int a, short b, short c);
        public static unsafe int UnitarySquare(transMatrix* matrix);
    }

    названия методов которого говорят сами за себя.

    2. Вопросы взаимодействия с анменеджед-миром. Ведь Авалон — это всего лишь ОО-библиотека. В своих глубинах она все так же обращается к анменеджед-сервисам ОС. Другое дело, что в отличии от ВыньФормс она отдает ОС только самые низкоуровневые операции, а все контролы и т.п. живут в управляемом мире.

    Так что уже видно, что с тодной сторны МС++ востребован. Но с другой повальный переход на него — это скорее мечты слишком привязанных к С++ людей. Если еще учесть, что есть орлы типа нашего горяче любимого ПК которые свой С++ ни за какие ковришки не продадут... а выпускать продукт под Авалон один фиг нужно... то и вопросов не возникает.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[2]: C# - необходимость?
    От: Павел Кузнецов  
    Дата: 07.03.05 06:23
    Оценка: :))
    VladD2,

    > <...>


    Поскипано, т.к. в основном согласен.

    > орлы типа нашего горяче любимого ПК которые свой С++ ни за какие ковришки не продадут...


    ПК сдаст C++ с потрохами в любой момент, как только на горизонте появится другой язык, избавленный от многочисленных недостатков C++, но поддерживающий любимые ПК в C++ идиомы, при условии, что вокруг нового языка будет community, не менее привлекательное, чем вокруг C++. Правда, ПК очень сильно сомневается в том, что это произойдет сколько-нибудь скоро. О чем регулярно совершенно искренне грустит.
    Posted via RSDN NNTP Server 1.9
    Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
    Re[5]: C# - необходимость?
    От: LSL  
    Дата: 08.03.05 19:02
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>2. Вопросы взаимодействия с анменеджед-миром. Ведь Авалон — это всего лишь ОО-библиотека. В своих глубинах она все так же обращается к анменеджед-сервисам ОС. Другое дело, что в отличии от ВыньФормс она отдает ОС только самые низкоуровневые операции, а все контролы и т.п. живут в управляемом мире.


    Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Re[5]: C# - необходимость?
    От: GlebZ Россия  
    Дата: 09.03.05 10:18
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    Извини, сообщение прочитал только сейчас. Я изменил мнение после того как врубился в C++/CLI. Мой ответ.
    Автор: GlebZ
    Дата: 07.03.05


    С уважением, Gleb.

    PS: честно говоря меня бы удовлетворило расширение функциональности C# для unsafe кода для реализации подобных вещей.
    Re[6]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.03.05 12:24
    Оценка: +1
    Здравствуйте, LSL, Вы писали:

    LSL>Майкрософт говорит, что Avalon построен поверх DirectX, но не видно никаких связей в References. Не знаешь, как это понимать?


    1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.
    2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: C# - необходимость?
    От: LSL  
    Дата: 09.03.05 17:33
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.

    VD>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.

    Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Re[8]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.03.05 02:16
    Оценка:
    Здравствуйте, LSL, Вы писали:

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


    VD>>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.

    VD>>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.

    LSL>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.


    Где искал? Надо искать в %SystemRoot%.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: C# - необходимость?
    От: LSL  
    Дата: 11.03.05 16:11
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


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


    VD>>>1. Вся связь с ОС и железом идет через анменеджед-длл-и, так называемый MIT. Поищи в виндовс-каталоге длл-и с префиксом mit.

    VD>>>2. DirectX базируется на COM и значит никаких прямых связей ты увидить в анменеджед-мире не сможешь.

    LSL>>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.


    VD>Где искал? Надо искать в %SystemRoot%.


    Там и искал, в папке C:\WINDOWS\... а сам Авалон ставится в C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030
    ... << RSDN@Home 1.1.4 beta 4 rev. 303>>
    Re[10]: C# - необходимость?
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.03.05 21:47
    Оценка:
    Здравствуйте, LSL, Вы писали:

    LSL>>>Действительно, связей нет даже в сборках Managed DX. А вот по шаблону *mit*.dll ничего не нашёл.


    VD>>Где искал? Надо искать в %SystemRoot%.


    LSL>Там и искал, в папке C:\WINDOWS\... а сам Авалон ставится в C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030


    Извиняюсь. Это я торможу. Конечно же не MIT, MIL. Одна из дллей точно называется MILCORE.DLL.
    ... << RSDN@Home 1.1.4 beta 3 rev. 279>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.