Size: a a a

Compiler Development

2021 June 20

а

а это кто in Compiler Development
Например в C# можно сделать генерик метод и передать в него тип-структуру

struct A
{
   int a;
   int b;
}

struct B
{
   int a;
   double d;
}

class Main
{
   public static (T, T) Twice<T>(T value)
   {
       return (value, value);
   }

   public static void Main()
   {
       F<A>(new A());
       F<B>(new A());
   }
}


Так как у структур A и B разный размер и разный лейаут, виртуальная машина .NET должна будет мономорфизировать методы C.Twice<A> и C.Twice<B>
источник

AK

Andrei Kurosh in Compiler Development
Вы наверное имели в виду F(new B()) во второй строке в Main
источник

K

Kir in Compiler Development
У меня есть подозрение, что в C# мономорфизации не происходит вообще
источник

K

Kir in Compiler Development
Это в F# есть statically-resolved type parameters, а в до-диезе нет
источник

AK

Andrei Kurosh in Compiler Development
На уровне CIL нет, но на уровне джита происходит
источник

а

а это кто in Compiler Development
А, да
источник

а

а это кто in Compiler Development
ну и не F(new A()), а Twice(new A())
источник

h

hazer_hazer in Compiler Development
а я думал, что шарпы как и джава не делают мономорфизацию... но я не шарю, так что 🤷‍♂️
источник

а

а это кто in Compiler Development
В джаве нет структур поэтому мономорфизация методов не обязательна
источник

а

а это кто in Compiler Development
В C# есть структуры и, как я понимаю, существует всего два способа реализовать вызов генерик метода со структурой: боксинг или мономорфизация. C# (.NET) использует мономорфизацию потому что боксинг ударяет по производительности
источник

IP

Iaroslav Postovalov in Compiler Development
В джаве raw types есть, мономорфизация не возможна
источник

h

hazer_hazer in Compiler Development
я тоже подобное хочу делать.
но меня кое-что настораживает:
- Какой тип возвращаемого значения? Если это массив (raw), то мы не знаем его размер
- Если это не массив, то тогда это какая-то heap-alloc структура, vector, например, чтобы функцию можно было в рантайме вызвать
- Если эта функция не расчитана на вызов в рантайме, то тогда получается, это compile-time массив?
источник

а

а это кто in Compiler Development
Хотя боксинг тоже можно использовать, правда в таком случае это уже будет не генерик функция, а функция принимающая на вход Object:

struct A
{
   int a;
   int b;
}

struct B
{
   int a;
   double d;
}

class Main
{
   public static (Object, Object) Twice(Object value)
   {
       return (value, value);
   }

   public static void Main()
   {
       Twice(new A());
       Twice(new B());
   }
}
источник

h

hazer_hazer in Compiler Development
не. ну да. я о том, что вы с этой структурой только в ct получается можете работать? или у вас в любой массив обычный ([]) также длина заложена?
источник

а

а это кто in Compiler Development
typename... это variadic template?
источник

а

а это кто in Compiler Development
Есть технология позволяющая реализовать N-арные кортежи через 2-арные кортежи
источник

а

а это кто in Compiler Development
Её плюс в том что она не требует от языка поддержки variadic templates
источник

K

Kir in Compiler Development
> мы не знаем его размер

зачем второй раст-то делать, одного уже много
источник

h

hazer_hazer in Compiler Development
Я не понимаю что со мной происходит.

Раст очень странное влияние оказывает на мозг, после него почему-то все решения в других япах кажутся не продуманными. Я кажется схожу с ума
источник

K

Kir in Compiler Development
наверни хаскелля, должно отпустить
источник