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

Extensibility in Programming Languages: An overview

基本信息

  • 论文ID: 2510.13236
  • 标题: Extensibility in Programming Languages: An overview
  • 作者: Sebastian Mateos Nicolajsen (IT University of Copenhagen)
  • 分类: cs.PL (Programming Languages)
  • 发表时间: 2025年10月15日 (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. 关键词筛选:从19篇相关论文中提取65个关键词,生成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)

动机:参数化增加构造的定制化能力,实现更多重用和抽象。

应用领域

  • 模块参数化:如Standard ML和OCaml的functor构造
  • 类型参数化:通过多态性实现,如C++的concepts和Haskell的type classes

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论文:提供了语言历史和设计思想的宝贵资料

总体评价:这是一篇高质量的综述论文,为编程语言可扩展性研究提供了重要的理论框架和实践指导。虽然存在一些局限性,但其系统性的方法和清晰的分析框架使其成为该领域的重要贡献。对于语言设计者、研究者和学生都具有重要的参考价值。