Build→It 是一个轻量级的基于类型的 C++ Multi-stage programming 框架。可以让你在几乎不了解编译器的情况下轻松实现领域特定语言(domain-specific languages,DSL)。
除了使用运算符重载提取表达式和语句外,该工具还支持提取丰富的数据相关的控制流,如 if-then-else 条件和 for 和 while 循环,并使用新颖的重执行策略来探索程序中的所有控制流路径。
Build→It turns -
templatedyn_var power_f(BT base, ET exponent) { dyn_var res = 1, x = base; while (exponent > 1) { if (exponent % 2 == 1) res = res * x; x = x * x; exponent = exponent / 2; } return res * x; } ... int power = 15; context.extract_function_ast(power_f , static_var >, "power_15", power); ... int base = 5; context.extract_function_ast(power_f , dyn_var >, "power_5", base); ...
into -
int power_15 (int arg0) { int var0 = arg0; int var1 = 1; int var2 = var0; var1 = var1 * var2; var2 = var2 * var2; var1 = var1 * var2; var2 = var2 * var2; var1 = var1 * var2; var2 = var2 * var2; int var3 = var1 * var2; return var3; } int power_5 (int arg1) { int var0 = arg1; int var1 = 1; int var2 = 5; while (var0 > 1) { if ((var0 % 2) == 1) { var1 = var1 * var2; } var2 = var2 * var2; var0 = var0 / 2; } int var3 = var1 * var2; return var3; }
Build→It 使用纯基于库的方法,并且不需要任何特殊的编译器修改,这使得它具有极高的可移植性,并且易于集成到现有的代码库中。使用 Build→It 很简单,只需包含一些头文件,并针对 Build→It 库进行链接。
Build→It 使用声明的变量和表达式类型来确定绑定时间。添加了 2 个新的通用类型 -static_var 和 dyn_var,使用户程序可以分为 2 个阶段。这些类型可以任意嵌套以产生更多阶段的代码。
什么是 multi-stage programming,以及为什么 multi-stage programming 对高性能 DSL 很重要?具体可查看官方发表的一篇论文。