什么时候应该使用Rosette的浅层嵌入与深层嵌入进行程序综合?

时间:2018-12-10 04:59:30

标签: racket rosette

Rosette的某些教程介绍了使用shallow embedding的程序综合以及其他使用deep embedding的程序。

在阅读了Torlak et Bodik的"Growing Solver-Aided Languages with ROSETTE"之后,似乎浅层嵌入对于快速原型设计是有好处的(因为它不需要定义DSL和解释器),而深层嵌入对于进行具有更强正确性保证的查询是有好处的。这是决定使用哪种嵌入的良好经验法则吗?

使用Rosette的浅层嵌入与深层嵌入进行程序综合的充分理由是什么?

1 个答案:

答案 0 :(得分:6)

作为一般经验法则,浅嵌入最适合使用求解器来搜索程序处理的值的应用程序,这对于程序验证和天使执行来说是很典型的。

如果要进行程序综合并搜索(表示值的)代码,则深层嵌入是最佳选择。

如果您的应用程序将仅搜索常量,则浅嵌入可能是程序综合的不错选择。但是,如果您要搜索更复杂的内容(例如表达式或语句),则深层嵌入是解决之道。

通过浅层嵌入,您对Rosette搜索的程序空间的控制有限。基本上,您只能使用Rosette基于宏的草图构造进行编码的任何东西。这些允许您定义基本的搜索空间并编写快速的原型,但是如果您想构建一个可扩展的工具,则需要对搜索空间进行严格控制。

通过深度嵌入,您可以完全控制要搜索的程序的空间。本质上,您可以编写任意的Rosette / Racket函数来生成表示所有要搜索的具体程序的符号程序。然后,您还可以完全控制最后一步,即代码生成。一旦Rosette返回表示您深层嵌入的程序的值(例如AST),就可以对其进行处理,但要生成代码。通过浅层嵌入,您将只能使用Rosette的内置代码生成器。

因此,总而言之,如果您正在或计划进行综合,请使用深层嵌入。对于其他所有内容(验证和天使执行),浅层嵌入将更容易,更快。