星期日, 2月 16, 2014

CPPGM

http://www.cppgm.org/

這陣子除了工作以外,最有意義的活動就是參加了CPPGM,挑戰一人徒手打造standard compliant C++ toolchain。不需要做優化,只針對linux x64 platform,但禁一切3rd party code的使用,只能用GCC和GCC附帶的東西。這和一人帶一把小刀去和整個軍隊單挑一樣愚蠢,可是我還是很熱血的報了。還支撐到PA7通過....

最後陣亡並不是因為PA8時間到寫不出來,而是因為累了,加上要去國外報paper,準備專科考試等眾多因素,實在沒辦法挪出多餘的時間和體力去應付這需求越來越膨脹的怪物。

活動只有越變越難,一開始是寫tokenizer之類的小東西,後來慢慢把整個preprocessor弄出來,接下來開始parse完整的C++ grammar,然後PA7開始慢慢加入syntax analysis。我掛掉的PA8是要求模擬linking產生fake image。接下來的題目是真正的code generation和完整實作C++除了STL以外的東西(statement, expression, class, template....要產生Linux X64 ELF的樣子QQ)。

PA1在寫tokenizer的時候,自己去Google了paper把regular expression自己實作出來,覺得好有挑戰性啊XD。開始做preprocessor的時候又覺得照paper寫regular expression相比之下是無腦小事。開始寫parser generator的時候又覺得前面並沒那麼難。開始做name lookup, 抓ambiguity這些事的時候,又覺得寫parser generator其實也挺快樂的XD。開始產生fake image的時候就累了,退出orz

最後的結果,扣掉中間一些小單元測試和parser generator生出來的code的話,約一萬八千行,加上parser generator幫我生的code就三萬行,其實只能算中規模的C++ project,跟GCC幾百萬行比起來真是遜爆了XD

做CPPGM收穫不少,首先,雖然這個大師課並沒有老師手把手的教東西,不過確實也學到很多。寫的過程中,畢生所有知道的design pattern還有技巧全部都用上了,至少在code成長到一萬八千行,每個unit的藕合性等等還可以看,debug起來還不至於陷入無底深淵。C++、除錯、程式架構的功力算是有長足的進步。再來,寫CPPGM填補了我內心中當初想走二類組的願望。不只讓人體驗到寫程式,還體驗到吐出來XD。現在內心的「不甘願」確實少了很多XD

CPPGM寫作過程之中也再度發現自己的罩門:我對advance c++、除錯、組合語言,作業系統等認知不足。我從頭到尾都用cout在debug,gdb完全不會用。但cout debug法只要project稍微一大就會遇到很多困難。現在程式架構清楚的時候還勉強堪用。以後把expression, statement, class, template那些全加進來應該就會完全不夠。對作業系統和組合語言不懂,將來做code generation的時候應該會無比困難。不熟template,以後做相關功能的時候應該就會吃鱉,放下CPPGM以後,鑽研advance C++,除錯,組語,作業系統...的慾望大了不少。


放棄CPPGM雖然可惜,不過人生也恢復成彩色的。突然有好多時間和體力可以在家做醫院的事情,有好多閒情逸致可以看技術書籍,卡通和漫畫,好多時間彈鋼琴XD,但也同時伴隨著失去目標的迷茫感。接下來要挑戰甚麼呢? 全文連結