使用AI編碼代理與基於oracle的測試構建遊戲模擬器
在這篇客座文章中,Patrick Nadeau講述了他利用AI編碼代理從頭構建Intellivision模擬器的歷程。他使用現有模擬器jzintv的測試oracle驗證CPU核心,AI加速了開發進程——從第5小時顯示第一個像素到第36小時完成可玩的系統。他還添加了調試端口,讓AI能實時控制遊戲。儘管成功,Nadeau反思了AI利用他人代碼的倫理問題以及與人機協作的複雜感受。
這是Patrick Nadeau客座系列的第一部分。作為加拿大研究工程團隊的成員,他以個人而細緻的視角,探索了使用AI編碼工具解決一個極具趣味的編程挑戰的經歷。
童年時,家中只有兩台計算設備:Intellivision遊戲機和Apple II電腦。數十年後,當他第一次使用編碼代理時,他不由自主地回到了這些機器上。記得妹妹將手鐲掉進Intellivision的通風孔,父親打開外殼修理;他也曾拆開Apple II,追蹤CPU到RAM和ROM的線路。從BASIC到彙編,他沉浸在編程手冊中。
父親的一位朋友經營電子商店,曾請他設計Apple II的希臘字符集。他用方格紙描繪字母,編碼成二進制文件,帶到市中心商店。他們將字符集燒錄到ROM,插入芯片,看着每個字符出現在屏幕上——那份喜悦至今難忘。
如今,他依然喜歡在節假日玩Intellivision老遊戲。但使用的模擬器每次系統更新都會崩潰,需要醜陋的hack才能工作。於是,他決定自己從頭編寫一個模擬器,目標是在下個聖誕節前完成。
他先從CPU入手,手工編寫指令解碼器和核心。為了驗證代碼,他從舊模擬器jzintv中提取了CPU實現,通過測試oracle比較每條指令對寄存器、標誌、RAM和週期數的影響。構建oracle花費了大量精力,卻成為項目最關鍵的設計決策。
到三月中旬,他獨自完成了一個基本可用的CP-1610 CPU核心,但缺少總線、視頻和聲音,離真正運行遊戲還有距離。與此同時,公司開始鼓勵使用編碼代理。他最初持懷疑態度,讓AI寫一個解析器,但結果有兩大缺陷。當他展示自己的代碼時,AI承認他的版本“在所有重要方面都更好”。但他需要工作模擬器,加上已有可靠的測試oracle,於是再次嘗試,這次引導AI工作。
第5小時,屏幕上出現了第一個像素,熟悉的彩色測試條。第10小時,渲染管線就緒。第21小時,首個卡帶ROM啓動。第28小時,他收藏的所有204個ROM都成功啓動。第32小時,屏幕上有了移動。第36小時,完整的Intellivision系統運行起來,他通過手柄玩遊戲並聽到聲音。
接下來幾天,他們添加了舊模擬器幾乎不可能實現的功能。他靈機一動:能否給模擬器添加調試端口,讓AI窺視運行中的機器,檢查內部狀態,甚至實時控制?他欣喜地看着AI從內部控制遊戲,甚至叫來妻子,輸入“向左移動飛船”,飛船就動了。他還讓AI找到飛船被擊中的代碼位置,添加了玩家被擊中時手柄震動功能——這太瘋狂了。
但興奮過後,不適感湧上心頭。編碼代理之所以能如此高效,是因為它們捕獲(有人説是竊取)了數百萬程序員的辛勤工作——他們通過艱苦學習,自由分享代碼。然而,他的模擬器離不開Joe Zbciak多年開發jzintv的成果。測試oracle不也正是自動化提取他知識的方式嗎?
令他驚訝的是,整個過程仍如此熟悉。AI寫了大部分代碼,但當他們迷失方向時,答案仍需從他心中湧現,他仍需足夠渴望得到它。他最終真正進入了童年那些芯片內部——當父親打開主機外殼時他第一次看到的那些芯片。他感到自己得到了一些東西,同時也失去了一些。
希望讀者喜歡這篇分享。後續文章將深入探討Patrick的旅程。