關於工作當中系統引擎到底是用手寫還是用類似yacc工具編寫?

趙年峰發表於2015-07-17

這個問題和朋友,同事都討論過數次,這裡做個總結。

大部分認為用手寫。

其實我不反對實際當中這麼幹的,但要說清楚非要用語法工具編寫的原因。

用手寫的理由大部分是:

  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 

你看,鬼才願意在手擼遞迴下降的程式碼裡大量的改程式碼麼。。。當然不少大師,還是十分優雅的解決了手擼的問題,比如使用手寫生成器生成大部分文法程式碼,然後具體的細節部分調優採用模板嵌入或者其他的方式。。這個文坑留在以後添。

相關文章