Scala:蛋糕模式的懒惰烘焙和运行时编译

时间:2012-06-16 14:41:58

标签: scala dynamic compiler-construction cake-pattern

蛋糕模式的一个重大局限是它的静电。我希望能够完全独立地混合使用由不同编码器编写的特征。然而,的特征需要经常混入。在运行主应用程序之前,用户将有一个初始化屏幕,用于选择特征/组件。所以我想到了为什么不在用户选择选择模块中混合和编译所选择的特征。如果编译失败,用户只会收到一些消息 - 不兼容的程序集或者什么都没有问题。如果编译成功,那么顶级UI模块将使用程序集的预编译部分加载新编译的类并运行主应用程序。注意,在运行时初始化期间可能只需要编译一个或两个类。所有其余的代码都可以正常编译。

我对Scala很新。 这是一种公认​​的模式吗?是否有任何支持?看来狂必须使用吉斯一个相对简单的依赖局面。 我可以在应用程序中轻松运行Scala编译器吗?我可以在内存中运行它,并且可以从内存中使用它的输出而不需要创建不必要的文件吗?

注意:虽然看似动态,但这种方法仍然是 100%静态。

编辑它是因为微软Roslyn项目的其中一个驱动器就是为C#和Visual Basic启用这种功能。但即使对于一个高效的微软团队来说,这似乎也是一个非常大的项目。

1 个答案:

答案 0 :(得分:6)

直接从Scala中调用编译器是可行的,但不适用于胆小的。幸运的是,Twitter上的好人已经为您自动化了这个过程。 (140个角色的名人微博,以及一些很酷的Scala实用程序!感谢Twitter。)您可以使用com.twitter.utils.Eval类来编译和评估Scala字符串。在您的示例中,您将执行类似

的操作
val eval = new Eval()
val myObj = eval[BaseClass]("new BaseClass extends " + traitNameList.mkString(" with "))

这将创建一个具有您想要内置的所有特征的新对象。然后出现这个问题是否是一个好主意。缺点:

  • 调用Scala编译器不是很快
  • 如果你这么做,你将重载PermGen空间,因为你创建的类永远不会被垃圾收集
  • 这实际上更像是你想要一种动态语言而不是Scala。你可能会找到各种各样有用的地方,但与你的其他建筑发生冲突(是的,这很模糊)。