作者:量子位
鏈接:https://www.zhihu.com/question/26436364/answer/937824533
來源:知乎
著作權(quán)歸作者所有沪羔。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)蠕搜,非商業(yè)轉(zhuǎn)載請注明出處泰涂。
文本編輯器
不使用GUI框架中內(nèi)置的文本框組件缴挖,要如何搭建支持光標移動究抓、選擇、插入和刪除操作的文本框笔链?
這個項目中纱注,存在兩個主要挑戰(zhàn):
- 如何將文本文檔存儲在內(nèi)存中
- 學(xué)習(xí)文本光標在流行的編輯器中的行為
不要小看這些基礎(chǔ)的功能,其中有許多細節(jié)值得注意税稼。比如當光標位于文本當中烦秩,按下向上箭頭,光標會移動到何處郎仆?
[圖片上傳失敗...(image-531e3e-1578808750433)]
△圖源:Austin Z. Henley
如果你覺得這太簡單只祠,還有進階測試:
- 撤銷/重做
- 自動換行
最后總結(jié)一下知識要點:
- 用于存儲文本的數(shù)據(jù)結(jié)構(gòu):數(shù)組,rope扰肌,gap buffer抛寝,piece table
- 文本光標的行為和實現(xiàn)
- 撤銷/重做的設(shè)計模式:記憶,命令
- 分離文本視覺和記憶的抽象
別忘了還有拓展閱讀喲:
2D游戲-太空侵略者
即使是最簡單的游戲也需要考慮數(shù)據(jù)結(jié)構(gòu)和設(shè)計模式。
在這個項目中盗舰,你的任務(wù)是從頭到尾實現(xiàn)一個定義明確的游戲晶府。最好使用SDL,SFML钻趋,PyGame這樣的2D圖形庫川陆。
第一步,創(chuàng)建對象移動的效果蛮位。
第二步较沪,了解有關(guān)游戲循環(huán)的所有信息。游戲?qū)嶋H上是在繪圖失仁、獲取用戶輸入和處理游戲邏輯之間循環(huán)购对。
第三步,處理用戶輸入陶因。
第四步,學(xué)習(xí)如何創(chuàng)建和管理所有游戲?qū)ο蠹捌錉顟B(tài)垂蜗。比如如何生成動態(tài)數(shù)量的敵人楷扬。
第五步,學(xué)習(xí)如何應(yīng)用游戲的邏輯贴见。子彈頭位置何時更新?什么時候會有更多敵人出現(xiàn)在屏幕上?怎么判定敵人被干掉了稿黍?游戲何時結(jié)束暇番?
甚至,在進階階段档悠,你還可以考慮引入AI廊鸥,來制造更加“智能”的敵人。
編譯器-Tiny BASIC
從頭開始編寫一種非常小的類似于BASIC的語言編譯器辖所,然后將其編譯為任何其他語言惰说。比如,用Python編寫可以輸出C#代碼的Tiny BASIC編譯器缘回。
△圖源:Austin Z. Henley
知識點:
- 詞法分析
- 句法分析
- 遞歸下降解析
- 抽象語法樹
- 語義分析
- 優(yōu)化passes
- 代碼生成
迷你操作系統(tǒng)
從這個項目開始吆视,難度就加大了。
操作系統(tǒng)依賴于硬件酥宴,因此入門門檻比較高啦吧。但這個項目可以幫助你更好地理解計算機底層都發(fā)生了什么。
作者亨利推薦了一本免費電子書《使用Rust構(gòu)建RISC-V操作系統(tǒng)》作為入門教材(地址見文末)拙寡。
△圖源:Austin Z. Henley
知識點:
- 交叉編譯
- Bootloading
- BIOS中斷
- x86模式
- 內(nèi)存管理和分頁
- 排程(Scheduling)
- 文件系統(tǒng)
如果以上四個項目授滓,你都覺得so easy,那么就來嘗試一下最后這兩個高難度項目吧。
電子表格
電子表格應(yīng)用程序(如Excel)將文本編輯器和編譯器的挑戰(zhàn)結(jié)合在了一起褒墨。
在這個項目中炫刷,你需要學(xué)會如何在內(nèi)存中表示單元格內(nèi)容,并實現(xiàn)用于方程式的編程語言解釋器郁妈。
電子游戲機模擬器
這是一個操作系統(tǒng)+編譯器的二合一挑戰(zhàn)項目浑玛。
挑戰(zhàn)內(nèi)容是,編寫一個虛擬機噩咪,讓虛擬機可以像真實的CPU和其他硬件組件一樣運行顾彰。
亨利的建議,是從簡單的虛擬控制臺入手胃碾,比如CHIP-8涨享。
網(wǎng)友建言獻策
博客一出,在Hacker News仆百、Reddit上受到了廣大碼農(nóng)們的歡迎厕隧。
有網(wǎng)友說:
這些項目能讓我接觸到完全不同的領(lǐng)域和問題,比我日常的工作更能激勵我俄周。
并且吁讨,網(wǎng)友們紛紛建言獻策,又推舉出好幾個優(yōu)質(zhì)上手項目:
- 從零搭建數(shù)據(jù)庫
- 光線追蹤器
- 矢量圖形編輯器
- 圖像解碼器
- 網(wǎng)頁聊天室
- pi計算器的位數(shù)
- 通用終端實用程序(如grep)
- FTP客戶端和服務(wù)器
所以峦朗,這些項目是否激發(fā)了你的靈感建丧?
Talk is cheap. Show me the code. 快動手練起來吧~
傳送門
博客地址:
http://web.eecs.utk.edu/~azh/blog/challengingprojects.html
Hacker News討論(內(nèi)含更多項目推薦):
https://news.ycombinator.com/item?id=21790779
《使用Rust構(gòu)建RISC-V操作系統(tǒng)》:
http://osblog.stephenmarz.com/index.html