Domain-specific languages (DSLs) are touted as both easy to embed in programs and easy to optimize. Yet these goals are often in tension. Embedded or internal DSLs fit naturally with a host language, while inheriting the host's performance characteristics. External DSLs can use external optimizers and languages but sit apart from the host. We present Sham, a toolkit designed to enable internal DSLs with high performance. Sham provides a domain-specific language (embedded in Racket) for implementing other high-performance DSLs, with transparent compilation to assembly code at runtime. Sham is well suited as both a compilation target for other embedded DSLs and for transparently replacing DSL support code with faster versions. Sham provides seamless inter-operation with its host language without requiring any additional effort from its users. Sham also provides a framework for defining language syntax which implements Sham's own language interface as well. We validate Sham's design on a series of case studies, ranging from Krishnamurthi's classic automata DSL to a sound synthesis DSL and a probabilistic programming language. All of these are existing DSLs where we replaced the backend using Sham, resulting in major performance gains. We present an example-driven description of how Sham can smoothly enhance an existing DSL into a high-performance one. When compared to existing approaches for implementing high-performance DSLs, Sham's design aims for both simplicity and programmer control. This makes it easier to port our techniques to other languages and frameworks, or borrow Sham's innovations "\`a la carte" without adopting the whole approach. Sham builds a sophisticated and powerful DSL construction toolkit atop fundamental language features including higher-order functions, data structures, and a foreign-function interface (FFI), all readily available in other languages. Furthermore, Sham's approach allows DSL developers to simply write functions, either using Sham or generating Sham, without needing to work through complex staging or partial evaluation systems.
翻译:域名语言( DSL) 被形容为容易嵌入程序且容易优化。 但这些目标往往处于紧张状态。 嵌入式或内部 DSL 与主机语言自然匹配, 同时继承主机的性能特性。 外部 DSL 可以使用外部优化和语言, 但与主机不同。 我们提供 Sham, 这是设计内部 DSL 的工具包, 使内部 DSL 能够使用高性能。 Sham 提供了一种域名语言( 在 Racket 中嵌入), 用于实施其他高性能 DSL, 透明地编译到运行代码代码代码代码代码。 ShamSL 既适合用于其他嵌入式 DSL, 也适合以透明的方式替换 DSLF 支持代码。 ShamFF 系统还提供一个框架, 用来定义语言的语协, 用于实施 Shammal 自己的语言接口。 我们通过 Sladmurth 和 Slade DSL 的典型的D 方法, 也可以将SL 用于当前运行, 以及当前运行中的一种快速的系统 。