Re[13]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 18:08
Оценка: :))
Здравствуйте, Serginio1, Вы писали:

S> Смотреть то я могу. Но сразу вопрос. .Net для чисел и тому подобное ввели Generic Math


Угу. И это костыль

S> Ту сразу вопрос. Работает интеллисенс если нет ограничений?

S> Есть синтаксическая проверка?

Для всех известных типов используемых в дженерике доводчик кода работает и синтаксис проверяется. Для типа которым дженерик специализируется разумеется не работает т.к. конкретный тип известен только в момент специализации.
avalon/3.0.2
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[24]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.09.23 07:12
Оценка: 3 (1)
Здравствуйте, rudzuk, Вы писали:



S>> Ну ну. Нахваливай свои костыли.


R>Завидуйте молча


S>> Еще раз в C# дженериках есть статическая типизация с со всеми плюшками. И так же быть твоим шаблоном при компиляции в AOT с инлайнингом.

S>> И все это как ты говоришь скомпилировано в промежуточный Il

R>Еще раз: шарповые дженерики это кастрированные шаблоны, которые без костылей генерикматх попросту не юзабельны. Не пойму только одного, ну чего спорить с очевидными вещами то? Могу подсластить пилюлю, сказав, что в Delphi дженерики тоже кастрированные, и там еще и генерикматха нет

Ага без типизации и интеллисенса это не кастрированные?
Дженерики как раз и есть следующий этап! Для примера тот же TS набирает популярность именно из-за аннотации типов!
При этом дженерики можно использовать как они задуманы, так и компилировать с инлайнингом.

Хотя и для джита повышают производительность. Все течет, все меняется https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.09.2023 7:34 Serginio1 . Предыдущая версия .
Re[3]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:45
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

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


Р>>>Зашибись конечно.

Р>>>Те использование аот это бег по минному полю. понимаю...
G>>Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти
Р>предупреждения это же не точно, такое себе как обойти. точно разве нельзя вычислить по АСТ?
сделай treat warnings as error в этой категории



Р>>>тот же null как false в js это же из лиспа пошло.

G>>А не из C?
Р>на конфе слышал про цитату что js это лисп для браузера. отсюда и вывод.
Как в анекдоте: маша считает себя моделью и творческой личностью, а в подъезде на стене написано другое.
Если говорить о первоисточниках, то null как false было и в C, и, самое главное, в ассемблере. Ибо нулевая ссылка на объект это просто число ноль, которое является false и выставляет zero flag при операции or\and\cmp само с собой.
Re[31]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 08:45
Оценка: 1 (1)
Здравствуйте, Serginio1, Вы писали:

S> R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.


S> Ну и нахрен такой язык нужен если нет нормального среды разработки.


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

S> Еще раз напомню про Delphi. Это не только язык, но и среда разработки.


Так в Delphi он тоже не работает для дженериков
avalon/3.0.2
Re: Сложности выбора или часть не может быть лучше целого
От: vsb Казахстан  
Дата: 19.09.23 11:25
Оценка: +1
Я вообще не понимаю, как компиляция и рефлексия мешают друг другу.

Рефлексия это тупо кучка констант, с адресами и смещениями.
Отредактировано 19.09.2023 11:26 vsb . Предыдущая версия .
Re[2]: Сложности выбора или часть не может быть лучше целого
От: SkyDance Земля  
Дата: 19.09.23 16:31
Оценка: +1
S> То есть вся рефлексия должна заменяться Source Generator под определенный набор типов.

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

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

Р>По сути получается отдельное подмножество C#, не очень верится что в обозримом будущем все библиотеки избавятся от рефлексии.
Р>Это была одна из ключевых фичей C# изначально.
Ну хочешь натива, меньшего размера памяти то надо чем то жертвовать.
Почему то ты молчишь про динамическую компиляцию, деревья выражений
и солнце б утром не вставало, когда бы не было меня
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[11]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 20.09.23 16:08
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

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

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

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

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

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

Это не принципиально, просто ремарка относительно твоего упоминания C++.
avalon/3.0.2
Re[21]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 21.09.23 10:48
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> В большинстве задач не нужны числодробилки, а работа с потоками, асинхронность.


Новая мантра, понимаю

S> R>И есть необхождимость в костылях дженерикматх.


S> Еще раз это шаблоны костыли без типизации и интеллисенса.


Да нет, именно дженерикматх и есть самый настоящий костыль. Прям эталон, из палаты мер и весов

S> S>> Это все та же кодогенерация, но на другом уровне.


S> R>Хрена ты... Термин выдумал и давай спорить... Это, оказывается, другой уровень ты еще инлайниг генерацией исходников назови, просто на другом, блин, уровне.


S> Угу твой макрос как раскрывается?


Не через генерацию исходников, уж точно.

S> Его как раз проще перевести в код с нужным типом и скомпилировать. При этом еще и отладить в нужных местах.

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

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

S> Кстати как там отладка ваших шаблонов?


Отладка как отладка
avalon/3.0.2
Re[10]: Сложности выбора или часть не может быть лучше целого
От: SkyDance Земля  
Дата: 22.09.23 18:35
Оценка: +1
R> нам дженерики не нужны, это сложно и все такое, вот вам кодгены

Это особенный прибабах конкретных людей конкретно в Гугл. Из-за этих вот (censored) и получается, что gRPC/protobuf все такой же отсталый и убогий, как в 80-х были первые RPC (кажется, Mesa их звали). Переизобретено колесо MS COM (с их IDL, mIDL).

На деле же кодген куда более ушибленная штука, чем рантайм-реализация.
Re[28]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.09.23 22:50
Оценка: +1
Здравствуйте, rudzuk, Вы писали:


S>> Это проблема языка, так как среда разработки не справляется.


R>Чо, вечер пятницы в разгаре?


S>> Ну и раз можно указать ограничения, то чем они отличаются от дженериков?


R>Укажешь ограничения, компилятор будет контролировать код дженерика в соответствии с ограничениями, еще до фазы специализации. Если ограничений нет, то контроль будет выполняться в момент специализации.


Ну в итоге то с ограничениями чем от дженериков отличается?
S>> Дженерики это прежде всего типизация и интеллисенс!

R>Дженерики это прежде всего типобезопасность. А ителисенс, еще раз, не характеристика языка.

Это характеристика языка! Так как можно выводить тип итд. С++ ники очень любили блокнот. Хотя он типизированный. Но макросы и шаблоны этому сильно препятствовали.
и солнце б утром не вставало, когда бы не было меня
Re[29]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 07:36
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> R>Укажешь ограничения, компилятор будет контролировать код дженерика в соответствии с ограничениями, еще до фазы специализации. Если ограничений нет, то контроль будет выполняться в момент специализации.


S> Ну в итоге то с ограничениями чем от дженериков отличается?


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

S> R>Дженерики это прежде всего типобезопасность. А ителисенс, еще раз, не характеристика языка.


S> Это характеристика языка! Так как можно выводить тип итд.


Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.

S> С++ ники очень любили блокнот. Хотя он типизированный. Но макросы и шаблоны этому сильно препятствовали.


https://www.youtube.com/watch?v=d1vRLfuF-wM
avalon/3.0.2
Re[45]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 24.09.23 10:20
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

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

S> C# говном из-за IDE итд.
S> Смысла тратить время не имеет смысла. Удачи.

Ну вот А как дысал, как дысал...
avalon/3.0.2
Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 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[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[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: Сложности выбора или часть не может быть лучше целого
От: 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[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:19
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> И заодно, что такое шаблоны в Free Pascal.


Можешь посмотреть, как выглядит шаблонный код на Free Pascal
Автор: rudzuk
Дата: 14.03.23
.
avalon/3.0.2
Re[12]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.09.23 16:23
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


S>> И заодно, что такое шаблоны в Free Pascal.


R>Можешь посмотреть, как выглядит шаблонный код на Free Pascal
Автор: rudzuk
Дата: 14.03.23
.

Смотреть то я могу. Но сразу вопрос. .Net для чисел и тому подобное ввели Generic Math
Ту сразу вопрос. Работает интеллисенс если нет ограничений?
Есть синтаксическая проверка?
и солнце б утром не вставало, когда бы не было меня
Re[14]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.09.23 07:29
Оценка:
Здравствуйте, rudzuk, Вы писали:

S>> Ту сразу вопрос. Работает интеллисенс если нет ограничений?

S>> Есть синтаксическая проверка?

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

Ну и чем этот некостыль отличается от C++ шаблона?
и солнце б утром не вставало, когда бы не было меня
Re[15]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 21.09.23 08:05
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну и чем этот некостыль отличается от C++ шаблона?


Эм... А должен отличаться?
avalon/3.0.2
Re[16]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.09.23 08:11
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> Ну и чем этот некостыль отличается от C++ шаблона?


R>Эм... А должен отличаться?

Ну ты же писал про отличие шаблонов от С++ шаблонов, отсутствии кодогенерации.
Вот дженерики компилируются в Il без специализации, а при джите для объектов используется один класс.
При этом есть и интеллисенс и проверка кода на этапе написания кода.
И для AOT они могут так же раскрываться как и обычные шаблоны.
А вот шаблоны то как раз и огромнейший костыль!
и солнце б утром не вставало, когда бы не было меня
Re[17]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 21.09.23 08:42
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну ты же писал про отличие шаблонов от С++ шаблонов, отсутствии кодогенерации.


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

S> Вот дженерики компилируются в Il без специализации, а при джите для объектов используется один класс.


Угу. Потому-то дотнетовские дженерики тормозные. Даже тут были жалобы на этот момент.

S> А вот шаблоны то как раз и огромнейший костыль!


Шаблоны это мощь в чистом виде, без компромиссов.
avalon/3.0.2
Re[18]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.09.23 08:49
Оценка:
Здравствуйте, rudzuk, Вы писали:

S>> Ну ты же писал про отличие шаблонов от С++ шаблонов, отсутствии кодогенерации.


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


S>> Вот дженерики компилируются в Il без специализации, а при джите для объектов используется один класс.


R>Угу. Потому-то дотнетовские дженерики тормозные. Даже тут были жалобы на этот момент.

Зато очень быстро компилируются. Тормоза из-за отсутствия инлайнинга, но это только на ограниченном числе типов.
Так или иначе JIT все таки уступает прежде всего из-за необходимой скорости компиляции.
S>> А вот шаблоны то как раз и огромнейший костыль!

R>Шаблоны это мощь в чистом виде, без компромиссов.

Это анахронизм! Еще раз дженерики в AOT так же могут раскрываться. Нет проблем! Но есть интеллисенс и проверка типов.
То есть скорость компиляции и отладка идет на нормальных дженериках, а вот в релиз уже идет как ты говоришь дженерик разворачивается.
Это все та же кодогенерация, но на другом уровне.
и солнце б утром не вставало, когда бы не было меня
Re[19]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 21.09.23 09:05
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Угу. Потому-то дотнетовские дженерики тормозные. Даже тут были жалобы на этот момент.


S> Зато очень быстро компилируются. Тормоза из-за отсутствия инлайнинга, но это только на ограниченном числе типов.

S> Так или иначе JIT все таки уступает прежде всего из-за необходимой скорости компиляции.

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

S> R>Шаблоны это мощь в чистом виде, без компромиссов.


S> Это анахронизм! Еще раз дженерики в AOT так же могут раскрываться. Нет проблем! Но есть интеллисенс и проверка типов.


И есть необхождимость в костылях дженерикматх.

S> Это все та же кодогенерация, но на другом уровне.


Хрена ты... Термин выдумал и давай спорить... Это, оказывается, другой уровень ты еще инлайниг генерацией исходников назови, просто на другом, блин, уровне.
avalon/3.0.2
Re[20]: Сложности выбора или часть не может быть лучше целого
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.09.23 09:10
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> R>Угу. Потому-то дотнетовские дженерики тормозные. Даже тут были жалобы на этот момент.


S>> Зато очень быстро компилируются. Тормоза из-за отсутствия инлайнинга, но это только на ограниченном числе типов.

S>> Так или иначе JIT все таки уступает прежде всего из-за необходимой скорости компиляции.

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

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

S>> R>Шаблоны это мощь в чистом виде, без компромиссов.


S>> Это анахронизм! Еще раз дженерики в AOT так же могут раскрываться. Нет проблем! Но есть интеллисенс и проверка типов.


R>И есть необхождимость в костылях дженерикматх.

Еще раз это шаблоны костыли без типизации и интеллисенса.

S>> Это все та же кодогенерация, но на другом уровне.


R>Хрена ты... Термин выдумал и давай спорить... Это, оказывается, другой уровень ты еще инлайниг генерацией исходников назови, просто на другом, блин, уровне.

Угу твой макрос как раскрывается? Его как раз проще перевести в код с нужным типом и скомпилировать. При этом еще и отладить в нужных местах.
А раскрывать отдельно шаблон в тот машинный код дороже и без особого выхлопа.
Кстати как там отладка ваших шаблонов?
и солнце б утром не вставало, когда бы не было меня
Re[22]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.09.23 11:02
Оценка:
Здравствуйте, rudzuk, Вы писали:

S>> Угу твой макрос как раскрывается?


R>Не через генерацию исходников, уж точно.

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

S>> Его как раз проще перевести в код с нужным типом и скомпилировать. При этом еще и отладить в нужных местах.

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

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

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

S>> Кстати как там отладка ваших шаблонов?


R>Отладка как отладка

Ну ну. Нахваливай свои костыли.
Еще раз в C# дженериках есть статическая типизация с со всеми плюшками. И так же быть твоим шаблоном при компиляции в AOT с инлайнингом.
И все это как ты говоришь скомпилировано в промежуточный Il
и солнце б утром не вставало, когда бы не было меня
Отредактировано 21.09.2023 11:03 Serginio1 . Предыдущая версия . Еще …
Отредактировано 21.09.2023 11:03 Serginio1 . Предыдущая версия .
Re[23]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 21.09.23 12:56
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Не через генерацию исходников, уж точно.


S> Ну то есть реально не знаешь?


Я тебе доку процитировал, чуть не дословно:

Creating and using generics is a 2-phase process.

The definition of the generic is defined as a new type: this is a code template, a macro which can be replayed by the compiler at a later stage.
A generic type is specialized: this defines a second type, which is a specific implementation of the generic type: the compiler replays the macro which was stored when the generic type was defined.


Видишь где нибудь слова о генерации исходника?

S> Как раз проблема шаблонов С++ это перегрузка операторов, что бы привести к единой кодогенерации.

S> В дженериках через ограничения. Интерфейсы, базовые классы.

Ты мне сейчас парсер сломал. Я нихуя не понял Дженерики во Free Pascal прекрасно работают с перегрузкой операторов

S> Ну а как ты обойдешься без валидации, какой перегруженный метод вызывать итд?

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

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

S> R>Отладка как отладка


S> Ну ну. Нахваливай свои костыли.


Завидуйте молча

S> Еще раз в C# дженериках есть статическая типизация с со всеми плюшками. И так же быть твоим шаблоном при компиляции в AOT с инлайнингом.

S> И все это как ты говоришь скомпилировано в промежуточный Il

Еще раз: шарповые дженерики это кастрированные шаблоны, которые без костылей генерикматх попросту не юзабельны. Не пойму только одного, ну чего спорить с очевидными вещами то? Могу подсластить пилюлю, сказав, что в Delphi дженерики тоже кастрированные, и там еще и генерикматха нет
avalon/3.0.2
Re[25]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 22.09.23 17:26
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ага без типизации и интеллисенса это не кастрированные?


Что значит без типизации, але? Типизация работает в момент специализации, это компайлтайм. Любое несоответствие будет выявлено в момент компиляции. Интеллисенс это вообще не характеристика языка. У паскалевских дженериков можно указать ограничения на специализацию (например TObj<T : IMyIntf1, IMyIntf2>) и т.о. у среды разработки появляется информация для доводчика кода. То, что доводчик не работает это просто недоделка среды разработки, это не проблема языка.

S> Дженерики как раз и есть следующий этап! Для примера тот же TS набирает популярность именно из-за аннотации типов!


Ты все смешал в кучу, как всегда.
avalon/3.0.2
Re[26]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.09.23 20:32
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


S>> Ага без типизации и интеллисенса это не кастрированные?


R>Что значит без типизации, але? Типизация работает в момент специализации, это компайлтайм. Любое несоответствие будет выявлено в момент компиляции. Интеллисенс это вообще не характеристика языка. У паскалевских дженериков можно указать ограничения на специализацию (например TObj<T : IMyIntf1, IMyIntf2>) и т.о. у среды разработки появляется информация для доводчика кода. То, что доводчик не работает это просто недоделка среды разработки, это не проблема языка.

Это проблема языка, так как среда разработки не справляется. Среда разработки и язык это одно целое. Именно популярность Delphi и была в этом.
Ну и раз можно указать ограничения, то чем они отличаются от дженериков?
S>> Дженерики как раз и есть следующий этап! Для примера тот же TS набирает популярность именно из-за аннотации типов!

R>Ты все смешал в кучу, как всегда.

Это все про одно и тоже. Дженерики это прежде всего типизация и интеллисенс!
А разворачиваться они могут по разному при Jit и AOT
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.09.2023 20:36 Serginio1 . Предыдущая версия .
Re[27]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 22.09.23 21:06
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Это проблема языка, так как среда разработки не справляется.


Чо, вечер пятницы в разгаре?

S> Ну и раз можно указать ограничения, то чем они отличаются от дженериков?


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

S> Дженерики это прежде всего типизация и интеллисенс!


Дженерики это прежде всего типобезопасность. А ителисенс, еще раз, не характеристика языка.
avalon/3.0.2
Re[30]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 08:24
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> Ну в итоге то с ограничениями чем от дженериков отличается?


R>Ограниченный дженерик ничем отличаться не будет, кроме того, что инстанциация его происходит в компайлтайм.

Для AOT тоже в компайлтайм.
S>> R>Дженерики это прежде всего типобезопасность. А ителисенс, еще раз, не характеристика языка.

S>> Это характеристика языка! Так как можно выводить тип итд.


R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.

Ну и нахрен такой язык нужен если нет нормального среды разработки.
Еще раз напомню про Delphi. Это не только язык, но и среда разработки.
S>> С++ ники очень любили блокнот. Хотя он типизированный. Но макросы и шаблоны этому сильно препятствовали.
и солнце б утром не вставало, когда бы не было меня
Re: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:10
Оценка:
Здравствуйте, Разраб, Вы писали:

Р>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 смотрят на это все с ухмылкой)!
Современные тренды именно такие. Компиляторы за 20 лет сильно подросли.

Р>Зашибись конечно.

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

Р>Все таки получается попытка превратить ограниченный яп(часть) в Common Lisp(целое) не лучшая идея.

Вообще непонятно что ты хочешь сказать

Р>В итоге получаем с одной стороны:

Р>oberon который имеет минимум языковых конструкции но полностью отражает возможности железа.
Р>с другой:
Р>Common Lisp позволяющий делать все что придет в голову программисту.
Как это связано с AOT в .NET ?

Р>Все остальное вариации на этой шкале.

Интересное упрощение, но нет

Р>тот же null как false в js это же из лиспа пошло.

А не из C?
Re[2]: Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 23.09.23 10:15
Оценка:
Здравствуйте, gandjustas, Вы писали:

Р>>Зашибись конечно.

Р>>Те использование аот это бег по минному полю. понимаю...
G>Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти
предупреждения это же не точно, такое себе как обойти. точно разве нельзя вычислить по АСТ?


Р>>тот же null как false в js это же из лиспа пошло.

G>А не из C?
на конфе слышал про цитату что js это лисп для браузера. отсюда и вывод.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[32]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 10:18
Оценка:
Здравствуйте, rudzuk, Вы писали:


S>> R>Нет. Это не харктеристика языка. Вывод типа — характеристика, интелисенс — нет.


S>> Ну и нахрен такой язык нужен если нет нормального среды разработки.


R>Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.

Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.
S>> Еще раз напомню про Delphi. Это не только язык, но и среда разработки.

R>Так в Delphi он тоже не работает для дженериков


Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.
Ну во С++ ники очень и любили блокнот и консоль, ибо это лучшая среда разработки!
Твой путь видно такой! Удачи!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.09.2023 10:28 Serginio1 . Предыдущая версия .
Re[2]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:34
Оценка:
Здравствуйте, vsb, Вы писали:

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

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

Цель AOT в том числе — уменьшение размера загружаемого в память образа. А эта "куча констант" и есть львиная доля объема сборок, которые поставляются вместе даже с минимальным приложением на .net.
Re[4]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:36
Оценка:
Здравствуйте, vsb, Вы писали:

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

vsb>Не очень понял. Чтобы не обрезалось — надо обрезальщик делать умней. Если кода в сборке нет, то и рефлексия не нужна.
Вообще не факт. Например сборка data-классов, которые сериализуются в json и хранятся в базе. Кода нет, а метаданные есть и очень нужны.
Re[6]: Сложности выбора или часть не может быть лучше целого
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 23.09.23 10:39
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


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


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

Там же IDispatch рефлексия, в .NET начиная с Core рефлексия используется для рантайм кодогенерации. Вот её хотят в компайлтайм перевести для AOT.
Re[7]: Сложности выбора или часть не может быть лучше целого
От: rudzuk  
Дата: 23.09.23 12:39
Оценка:
Здравствуйте, gandjustas, Вы писали:

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


g> Там же IDispatch рефлексия


Нет. IDispatch отдельно, рефлексия отдельно:
program Project1;
uses
  System.Rtti, System.Classes;
begin
  var t := TRttiContext.Create.GetType(TFileStream);

  WriteLn('Fields:');
  for var f in t.GetFields do
    WriteLn('  ', f.ToString);

  WriteLn('Methods:');
  for var m in t.GetMethods do
    WriteLn('  ', m.ToString);
end.


Результат:
Fields:
  FFileName: string @ 08
  FHandle: NativeUInt @ 04
Methods:
  constructor Create(const AFileName: string; Mode: Word)
  constructor Create(const AFileName: string; Mode: Word; Rights: Cardinal)
  destructor Destroy
  constructor Create(AHandle: NativeUInt)
  function Read(var Buffer; Count: Integer): Integer
  function Write(const Buffer; Count: Integer): Integer
  function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64
  function Read(var Buffer; Count: Integer): Integer
  function Write(const Buffer; Count: Integer): Integer
  function Read(Buffer: TArray<System.Byte>; Offset: Integer; Count: Integer): Integer
  function Write(const Buffer: TArray<System.Byte>; Offset: Integer; Count: Integer): Integer
  function Read(var Buffer: TArray<System.Byte>; Count: Integer): Integer
  function Write(const Buffer: TArray<System.Byte>; Count: Integer): Integer
  function Read64(Buffer: TArray<System.Byte>; Offset: Int64; Count: Int64): Int64
  function Write64(const Buffer: TArray<System.Byte>; Offset: Int64; Count: Int64): Int64
  function ReadData(Buffer: Pointer; Count: NativeInt): NativeInt
  function ReadData(const Buffer: TArray<System.Byte>; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Boolean): NativeInt
  function ReadData(var Buffer: Boolean; Count: NativeInt): NativeInt
  function ReadData(var Buffer: AnsiChar): NativeInt
  function ReadData(var Buffer: AnsiChar; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Char): NativeInt
  function ReadData(var Buffer: Char; Count: NativeInt): NativeInt
  function ReadData(var Buffer: ShortInt): NativeInt
  function ReadData(var Buffer: ShortInt; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Byte): NativeInt
  function ReadData(var Buffer: Byte; Count: NativeInt): NativeInt
  function ReadData(var Buffer: SmallInt): NativeInt
  function ReadData(var Buffer: SmallInt; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Word): NativeInt
  function ReadData(var Buffer: Word; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Integer): NativeInt
  function ReadData(var Buffer: Integer; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Cardinal): NativeInt
  function ReadData(var Buffer: Cardinal; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Int64): NativeInt
  function ReadData(var Buffer: Int64; Count: NativeInt): NativeInt
  function ReadData(var Buffer: UInt64): NativeInt
  function ReadData(var Buffer: UInt64; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Single): NativeInt
  function ReadData(var Buffer: Single; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Double): NativeInt
  function ReadData(var Buffer: Double; Count: NativeInt): NativeInt
  function ReadData(var Buffer: Extended): NativeInt
  function ReadData(var Buffer: Extended; Count: NativeInt): NativeInt
  function ReadData(var Buffer: TExtended80Rec): NativeInt
  function ReadData(var Buffer: TExtended80Rec; Count: NativeInt): NativeInt
  function WriteData(const Buffer: TArray<System.Byte>; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Pointer; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Boolean): NativeInt
  function WriteData(const Buffer: Boolean; Count: NativeInt): NativeInt
  function WriteData(const Buffer: AnsiChar): NativeInt
  function WriteData(const Buffer: AnsiChar; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Char): NativeInt
  function WriteData(const Buffer: Char; Count: NativeInt): NativeInt
  function WriteData(const Buffer: ShortInt): NativeInt
  function WriteData(const Buffer: ShortInt; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Byte): NativeInt
  function WriteData(const Buffer: Byte; Count: NativeInt): NativeInt
  function WriteData(const Buffer: SmallInt): NativeInt
  function WriteData(const Buffer: SmallInt; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Word): NativeInt
  function WriteData(const Buffer: Word; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Integer): NativeInt
  function WriteData(const Buffer: Integer; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Cardinal): NativeInt
  function WriteData(const Buffer: Cardinal; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Int64): NativeInt
  function WriteData(const Buffer: Int64; Count: NativeInt): NativeInt
  function WriteData(const Buffer: UInt64): NativeInt
  function WriteData(const Buffer: UInt64; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Single): NativeInt
  function WriteData(const Buffer: Single; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Double): NativeInt
  function WriteData(const Buffer: Double; Count: NativeInt): NativeInt
  function WriteData(const Buffer: Extended): NativeInt
  function WriteData(const Buffer: Extended; Count: NativeInt): NativeInt
  function WriteData(const Buffer: TExtended80Rec): NativeInt
  function WriteData(const Buffer: TExtended80Rec; Count: NativeInt): NativeInt
  function Seek32(const Offset: Integer; Origin: TSeekOrigin): Int64
  function Seek(Offset: Integer; Origin: Word): Integer
  function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64
  function Seek(const Offset: Int64; Origin: Word): Int64
  procedure ReadBuffer(var Buffer; Count: NativeInt)
  procedure ReadBuffer(var Buffer: TArray<System.Byte>; Count: NativeInt)
  procedure ReadBuffer(var Buffer: TArray<System.Byte>; Offset: NativeInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Boolean)
  procedure ReadBufferData(var Buffer: Boolean; Count: NativeInt)
  procedure ReadBufferData(var Buffer: AnsiChar)
  procedure ReadBufferData(var Buffer: AnsiChar; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Char)
  procedure ReadBufferData(var Buffer: Char; Count: NativeInt)
  procedure ReadBufferData(var Buffer: ShortInt)
  procedure ReadBufferData(var Buffer: ShortInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Byte)
  procedure ReadBufferData(var Buffer: Byte; Count: NativeInt)
  procedure ReadBufferData(var Buffer: SmallInt)
  procedure ReadBufferData(var Buffer: SmallInt; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Word)
  procedure ReadBufferData(var Buffer: Word; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Integer)
  procedure ReadBufferData(var Buffer: Integer; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Cardinal)
  procedure ReadBufferData(var Buffer: Cardinal; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Int64)
  procedure ReadBufferData(var Buffer: Int64; Count: NativeInt)
  procedure ReadBufferData(var Buffer: UInt64)
  procedure ReadBufferData(var Buffer: UInt64; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Single)
  procedure ReadBufferData(var Buffer: Single; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Double)
  procedure ReadBufferData(var Buffer: Double; Count: NativeInt)
  procedure ReadBufferData(var Buffer: Extended)
  procedure ReadBufferData(var Buffer: Extended; Count: NativeInt)
  procedure ReadBufferData(var Buffer: TExtended80Rec)
  procedure ReadBufferData(var Buffer: TExtended80Rec; Count: NativeInt)
  procedure WriteBuffer(const Buffer; Count: NativeInt)
  procedure WriteBuffer(const Buffer: TArray<System.Byte>; Count: NativeInt)
  procedure WriteBuffer(const Buffer: TArray<System.Byte>; Offset: NativeInt; Count: NativeInt)
  procedure WriteBufferData(var Buffer: Integer; Count: NativeInt)
  function CopyFrom(const Source: TStream; Count: Int64; BufferSize: Integer): Int64
  function ReadComponent(const Instance: TComponent): TComponent
  function ReadComponentRes(const Instance: TComponent): TComponent
  procedure WriteComponent(const Instance: TComponent)
  procedure WriteComponentRes(const ResName: string; const Instance: TComponent)
  procedure WriteDescendent(const Instance: TComponent; const Ancestor: TComponent)
  procedure WriteDescendentRes(const ResName: string; const Instance: TComponent; const Ancestor: TComponent)
  procedure WriteResourceHeader(const ResName: string; out FixupInfo: Integer)
  procedure FixupResourceHeader(FixupInfo: Integer)
  procedure ReadResHeader
  constructor Create
  procedure Free
  procedure DisposeOf
  class function InitInstance(Instance: Pointer): TObject
  procedure CleanupInstance
  function ClassType: TClass
  class function ClassName: string
  class function ClassNameIs(const Name: string): Boolean
  class function ClassParent: TClass
  class function ClassInfo: Pointer
  class function InstanceSize: Integer
  class function InheritsFrom(AClass: TClass): Boolean
  class function MethodAddress(const Name: ShortString): Pointer
  class function MethodAddress(const Name: string): Pointer
  class function MethodName(Address: Pointer): string
  class function QualifiedClassName: string
  function FieldAddress(const Name: ShortString): Pointer
  function FieldAddress(const Name: string): Pointer
  function GetInterface(const IID: TGUID; out Obj): Boolean
  class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry
  class function GetInterfaceTable: PInterfaceTable
  class function UnitName: string
  class function UnitScope: string
  function Equals(Obj: TObject): Boolean
  function GetHashCode: Integer
  function ToString: string
  function SafeCallException(ExceptObject: TObject; ExceptAddr: Pointer): HRESULT
  procedure AfterConstruction
  procedure BeforeDestruction
  procedure Dispatch(var Message)
  procedure DefaultHandler(var Message)
  class function NewInstance: TObject
  procedure FreeInstance
  destructor Destroy
avalon/3.0.2
Re[33]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 12:39
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.


Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?

S> R>Так в Delphi он тоже не работает для дженериков


S> Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.


У Free Pascal все это тоже есть, прикинь.
avalon/3.0.2
Re[34]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 14:29
Оценка:
Здравствуйте, rudzuk, Вы писали:



S>> Ну вот сам же говоришь, что в Паскале есть тоже ограничения. Чем они отличаются от дженериков. Сам же себе и противоречишь.


R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?

То есть если наложили ограничения значит это костыль? При этом ты имеешь все плюсы типизации. Напомню про TS. Там все компилируется в JS но с аннотацией типов, проверкой синтаксиса и интеллисенсом. Именно по этому его популярность и растет.

Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.
S>> R>Так в Delphi он тоже не работает для дженериков

S>> Про Delphi не про дженерики, а среду разработки. Там и интеллисенс, и редакторы форм, и быстрый компилятор, отладчик итд. Все, что нужно для быстрой разработки.


R>У Free Pascal все это тоже есть, прикинь.

Прикинь ты говорил, что не нужна среда разработки

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


То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!
А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!
При этом если среда разработки не понимает ограничения, то это не проблема языка?
А программировать значит в блокноте. Самая лучшая среда, для всех языков!
Мне тебя трудно понять
и солнце б утром не вставало, когда бы не было меня
Re[35]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 16:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?


S> То есть если наложили ограничения значит это костыль?


Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.

S> Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.


Типизация никуда не исчезает, не говори глупости. Просто контроль типов переходит в фазу специализации. Мне все по три раза тебе повторять?

S> Прикинь ты говорил, что не нужна среда разработки


Где это я такое сказал? Посыл тех слов, что ты отквотил совершенно другой, перечитайка.

S> То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!


Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.

S> А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!


С чего бы не проверяться синтаксису? Опять выдумываешь чего-то... Еще раз посмотри в код приведенного мной дженерика и скажи в каком его месте тебе потребовался бы интелисенс?

S> При этом если среда разработки не понимает ограничения, то это не проблема языка?


Именно так.

S> А программировать значит в блокноте. Самая лучшая среда, для всех языков!


Ты уже три раза упомянул блокнот. С чего вдруг? Фетишь такой, или что? Или любая недоработка IDE сразу превращает ее в блокнот?

S> Мне тебя трудно понять


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



S>> R>Ну ты, пипец, трудный... В паскале ограничения на параметры специализации наложить можно, а можно и не накладывать. Я же тебе исходник
Автор: rudzuk
Дата: 14.03.23
показывал... Ты видел там ограничения на параметры специализации?


S>> То есть если наложили ограничения значит это костыль?


R>Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.

Почему не могу? А на шаблонах можно? Еще раз расскажи чем шаблон без ограничений лучше с ограничениями!
Почему с ограничениями это костыль. Ты так и не объяснил!
S>> Но по твоему если нет ограничений, то это не костыль! Вез всех плюшек типизации.

R>Типизация никуда не исчезает, не говори глупости. Просто контроль типов переходит в фазу специализации. Мне все по три раза тебе повторять?

Угу. То есть на этапе кодирования я работаю без интеллисенса и синтаксической проверки.
Как с динамической типизацией.

Я об этом тебе уже 100 сообщений говорю. Но ты так и стоишь на своем.

S>> Прикинь ты говорил, что не нужна среда разработки


R> Где это я такое сказал? Посыл тех слов, что ты отквотил совершенно другой, перечитайка.


S>> То есть в Паскале сделали ограничения, и такие шаблоны для тебя уже костыль!


R>Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.

Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math
static T Add<T>(T left, T right)
    where T : INumber<T>
{
    return left + right;
}


S>> А вот без ограничения, но без интеллисенса и проверки синтаксиса это самое то!


R>С чего бы не проверяться синтаксису? Опять выдумываешь чего-то... Еще раз посмотри в код приведенного мной дженерика и скажи в каком его месте тебе потребовался бы интелисенс?

В твоем примере только Inc. Но на самом то деле тип может поддерживать кучу методов и свойств.

S>> При этом если среда разработки не понимает ограничения, то это не проблема языка?


R>Именно так.


S>> А программировать значит в блокноте. Самая лучшая среда, для всех языков!


R>Ты уже три раза упомянул блокнот. С чего вдруг? Фетишь такой, или что? Или любая недоработка IDE сразу превращает ее в блокнот?

Ну раз среда не поддерживает язык, то блокнот для тебя самая лучшая среда.
Обычно под язык и среда разработки совершенствуется и наоборот как с SG.

S>> Мне тебя трудно понять


R>А ты попробуй читать внимательно и все у тебя получится.

Ну так ты пишешь и сам же себя опровергаешь!

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

В .Net Native Il код переводился в C++. А как известно в C++ нет дженериков (во всяком случае на тот момент)
То есть для AOT это все те же шаблоны с ограничениями.
и солнце б утром не вставало, когда бы не было меня
Re[37]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 18:48
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Костыль, это когда ты без генерикматха не можешь элементарные операции выполнить.


S> Почему не могу?


По факту.

S> А на шаблонах можно?


Конечно можно.

S> Еще раз расскажи чем шаблон без ограничений лучше с ограничениями!

S> Почему с ограничениями это костыль. Ты так и не объяснил!

Потому что в шаблоне мы просто пишем: "left + right" и это работает вообще для любых типов: числовых, строковых, динамических массивов, вообще любых типов для которых применима операция сложения.

S> Угу. То есть на этапе кодирования я работаю без интеллисенса и синтаксической проверки.

S> Как с динамической типизацией.

Нет. С динамической типизацией ты ловишь все проблемы в рантайме, а тут все вопросы будут разрешены в компайлтайм, и ждать компиляции три часа не придется.

S> R>Генерикматх костыль, без которого ты два числа сложить не можещь, вот что костыль.


S> Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math


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

S>
S> static T Add<T>(T left, T right)
S>     where T : INumber<T>
S> {
S>     return left + right;
S> }
S>


Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.

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


Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.
avalon/3.0.2
Re[38]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.09.23 19:33
Оценка:
Здравствуйте, rudzuk, Вы писали:



S>> Почему это не могу. Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math


R>Я тебе говорю, что ты не можешь это сделать без генерикматх, а ты приводишь пример, как ты это делаешь с генерикматх. Выдыхай бобер!


S>>
S>> static T Add<T>(T left, T right)
S>>     where T : INumber<T>
S>> {
S>>     return left + right;
S>> }
S>>


R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.

А вот нахрена? Но ты можешь на перегрузке операторов сделать интерфейс.
Кстати в начальных вариациях предлагалось для перегрузки операторов сделать свою реализацию
https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3?view=net-7.0
Используй интерфейс, или делегат. Для не чисел, там выхлоп от инлайнинга небольшой.
Только я вот как то плохо представляю как скрестить строки и Rec.
В большинстве дженерики нужны для коллекций или чисел.

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


R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.

Ну тогда и не говори, что IDE не нужна. А язык без IDE это блокнот.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.09.2023 19:43 Serginio1 . Предыдущая версия .
Re[39]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 23.09.23 20:22
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> S>>
S> S>> static T Add<T>(T left, T right)
S> S>>     where T : INumber<T>
S> S>> {
S> S>>     return left + right;
S> S>> }
S> S>>


S> R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.


S> А вот нахрена?


Ну чего тебе сложно что-ли? Или нужных костылей не подвезли?

S> Только я вот как то плохо представляю как скрестить строки и Rec.

S> В большинстве дженерики нужны для коллекций или чисел.



S> R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.


S> Ну тогда и не говори, что IDE не нужна.


Я этого никогда не говорил, не приписывай мне свои фантазии.

S> А язык без IDE это блокнот.


Выдыхай, выдыхай!
avalon/3.0.2
Re[40]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.23 07:55
Оценка:
Здравствуйте, rudzuk, Вы писали:

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


S>> S>>
S>> S>> static T Add<T>(T left, T right)
S>> S>>     where T : INumber<T>
S>> S>> {
S>> S>>     return left + right;
S>> S>> }
S>> S>>


S>> R>Теперь сделай так, чтобы этот код складывал еще строки и какой-нибудь кастом тип, назовем его Rec.


S>> А вот нахрена?


R>Ну чего тебе сложно что-ли? Или нужных костылей не подвезли?

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

S>> Только я вот как то плохо представляю как скрестить строки и Rec.

S>> В большинстве дженерики нужны для коллекций или чисел.

R>

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

Ты вот приведи пример шаблона где могут складываться и строки и Rect
S>> R>Среда, всего лишь, не понимает (пока) ограничений на специализацию дженерика. Это не делает ее блокнотом, как бы тебе того ни хотелось.

S>> Ну тогда и не говори, что IDE не нужна.


R>Я этого никогда не говорил, не приписывай мне свои фантазии.


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

и солнце б утром не вставало, когда бы не было меня
Re[41]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 24.09.23 08:31
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

S> Вот это и есть костыль.
S> Для примера возьмем ту же самую сортировку и <>=/
S> Те же строки по разному сравниваются, а у класса можно сортировать по разным свойствам итд.

Давай без бла-бла. Код покажи, на божественных дженериках.

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


Да знаю я чего ты имел ввиду: если шарп не могет, то это и не нужно Все же просто До генерикматха и вычислительные операции в дженериках не нужны были, правда же?

S> Ты вот приведи пример шаблона где могут складываться и строки и Rect


Я его тебе уже показал: left + right, если ты не понял.

S> S>> Ну тогда и не говори, что IDE не нужна.


S> R>Я этого никогда не говорил, не приписывай мне свои фантазии.


S> Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? [А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.


И где ты видишь слова о том, что IDE не нужна? Тут сказано, что язык не нужен, если его без IDE читать невозможно
avalon/3.0.2
Re[42]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.23 09:33
Оценка:
Здравствуйте, rudzuk, Вы писали:


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

S>> Вот это и есть костыль.
S>> Для примера возьмем ту же самую сортировку и <>=/
S>> Те же строки по разному сравниваются, а у класса можно сортировать по разным свойствам итд.

R>Давай без бла-бла. Код покажи, на божественных дженериках.

https://learn.microsoft.com/ru-ru/dotnet/api/system.collections.generic.list-1.sort?view=netcore-3.1

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


R>Да знаю я чего ты имел ввиду: если шарп не могет, то это и не нужно Все же просто До генерикматха и вычислительные операции в дженериках не нужны были, правда же?


S>> Ты вот приведи пример шаблона где могут складываться и строки и Rect


R>Я его тебе уже показал: left + right, если ты не понял.

А я тебе показал
Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math
static T Add<T>(T left, T right)
    where T : INumber<T>
{
    return left + right;
}




Реализуй для своего класса IAdditionOperators
https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3?view=net-7.0
И используй если тебе этого хочется.

Но ты покажи реальный шаблон который не просто складывает, а что то делает полезное складывая для строк и Rect.

И ты как то отмел использование перегрузки операций для различных типов сравнения и сложения.
В итоге придешь к дженериковским интерфейсам или методам.
То есть использование перегрузки операторов нужна для чисел. Во всех остальных случаях ты так же будешь использовать то же что и в дженериках.
Поэтому в C# не пошли твоим путем. Хотя такие предложения были http://rsdn.org/forum/dotnet/7749568.flat
Автор: varenikAA
Дата: 08.06.20

interface IMonoid<T>
{
static T Zero{get;}
static T operator+(T t1, T t2)
static T operator*(T t1, T t2)
}


И можно было бы переопределять методы для типа
role IntMonoid extednds int
{
public static int Zero = 0;
}

То есть Zero переопределялся, а operator берутся из класса.

Но отказались.
S>> S>> Ну тогда и не говори, что IDE не нужна.

S>> R>Я этого никогда не говорил, не приписывай мне свои фантазии.


S>> Какая-то странная логика... Завтра выйдет среда с починенным интелисенсом и язык сразу станет нужен? [А по мне так, нахрен не нужен язык, где нормальную шаблонизацию заменили огороженными симулякрами и окостылили со всех сторон. Где для того, чтобы разобраться в коде, нужно запустить монстроидную IDE, без которой хер ты его нормально почитаешь.


R>И где ты видишь слова о том, что IDE не нужна? Тут сказано, что язык не нужен, если его без IDE читать невозможно


Мне не нужен язык с монструозной IDE.
Не монструозная IDE это блокнот.
При этом это был ответ на
S> Ну и нахрен такой язык нужен если нет нормального среды разработки.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 24.09.2023 10:06 Serginio1 . Предыдущая версия .
Re[43]: Сложности выбора или часть не может быть лучше целог
От: rudzuk  
Дата: 24.09.23 10:03
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> R>Давай без бла-бла. Код покажи, на божественных дженериках.


S> https://learn.microsoft.com/ru-ru/dotnet/api/system.collections.generic.list-1.sort?view=netcore-3.1


Дядя Сережа, ты мне не ссылки кидай, а код покажи, который решит означенную задачу.

S> R>Я его тебе уже показал: left + right, если ты не понял.


S> А я тебе показал

S> Я тебе уже ссылки приводил https://learn.microsoft.com/en-us/dotnet/standard/generics/math
S>
S> static T Add<T>(T left, T right)
S>     where T : INumber<T>
S> {
S>     return left + right;
S> }
S>


S> Реализуй для своего класса IAdditionOperators

S> https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3?view=net-7.0
S> И используй если тебе этого хочется.

Не-не. Ты. Сюда. Выложи. Готовой. Компилирующися. Код.

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

S> R>И где ты видишь слова о том, что IDE не нужна? Тут сказано, что язык не нужен, если его без IDE читать невозможно


S> Мне не нужен язык с монструозной IDE.


Шарп тебе не нужен? Студия-то, пиздец, монстр из монстров

S> Не монструозная IDE это блокнот.


То есть, для тебя существуют только две крайности: блокнот и монструозная иде. Как ты сам сказал, монструозная иде тебе не нужна. Выходит, тебе нужен... Блокнот! То-то я смотрю, ты его чуть не в каждом сообщении поминаешь
avalon/3.0.2
Re[44]: Сложности выбора или часть не может быть лучше целог
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.09.23 10:14
Оценка:
Здравствуйте, rudzuk, Вы писали:
Все до свидания. Считай и дальше использование перегрузки операторов для специализации и отсутствие интеллисениса не костылем .
C# говном из-за IDE итд.
Смысла тратить время не имеет смысла. Удачи.
и солнце б утром не вставало, когда бы не было меня
Re[4]: Сложности выбора или часть не может быть лучше целого
От: Разраб  
Дата: 26.09.23 01:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Разраб, Вы писали:


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


Р>>>>Зашибись конечно.

Р>>>>Те использование аот это бег по минному полю. понимаю...
G>>>Почему же? комилятор показал тебе где грабли, чтобы ты мог обойти
Р>>предупреждения это же не точно, такое себе как обойти. точно разве нельзя вычислить по АСТ?
G>сделай treat warnings as error в этой категории

Ну так в том то и дело, что это могут быть ошибки а могут и нет.
Вот попробовал F# AOT. В консоли использовал FSharp.Json, куча предупреждений — работает!
Потом взял Fabuluos.Avalania и FSharp.Data (Xml data provider), еще больше предупреждений — работает!(отдельно замечу старт гуйного приложения радует своей скоростью).
Избавиться от всех предупреждений это просто написать фрэймворк с нуля.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.