今天对比了一下这三个颇有代表性的规则引擎的规则语言。其中Ilog是商业产品,没有机会实战。
2.1 Drools的XML框架+Java/Groovy/Python嵌入语言
2.2 ILog的IRL(ILog Rule Language)
文档称IRL的语法是Java Syntax-like的,但我怎么也看不出两者是相同的。不过他因为是商业产品,有很强大的编辑器和管理工具,编写规则的速度应该不坏。
;Facttemplates (deftemplateairplane(slotname)) (deftemplatejet extends airplane) (deftemplateprop extends airplane); Rules (defrulecan - use - grass - runway (prop(name ? n)) => (printoutt " Aircraftcanusegrass- " ? ncrlf)) (defrulecan - use - asphalt - runway (airplane(name ? n)) => (printoutt " Aircraftcanuseasphalt- " ? ncrlf)) |
3.客户使用的规则语言
如果客户可以自己任意编写规则,无疑是产品一个很大的卖点。大部分客户都会喜欢这样一个玩具。而且也只有把规则编写交给客户,才能达到规则引擎的全部意义。
3.1 Drools的 DSL
Drools的最新版Drools2.0Rc2里,House和Conways game of Live两个例子有DSL的版本
对比一下Java版本,效果如下:
< house:room name ="calvin" >
< house: 温度 >
< house:greater-than scale ="摄氏" > 20 </ house:greater-than >
</ house:温度 >
</ house:room >
</ house:condition >
vs 但这种XML Base的DSL语法其实好不了多少,而且实现的代价一点不少,要自己实现Conditons和Consequence Factory类,自行解释那段XML,基本上没有什么便利的底层支持。
其实,一不做二不休,干脆用Antlr来定义真正的DSL,同样是实现Conditons和Consequence Factory类可能更好。只不过解释XML人人都会,Antlr就比较少人用而已。
room.getName().equals("calvin")
< java:condition >
< java:condition >
convertToCelsius(room.getTemperature())>20
< java:condition >
3.2 ILog的BAL(Business Action Language)--最完美的王者?
没有实际用过,只能看文档过过瘾。从文档来看,配合Ilog的编辑器,的确就是很完美的规则语言了。
thecalldestinationnumberisthepreferrednumber
Then
applythepreferrednumberrate
Drools是最活跃的开源规则引擎,一路高歌猛进;
Jess是Clips的java实现,就如JRuby之于Ruby,是AI系的代表。