转载

关于工作当中系统引擎到底是用手写还是用类似yacc工具编写?

这个问题和朋友,同事都讨论过数次,这里做个总结。

大部分认为用手写。

其实我不反对实际当中这么干的,但要说清楚非要用语法工具编写的原因。

用手写的理由大部分是:

  1. 编写速度快,可以快速上线
  2. 益于其他程序员理解。

就以上两点

  • 首先,我们编写的手撸递归下降程序,可维护性其实十分差,极少人能十分优雅的写出清晰的结构和正确的算法逻辑。
  • 其次,做二次语法升级,三次语法升级的时候往往死掉了,因为修改起来太费劲了,而且实际程序和设计差距肯定会有,那么一点差距,都会导致整套代码重新编写(撸的艺术的排除在外)

实际举个例子。

switch(funcname){    case "ok": call_function(stack.top());    case "failed" : call_function(stack.bottom()); } 

看着很简单的代码 ok 和failed 对栈不同的位置函数名字。

function ok() function failed() 

当然这代码很傻,不过不少引擎里面能看到这样大量的代码。额 ……

但如果客户有要求,我们需要对语法进行缩减并增加可自定义函数。然后你会跟客户说,这样不行阿。需要修改大量的代码。

这时候你突然想起来了,我怎么没有用antlr或者yacc呢。。。只需要改几行代码就ok了。

function functionname '(' paramlist ')' functionbody 

客户想这样

func functionname :paramslist -> functionbody  

你看,鬼才愿意在手撸递归下降的代码里大量的改代码么。。。当然不少大师,还是十分优雅的解决了手撸的问题,比如使用手写生成器生成大部分文法代码,然后具体的细节部分调优采用模板嵌入或者其他的方式。。这个文坑留在以后添。

正文到此结束
Loading...