使用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的旅程。