Здравствуйте, Serginio1, Вы писали:
V>>Это то, что должен был генерить компилятор.
V>>Но приходится тебе.
S> А я уже в 1000 раз привожу ссылки где это делается
S>Optimising LINQ
Посмотри внимательней свои ссылки, плиз.
Ничего из обсуждаемого там не делается.
S>Сейчас с развитием Рослина много оптимизаций на уровне Кода в CIL.
Я даже уверен, что с использованием Рослина можно накрутить свой собственный диалект C#, в котором попытаться порешать некоторые обсуждаемые вопросы. ))
S>Кроме того есть Net Native и там намного проще делать оптимизации из-за ограничения в рефлексии.
Оптимизации проще делать при отсутствии какой-либо рефлексии и конкретно нейтивность тут не при чём.
Просто не надо было тащить систему типов в VM, как это топорно сделала Java.
По-сути, Net Native — это совсем другая философия, это НЕ дотнет в его привычном понимании. ))
А в дотнет проблема была заложена изначально, ИМХО.
Он был разработан в то время, когда рост вычислительных мощностей удваивался каждые полтора года.
Отсюда такие случились такие акценты — на простоту инфраструктуры на основе топорной системы типов, типа джавистской.
Почему топорной? Потому что рефлексируется всё и вся, включая приватные члены. Т.е., "как слышится, так и пишется" и ничего не "сокращается в уме". То бишь, система типов не позволяет никакой их редукции и никакого "стирания" артефактов типов вплоть до аж рантайма. Нифига себе... ))
ОК. С одной стороны это упростило первую версию точного GC, с другой стороны создало проблемы для оптимизаций.
Например, в С++ есть т.н. "бинарная склейка" одинаковых участков кода. Ну вот пусть совершенно разные типы после компиляции создадут идентичный бинарный код некоей ф-ии или метода — такой код будет склеен в единственный экземпляр. Именно это позволяет бороться с распуханием кода после применения шаблонов.
Но даже без шаблонов такая техника оказалась весьма эффективной, потому что повторяющиеся куски кода в больших приложениях — это более чем обычно. В случае рефлексии всего и вся такой фокус невозможен. В случае рефлексии мы даже не можем делать предположения о живых и мертвых зависимостях. Т.е. вынуждены таскать за собой огромные зависимости целиком.
В общем, генерики дотнета сделали такими, какие они есть в том числе по этой причине — чтобы не плодить дубликаты практически одинакового кода в ходе специализаций. Идёт размен статического ресолвинга точных типов на динамические вызовы интерфейсов.
В общем, положа руку на — кошмар.
===============
Я более чем уверен, что концепция дотнета будет серьёзно пересматриваться.
Собсно уже. Ты правильно напомнил про Net Native. В любом сложном процессе важно целеполагание, на сегодня это целеполагание уже оформилось — это эффективный кроссплатформенный код.
Раньше целеполагание было чуть другим — дать простой в изучении и применении инструмент. А "эффективный и кроссплатформенный" — когда-нибудь потом. Декларировалось, что достаточно будет запустить имеющиеся приложения на новых версиях фреймворков и всё само собой случится. ))
Вот как раз из-за топорности системы типов VM нифига так и не случилось.
15 лет прошло уже... Дотнет набрал неимоверный вес и инерцию.
И при этом активно ПЕРЕДЕЛЫВАЕТСЯ прямо сейчас.
Сколько это еще займёт лет, как думаешь?
Думаю, еще десяток лет запросто, пока не откажутся окончательно от современной модели VM. Текущую парадигму исполнения VM в лучшем случае оставят как эмулируемую для совместимости.