Comments 14
Не очень понятен момент про Swift. Чем witness-таблица отличается от тайп-классов? Witness-таблица это как vtable, но указатель на неё не хранится в объекте, а передаётся?
Если так, то что делать с типами более высокого порядка, например:
zip(a: Pair<List<T>, List<U>>) -> List<Pair<U, V>>
Создавать witness-таблицы на лету?
Реализация дженериков от C# зря попала в ветку "упаковки" — это не соответствует действительности.
Проблема в том, что каждая функция и определение типа будет работать только с данными одного размера и скопированными одним способом, и, в целом, работающими похоже.Обойти это можно двумя способами: либо сделать так, чтобы все типы данных действовали в нашей структуре одинаково, либо сделать много копий структуры данных с небольшими изменениями для корректной работы с каждым типом данных.
есть третий способ — это векторные инструкции, если заморачиваемся с производительностью. Если нет, то можно динамический тип. Вообще это такой галоп по сабжу что согласен, надо по разработке компиляторов нормально почитать
Как же здорово в D реализовано метапрограммирование, жаль что язык не обрел популярность
Тоже подметил это. Удивительно, что распространение не получает, учитывая, что его развивает Александреску, это тем более выглядит странновато.
Я для микроконтроллеров посмотрел реализацию безопастной работы с регистра, как там все прозрачно и понятно.
По-моему, разнообразие метапрограммирования в C# не полностью отражено на иллюстрации в начале статьи.
ArrayList
— недженериковая коллекция, в которую можно боксить что угодно, потом приводитьList<FooClass>
— дженериковая коллекция, машинный код один для всех классовList<dynamic>
— дженериковая коллекция, тот же IL, тот же машинный код, но каждое обращение к объекту "динамическое" (с утиной типизацией), внутри кэшированные отраженияList<BarStruct>
— дженериковая коллекция, тот же IL, но машинный код под каждую структуру отдельный, боксинга нет- Шаблоны на T4 — не совсем встроено в язык, но идёт в комплекте, скажем так
Есть ещё варианты, но это так, из коробки.
Модели дженериков и метапрограммирования: Go, Rust, Swift, D и другие