[论文解读] Compiling Language Definitions: The ASF+SDF Compiler
本文提出 ASF+SDF 编译器,可将用 ASF+SDF 元语言编写的高级语言定义转换为高度优化的 C 代码。通过利用最大子项共享(哈希合并)和直接 C 代码生成,该编译器实现了卓越性能——与函数式语言和重写语言编译器相比,性能相当或更优——从而能够高效执行包含多达 10,000 条规则和一百万个以上节点的大规模语言定义。
The ASF+SDF Meta-Environment is an interactive language development environment whose main application areas are definition of domain-specific languages, generation of program analysis and transformation tools, production of software renovation tools, and general specification and prototyping. It uses conditional rewrite rules to define the dynamic semantics and other tool-oriented aspects of languages, so the effectiveness of the generated tools is critically dependent on the quality of the rewrite rule implementation. The ASF+SDF rewrite rule compiler generates C code, thus taking advantage of C's portability and the sophisticated optimization capabilities of current C compilers as well as avoiding potential abstract machine interface bottlenecks. It can handle large (10 000+ rule) language definitions and uses an efficient run-time storage scheme capable of handling large (1 000 000+ node) terms. Term storage uses maximal subterm sharing (hash-consing), which turns out to be more effective in the case of ASF+SDF than in Lisp or SML. Extensive benchmarking has shown the time and space performance of the generated code to be as good as or better than that of the best current rewrite rule and functional language compilers.
研究动机与目标
- 开发一种高性能的 ASF+SDF 语言定义编译器,以支持复杂的程序分析、转换和软件重构任务。
- 通过生成高效、可移植的 C 代码,解决项重写系统中解释执行带来的性能瓶颈。
- 实现对大规模语言定义(最多 10,000 条规则)和巨大项结构(超过一百万个节点)的可扩展处理。
- 通过最大子项共享提升运行时效率,减少内存使用并加速项相等性检查。
提出的方法
- 将 ASF+SDF 语言定义直接编译为可移植的优化 C 代码,以利用 C 编译器的优化能力并避免虚拟机开销。
- 采用基于最大子项共享(哈希合并)的运行时存储方案,以最小化内存分配并加速项比较。
- 使用条件重写规则、关联列表和默认规则来表达语言定义中的复杂语义和控制流。
- 集成 ATerm 库以高效表示和操作项,支持严格和惰性求值模式。
- 通过内存和时间密集型工作负载(如 evalexp、evaltree)进行基准测试,评估在压力下的性能表现。
- 对 ASF+SDF 编译器自身进行自编译,以验证工具链并测量其在真实世界大规模定义中的性能表现。
实验结果
研究问题
- RQ1从高级语言定义语言直接编译到 C 的方法,是否能实现与现有函数式语言和重写语言编译器相当或更优的性能?
- RQ2最大子项共享在大规模项重写系统中,对减少内存使用和提升项相等性性能方面有多大的有效性?
- RQ3生成的 C 代码在不出现性能下降的情况下,能够多大程度上处理大规模语言定义(例如 10,000 条以上规则)和巨大项结构(例如一百万个以上节点)?
- RQ4直接 C 代码生成与高效项存储的结合,是否能实现优于解释执行或基于虚拟机执行的性能?
- RQ5在内存密集型工作负载下(如需要惰性求值和高项复用),该编译器能否实现有效扩展?
主要发现
- ASF+SDF 编译器生成的 C 代码在时间和空间效率方面,与当前最佳的函数式语言和重写语言编译器相比,性能相当或更优。
- 最大子项共享显著减少了内存使用量——最高可达 90%——并在内存密集型基准测试(如 evaltree)中提升了性能。
- 该编译器成功处理了大规模定义:ASF+SDF 编译器在启用共享的情况下自编译耗时 216 秒,而关闭共享时为 661 秒,内存使用量从 117 MB 降至 16 MB。
- Risla 展开器在启用共享的情况下耗时 9 秒(无共享时为 18 秒),仅使用 8 MB 内存,展示了其在领域特定语言处理中的可扩展性。
- 在 evaltree 基准测试中,只有 ASF+SDF 配合最大子项共享能扩展至 n=20 以上,且内存使用保持可接受,而其他系统在此时已失败。
- 执行时间对比显示,仅 Clean(惰性)在部分基准测试中优于 ASF+SDF,但差异极小,证实了 ASF+SDF 具有极强的竞争力。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。