Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 19.09.23 02:22
Оценка:
c# .net 8 rc1
AOT analysis warning IL3050: Program.<>c.<<Main>b__2_0>d.MoveNext(): Using member 'System.Text.Json.JsonSerializer.Deserialize<Payload>(String,JsonSerializerOptions)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.

И так рефлексию на свалку, гоу на кодогенерацию(zig, ++, dlang смотрят на это все с ухмылкой)!
Зашибись конечно.
Те использование аот это бег по минному полю. понимаю...
Все таки получается попытка превратить ограниченный яп(часть) в Common Lisp(целое) не лучшая идея.
В итоге получаем с одной стороны:
oberon который имеет минимум языковых конструкции но полностью отражает возможности железа.
с другой:
Common Lisp позволяющий делать все что придет в голову программисту.

Все остальное вариации на этой шкале.
тот же null как false в js это же из лиспа пошло.
интересно, а nemerle смог бы в аот без миноискателя?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.23 11:17
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

Ну надо менять сериализаторы
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/native-aot?view=aspnetcore-8.0#changes-to-support-source-generation
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/native-aot?view=aspnetcore-8.0#minimal-apis-and-json-payloads
Прописывать типы для рефлексии, ну и никаких деревьев выражений для компиляции

Ну и больше использовать Генераторы исходного кода
https://learn.microsoft.com/ru-ru/aspnet/core/fundamentals/native-aot?view=aspnetcore-8.0#source-generators
https://learn.microsoft.com/ru-ru/dotnet/standard/serialization/system-text-json/source-generation

То есть вся рефлексия должна заменяться Source Generator под определенный набор типов.
Наверняка сделают анализаторы с автоматической пропиской используемых типов, кроме object
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.09.2023 11:33 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.09.2023 11:31 Serginio1 . Предыдущая версия .
Отредактировано 19.09.2023 11:26 Serginio1 . Предыдущая версия .
Отредактировано 19.09.2023 11:21 Serginio1 . Предыдущая версия .
Re: Сложности выбора или часть не может быть лучше целого
От: vsb Казахстан  
Дата: 19.09.23 11:25
Оценка: +1
Я вообще не понимаю, как компиляция и рефлексия мешают друг другу.

Рефлексия это тупо кучка констант, с адресами и смещениями.
Отредактировано 19.09.2023 11:26 vsb . Предыдущая версия .
Re[2]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.23 11:58
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Я вообще не понимаю, как компиляция и рефлексия мешают друг другу.


vsb>Рефлексия это тупо кучка констант, с адресами и смещениями.


А если типа нет в сборке или они обрезаются, так как нет использования.
Кроме того есть инлайнинг и нехрен сам метод хранить.
Поэтому лучше всего генерить классы по определенным типам, вместо рефлексии в рантайме.
Для SG вся информация по типам есть и проще сгенерить код
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.09.2023 11:59 Serginio1 . Предыдущая версия .
Re[3]: Сложности выбора или часть не может быть лучше целого
От: vsb Казахстан  
Дата: 19.09.23 12:05
Оценка:
Здравствуйте, Serginio1, Вы писали:

vsb>>Я вообще не понимаю, как компиляция и рефлексия мешают друг другу.


vsb>>Рефлексия это тупо кучка констант, с адресами и смещениями.


S> А если типа нет в сборке или они обрезаются, так как нет использования.


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

S>Кроме того есть инлайнинг и нехрен сам метод хранить.


Ничего не мешает хранить и инлайнинг и метод. Это мелочи.

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


Это не лучше, это другой подход. Если у меня схема в рантайме задаётся, то я без рефлексии ничего не смогу сделать.
Re[4]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.23 12:12
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Это не лучше, это другой подход. Если у меня схема в рантайме задаётся, то я без рефлексии ничего не смогу сделать.

Ну вообще то AOT поддерживает рефлексию в CoreRT. Просто типы или сборки нужно указать Rd.xml

https://github.com/dotnet/corert/blob/master/Documentation/using-corert/reflection-in-aot-mode.md
https://github.com/dotnet/corert/blob/master/Documentation/using-corert/rd-xml-format.md

В .Net Native тоже https://learn.microsoft.com/ru-ru/windows/uwp/dotnet-native/runtime-directives-rd-xml-configuration-file-reference

Наверняка в .Net 8 добавят, но возможно и нет. Так как народ любит включать все типы.
Ну опять же, кто тебе мешает рефлексию заменить на генератор кода с интерфейсами итд?
Рефлексия это по сути утиная типизация и доступ к непубличным полям.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 19.09.2023 12:20 Serginio1 . Предыдущая версия . Еще …
Отредактировано 19.09.2023 12:15 Serginio1 . Предыдущая версия .
Re[2]: Сложности выбора или часть не может быть лучше целого
От: SkyDance Земля  
Дата: 19.09.23 16:31
Оценка: +1
S> То есть вся рефлексия должна заменяться Source Generator под определенный набор типов.

Блин, вот зачем. Кодогенерация — зло!
Re[3]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.09.23 18:33
Оценка:
Здравствуйте, SkyDance, Вы писали:

S>> То есть вся рефлексия должна заменяться Source Generator под определенный набор типов.


SD>Блин, вот зачем. Кодогенерация — зло!

Это почему? Как раз добро. При этом ты можешь отлаживать сгенеренный код!
Это тебе не какие ни будь там шаблоны С++
и солнце б утром не вставало, когда бы не было меня
Re[4]: Сложности выбора или часть не может быть лучше целого
От: SkyDance Земля  
Дата: 19.09.23 22:45
Оценка:
S> Это почему? Как раз добро. При этом ты можешь отлаживать сгенеренный код!

Да, собственно, именно этого-то я и не хочу делать. Сгенерированный код — это, по факту, copy-paste, проделанный компилятором. В некотором роде те самые "шаблоны С++", притом каждый раз развернутые заново.
Чем мне нравится reflection, что код не дублируется. И отлаживать код, работающий с reflection, ни разу не сложнее.
Re[3]: Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 20.09.23 00:18
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

По сути получается отдельное подмножество C#, не очень верится что в обозримом будущем все библиотеки избавятся от рефлексии.
Это была одна из ключевых фичей C# изначально.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 07:07
Оценка:
Здравствуйте, SkyDance, Вы писали:

S>> Это почему? Как раз добро. При этом ты можешь отлаживать сгенеренный код!


SD>Да, собственно, именно этого-то я и не хочу делать. Сгенерированный код — это, по факту, copy-paste, проделанный компилятором. В некотором роде те самые "шаблоны С++", притом каждый раз развернутые заново.

SD>Чем мне нравится reflection, что код не дублируется. И отлаживать код, работающий с reflection, ни разу не сложнее.
Ну как бы там ни было SG внедряется все больше и больше. И никто же тебе не мешает использовать CLR как и раньше
и солнце б утром не вставало, когда бы не было меня
Re[4]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 07:08
Оценка: +1
Здравствуйте, Разраб, Вы писали:

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

Р>По сути получается отдельное подмножество C#, не очень верится что в обозримом будущем все библиотеки избавятся от рефлексии.
Р>Это была одна из ключевых фичей C# изначально.
Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.
Почему то ты молчишь про динамическую компиляцию, деревья выражений
и солнце б утром не вставало, когда бы не было меня
Re: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 08:35
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>c# .net 8 rc1

Р>
Р>AOT analysis warning IL3050: Program.<>c.<<Main>b__2_0>d.MoveNext(): Using member 'System.Text.Json.JsonSerializer.Deserialize<Payload>(String,JsonSerializerOptions)' which has 'RequiresDynamicCodeAttribute' can break functionality when AOT compiling. JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.
Р>

Для улучшения AOT Что нового в System.Text.Json в .NET 8
и солнце б утром не вставало, когда бы не было меня
Re[5]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 08:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.


В Delphi и натив, и память не жрется, и рефлексия в полный рост Дотнед, смотрю, окостыливается вместе с шарпом...
avalon/3.0.2
Re[6]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 09:03
Оценка:
Здравствуйте, rudzuk, Вы писали:

S>> Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.


R>В Delphi и натив, и память не жрется, и рефлексия в полный рост Дотнед, смотрю, окостыливается вместе с шарпом...

Ну в Delphi 7 никакого полного роста не было.
Еще раз в CoreRT и .Net Native есть поддержка рефлексии. В .Net 8 решили насильно отходить от рефлексии в сторону кодогенерации.
И это в общем считаю правильным решением. Незачем хранить метаинформацию с адресами методов итд.

Просто нужны более простые шаблоны для генерации кода.
Хотя набив руку на Roslyn не проблема
и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.09.2023 9:06 Serginio1 . Предыдущая версия .
Re[7]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 09:32
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> S>> Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.


S> R>В Delphi и натив, и память не жрется, и рефлексия в полный рост Дотнед, смотрю, окостыливается вместе с шарпом...


S> Ну в Delphi 7 никакого полного роста не было.


И было это... 20 лет назад. На самом дело все было в Delphi 7, но не так удобно, как стало в d2010 (14 лет назад).

S> Еще раз в CoreRT и .Net Native есть поддержка рефлексии. В .Net 8 решили насильно отходить от рефлексии в сторону кодогенерации.

S> И это в общем считаю правильным решением. Незачем хранить метаинформацию с адресами методов итд.

Да ты любой эмэсовский высер считаешь правильным решением И костыль дженерикматх правильное решение, и костыльная кодогенерашка правильное решение... Вот казалось бы, сделайте уже шаблоны и не нужны будут костыли... Но нет, все будет сделано в лучших традициях современной айтишечки. Истинно говорю — индусы уебут МС о небесную ось.
avalon/3.0.2
Re[8]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 10:55
Оценка:
Здравствуйте, rudzuk, Вы писали:

S>> Еще раз в CoreRT и .Net Native есть поддержка рефлексии. В .Net 8 решили насильно отходить от рефлексии в сторону кодогенерации.

S>> И это в общем считаю правильным решением. Незачем хранить метаинформацию с адресами методов итд.

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


Вот шаблоны то как раз и отстой. Те же дженерики можно для реального типа генерить код с инлайнингом и интеллисенсом.
Тот же шаблон это ничто иное как годогенерация. Но для C++ ты считаешь это отлично, а для .Net костыли.
Ты уж определись.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.09.2023 10:57 Serginio1 . Предыдущая версия .
Re[9]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 15:41
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Вот шаблоны то как раз и отстой. Те же дженерики можно для реального типа генерить код с инлайнингом и интеллисенсом.

S> Тот же шаблон это ничто иное как годогенерация. Но для C++ ты считаешь это отлично, а для .Net костыли.
S> Ты уж определись.

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

И кстати, я ни слова о C++ не сказал. Или ты считаешь, что шаблоны есть только в C++? Они и во Free Pascal есть, например (называется это дженериками, но это не дотнетовские дженерики) И да, шаблоны это не кодогенерация.
avalon/3.0.2
Re[10]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 15:55
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> Вот шаблоны то как раз и отстой. Те же дженерики можно для реального типа генерить код с инлайнингом и интеллисенсом.

S>> Тот же шаблон это ничто иное как годогенерация. Но для C++ ты считаешь это отлично, а для .Net костыли.
S>> Ты уж определись.

R>Вот смотри, в гошечке кодогенераторы появились ввиду наличия отсутствия обобщенного программирования. Ебанутость у них такая была, дескать, нам дженерики не нужны, это сложно и все такое, вот вам кодгены. В шарпе поддержку обобщенного программирования сделали дженериками, но сцука, кастрированными по самую кочерыжку. Потом, вдруг, до них дошло, что это, как-то, не очень удобно, и они прикостылили кодогенераторы. Потом еще подумали, и в дженерики добавили дженерикматх. И вот теперь в шарпе есть эта груда предназначенная для решения одной и той же задачи


Нет в Шарпе как были дженериками так и остались. Но для Jita используются обычные дженерики ибо анализировать долго. А вот для AOT там сначала переводят в C++ а затем компилируют.
То есть отладка в CLR, а релиз уже в C++ с последующей компиляцией.
То есть там вообще двойная кодогенерация.

R>И кстати, я ни слова о C++ не сказал. Или ты считаешь, что шаблоны есть только в C++? Они и во Free Pascal есть, например (называется это дженериками, но это не дотнетовские дженерики) И да, шаблоны это не кодогенерация.


Ты уж поясняй, что ты там под шаблонами имеешь. Или я должен гадать?
И заодно, что такое шаблоны в Free Pascal. Может ты шаблон раскройки и шитья имеешь ввиду
и солнце б утром не вставало, когда бы не было меня
Re[11]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 16:08
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> То есть отладка в CLR, а релиз уже в C++ с последующей компиляцией.

S> То есть там вообще двойная кодогенерация.

[апплодирует стоя]
[думает, что ты сам не понимаешь о чем пишешь]

S> Ты уж поясняй, что ты там под шаблонами имеешь. Или я должен гадать?

S> И заодно, что такое шаблоны в Free Pascal. Может ты шаблон раскройки и шитья имеешь ввиду

Это не принципиально, просто ремарка относительно твоего упоминания C++.
avalon/3.0.2
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.