为何在Drools中使用MVEL

 

为何在Drools中使用MVEL <o:p></o:p>

作者: Mark Proctor <o:p></o:p>

我目前正在努力工作以实现插件式的语言系统,它与Drools2.0中的语义模块有些类似。使用这种系统,人们可以用任何他们喜欢的语言来编写Drl语言实现,可以用这种语言建立他们的断言、返回值、Eval和推论。我们将支持两种语言实现:JavaMVELhttp://mvel.codehaus.org/当然大家问的第一个问题会是为什么选择MVEL而不是GroovyJython等等,我将原因列举如下:<o:p></o:p>

  • 反射/字节码(JIT)编译和执行模式<o:p></o:p>
    • 对于大型系统,我们需要避免产生过多的字节码,但是对于性能敏感区域字节码仍然是一个选择<o:p></o:p>
  • 快速反射模式<o:p></o:p>
    • 我们最开始使用自己的语言JFDI,它被设计成一个简单并且快速的基于反射的语言,核心是所有的工作在编译时已经完成,运行时只是一系列的反射调用。这一设计已经完全在MVEL中实现,因此它的反射性能非常好。而其它语言放弃反射模式使用字节码来获得合理的性能。<o:p></o:p>
  • 插件式转换器<o:p></o:p>
    • 字典式转换太慢,MVEL可以通过提供的转换器直接解决这个问题,这样我们可以用数组提升性能。<o:p></o:p>
  • 规模<o:p></o:p>
    • MVEL 当前小于 350K<o:p></o:p>
  • 自定义的语言扩展<o:p></o:p>
    • MVEL扩展了语言,通过特殊代码块嵌入以支持对规则友好的构建。因此我可以将“modify (person) ( age += 1, location = "london" )”作为一个事务模块看待,这样我可以在整个模块的前后运行拦截机制。这使得宏的应用更为简单,我们可以定义我们自己的关键字并将它扩展到MVEL代码中。<o:p></o:p>
  • 静态类型/推断类型或者动态模式<o:p></o:p>
    • 变量可以被无类型化并完全动态进行<o:p></o:p>
    • 变量可以是静态类型或者类型能够被推断,支持Casting<o:p></o:p>
    • 对于类型模式可以选择验证器,不允许动态变量并且确认所有类型和方法调用都是正确的,这有助于:<o:p></o:p>
      • 编制时间校验器<o:p></o:p>
      • 代码补完<o:p></o:p>
      • 重构<o:p></o:p>
  • 支持可配置的语言特性<o:p></o:p>
    • 语言特性可以被关闭<o:p></o:p>
    • 我们不想在“then”部分强制使用流结构,没有‘if’‘switch’等等。规则应该是宣告式的,‘何时做那件事’而不是‘何时可能做那件事’<o:p></o:p>

MVEL遵从BSF(脚本语言框架),不久也将会支持ELJSP 2.0 表达式标准实现)。MVEL已经是EL的超集,但是它仍然不支持一些深奥的特性如用不同的方式表达等式

<o:p>补充一点:MVEL对比OGNL在某些情况下有10倍以上的性能提升</o:p>

<o:p> </o:p>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值