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

Ric*_*ver 1 compiler-construction scala dynamic cake-pattern

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

我对Scala很新.这是一种公认​​的模式吗?有没有支持呢?在相对简单的依赖情况下使用Guice似乎很疯狂.我可以在应用程序中轻松运行Scala编译器吗?我可以在内存中运行它,它的输出可以从内存中使用而不需要创建不必要的文件吗

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

编辑它发生在微软的Roslyn项目的一个驱动器是为C#和Visual Basic启用这种事情.但即使对于高性能的微软团队来说,这似乎也是一个相当大的项目.

Dav*_*ith 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 "))
Run Code Online (Sandbox Code Playgroud)

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

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