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 (プログラミング言語)
  • 発表日時: 2025年10月15日 (arXiv プレプリント)
  • 論文リンク: https://arxiv.org/abs/2510.13236

要約

本論文は、プログラミング言語の拡張性について深く探究し、従来の言語設計において見落とされることが多い要素に対する論証を提供している。著者は文献レビューを通じて、4つの主要な拡張性テーマ(マクロ、モジュール、型、リフレクション)を特定し、拡張性を促進する多様な戦略を強調している。分析はさらに、パラメータ化と一等市民としての振る舞いなどの横断的属性に拡張され、プログラミング言語構成における カスタマイズと柔軟性の重要性を強調することで複雑性の層を導入している。

研究背景と動機

研究課題

  1. 中心的課題:プログラミング言語の拡張性は言語設計において見落とされることが多く、体系的な研究と総括が不足している
  2. 定義の曖昧性:拡張性の概念は文献において定義が曖昧であり、明確な分類と理解の枠組みが欠けている
  3. 実践的需要:既存のプログラミング言語は新しい要件に直面する際、その不変性によって制限されることが多い

問題の重要性

  1. 言語の限界:従来の見方ではプログラミング言語は不変の成果物と見なされているが、これは言語が新しい要件に適応する能力を制限している
  2. 開発効率:拡張性は開発者の生産性向上と言語の限界を克服するための唯一の手段である
  3. 将来の発展:Guy Steeleなどの学者は、言語の成長のための設計(すなわち拡張性)が将来の言語の基本要素であるべきだと主張している

既存アプローチの限界

  1. 研究の分散:マクロ、リフレクション、関数、モジュールなどの概念は広く研究されているが、主に再利用性、モジュール性、抽象化に焦点が当てられており、拡張性そのものには焦点が当てられていない
  2. 全体的視点の欠如:既存の研究は主に拡張性の改善または実装の詳細に焦点を当てており、拡張性そのものの体系的研究が不足している
  3. 理論的不足:拡張性は抽象化などの概念と比較して、明確な定義と理論的基礎が不足している

核心的貢献

  1. 体系的分類:文献レビューを通じて4つの核心的拡張性テーマ(マクロ、モジュール、型、リフレクション)を特定
  2. 横断的属性:2つの重要な横断的属性(パラメータ化と一等市民としての振る舞い)を発見・分析
  3. 理論的枠組み:プログラミング言語の拡張性を理解するための構造化された枠組みを提供
  4. 実践的指導:将来の言語設計者に対して、言語の拡張性を評価・検討するための指導を提供
  5. 研究ギャップの特定:ブートストラップ、コンパイラフック、仮想マシンなど、比較的探索されていない概念を指摘

方法の詳細

研究方法

本論文は、Kitchenhamらによって定義されたプロセスに従う体系的文献レビュー方法を採用し、グラウンデッド・セオリー(根拠理論)のデータコーディング方法と組み合わせている。

文献収集戦略

初期文献セット

  • データソース:言語工学関連の10の会議および学術誌
  • 会議:HOPL、POPL、PLDI、CGO、DLS、GPCE、Onward、SLE、TOPLAS、PACMPL
  • 初期規模:7,090論文
  • 除外戦略:特定の言語パラダイムに焦点を当てた会議を除外

スクリーニングプロセス

  1. キーワードスクリーニング:19の関連論文から65のキーワードを抽出し、19の追加キーワードを生成
  2. タイトルスクリーニング:キーワードを論文タイトルと比較し、648論文に絞り込み
  3. 要約スクリーニング:キーワードを要約と結論と比較し、さらに223論文に絞り込み
  4. 品質評価:拡張性を説明または議論しているかどうかに基づいて、高度に関連性のある論文(69論文)と部分的に関連性のある論文(64論文)に分類

データ抽出と統合

  • 抽出方法:すべての定性的記述と拡張性に関する議論を抽出
  • 統合方法:グラウンデッド・セオリーのデータコーディング方法を借用し、帰納的方法を採用して分類体系を開発
  • 反復的改善:新しい情報を発見した際に分類を継続的に改善・再評価

実験設定

データセットの特性

  • 全体規模:初期7,090論文
  • 時間範囲:2022年秋に収集されたデータ
  • 最終分析:133の関連論文(高度に関連性のある69論文 + 部分的に関連性のある64論文)

品質評価基準

主要質問

  • 論文は拡張性について議論しているか?(直接的または間接的に)
  • 論文は拡張性の概念について議論しているか?

副次質問

  • 論文は特定の拡張性の概念について議論しているか?
  • 論文は特定の言語と拡張性について議論しているか?

分析枠組み

帰納的方法を採用してテーマを特定し、継続的な比較と分類の細分化を通じて、最終的に4つの主要テーマと2つの横断的属性の枠組みを形成。

実験結果

主要な発見:4つの核心的テーマ

1. マクロ (Macros)

動機:マクロにより、言語ユーザーはほぼ任意の構文形式の新しい制御メカニズムを作成でき、拡張性を向上させることができる。

タイプ分類

  • 字句マクロ:文字列ベースの変換、構文に依存しないが構文安全性を保証しない
  • 構文マクロ:抽象構文木(AST)を操作し、構文安全性を保証
  • 意味マクロ:型チェックなどの意味分析を提供

代表的な実装

  • Racket:モジュール化された構文システム
  • CPP:C言語の字句マクロエンジン
  • LISP:構文マクロシステム
  • C++:テンプレートとコンセプト(マクロのような機能)

2. モジュール (Modules)

動機:モジュールはコードを構造化するために使用され、ユーザーがコードをグループ化して、ドメイン固有言語またはフレームワークをパッケージとして提供することを可能にする。

型システム

  • 存在型:一等モジュールを許可するが実装詳細を隠蔽
  • 依存型:完全に透過的
  • 明示的型:両者の間で折衷案を提供

設計上の考慮事項

  • 階層構造と依存関係
  • ネストされたモジュールの処理
  • 循環依存の解決

3. 型 (Types)

動機:型システムにより、ユーザーは言語内で保証を行うことができ、多態性とジェネリックプログラミングなどの属性と組み合わせることで、プログラム開発の予測可能性と安全性を提供する。

多態性の分類

  • アドホック多態性:型はパラメータに依存
  • ユニバーサル多態性
    • パラメータ多態性:任意の型をパラメータとして許可
    • サブタイプ多態性:型の置換を許可

ジェネリックプログラミング

  • 異なる実装方式:仮想マシンサポート(C#)対型消去(Java)
  • 構造的マッチング:ML、C++、OCamlなど

4. リフレクション (Reflection)

動機:リフレクションにより、ユーザーは他のプログラミング構成をプログラム的に修正でき、元々は修正不可能だった概念の修正可能性と柔軟性を向上させる。

能力範囲

  • プログラムの自己検査と修正
  • クラスのクローンと拡張
  • 仮想マシンの明確なインターフェース提供

課題

  • パフォーマンスコスト
  • カプセル化の破壊
  • メタ安定性の問題

横断的属性

1. パラメータ化 (Parametricism)

動機:パラメータ化は構成のカスタマイズ能力を向上させ、より多くの再利用と抽象化を実現する。

応用領域

  • モジュールパラメータ化:Standard MLおよびOCamlのfunctor構成など
  • 型パラメータ化:C++のconceptsや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. 体系的枠組み:4つのテーマ(マクロ、モジュール、型、リフレクション)と2つの横断的属性は、拡張性を理解するための構造化された枠組みを提供する
  3. バランスの取れた検討:拡張性は、パフォーマンス、安全性、予測可能性などの他の品質属性とのバランスを必要とする

課題と権衡

拡張性の代価

  1. パフォーマンスへの影響:JavaおよびC#の抽象化と拡張性により、C言語よりもパフォーマンスが低下
  2. セキュリティリスク:ユーザー開発の拡張機能はセキュリティ脆弱性をもたらす可能性がある
  3. 複雑性の増加:言語の膨張と文脈固有のソリューションをもたらす可能性がある
  4. 抽象化の漏洩:ほとんどの言語における抽象化は実装詳細を漏らす

設計上の推奨事項

  • 拡張性は言語設計全体の統合部分であるべき
  • 言語エンジニアは指摘された課題を検討すべき
  • 拡張性と他の品質属性の間でバランスを見つける必要がある

将来の方向性

  1. 深い探究:ブートストラップ、コンパイラフック、仮想マシンなどの概念はさらなる研究が必要
  2. 理論の発展:拡張性のより明確な定義と理論的基礎が必要
  3. 実践的応用:言語設計者に対してより具体的な拡張性設計ガイダンスを提供

深度評価

強み

  1. 体系性が強い:プログラミング言語の拡張性に関する初めての体系的文献レビューと分類
  2. 枠組みが明確:4つのテーマと2つの横断的属性の明確な分析枠組みを提供
  3. 実用価値が高い:言語設計者に対して価値のある参考資料とガイダンスを提供
  4. 方法が厳密:標準的な体系的文献レビュー方法を採用し、プロセスが透明で追跡可能
  5. カバー範囲が広い:歴史から現代まで、多様な言語と技術を網羅

不足

  1. 定義の曖昧性:拡張性定義の曖昧性を指摘しているが、本論文もより正確な定義を提供していない
  2. 実証的不足:定量的な実証研究が不足しており、主に定性分析に依存
  3. 評価基準:異なる拡張性メカニズムの効果を評価するための客観的基準が不足
  4. 範囲の制限:一部の重要な会議を除外したため、関連研究を見落とした可能性がある
  5. 研究者バイアス:単一の研究者による分析は主観的バイアスをもたらす可能性がある

影響力

  1. 学術的貢献:プログラミング言語研究分野に新しい研究視点と枠組みを提供
  2. 実践的価値:言語設計者とツール開発者に対して重要な参考価値を持つ
  3. 啓発的意義:言語拡張性に関するさらなる深い研究を刺激する可能性がある
  4. 教育的価値:プログラミング言語コースの重要な参考資料として機能

適用シーン

  1. 言語設計:新しいプログラミング言語の設計と既存言語の改善
  2. ツール開発:IDE、コンパイラなどの開発ツールの拡張メカニズム設計
  3. 学術研究:プログラミング言語理論と実践のさらなる研究
  4. 教育訓練:プログラミング言語コースと訓練資料の開発

参考文献

論文は135の参考文献を含み、プログラミング言語の歴史、設計原理、具体的な実装など複数の側面をカバーしており、拡張性研究に対して包括的な文献基盤を提供している。主要な参考文献には以下が含まれる:

  • Standish (1975):拡張可能なプログラミング言語設計に関する初期の研究
  • Steele (1998):言語成長に関する重要な見方
  • 様々なHOPL論文:言語の歴史と設計思想に関する貴重な資料を提供

総合評価:これは高品質の総説論文であり、プログラミング言語の拡張性研究に対して重要な理論的枠組みと実践的ガイダンスを提供している。いくつかの限界は存在するが、その体系的なアプローチと明確な分析枠組みにより、この分野への重要な貢献となっている。言語設計者、研究者、学生にとって重要な参考価値を持つ。