| 下一頁 | 章節選單 | 主選單 | 上一頁 | Gregory Barber 商業 2025 年 10 月 13 日 上午 7:00 組譯語言編程 是殘酷、美麗,或許甚至是 通往更好 AI 的途徑 無論你的晶片在運行經典的電腦遊戲還是最新的 DeepSeek 模型,它都會因為你說它的母語而回報你。 插圖:Samuel Tomson
《過山車大亨》(Rollercoaster Tycoon) 並非 1999 年最流行的電腦遊戲。但如果你深入探究像素之下——那些搖搖晃晃的遊樂設施、飢渴、想吐的人群(以及在他們身後擦地的清潔人員)——深入到程式碼層面,你會看到一種近乎瘋狂的癡迷工藝。Chris Sawyer,這款遊戲唯一的開發者,完全用組譯語言寫了這一切。 機器可讀
關於編程的固定專欄。因為如果/當機器接管時,我們至少應該說它們的語言。 某些編程語言,例如 Python、Go 或 C++,被稱為「高階」語言,因為它們的工作方式有點像人類語言,寫滿了適合在詩歌大賽中使用的指令和慣用語。一般來說,像編譯器這樣的軟體會將這些轉換成機器真正讀取的內容:告訴實際電晶體如何運作的 1 和 0 的區塊(或可能是十六進位)。組譯語言是「低階」語言中最低的等級,它與機器母語幾乎一一對應。這是在金屬上直接編程。用組譯語言構建一個複雜的電腦遊戲,就像用掉落的貓毛編織一幅掛毯一樣。
為什麼有人會這麼做?我最近問了 Sawyer,他住在他的家鄉蘇格蘭。他告訴我,效率是其中一個原因。在 1990 年代,高階程式設計的工具還不完善。編譯器非常慢,除錯器也爛到不行。Sawyer 可以透過自己用 x86 組裝語言來避免這些問題,這是 Intel 晶片的通用語言。
我們都知道這並不是真正的理由。真正的理由是愛。在轉向過山車之前,Sawyer 用組裝語言寫過另一款遊戲,Transport Tycoon。它讓玩家負責一座城市的道路、鐵路車站、跑道和港口。我將 Sawyer 想像成一個模型火車愛好者——鋪設每一段軌道,手工縫製人工草皮,每一個細節都是一種選擇和一種苦差事。為了將這些精心製作的像素從位圖傳送到顯示器上,Sawyer 必須發揮晶片的全部潛力。「RollerCoaster Tycoon 只是因為我熟悉可能的極限才得以實現,」他告訴我。
在極限內工作?或許在數位豐饒的時代,這是一個陌生的概念,因為在 AI 訓練演算法中呼叫單一函數,就可能啟動一百萬個 GPU。使用組裝語言,你只能得到一件事情,而且就是你所要求的東西——即使,就像許多編碼人員親身體驗過的那樣,那東西是錯誤的。組裝語言就是如此地殘酷又美麗。它要求你準確地表達你的意思。
我對組裝語言的創作者造成了不公平。他們想要讓事情變得更容易,而不是更難。我想像他們厭倦了加載穿孔卡片並在他們的蒸汽龐克巨獸上翻轉開關。也許他們夢想著一個像我們這樣的世界,電腦可以在極少的引導下做到如此多的事情。
第一個組裝語言,由 Kathleen Booth 在 1940 年代創建(儘管她常常沒有得到應有的回報,真是令人驚訝),與語言幾乎沒有相似之處。代碼代表代碼。為了指示機器執行某項操作——例如機器碼中的「0,0111」——你將使用一系列字母和符號,而一個新的軟體,稱為組譯器,會將其翻譯成二進位。很快,指令就有了更友善的人類易記助記符,例如「MOV」。
懂得組裝語言就是懂得 CPU 本身——它能做什麼,更重要的是,它不能做什麼。晶片的物理設計,連接電路的模式,
AND 和 XOR 的邏輯閘其實已經被設計好,定義了它的運作方式。它的 功能相當基本,將指令分解為基本步驟: 從記憶體中取出東西,放到一個暫存空間,也就是暫存器(register)。在那裡解碼它。執行一些運算,像是比較兩個數值,或是將它們相加。然後再將結果送回記憶體。
隨著晶片不斷進步,組譯語言也演變出新的方言。讓人類登陸月球的程式碼就是組譯語言,而且是為單一晶片設計的,就是 Apollo 11 指導電腦。如果你想閱讀洩漏的 Furby 原始碼,你需要精通 6502。要駭入你的 Ti-83 計算機,你需要 z80。學習一種晶片的語言——比如說 Intel 的 x86——然後轉到 Arm,就像在貝魯特學習阿拉伯文,然後試著在突尼斯或喀土穆生活一樣。祝你好運。
我在大學裡學習 x86 組譯語言,逃避數學的困擾。當我的同學似乎很享受 Java 那些乏味的咒語時,我喜歡組譯語言這個邏輯遊戲。學習起來容易失敗,但失敗的方式是可以解釋的,只要你檢視電路和暫存器。我用這個不算是語言的簡單指令編碼時,感覺有多麼得心應手;也知道這種掌握有多麼脆弱。例如,說「把這些位元放那裡——不,在那裡,在那個暫存器,在那些電容器裡。」記住這個。忘記那個。一點一滴地工作,一尊一尊地雕刻這些小雕像。
的確,現在在日常編碼工作中,使用組譯語言已經沒有太多意義了。高階語言效率很高,它們的抽象通常是更佳的選擇。連組譯語言的發明者也轉向了其他事業;Booth 在 1990 年代最後一份論文,使用神經網路來匹配海豹和牠們的叫聲。Sawyer 也轉了過來。他最近在玩家庭自動化—燈光、溫度感測器、音響系統等等,使用 Python 在 Raspberry Pi 上編碼,他告訴我,一開始覺得「相當令人反感」。但即使在那個小小的處理器上,也能很好地完成工作。
然後,DeepSeek 這樣的東西出現了,提醒我們人類仍然可以更好地與我們的硬體溝通。今年早些時候,這家中國公司開發出這些極其高效的 AI 模型,顛覆了 AI 進步只能來自更多晶片和更多能量的說法。組譯語言是其中一個令人驚訝的原因。DeepSeek 的工程師們…
深入 Nvidia 晶片的子層,發出指令,要求每個獨立的機器在恰到好處的時機,將資料從 32 位元壓縮到 8 位元——犧牲精確度以換取效率。觀察者們都驚呆了。你可以這樣做嗎? DeepSeek 的工程師們重新找回了一門許多人早已遺忘的藝術。
我也有類似的感受,在 2023 年,DeepMind 的研究人員教導機器 x86 組裝語言,然後要求它改善 C 語言中長期存在的 sort() 函數。這個 AI 做出了一些奇怪、難以理解的選擇,在暫存器之間進行了奇特的跳躍,最終減少了精確一步。或許只節省了毫秒中的一小部分。但現在這個新的演算法已經正式採用,每天都會發生無數次。
這提醒了我,人類創造了這些機器,即使它們看起來正在螺旋式地發展成我們難以理解的複雜性,它們仍然在我們的掌控之下。我們可以總是讓它們做得更好。就像 Sawyer 說的那樣,當他回憶起他最近的 Raspberry Pi 驅動的家庭編碼實驗時。這可能只是他的想像,但他覺得顯示器有點卡頓。他說如果可以,他會重新編寫程式碼。但可惜的是,Sawyer 和機器說的不是同一種組裝語言。
這篇文章由 calibre 從 https://www.wired.com/story/programming-assembly-artificial-intelligence/ 下載。 | Section menu | Main menu |