home.social

#метапрограммирование — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #метапрограммирование, aggregated by home.social.

  1. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  2. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  3. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  4. Bad Apple через CSS: как заставить браузер страдать без единой строчки JavaScript

    Есть проекты, которые рождаются не из практической необходимости, а из глубоко нездорового вопроса: а можно ли сделать это совсем не тем инструментом? Обычно, если человек хочет показать в браузере видео, он берёт video. Если хочет покадровую анимацию — пишет немного JavaScript. Он же служит и для потоковой передачи данных. Но все эти подходы слишком нормальные, а потому и недостаточно интересные. Поэтому давайте поставим себе задачу чуть более сомнительную, чем следовало бы: воспроизвести Bad Apple в браузере без JavaScript вообще, опираясь почти целиком на CSS и немного на серверную магию. Ну и чтобы окончательно не сбивать градус абсурда, бекенд мы тоже не будем писать на чем-то скучно-прагматичном. Если заниматься таким делом, то с достоинством: C++26 и Boost.Beast. Результат посмотреть можно тут и на GitHub .

    habr.com/ru/companies/timeweb/

    #Ненормальное_программирование #JSfree #CSS #c++26 #bad_apple #метапрограммирование #timeweb_статьи

  5. Генерация типов в Runtime

    Иногда в разработке возникают задачи, требующие создания типов в рантайме. Чаще всего это необходимо при написании декларативных сервисов, высокопроизводительных мапперов или систем с динамическим проксированием. В этой статье расмотрим как создавать типы используя Reflection.Emit и реализовывать методы через Expression Trees

    habr.com/ru/articles/1033564/

    #c# #net #reflection #reflectionemit #expression_trees #метапрограммирование #кодогенерация

  6. «ECS — like» вектор на с++

    В программировании частая задача это работа с последовательными элементами. В этой, порой непростой задаче, нам часто помогают вектора. Вектора бывают самыми разными от queue и set до unordered_map и обычных массивов. Все они позволяют работать с данными по разному, где то быстрее вставка, где то быстрее доступ, но все они выполняют одну важную задачу это хранение данных. И не смотря на их всеобъемлющую вариативность, в жизни встречаются ситуации когда один вектор не может решить задачу. Точнее может, но через костыли... О чем я?

    habr.com/ru/articles/1029802/

    #C++ #SoA #ECS #attribute_vector #GPU #вершинный_буфер #теги #метапрограммирование #структуры_данных #OpenGL

  7. Type Loopholes: решая нерешаемое. Рефлексия времени компиляции

    Лупхолы — это техника, позволяющая манипулировать глобальным состоянием компилятора, добавляя значения и считывая их. Эта техника позволяет решать многие задачи, некоторые из которых будут рассмотрены в статье: Узнать, какие параметры принимает конструктор типа. Узнать, с какими шаблонными параметрами вызывался метод/функция с ADL. Как сделать метапрограммирование с типами более похожим на обычный код, где есть состояние.

    habr.com/ru/articles/824574/

    #лупхолы #метапрограммирование #рефлексия #c++ #constexpr

  8. Метапрограммирование 2.0: макросы и генерация кода в современном мире

    Забудьте про скучные «Hello, World». Макросы и шаблоны давно стали полноценными инструментами архитектора кода: от хитрых C++-шаблонов до процедурных макросов Rust и Java-аннотаций, автоматически генерирующих целые фреймворки. В этой статье мы рассмотрим примеры, где metaprogramming избавляет от рутины и экономит часы работы над проектом. Детали как всегда под катом.

    habr.com/ru/companies/ruvds/ar

    #ruvds_статьи #метапрограммирование #генерация_кода #макросы #code_generation #Rust #Java #C++ #metaprogramming #шаблонный_код

  9. Пишем свой вариантный тип

    C++ 17 привнес в язык достаточно много нововведений, в том числе шаблон std::variant (хоть в Boost он есть уже довольно давно). Фактически, последним вышедшим и полноценно реализованным стандартом C++ на тот момент, как я начал изучать данный язык, являлся как раз C++17, поэтому нововведениям данного стандарта в свое время я уделил наибольшее внимание. В какой-то момент мне стало интересно, как именно устроен std::variant, в связи с чем я немного погуглил про его принципиальное устройство и, вооружившись variadic templates, сел писать свою реализацию. Данный шаблон устроен достаточно интересно, поэтому людям, вообще не знакомым с его устройством, данная статья будет полезна. Если данную статью прочитают более опытные разработчики, я буду рад их комментариям по поводу моей реализации. Упомяну несколько моментов перед началом статьи:

    habr.com/ru/articles/804837/

    #c++17 #c++ #variant #метапрограммирование #шаблоны #variadic_templates

  10. Продвинутое использование препроцессора C/C++

    Зачастую, в проектах ограничивается использование препроцессора по следующим причинам: — Он не похож на весь остальной язык; — Макросы могут возвращать неполные синтаксические конструкции, или вовсе различные, в зависимости от параметров. Ввиду перечисленных особенностей, читать код с активным использованием препроцессора зачастую становится на порядок сложнее кода без него. Со всеми его недостатками, инструмент есть в языке и достоин изучения.

    habr.com/ru/companies/timeweb/

    #препроцессор #c_language #макросы #метапрограммирование #c++ #C #ненормальное_программирование #функциональное_программирование #timeweb_статьи

  11. Полный гайд по dunder-методам в Python (от новичка до профи)

    В Python всё — объект. Но как язык понимает, что делать при сложении двух классов через +, вызове len() или обращении к несуществующему атрибуту? Вся магия скрыта под капотом dunder-методов. Мы собрали полный гайд для разработчиков любого уровня: от правильной инициализации и перегрузки операторов до создания собственных дескрипторов, контекстных менеджеров и жесткой оптимизации памяти через slots . Никакой воды, только практика, живые примеры и то, что реально спрашивают на собеседованиях.

    habr.com/ru/articles/1033432/

    #ython #ООП #dunderметоды #магические_методы #метапрограммирование #дескрипторы #итераторы #генераторы #контекстные_менеджеры #Python_3

  12. «ECS — like» вектор на с++

    В программировании частая задача это работа с последовательными элементами. В этой, порой непростой задаче, нам часто помогают вектора. Вектора бывают самыми разными от queue и set до unordered_map и обычных массивов. Все они позволяют работать с данными по разному, где то быстрее вставка, где то быстрее доступ, но все они выполняют одну важную задачу это хранение данных. И не смотря на их всеобъемлющую вариативность, в жизни встречаются ситуации когда один вектор не может решить задачу. Точнее может, но через костыли... О чем я?

    habr.com/ru/articles/1029802/

    #C++ #SoA #ECS #attribute_vector #GPU #вершинный_буфер #теги #метапрограммирование #структуры_данных #OpenGL

  13. «ECS — like» вектор на с++

    В программировании частая задача это работа с последовательными элементами. В этой, порой непростой задаче, нам часто помогают вектора. Вектора бывают самыми разными от queue и set до unordered_map и обычных массивов. Все они позволяют работать с данными по разному, где то быстрее вставка, где то быстрее доступ, но все они выполняют одну важную задачу это хранение данных. И не смотря на их всеобъемлющую вариативность, в жизни встречаются ситуации когда один вектор не может решить задачу. Точнее может, но через костыли... О чем я?

    habr.com/ru/articles/1029802/

    #C++ #SoA #ECS #attribute_vector #GPU #вершинный_буфер #теги #метапрограммирование #структуры_данных #OpenGL

  14. «ECS — like» вектор на с++

    В программировании частая задача это работа с последовательными элементами. В этой, порой непростой задаче, нам часто помогают вектора. Вектора бывают самыми разными от queue и set до unordered_map и обычных массивов. Все они позволяют работать с данными по разному, где то быстрее вставка, где то быстрее доступ, но все они выполняют одну важную задачу это хранение данных. И не смотря на их всеобъемлющую вариативность, в жизни встречаются ситуации когда один вектор не может решить задачу. Точнее может, но через костыли... О чем я?

    habr.com/ru/articles/1029802/

    #C++ #SoA #ECS #attribute_vector #GPU #вершинный_буфер #теги #метапрограммирование #структуры_данных #OpenGL

  15. SFINAE в C++

    Привет, Хабр! Сегодня я хочу поговорить про SFINAE, загадочную аббревиатуру из C++. Расшифровывается SFINAE не менее загадочно: Substitution Failure Is Not An Error , по-русски: «неудавшаяся подстановка — не ошибка». Сейчас рассмотрим, почему это правило появилось, как оно работает и как мы можем использовать его себе во благо. К механике SFINAE

    habr.com/ru/companies/otus/art

    #C++ #шаблонная_метапрограммирование #шаблоны #SFINAE #перегрузка_функций #типы_в_C++ #метапрограммирование #компиляция

  16. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  17. Что не так в Расте :: впечатления вкатуна

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

    habr.com/ru/articles/973938/

    #макросы #метапрограммирование #документация #комментарии_в_коде #тестирование

  18. Type-level программирование в TypeScript: практические кейсы и новые возможности

    Как использовать мощь системы типов TypeScript для вычисления логики ещё на этапе компиляции и автоматической генерации кода. Разбираем условные типы, шаблонные литералы, рекурсивные типы и другие приёмы, чтобы упростить разработку, сократить дублирование кода и снизить вероятность ошибок на runtime.

    habr.com/ru/articles/871336/

    #typescript #Typelevel_программирование #метапрограммирование #условные_типы #типобезопасность #Валидация_типов #рекурсивные_типы #mapped_types #Шаблонные_литералы_типов

  19. Type-level программирование в TypeScript: практические кейсы и новые возможности

    Как использовать мощь системы типов TypeScript для вычисления логики ещё на этапе компиляции и автоматической генерации кода. Разбираем условные типы, шаблонные литералы, рекурсивные типы и другие приёмы, чтобы упростить разработку, сократить дублирование кода и снизить вероятность ошибок на runtime.

    habr.com/ru/articles/871336/

    #typescript #Typelevel_программирование #метапрограммирование #условные_типы #типобезопасность #Валидация_типов #рекурсивные_типы #mapped_types #Шаблонные_литералы_типов

  20. Type-level программирование в TypeScript: практические кейсы и новые возможности

    Как использовать мощь системы типов TypeScript для вычисления логики ещё на этапе компиляции и автоматической генерации кода. Разбираем условные типы, шаблонные литералы, рекурсивные типы и другие приёмы, чтобы упростить разработку, сократить дублирование кода и снизить вероятность ошибок на runtime.

    habr.com/ru/articles/871336/

    #typescript #Typelevel_программирование #метапрограммирование #условные_типы #типобезопасность #Валидация_типов #рекурсивные_типы #mapped_types #Шаблонные_литералы_типов

  21. Type-level программирование в TypeScript: практические кейсы и новые возможности

    Как использовать мощь системы типов TypeScript для вычисления логики ещё на этапе компиляции и автоматической генерации кода. Разбираем условные типы, шаблонные литералы, рекурсивные типы и другие приёмы, чтобы упростить разработку, сократить дублирование кода и снизить вероятность ошибок на runtime.

    habr.com/ru/articles/871336/

    #typescript #Typelevel_программирование #метапрограммирование #условные_типы #типобезопасность #Валидация_типов #рекурсивные_типы #mapped_types #Шаблонные_литералы_типов

  22. Полиморфизм, мета-программирование и космическая баллистика: 4 доклада о C++ и Linux Kernel

    Посмотрели за вас все доклады с System Level Meetup и выбрали по два лучших из потоков по Linux Kernel и C++. Для «плюсовиков» приготовили выступления о мета-программировании и девиртуализации в компиляторах. Для тех, кто интересуется ядром Linux — материалы о kernel bypass и чем-то еще. Остальные доклады и дискусии собрали в плейлисты, ссылки ищите под катом.

    habr.com/ru/companies/yadro/ar

    #c++ #linux_kernel #доклады #митапы #метапрограммирование

  23. [Перевод] Анонс Dart 3.4

    Dart 3.4 вышел сегодня! Этот релиз демонстрирует совместные усилия Dart и Flutter в посте Flutter 3.22 / Dart 3.4 / IO24 , так что обязательно ознакомьтесь с полной информацией там. В этом посте мы расскажем о поддержке WebAssembly, а затем подробно остановимся на одном из основных пунктов дорожной карты для языка Dart на этот год: макросы. Автор: Michael Thomsen Ура, анонс!

    habr.com/ru/articles/814411/

    #dartlang #dart #flutter #wasm #webassembly #metaprogramming #метапрограммирование #флаттер #дарт #анонс

  24. Новая жизнь или начало экзистенциального кризиса?

    Ни для кого не секрет, что популярные языки программирования развиваются по схожему сценарию. Сначала появляется новый язык программирования с амбициозной и благой целью решить те или иные проблемы уже существующего языка, которые иначе, как созданием нового языка программирования, не решить. Далее язык набирает популярность, часто путем обрастания различными модными фичами. Теряет связь с миром свою простоту и лаконичность в бесконечной погоне за новыми возможностями. В какой-то момент наступает экзистенциальный кризис в виде Франкенштейна. А как отмыть кровь решать подобные проблемы, мы уже знаем. Или я несколько утрирую (или нет?), и, возможно, не все так плохо? Сегодня поговорим об этом в общем и о новом функционале языка Dart в частности.

    habr.com/ru/articles/815527/

    #dart #macro #macros #metaprogramming #codegeneration #flutter #метапрограммирование #макросы #build_runner

  25. Дескрипторы Python: механизм, на котором держится половина крутости языка

    Дескрипторы — одна из тех фич Python, о которых многие слышали, но мало кто использует напрямую. При этом они лежат в основе @property , @classmethod , @staticmethod , слотов и даже обычного доступа к методам. Разберём, что такое дескрипторы, как их писать и когда они реально полезны. Понять механизм

    habr.com/ru/companies/otus/art

    #python #дескрипторы_Python #метапрограммирование #внутреннее_устройство_Python #data_descriptor

  26. Метапрограммирование 2.0: макросы и генерация кода в современном мире

    Забудьте про скучные «Hello, World». Макросы и шаблоны давно стали полноценными инструментами архитектора кода: от хитрых C++-шаблонов до процедурных макросов Rust и Java-аннотаций, автоматически генерирующих целые фреймворки. В этой статье мы рассмотрим примеры, где metaprogramming избавляет от рутины и экономит часы работы над проектом. Детали как всегда под катом.

    habr.com/ru/companies/ruvds/ar

    #ruvds_статьи #метапрограммирование #генерация_кода #макросы #code_generation #Rust #Java #C++ #metaprogramming #шаблонный_код

  27. Метапрограммирование 2.0: макросы и генерация кода в современном мире

    Забудьте про скучные «Hello, World». Макросы и шаблоны давно стали полноценными инструментами архитектора кода: от хитрых C++-шаблонов до процедурных макросов Rust и Java-аннотаций, автоматически генерирующих целые фреймворки. В этой статье мы рассмотрим примеры, где metaprogramming избавляет от рутины и экономит часы работы над проектом. Детали как всегда под катом.

    habr.com/ru/companies/ruvds/ar

    #ruvds_статьи #метапрограммирование #генерация_кода #макросы #code_generation #Rust #Java #C++ #metaprogramming #шаблонный_код

  28. Метапрограммирование 2.0: макросы и генерация кода в современном мире

    Забудьте про скучные «Hello, World». Макросы и шаблоны давно стали полноценными инструментами архитектора кода: от хитрых C++-шаблонов до процедурных макросов Rust и Java-аннотаций, автоматически генерирующих целые фреймворки. В этой статье мы рассмотрим примеры, где metaprogramming избавляет от рутины и экономит часы работы над проектом. Детали как всегда под катом.

    habr.com/ru/companies/ruvds/ar

    #ruvds_статьи #метапрограммирование #генерация_кода #макросы #code_generation #Rust #Java #C++ #metaprogramming #шаблонный_код

  29. Полный гайд по dunder-методам в Python (от новичка до профи)

    В Python всё — объект. Но как язык понимает, что делать при сложении двух классов через +, вызове len() или обращении к несуществующему атрибуту? Вся магия скрыта под капотом dunder-методов. Мы собрали полный гайд для разработчиков любого уровня: от правильной инициализации и перегрузки операторов до создания собственных дескрипторов, контекстных менеджеров и жесткой оптимизации памяти через slots . Никакой воды, только практика, живые примеры и то, что реально спрашивают на собеседованиях.

    habr.com/ru/articles/1033432/

    #ython #ООП #dunderметоды #магические_методы #метапрограммирование #дескрипторы #итераторы #генераторы #контекстные_менеджеры #Python_3

  30. Полный гайд по dunder-методам в Python (от новичка до профи)

    В Python всё — объект. Но как язык понимает, что делать при сложении двух классов через +, вызове len() или обращении к несуществующему атрибуту? Вся магия скрыта под капотом dunder-методов. Мы собрали полный гайд для разработчиков любого уровня: от правильной инициализации и перегрузки операторов до создания собственных дескрипторов, контекстных менеджеров и жесткой оптимизации памяти через slots . Никакой воды, только практика, живые примеры и то, что реально спрашивают на собеседованиях.

    habr.com/ru/articles/1033432/

    #ython #ООП #dunderметоды #магические_методы #метапрограммирование #дескрипторы #итераторы #генераторы #контекстные_менеджеры #Python_3

  31. Полный гайд по dunder-методам в Python (от новичка до профи)

    В Python всё — объект. Но как язык понимает, что делать при сложении двух классов через +, вызове len() или обращении к несуществующему атрибуту? Вся магия скрыта под капотом dunder-методов. Мы собрали полный гайд для разработчиков любого уровня: от правильной инициализации и перегрузки операторов до создания собственных дескрипторов, контекстных менеджеров и жесткой оптимизации памяти через slots . Никакой воды, только практика, живые примеры и то, что реально спрашивают на собеседованиях.

    habr.com/ru/articles/1033432/

    #ython #ООП #dunderметоды #магические_методы #метапрограммирование #дескрипторы #итераторы #генераторы #контекстные_менеджеры #Python_3

  32. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  33. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции

  34. Как убрать virtual и не сойти с ума: велосипедные генераторы через type loopholes

    В C++ уже есть корутины. Есть диапазоны. Есть готовые библиотеки. Но это не мешает взять гаечный ключ и начать собирать генератор вручную. В предыдущей статье макросы внезапно начинают изображать из себя язык: DO , LET , IS управляют препроцессорным ритуалом и создают DSL. Это синтаксис. Это оболочка. Это фронтенд. (чтение предыдущей статьи необязательно для понимания этой) Но ведь есть не только синтаксис, можно создать и конкретную семантику — генераторы. В этой статье я строю велосипедный генератор. Самый честный.

    habr.com/ru/companies/timeweb/

    #C++ #метапрограммирование #генераторы #type_loopholes #макросы #оптимизация #оптимизации_компилятора #ненормальное_программирование #timeweb_статьи #виртуальные_функции