關於工作當中系統引擎到底是用手寫還是用類似yacc工具編寫?
這個問題和朋友,同事都討論過數次,這裡做個總結。
大部分認為用手寫。
其實我不反對實際當中這麼幹的,但要說清楚非要用語法工具編寫的原因。
用手寫的理由大部分是:
- 編寫速度快,可以快速上線
- 益於其他程式設計師理解。
就以上兩點
- 首先,我們編寫的手擼遞迴下降程式,可維護性其實十分差,極少人能十分優雅的寫出清晰的結構和正確的演算法邏輯。
- 其次,做二次語法升級,三次語法升級的時候往往死掉了,因為修改起來太費勁了,而且實際程式和設計差距肯定會有,那麼一點差距,都會導致整套程式碼重新編寫(擼的藝術的排除在外)
實際舉個例子。
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
你看,鬼才願意在手擼遞迴下降的程式碼裡大量的改程式碼麼。。。當然不少大師,還是十分優雅的解決了手擼的問題,比如使用手寫生成器生成大部分文法程式碼,然後具體的細節部分調優採用模板嵌入或者其他的方式。。這個文坑留在以後添。
相關文章
- 用 GoLang 編寫類似 Apache Camel 路由引擎GolangApache路由
- WMI 應用——用 VBScript 編寫類似 ipconfig 的工具_終南的IT空間
- java工具類編寫思考Java
- 到底是用"靜態類"還是單例單例
- 分散式系統關注點——先寫DB還是「快取」?分散式快取
- mamute是一個類似stackoverflow的Q&A問答系統Java引擎Java
- 面試關於 MySQL 的編寫面試MySql
- [20160314]關於sql寫法問題使用=還是用inSQL
- 基於MessageDigest類編寫MD5通用工具類
- Wez:Rust編寫的類似Powershell的終端模擬器Rust
- 關於Java中類似於Portal starter的專案Java
- 關於寫作那些事之終於還是無法忍受純人工統計資料
- 寧願編寫程式碼?還是把事情都寫下來吧!
- Datafaker是用於生成類似生產資料的工具 – jworks.io
- (七)系統通用元件編寫元件
- 如何編寫 C++ 遊戲引擎C++遊戲引擎
- 寫了一個 SRE 除錯工具,類似一個小木馬除錯
- 不當編寫SQL語句導致系統不安全(轉)SQL
- 不當編寫SQL語句導致系統不安全 (轉)SQL
- 該寫的總結還是要寫
- gmcache一個用go寫的分散式快取,類似memcachedGo分散式快取
- 當我寫程式碼時 我寫的是
- 程式碼是寫在Routing中還是專門寫程式處理呢?
- 【安卓筆記】硬碟快取工具類的編寫安卓筆記硬碟快取
- 關於寫作工具和平臺的思考
- 用JavaScript中lodash編寫雙色球JavaScript
- 區塊鏈遊戲到底是投資工具,還是遊戲?區塊鏈遊戲
- 編寫還可以的php 圖片上傳類程式碼PHP
- 自己動手寫類似酷狗播放器(4)_系統托盤的顯示播放器
- 檢視當前作業系統是ubuntu還是centos作業系統UbuntuCentOS
- 如何利用Capstone引擎寫一個Android反彙編工具Android
- 轉: 關於oracle 是按照寫入順序還是ROWID順序取資料Oracle
- 用PYTHON初次編寫小工具心得Python
- 網路請求回撥的Block中,到底是用weakSelf還是用self?BloC
- Aero:用rust編寫的新現代作業系統Rust作業系統
- 【譯】JavaScript的工作原理:V8引擎內部+關於如何編寫優化程式碼的5個技巧JavaScript優化
- 編寫公司DBA工作規範
- 用JavaScript中jQuery編寫放大鏡效果JavaScriptjQuery