Size: a a a

Compiler Development

2020 January 28

OM

Oleg Morozov in Compiler Development
да, это естественно
но это уже детали реализации

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

EM

Evgenii Moiseenko in Compiler Development
Oleg Morozov
а кто-нибудь встречал статические типизируемые АОТ компилируемые языки со структурной эквивалентностью типов?

как пример
struct Foo {
   public int a;
   public int b;
}

struct Bar {
   public int a;
   public int b;
   public int c;
}

void DoSomething(Foo f) { ... }


вот в DoSomething можно передать как и Foo так и Bar без использования обобщений или чего-то подобного
то есть по-русски функция принимает любой тип содержащий определенный набор полей
подойдут любые типы содержащие такие же поля
это ещё называется row polymorphism.
В OCaml так типизируются модули и объекты
источник

OM

Oleg Morozov in Compiler Development
Evgenii Moiseenko
это ещё называется row polymorphism.
В OCaml так типизируются модули и объекты
посмотрю, спасибо
источник

AT

Alexander Tchitchigin in Compiler Development
Oleg Morozov
а кто-нибудь встречал статические типизируемые АОТ компилируемые языки со структурной эквивалентностью типов?

как пример
struct Foo {
   public int a;
   public int b;
}

struct Bar {
   public int a;
   public int b;
   public int c;
}

void DoSomething(Foo f) { ... }


вот в DoSomething можно передать как и Foo так и Bar без использования обобщений или чего-то подобного
то есть по-русски функция принимает любой тип содержащий определенный набор полей
подойдут любые типы содержащие такие же поля
OCaml? Не считая экзотики типа Ur/Web и Opa...
источник

AT

Alexander Tchitchigin in Compiler Development
Evgenii Moiseenko
это ещё называется row polymorphism.
В OCaml так типизируются модули и объекты
По-моему, это называется structural subtyping. 😉
источник

OM

Oleg Morozov in Compiler Development
не, row polymorphism хорошо гуглится и не является сабтайпингом
источник

AT

Alexander Tchitchigin in Compiler Development
Oleg Morozov
да, это естественно
но это уже детали реализации

тут можно идти двумя путями, либо при вызове кастовать типы c копированием
либо компилировать функции под каждый новый тип с другими оффсетами, но это сломает весь ABI, будет килотонна таких функций
Кажется, в Swift есть что-то подобное с ABI.
источник

OM

Oleg Morozov in Compiler Development
мы нигде не указываем взаимосвязи типов
это больше полиморфизм
источник

BD

Berkus Decker in Compiler Development
FORTRAN ONE LOVE
а являются ли структурноэквивалентными следующие структуры?
struct Foo {
   public int a;
   public int b;
}

struct Bar {
   public int b;
   public int a;
   public int c;
}
да, одна полный сабсет другой, поэтому вместо Foo можно передавать Bar, вместо Bar нельзя передавать Foo
источник

YS

Yuriy Syrovetskiy in Compiler Development
такая структурная эквивалентность де факто есть в С и часто используется, но, кажется, стандартом не гарантируется, а значит, компилятор может в любой момент что-то сломать
источник

EM

Evgenii Moiseenko in Compiler Development
Alexander Tchitchigin
По-моему, это называется structural subtyping. 😉
там действительно есть разница между ними,
вот тут вроде неплохо она описана
https://cs.stackexchange.com/questions/53998/what-are-the-major-differences-between-row-polymorphism-and-subtyping
источник

FO

FORTRAN ONE LOVE in Compiler Development
Berkus Decker
да, одна полный сабсет другой, поэтому вместо Foo можно передавать Bar, вместо Bar нельзя передавать Foo
а как быть с тем, что адресы а и б от начала структуры отличается?
источник

AT

Alexander Tchitchigin in Compiler Development
Oleg Morozov
мы нигде не указываем взаимосвязи типов
это больше полиморфизм
В системе типов для таких случаев как Вы хотите будут так или иначе subtyping rules (subtyping relation).
источник

BD

Berkus Decker in Compiler Development
FORTRAN ONE LOVE
а являются ли структурноэквивалентными следующие структуры?
struct Foo {
   public int a;
   public int b;
}

struct Bar {
   public int b;
   public int a;
   public int c;
}
а, не, порядок другой - это уже зависит от языка, как ты обращаешься к полям
источник

МБ

Михаил Бахтерев in Compiler Development
Oleg Morozov
да, это естественно
но это уже детали реализации

тут можно идти двумя путями, либо при вызове кастовать типы c копированием
либо компилировать функции под каждый новый тип с другими оффсетами, но это сломает весь ABI, будет килотонна таких функций
Обычно делают через интерфейсы и cast-ы.
источник

BD

Berkus Decker in Compiler Development
FORTRAN ONE LOVE
а как быть с тем, что адресы а и б от начала структуры отличается?
ну как, придумывать способы доступа )
источник

OM

Oleg Morozov in Compiler Development
Михаил Бахтерев
Обычно делают через интерфейсы и cast-ы.
интерфейсы во-первых отражают методы типа, а не его поля
во-вторых имеют неудобства в виде того, что на код, который написан не тобой, ты их применить не можешь
принадлежность к ним находится в декларации типа

а хотелось бы унификацию, что если кто-то когда-то объявил тип или объявит в будущем, то подходящяя функция работала и с ними
источник

SO

Sergey Ostanevich in Compiler Development
Berkus Decker
ну как, придумывать способы доступа )
MDIL isn’t a high-level language like MSIL. Instead, MDIL includes a given platform’s assembly language with some additional tokens to avoid hard-coding certain addresses and pointers.
https://devblogs.microsoft.com/dotnet/the-net-native-tool-chain/
источник

МБ

Михаил Бахтерев in Compiler Development
Oleg Morozov
интерфейсы во-первых отражают методы типа, а не его поля
во-вторых имеют неудобства в виде того, что на код, который написан не тобой, ты их применить не можешь
принадлежность к ним находится в декларации типа

а хотелось бы унификацию, что если кто-то когда-то объявил тип или объявит в будущем, то подходящяя функция работала и с ними
Посмотрите, как сделано в Go.
источник

BD

Berkus Decker in Compiler Development
Oleg Morozov
интерфейсы во-первых отражают методы типа, а не его поля
во-вторых имеют неудобства в виде того, что на код, который написан не тобой, ты их применить не можешь
принадлежность к ним находится в декларации типа

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