I here conduct an exploration of programming language extensibility, making an argument for an often overlooked component of conventional language design. Now, this is not a technical detailing of these components, rather, I attempt to provide an overview as I myself have lacked during my time investigating programming languages. Thus, read this as an introduction to the magical world of extensibility. Through a literature review, I identify key extensibility themes - Macros, Modules, Types, and Reflection - highlighting diverse strategies for fostering extensibility. The analysis extends to cross-theme properties such as Parametricism and First-class citizen behaviour, introducing layers of complexity by highlighting the importance of customizability and flexibility in programming language constructs. By outlining these facets of existing programming languages and research, I aim to inspire future language designers to assess and consider the extensibility of their creations critically.
- ID статьи: 2510.13236
- Название: Extensibility in Programming Languages: An overview
- Автор: Sebastian Mateos Nicolajsen (IT University of Copenhagen)
- Категория: cs.PL (Языки программирования)
- Дата публикации: 15 октября 2025 г. (препринт arXiv)
- Ссылка на статью: https://arxiv.org/abs/2510.13236
В данной статье проводится глубокое исследование расширяемости языков программирования, предоставляя обоснование для компонентов, которые часто игнорируются в традиционном проектировании языков. Автор посредством обзора литературы выявляет четыре ключевые темы расширяемости: макросы (Macros), модули (Modules), типы (Types) и рефлексия (Reflection), подчеркивая разнообразные стратегии, способствующие расширяемости. Анализ также распространяется на кросс-тематические атрибуты, такие как параметризация (Parametricism) и поведение объектов первого класса (First-class citizen behaviour), вводя уровни сложности путем выделения важности кастомизации и гибкости в конструкциях языков программирования.
- Основной вопрос: Расширяемость языков программирования часто игнорируется при проектировании языков, отсутствует систематическое исследование и обобщение
- Неясность определений: Концепция расширяемости в литературе определена нечетко, отсутствует четкая классификация и структура понимания
- Практические потребности: Существующие языки программирования часто ограничены неизменяемостью при столкновении с новыми требованиями
- Ограничения языков: Традиционный взгляд рассматривает языки программирования как неизменяемые артефакты, что ограничивает способность языка адаптироваться к новым требованиям
- Эффективность разработки: Расширяемость является единственным путем повышения производительности разработчиков и преодоления ограничений языков
- Будущее развитие: Ученые, такие как Guy Steele, считают, что проектирование для роста языков (т.е. расширяемость) должно быть фундаментальным элементом будущих языков
- Разрозненность исследований: Хотя макросы, рефлексия, функции и модули широко изучаются, основное внимание уделяется переиспользуемости, модульности и абстракции, а не самой расширяемости
- Отсутствие целостного взгляда: Существующие работы сосредоточены на улучшении расширяемости или деталях реализации, отсутствует систематическое исследование самой расширяемости
- Недостаток теории: Расширяемость, в отличие от абстракции и других концепций, лишена четких определений и теоретической базы
- Систематическая классификация: Выявление четырех основных тем расширяемости (макросы, модули, типы, рефлексия) посредством обзора литературы
- Кросс-тематические атрибуты: Выявление и анализ двух важных кросс-тематических атрибутов (параметризация и поведение объектов первого класса)
- Теоретическая структура: Предоставление структурированной структуры для понимания расширяемости языков программирования
- Практическое руководство: Предоставление рекомендаций для будущих проектировщиков языков по оценке и рассмотрению расширяемости языков
- Выявление пробелов в исследованиях: Указание на менее изученные концепции, такие как самозагрузка (bootstrapping), компиляторные хуки (compiler hooks) и виртуальные машины
В статье используется метод систематического обзора литературы, следующий процессу, определенному Kitchenham и др., в сочетании с методами кодирования данных теории обоснованности (Grounded Theory).
- Источники данных: 10 конференций и журналов, связанных с инженерией языков
- Конференции включают: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
- Исходный объем: 7090 статей
- Стратегия исключения: Исключение конференций, сосредоточенных на конкретных парадигмах языков
- Фильтрация по ключевым словам: Извлечение 65 ключевых слов из 19 релевантных статей, генерирование 19 дополнительных ключевых слов
- Фильтрация по названиям: Сравнение ключевых слов с названиями статей, отбор до 648 статей
- Фильтрация по аннотациям: Сравнение ключевых слов с аннотациями и выводами, дальнейший отбор до 223 статей
- Оценка качества: Классификация на основе описания или обсуждения расширяемости на значительно релевантные (69 статей) и частично релевантные (64 статьи)
- Метод извлечения: Извлечение всех качественных описаний и обсуждений расширяемости
- Метод синтеза: Заимствование методов кодирования данных из теории обоснованности, применение индуктивного метода для разработки системы классификации
- Итеративное совершенствование: Непрерывное совершенствование и переоценка классификации при обнаружении новой информации
- Общий объем: Исходные 7090 статей
- Временной диапазон: Данные собраны осенью 2022 года
- Финальный анализ: 133 релевантные статьи (69 высокорелевантных + 64 частично релевантные)
Основные вопросы:
- Обсуждает ли статья расширяемость? (прямо или косвенно)
- Обсуждает ли статья концепции расширяемости?
Вторичные вопросы:
- Обсуждает ли статья конкретные концепции расширяемости?
- Обсуждает ли статья конкретные языки и расширяемость?
Применение индуктивного метода для выявления тем, посредством непрерывного сравнения и уточнения классификации, окончательное формирование структуры четырех основных тем и двух кросс-тематических атрибутов.
Мотивация: Макросы позволяют пользователям языка создавать новые механизмы управления практически любой синтаксической формы, тем самым увеличивая расширяемость.
Классификация типов:
- Лексические макросы: Преобразования на основе строк, синтаксически независимые, но не гарантирующие синтаксическую безопасность
- Синтаксические макросы: Операции над абстрактным синтаксическим деревом (AST), гарантирующие синтаксическую безопасность
- Семантические макросы: Предоставляющие семантический анализ, такой как проверка типов
Репрезентативные реализации:
- Racket: Модульная система синтаксиса
- CPP: Лексический механизм макросов для языка C
- LISP: Система синтаксических макросов
- C++: Шаблоны и концепции (функциональность, подобная макросам)
Мотивация: Модули используются для структурирования кода, позволяя пользователям группировать код для предоставления предметно-ориентированных языков или фреймворков в виде пакетов.
Система типов:
- Экзистенциальные типы: Позволяют модули первого класса, но скрывают детали реализации
- Зависимые типы: Полная прозрачность
- Явные типы: Обеспечивают компромисс между двумя подходами
Соображения проектирования:
- Иерархическая структура и зависимости
- Обработка вложенных модулей
- Разрешение циклических зависимостей
Мотивация: Системы типов позволяют пользователям делать гарантии в языке, в сочетании с полиморфизмом и обобщенным программированием, предоставляя предсказуемость и безопасность при разработке программ.
Классификация полиморфизма:
- Специальный полиморфизм (Ad hoc): Тип зависит от параметров
- Универсальный полиморфизм (Universal):
- Параметрический полиморфизм: Позволяет любой тип в качестве параметра
- Полиморфизм подтипов: Позволяет подстановку типов
Обобщенное программирование:
- Различные способы реализации: Поддержка виртуальной машины (C#) vs стирание типов (Java)
- Структурное сопоставление: ML, C++, OCaml и др.
Мотивация: Рефлексия позволяет пользователям программно изменять другие программные конструкции, увеличивая изменяемость и гибкость концепций, которые в противном случае были бы неизменяемы.
Диапазон возможностей:
- Самоанализ программы и модификация
- Клонирование и расширение классов
- Предоставление четкого интерфейса виртуальной машины
Вызовы:
- Затраты на производительность
- Нарушение инкапсуляции
- Проблемы метастабильности
Мотивация: Параметризация увеличивает способность кастомизации конструкций, обеспечивая большее переиспользование и абстракцию.
Области применения:
- Параметризация модулей: Такие как конструкции functor в Standard ML и OCaml
- Параметризация типов: Реализация через полиморфизм, такие как concepts в C++ и type classes в Haskell
Мотивация: Атрибут первого класса позволяет пользователям использовать конструкции так же, как другие значения, позволяя динамически изменять программные конструкции.
Способы реализации:
- Модули первого класса: Могут манипулироваться как структуры данных
- Типы первого класса: Механизмы, такие как генераторы типов
- Самозагрузка (Bootstrapping): Самозагрузка языка, устранение представления о неизменяемости языка
- Компиляторные хуки (Compiler hooks): Позволяют пользователям внедрять хуки в компилятор
- Виртуальные машины (Virtual machines): Предоставляют богатые функции и портативность для экспериментов с языками
- Daniel Zingaro: Применение концепций Standish (paraphrase, orthophrase, metaphrase) к наборам языков
- Sebastian Erdweg и Felix Rieger: Предложение структуры Sugar* для рассуждения о расширяемости языков
- Philip Wadler: Предложение проблемы выразительности в списке рассылки Java для измерения расширяемости языков программирования
- Robert Tennent: "Принципы языков программирования", описание различных компонентов языков
- Peter Sestoft: "Концепции языков программирования", охватывающие аналогичные темы и решения при проектировании
- Важность расширяемости: Расширяемость является ключевым фактором преодоления ограничений языков и содействия разработке, управляемой сообществом
- Систематическая структура: Четыре темы (макросы, модули, типы, рефлексия) и два кросс-тематических атрибута предоставляют структурированную структуру для понимания расширяемости
- Сбалансированное рассмотрение: Расширяемость должна быть сбалансирована с другими атрибутами качества, такими как производительность, безопасность и предсказуемость
- Влияние на производительность: Абстракция и расширяемость Java и C# делают их менее производительными, чем C
- Риски безопасности: Расширения, разработанные пользователями, могут вводить уязвимости безопасности
- Увеличение сложности: Может привести к разбуханию языка и решениям, специфичным для контекста
- Утечка абстракции: Абстракции в большинстве языков пропускают детали реализации
- Расширяемость должна быть интегрированной частью целостного проектирования языка
- Инженеры языков должны рассмотреть выделенные вызовы
- Необходимо найти баланс между расширяемостью и другими атрибутами качества
- Углубленное исследование: Концепции, такие как самозагрузка, компиляторные хуки и виртуальные машины, требуют дальнейшего исследования
- Развитие теории: Необходимы более четкие определения расширяемости и теоретическая база
- Практическое применение: Предоставление более конкретных рекомендаций по проектированию расширяемости для проектировщиков языков
- Высокая систематичность: Первый систематический обзор литературы и классификация расширяемости языков программирования
- Четкая структура: Предоставление четкой аналитической структуры из четырех тем плюс два кросс-тематических атрибута
- Высокая практическая ценность: Предоставление ценных ссылок и рекомендаций для проектировщиков языков
- Строгая методология: Применение стандартного метода систематического обзора литературы с прозрачным и отслеживаемым процессом
- Широкий охват: Охватывает множество языков и технологий от исторических до современных
- Неясность определений: Хотя указывается на неясность определения расширяемости, статья также не предоставляет более точное определение
- Недостаток эмпирических данных: Отсутствие количественных эмпирических исследований, в основном опирается на качественный анализ
- Критерии оценки: Отсутствие объективных критериев для оценки эффективности различных механизмов расширяемости
- Ограничение области: Исключение некоторых важных конференций может привести к пропуску релевантных исследований
- Предвзятость исследователя: Анализ, проведенный одним исследователем, может вводить субъективные предубеждения
- Академический вклад: Предоставление новой исследовательской перспективы и структуры для области исследований языков программирования
- Практическая ценность: Важное справочное значение для проектировщиков языков и разработчиков инструментов
- Вдохновляющее значение: Может стимулировать более глубокие исследования расширяемости языков
- Образовательная ценность: Может служить важным справочным материалом для курсов языков программирования
- Проектирование языков: Проектирование новых языков программирования и улучшение существующих
- Разработка инструментов: Проектирование механизмов расширения для инструментов разработки, таких как IDE и компиляторы
- Академические исследования: Дальнейшие исследования теории и практики языков программирования
- Образование и обучение: Разработка курсов и учебных материалов по языкам программирования
Статья содержит 135 ссылок, охватывающих историю языков программирования, принципы проектирования, конкретные реализации и другие аспекты, предоставляя всеобъемлющую литературную базу для исследований расширяемости. Ключевые ссылки включают:
- Standish (1975): Ранние работы по проектированию расширяемых языков программирования
- Steele (1998): Важные взгляды на рост языков
- Различные статьи HOPL: Предоставляющие ценные материалы по истории и идеям проектирования языков
Общая оценка: Это высококачественная обзорная статья, предоставляющая важную теоретическую структуру и практические рекомендации для исследований расширяемости языков программирования. Несмотря на некоторые ограничения, систематический подход и четкая аналитическая структура делают ее важным вкладом в эту область. Имеет важное справочное значение для проектировщиков языков, исследователей и студентов.