2025-11-23T09:55:17.068946

Extensibility in Programming Languages: An overview

Nicolajsen
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.
academic

Расширяемость в языках программирования: Обзор

Основная информация

  • 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), вводя уровни сложности путем выделения важности кастомизации и гибкости в конструкциях языков программирования.

Исследовательский контекст и мотивация

Исследовательские вопросы

  1. Основной вопрос: Расширяемость языков программирования часто игнорируется при проектировании языков, отсутствует систематическое исследование и обобщение
  2. Неясность определений: Концепция расширяемости в литературе определена нечетко, отсутствует четкая классификация и структура понимания
  3. Практические потребности: Существующие языки программирования часто ограничены неизменяемостью при столкновении с новыми требованиями

Значимость проблемы

  1. Ограничения языков: Традиционный взгляд рассматривает языки программирования как неизменяемые артефакты, что ограничивает способность языка адаптироваться к новым требованиям
  2. Эффективность разработки: Расширяемость является единственным путем повышения производительности разработчиков и преодоления ограничений языков
  3. Будущее развитие: Ученые, такие как Guy Steele, считают, что проектирование для роста языков (т.е. расширяемость) должно быть фундаментальным элементом будущих языков

Ограничения существующих подходов

  1. Разрозненность исследований: Хотя макросы, рефлексия, функции и модули широко изучаются, основное внимание уделяется переиспользуемости, модульности и абстракции, а не самой расширяемости
  2. Отсутствие целостного взгляда: Существующие работы сосредоточены на улучшении расширяемости или деталях реализации, отсутствует систематическое исследование самой расширяемости
  3. Недостаток теории: Расширяемость, в отличие от абстракции и других концепций, лишена четких определений и теоретической базы

Основные вклады

  1. Систематическая классификация: Выявление четырех основных тем расширяемости (макросы, модули, типы, рефлексия) посредством обзора литературы
  2. Кросс-тематические атрибуты: Выявление и анализ двух важных кросс-тематических атрибутов (параметризация и поведение объектов первого класса)
  3. Теоретическая структура: Предоставление структурированной структуры для понимания расширяемости языков программирования
  4. Практическое руководство: Предоставление рекомендаций для будущих проектировщиков языков по оценке и рассмотрению расширяемости языков
  5. Выявление пробелов в исследованиях: Указание на менее изученные концепции, такие как самозагрузка (bootstrapping), компиляторные хуки (compiler hooks) и виртуальные машины

Детальное описание методологии

Методология исследования

В статье используется метод систематического обзора литературы, следующий процессу, определенному Kitchenham и др., в сочетании с методами кодирования данных теории обоснованности (Grounded Theory).

Стратегия сбора литературы

Исходный набор литературы

  • Источники данных: 10 конференций и журналов, связанных с инженерией языков
  • Конференции включают: HOPL, POPL, PLDI, CGO, DLS, GPCE, Onward, SLE, TOPLAS, PACMPL
  • Исходный объем: 7090 статей
  • Стратегия исключения: Исключение конференций, сосредоточенных на конкретных парадигмах языков

Процесс отбора

  1. Фильтрация по ключевым словам: Извлечение 65 ключевых слов из 19 релевантных статей, генерирование 19 дополнительных ключевых слов
  2. Фильтрация по названиям: Сравнение ключевых слов с названиями статей, отбор до 648 статей
  3. Фильтрация по аннотациям: Сравнение ключевых слов с аннотациями и выводами, дальнейший отбор до 223 статей
  4. Оценка качества: Классификация на основе описания или обсуждения расширяемости на значительно релевантные (69 статей) и частично релевантные (64 статьи)

Извлечение и синтез данных

  • Метод извлечения: Извлечение всех качественных описаний и обсуждений расширяемости
  • Метод синтеза: Заимствование методов кодирования данных из теории обоснованности, применение индуктивного метода для разработки системы классификации
  • Итеративное совершенствование: Непрерывное совершенствование и переоценка классификации при обнаружении новой информации

Экспериментальная установка

Характеристики набора данных

  • Общий объем: Исходные 7090 статей
  • Временной диапазон: Данные собраны осенью 2022 года
  • Финальный анализ: 133 релевантные статьи (69 высокорелевантных + 64 частично релевантные)

Критерии оценки качества

Основные вопросы:

  • Обсуждает ли статья расширяемость? (прямо или косвенно)
  • Обсуждает ли статья концепции расширяемости?

Вторичные вопросы:

  • Обсуждает ли статья конкретные концепции расширяемости?
  • Обсуждает ли статья конкретные языки и расширяемость?

Аналитическая структура

Применение индуктивного метода для выявления тем, посредством непрерывного сравнения и уточнения классификации, окончательное формирование структуры четырех основных тем и двух кросс-тематических атрибутов.

Результаты экспериментов

Основные выводы: четыре основные темы

1. Макросы (Macros)

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

Классификация типов:

  • Лексические макросы: Преобразования на основе строк, синтаксически независимые, но не гарантирующие синтаксическую безопасность
  • Синтаксические макросы: Операции над абстрактным синтаксическим деревом (AST), гарантирующие синтаксическую безопасность
  • Семантические макросы: Предоставляющие семантический анализ, такой как проверка типов

Репрезентативные реализации:

  • Racket: Модульная система синтаксиса
  • CPP: Лексический механизм макросов для языка C
  • LISP: Система синтаксических макросов
  • C++: Шаблоны и концепции (функциональность, подобная макросам)

2. Модули (Modules)

Мотивация: Модули используются для структурирования кода, позволяя пользователям группировать код для предоставления предметно-ориентированных языков или фреймворков в виде пакетов.

Система типов:

  • Экзистенциальные типы: Позволяют модули первого класса, но скрывают детали реализации
  • Зависимые типы: Полная прозрачность
  • Явные типы: Обеспечивают компромисс между двумя подходами

Соображения проектирования:

  • Иерархическая структура и зависимости
  • Обработка вложенных модулей
  • Разрешение циклических зависимостей

3. Типы (Types)

Мотивация: Системы типов позволяют пользователям делать гарантии в языке, в сочетании с полиморфизмом и обобщенным программированием, предоставляя предсказуемость и безопасность при разработке программ.

Классификация полиморфизма:

  • Специальный полиморфизм (Ad hoc): Тип зависит от параметров
  • Универсальный полиморфизм (Universal):
    • Параметрический полиморфизм: Позволяет любой тип в качестве параметра
    • Полиморфизм подтипов: Позволяет подстановку типов

Обобщенное программирование:

  • Различные способы реализации: Поддержка виртуальной машины (C#) vs стирание типов (Java)
  • Структурное сопоставление: ML, C++, OCaml и др.

4. Рефлексия (Reflection)

Мотивация: Рефлексия позволяет пользователям программно изменять другие программные конструкции, увеличивая изменяемость и гибкость концепций, которые в противном случае были бы неизменяемы.

Диапазон возможностей:

  • Самоанализ программы и модификация
  • Клонирование и расширение классов
  • Предоставление четкого интерфейса виртуальной машины

Вызовы:

  • Затраты на производительность
  • Нарушение инкапсуляции
  • Проблемы метастабильности

Кросс-тематические атрибуты

1. Параметризация (Parametricism)

Мотивация: Параметризация увеличивает способность кастомизации конструкций, обеспечивая большее переиспользование и абстракцию.

Области применения:

  • Параметризация модулей: Такие как конструкции functor в Standard ML и OCaml
  • Параметризация типов: Реализация через полиморфизм, такие как concepts в C++ и type classes в Haskell

2. Поведение объектов первого класса (First-class citizen behaviour)

Мотивация: Атрибут первого класса позволяет пользователям использовать конструкции так же, как другие значения, позволяя динамически изменять программные конструкции.

Способы реализации:

  • Модули первого класса: Могут манипулироваться как структуры данных
  • Типы первого класса: Механизмы, такие как генераторы типов

Менее изученные концепции

  1. Самозагрузка (Bootstrapping): Самозагрузка языка, устранение представления о неизменяемости языка
  2. Компиляторные хуки (Compiler hooks): Позволяют пользователям внедрять хуки в компилятор
  3. Виртуальные машины (Virtual machines): Предоставляют богатые функции и портативность для экспериментов с языками

Связанные работы

Исследования улучшения расширяемости

  • Daniel Zingaro: Применение концепций Standish (paraphrase, orthophrase, metaphrase) к наборам языков
  • Sebastian Erdweg и Felix Rieger: Предложение структуры Sugar* для рассуждения о расширяемости языков

Проблемы выразительности

  • Philip Wadler: Предложение проблемы выразительности в списке рассылки Java для измерения расширяемости языков программирования

Учебные ресурсы

  • Robert Tennent: "Принципы языков программирования", описание различных компонентов языков
  • Peter Sestoft: "Концепции языков программирования", охватывающие аналогичные темы и решения при проектировании

Заключение и обсуждение

Основные выводы

  1. Важность расширяемости: Расширяемость является ключевым фактором преодоления ограничений языков и содействия разработке, управляемой сообществом
  2. Систематическая структура: Четыре темы (макросы, модули, типы, рефлексия) и два кросс-тематических атрибута предоставляют структурированную структуру для понимания расширяемости
  3. Сбалансированное рассмотрение: Расширяемость должна быть сбалансирована с другими атрибутами качества, такими как производительность, безопасность и предсказуемость

Вызовы и компромиссы

Стоимость расширяемости

  1. Влияние на производительность: Абстракция и расширяемость Java и C# делают их менее производительными, чем C
  2. Риски безопасности: Расширения, разработанные пользователями, могут вводить уязвимости безопасности
  3. Увеличение сложности: Может привести к разбуханию языка и решениям, специфичным для контекста
  4. Утечка абстракции: Абстракции в большинстве языков пропускают детали реализации

Рекомендации по проектированию

  • Расширяемость должна быть интегрированной частью целостного проектирования языка
  • Инженеры языков должны рассмотреть выделенные вызовы
  • Необходимо найти баланс между расширяемостью и другими атрибутами качества

Направления будущих исследований

  1. Углубленное исследование: Концепции, такие как самозагрузка, компиляторные хуки и виртуальные машины, требуют дальнейшего исследования
  2. Развитие теории: Необходимы более четкие определения расширяемости и теоретическая база
  3. Практическое применение: Предоставление более конкретных рекомендаций по проектированию расширяемости для проектировщиков языков

Глубокая оценка

Преимущества

  1. Высокая систематичность: Первый систематический обзор литературы и классификация расширяемости языков программирования
  2. Четкая структура: Предоставление четкой аналитической структуры из четырех тем плюс два кросс-тематических атрибута
  3. Высокая практическая ценность: Предоставление ценных ссылок и рекомендаций для проектировщиков языков
  4. Строгая методология: Применение стандартного метода систематического обзора литературы с прозрачным и отслеживаемым процессом
  5. Широкий охват: Охватывает множество языков и технологий от исторических до современных

Недостатки

  1. Неясность определений: Хотя указывается на неясность определения расширяемости, статья также не предоставляет более точное определение
  2. Недостаток эмпирических данных: Отсутствие количественных эмпирических исследований, в основном опирается на качественный анализ
  3. Критерии оценки: Отсутствие объективных критериев для оценки эффективности различных механизмов расширяемости
  4. Ограничение области: Исключение некоторых важных конференций может привести к пропуску релевантных исследований
  5. Предвзятость исследователя: Анализ, проведенный одним исследователем, может вводить субъективные предубеждения

Влияние

  1. Академический вклад: Предоставление новой исследовательской перспективы и структуры для области исследований языков программирования
  2. Практическая ценность: Важное справочное значение для проектировщиков языков и разработчиков инструментов
  3. Вдохновляющее значение: Может стимулировать более глубокие исследования расширяемости языков
  4. Образовательная ценность: Может служить важным справочным материалом для курсов языков программирования

Применимые сценарии

  1. Проектирование языков: Проектирование новых языков программирования и улучшение существующих
  2. Разработка инструментов: Проектирование механизмов расширения для инструментов разработки, таких как IDE и компиляторы
  3. Академические исследования: Дальнейшие исследования теории и практики языков программирования
  4. Образование и обучение: Разработка курсов и учебных материалов по языкам программирования

Библиография

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

  • Standish (1975): Ранние работы по проектированию расширяемых языков программирования
  • Steele (1998): Важные взгляды на рост языков
  • Различные статьи HOPL: Предоставляющие ценные материалы по истории и идеям проектирования языков

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