Pull to refresh

Comments 14

Это круто, спасибо. Хотя конечно нужно знать устройство компиляторов, чтобы понимать о чем речь в статье. Было бы идеально дополнить иллюстрациями и примерами «псевдокода» на Си (как «лингва франка») некоторых структур данных, используемых в дженериках с упаковкой. Т.е. просто нарисовать как оно устроено в памяти.

Не очень понятен момент про Swift. Чем witness-таблица отличается от тайп-классов? Witness-таблица это как vtable, но указатель на неё не хранится в объекте, а передаётся?
Если так, то что делать с типами более высокого порядка, например:


zip(a: Pair<List<T>, List<U>>) -> List<Pair<U, V>>

Создавать witness-таблицы на лету?

UFO just landed and posted this here
UFO just landed and posted this here

И ещё Data.Data тогда уж можно упомянуть. Забавно, что в одном языке есть три разных подхода для программирования дженериков :)

Реализация дженериков от C# зря попала в ветку "упаковки" — это не соответствует действительности.

C# для всех ссылочных типов использует одну реализацию.
Для типов-значений делает копию кода на каждый используемый тип.
Поэтому язык можно отнести в обе ветви.

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


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

Как же здорово в D реализовано метапрограммирование, жаль что язык не обрел популярность

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

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

Ничего удивительного при таких метаниях, в общем-то.

По-моему, разнообразие метапрограммирования в C# не полностью отражено на иллюстрации в начале статьи.


  • ArrayList — недженериковая коллекция, в которую можно боксить что угодно, потом приводить
  • List<FooClass> — дженериковая коллекция, машинный код один для всех классов
  • List<dynamic> — дженериковая коллекция, тот же IL, тот же машинный код, но каждое обращение к объекту "динамическое" (с утиной типизацией), внутри кэшированные отражения
  • List<BarStruct> — дженериковая коллекция, тот же IL, но машинный код под каждую структуру отдельный, боксинга нет
  • Шаблоны на T4 — не совсем встроено в язык, но идёт в комплекте, скажем так

Есть ещё варианты, но это так, из коробки.

Рекомендую посмотреть на дженерики в языке Julia (там это называется multiple dispatch).
Sign up to leave a comment.