Расширение языка C для поддержки процедурно-параметрического программирования (Александр Легалов, OSSDEVCONF-2025)
Материал из 0x1.tv
- Докладчик
- Александр Легалов
Предлагается расширение языка программирования C конструкциями, обеспечивающими поддержку процедурно-параметрической парадигмы.
Рассматриваются особенности реализации динамического полиморфизма и его использования для гибкой разработки эволюционно расширяемых программ.
Содержание
Видео
Презентация
Thesis
Ключевые слова: язык программирования, процедурно-параметрическое программирование, динамический полиморфизм, эволюционная разработка программного обеспечения.
Предлагаемое решение
Разработка программных систем осуществляется с применением различных парадигм программирования. Несмотря на их разнообразие, в настоящее время наибольшей популярностью пользуется объектно-ориентированный (ОО) подход. Его ключевые концепции лежат в основе многих современных языков программирования. Большинство разработчиков привлекают возможности более гибкого расширения программ по сравнению с процедурным подходом за счёт использования динамического ОО полиморфизма.
Эволюция парадигм программирования привела к использованию динамического полиморфизма в процедурных и функциональных языках программирования. Например, в Go интерфейсы связывают функции со структурами данных, а в Rust аналогичная функциональность реализована через типажи. В функциональных языках, таких как Haskell, указатели на специализированные методы передаются в виде таблиц (словарей) неявно, обеспечивая гибкость при сохранении статической типизации.
Вместе с тем, перечисленные подходы ориентированы на поддержку только одиночного полиморфизма (монометоды), при котором выбор альтернативной функциональности определяется только одним параметром. Это создаёт трудности при использовании мультиметодов — функций, полиморфных от нескольких аргументов. Для программной реализации множественного полиморфизма используют различные подходы. В случае ООП можно использовать диспетчеризацию. Часто применяются комбинированные решения, сочетающие ОО и процедурный подходы.
В качестве альтернативного подхода, обеспечивающего поддержку не только одиночного, но и множественного
полиморфизма, была предложена процедурно-параметрическая парадигма (ПП) программирования.
Её описание, основные характеристики и способы реализации в качестве расширения языка программирования C
представлены в соответствующих работах. Сам проект компилятора для языка C, реализующий эти расширения,
размещён в открытом доступе. Он создан на основе семейства компиляторов clang. В статье разработанный
язык фигурирует под именем PPC (Procedural Parametric C, процедурно-параметрический C).
При описании процедурно-параметрической парадигмы используются следующие понятия:
- основа специализации;
- специализация параметрического обобщения;
- параметрическое обобщение;
- экземпляр параметрического обобщения или специализированная переменная;
- обобщающая функция;
- обработчик параметрической специализации или специализированная функция;
- вызов параметрической функции.
В разработанном расширении языка C в качестве основ специализаций могут выступать разнообразные типы данных. Это могут быть как базовые типы данных, так и именованные типы данных, сформированные на основе структур. Помимо этого специализации могут формироваться на основе подключения неименованных структур или указателей на различные типы данных. Для идентификации подключаемых основ специализаций используются признаки, задаваемые идентификаторами. Они являются уникальными внутри каждого из формируемых обобщений. Также в качестве признака может выступать имя типа основы специализации, что может трактоваться как использование в качестве идентификатора признака имени типа.
Возможности процедурно-параметрического подхода
Для изучения возможностей ПП парадигмы программирования был разработан ряд программ, позволяющих оценить гибкость наращивания функционала без изменения ранее написанного кода:
- проведены эксперименты по добавлению в ранее написанный код новых функций, альтернативных данных, а также ряд других исследований, демонстрирующих более гибкие решения, получаемые с использованием ПП подхода;
- ПП реализация паттернов ОО проектирования показала, что многие из них вырождаются в более простые и эффективные решения, а процедурно-параметрический полиморфизм превосходит
по гибкости объектно-ориентированный полиморфизм;
- показано, что ПП реализация множественного полиморфизма обладает высокой эффективностью, допускает гибкое эволюционное добавление новых альтернатив.
Примеры, демонстрирующие возможности процедурно-параметрической парадигмы программирования, представлены в репозитории.
Заключение
Процедурно-параметрический подход предлагает эффективное и эволюционно расширяемое решение для реализации множественного полиморфизма. Используемые методы построения альтернатив и их обработчиков позволяют расширять или изменять функционал программы в новых единицах трансляции без изменения уже написанного кода.
Предложенное расширение языка программирования C конструкциями, обеспечивающими инструментальную
поддержку процедурно-параметрической парадигмы, позволило разрабатывать более надёжные и
эволюционно расширяемые программы. При этом обеспечено добавление новых альтернативных данных, а также
функций, позволяющих безболезненно для ранее написанного кода использовать множественный полиморфизм.
Реализация проекта проведена путём адаптации под новые конструкции как синтаксического анализатора,
так и абстрактного синтаксического дерева компилятора clang.
