今天進行了畢業設計項目的最后測試,不想再進行修改了。然后,開始回憶關於畢設的一切,發現這是一條由裝逼造就的路。
我的畢業設計項目是用C語言實現一個Scheme解釋器(當然,最后我也只是簡單地實現了基本功能框架而已)。第一次接觸LISP編程語言是在大三第二個學期。當時想學習在Linux下進行C語言編程,需要選擇C語言代碼編輯器,最后選擇了emacs編輯器(選擇emacs是第一件裝逼的事!傳說世上有三種程序員:一是用vim的,一是用emacs的,還有一種是用其他編輯器的。另外通過自定義配置后的emacs界面可以相當地華麗,而通過emacs的快捷鍵可以達到碼字如飛的操作,emacs可以說是程序員的一大裝逼利器)。emacs可以通過自定義配置進行功能擴展,而emacs的配置語言是LISP語言的一個方言Emacs LISP。為了更好的裝逼,我開始看一些LISP在線教程,當然最后也只是了解了個大概。記得當時看到某個帖子說某個大牛的本科畢業設計就是自己動手寫一個LISP語言的解釋器,於是覺得這件一個很裝逼的事,我的本科畢業設計可以考慮這個。
大三暑假時,我去深圳某公司實習兩個月。實習結束后,回到學校就到了每年一度的校園招聘,我開始投身到各個宣講會、筆試和面試現場。在這半年的時間內,我沒有再學習過LISP。到十二月份的時候,工作搞定了,閑着沒事干了,開始考慮畢業設計的事了。因為經常和陳林老師一起踢球,比較熟,便進了陳老師所在的研究組。陳老師給了我兩個關於程序分析方面的題目,看了幾篇陳老師給的論文,感覺很頭疼!於是,半年前那個裝逼的想法又再次浮現在我的腦海中,便提了出來,陳老師也沒有反對,畢設題目就這么定了。
要寫一個LISP解釋器,需要選定某個LISP方言。正好那段時間正看着Paul Graham著的《黑客與畫家》,於是選擇了Common Lisp,便上網下了Common Lisp的教程,結果都是英文版的,而我的英文又不好,只能硬着頭皮一點一點地啃吧(裝逼是需要付出代價的!)。結果學習了半個月左右,發現Common Lisp不是一般的龐大,太復雜了,傷不起!於是,開始轉向一個非常小的Scheme語言,所幸基本語法相差不多。但是這時已將近寒假,於是只能帶着scheme的語言標准R5RS和兩本書(《程序設計語言》和《計算機程序的構造和解釋》)回去慢慢啃scheme的語法。
經過一個寒假的學習,終於對scheme語言有了點一定的了解。在《計算機程序的構造和解釋》的第四章中介紹了用scheme語言本身來實現scheme解析器的實例,第五章又有用寄存器語言實現scheme解釋器的框架實例。於是我就想,如果我按照這上面的實例來實現,那我的畢設也太水了,我便決定用C語言根據自己的設計來實現scheme語言的解析器(又裝逼了!)。
萬事開頭難!開學后的前一段時間,我只是在查資料,看書,構思,完全沒有開始寫代碼的心,不知從何開始,似乎也沒有准備好,於是就拖到了三月中旬。3月11日這天是星期日,由於中午的足球比賽取消了,閑着沒事,下午便到機房開始寫代碼,那天實現了一些基本的數據結構。之后就按照自己的想法,寫一寫,改一改,不知不覺就到了三月底,解釋器的框架已完成,並且可以順利地解釋執行一些簡單的scheme語法結構,但是在進行垃圾回收時遇到了一個很嚴重的Bug(設計問題:對中間臨時對象的管理問題),徘徊了幾天都沒找到好的解決方法。
不幸的是,在29日這天中午踢比賽,結果摔了骨折,動了手術,住了院。修養了兩周后,恢復畢設工作,重新思考之前的錯誤,發現只有重新設計,將代碼從頭改一篇才能夠解決。徘徊一天后,開始從頭設計,從頭修改。帶着傷,不能長時間碼字,修改了好幾天方完畢,最后當然順利解決問題。於是添加了幾個scheme的語法結構的解釋執行以及尾遞歸的處理機制,便草草結束了我的畢設項目。
最后,我的畢設就是這樣由裝逼造就出來的。不過,沒本事裝逼真的很累!