聊聊程式語言——小說對話篇


前言

延續上一篇的武俠篇,這次我又請 AI 用小說對話的方式,來呈現我對程式語言的理解。 這是請他參考一位知名的日本作家的風格來寫的,你能猜到是誰嗎? 他的特色是:常常有貓出現、常常下雨、喜歡爵士樂、好像在談戀愛但又不到激情的程度,還有一種淡淡的哀愁感。 跟武俠篇完全不一樣吧!哈哈。

武俠篇連結:聊聊程式語言——武俠篇

散文篇連結:聊聊程式語言——散文篇



《且聽程式碼吟唱》

《《且聽程式碼吟唱》》

十月的一個星期二下午,雨像是一張巨大的灰色濾網,無聲無息地籠罩著這座城市。我正在廚房裡煮義大利麵,鍋裡的水正咕嚕咕嚕地冒著泡,收音機裡傳來史坦・蓋茲(Stan Getz)的薩克斯風獨奏,那聲音像是一條在深海裡游動的魚,既孤獨又優雅。

她在客廳的沙發上,抱著那隻叫做「鯖魚」的三花貓,盯著我筆電螢幕上密密麻麻的程式碼。她穿著一件寬大的灰色毛衣,袖口長得蓋住了手背,只露出修長的手指。

「吶,雨程。」她忽然開口,聲音像是從很遠的地方飄過來的,「這些東西,到底是什麼?」

我用長筷子攪動著義大利麵,試著判斷它們是否已經到了 Al dente 的程度。「那是程式碼。是用來告訴機器該做什麼的語言。」

「語言?」她歪著頭,頭髮順著肩膀滑落,「像我們說話這樣?像我說『我想吃起司蛋糕』,然後你去買,這樣?」

「有點像,但更嚴格。」我關掉瓦斯爐,把麵倒進濾網裡,蒸氣騰地一下升起來,模糊了我的眼鏡。「人類的語言充滿了曖昧。我說『隨便』的時候,可能意味著我想吃拉麵,也可能意味著我什麼都不想吃。但機器不行。機器需要絕對的精確。」

她放下貓,走到中島旁邊,看著我把橄欖油拌進麵條裡。「那麼,為什麼要有這麼多種?我看到這裡寫著 C#,那裡又是 Python,還有什麼 TypeScript。它們不都是在跟機器說話嗎?為什麼不能只用一種語言,就像全世界都說世界語那樣?」

這是一個好問題。我從冰箱裡拿出一罐啤酒,遞給她,然後自己也開了一罐。啤酒泡沫溢了出來,流過我的手指,涼涼的。

「因為時間的流動方式不同,」我說,「每一種語言,都有它自己對時間的理解。」


關於 C# 與凝固的時間

我喝了一口啤酒,感受那種苦澀在舌根散開。「比如說 C#,或者 C++。它們屬於『編譯語言』。這就像是錄製一張黑膠唱片。」

「黑膠唱片?」

「是的。在音樂被播放出來之前,必須先經過錄製、混音、壓片。這就是編譯(Compile)。寫程式的人把所有的邏輯寫好,然後交給編譯器——那就像是一個嚴苛的製作人。編譯器會檢查每一個音符,確保沒有錯誤。最後,它把這些東西壓製成一張唱片(執行檔)。」

我看著窗外的雨,繼續說道:「當你把唱片放進唱機裡播放時,它不需要思考。它只需要旋轉。所以它很快,非常快。所有的決定都在很久以前就已經做好了。那就是 C# 的世界。它像是一個結構嚴謹的建築物,或者是一首已經譜好的交響樂。雖然在 C# 裡,有一個叫做 CLR 的東西,像是一個住在機器裡的隱形管家,會幫你清理垃圾(Garbage Collection),但在本質上,它是一種『凝固的時間』。」

「聽起來很孤獨,」她說,「所有的決定都做好了,就沒有改變的餘地了嗎?」

「幾乎沒有。如果你想改變一個音符,你就得重新壓製整張唱片。這就是代價。」


關於 Python 與流動的即興

她輕輕搖晃著啤酒罐,聽著裡面的液體碰撞聲。「那 Python 呢?我看你常常用它來處理那些像山一樣高的數據。」

「Python 不一樣。Python 就像是爵士酒吧裡的現場鋼琴師。」我指了指收音機,「他手裡拿著樂譜,但他是邊看邊彈的。這叫做『直譯』(Interpreted)。」

「邊看邊彈?」

「對。Python 沒有被壓製成唱片。有一個叫做直譯器(Interpreter)的中間人,站在鋼琴師旁邊。你寫一行,中間人就讀一行,然後告訴機器:『嘿,彈個 C 大調和弦。』接著再讀下一行:『現在,來點憂傷的旋律。』」

「那樣豈不是會很慢?」她問。

「慢多了。比黑膠唱片慢了好幾個數量級。因為中間人每次都要重新閱讀、重新翻譯。但是,它很自由。」我轉過身,看著她的眼睛,「如果你突然想改變旋律,你不需要重新壓片,你只要告訴中間人:『換個調子。』它馬上就能改。它適合用來探索,適合用來在充滿不確定性的世界裡尋找答案。這就是為什麼那些做 AI 的人喜歡它。因為思考本身,就是一種即興演奏。」


關於 JavaScript 與變形的怪獸

「那這個呢?」她指著螢幕上的一行 console.log,「這個 JavaScript。」

我嘆了一口氣,把拌好的義大利麵分裝到兩個盤子裡。「JavaScript……它是一個奇怪的存在。如果說 C# 是建築師,Python 是鋼琴師,那 JavaScript 就是一團黏土。或者是電影裡的變形怪獸。」

「怪獸?」她笑了,眼角的皺紋像小小的魚尾。

「它出生在瀏覽器這個狹小的籠子裡。一開始,它很弱小,只能做些簡單的動作,比如讓按鈕變色。但它沒有骨骼(弱型別)。你告訴它『你是數字 5』,它說是。下一秒你告訴它『你是文字 5』,它也說是。它沒有原則,卻擁有無限的可塑性。」

我撒了一些帕瑪森起司粉在麵上。「後來,有人給它裝上了引擎(Node.js),讓它跑出了籠子。現在它無處不在。但因為它太容易變形了,太容易崩潰了,所以人們發明了 TypeScript。」

「TypeScript 是什麼?」

「TypeScript 是一套西裝。一套量身定做的、筆挺的西裝。」我比劃了一下,「人們把這套西裝穿在那團變形黏土身上,強迫它看起來像個人類。透過這套西裝,我們可以假裝它有骨骼,有原則(強型別)。但如果你把西裝剝開,裡面依然是那團混亂而充滿活力的黏土。這就是現代網路世界的真相:混亂,但穿著西裝。」


關於 C++ 與深淵

我們端著盤子走到小圓桌旁坐下。雨還在下,天色已經暗了下來,房間裡只有廚房的一盞黃燈亮著。

「還有一種,你剛才沒問,但它是這一切的基石。」我捲起一坨麵條送進嘴裡,「C++。」

「C++?」

「它是危險的。如果說 C# 是自動駕駛的特斯拉,C++ 就是一輛沒有煞車、沒有安全氣囊的一級方程式賽車,甚至是一把鋒利的手術刀。」

我看著盤子裡的羅勒葉,「在 C++ 的世界裡,沒有人會幫你。你必須自己管理每一寸記憶體。你向系統借了一個空間,用完之後,你必須親手還回去。如果你忘了還(Memory Leak),那個空間就會永遠消失在虛無中,直到電腦崩潰。它是用來打造神話的語言,那些最華麗的遊戲,那些最底層的引擎,都是用它打造的。但它要求你必須絕對清醒,絕對冷酷。就像在深海潛水,一旦你犯了錯,沒有人能救你。」


尾聲

她默默地吃著麵,好一會兒沒有說話。貓跳上了她的膝蓋,發出呼嚕呼嚕的聲音。

「雨程,」她最後說,「這聽起來,所有的程式語言,都像是某種形式的妥協。」

「妥協?」

「是啊。C# 為了安全而妥協了自由,Python 為了自由而妥協了速度,TypeScript 為了秩序而妥協了真實。就像我們的人生一樣,不是嗎?」

我愣了一下,看著手裡的啤酒罐。鋁罐表面凝結的水珠滑落下來,在桌面上形成了一個完美的小圓圈。

「也許吧,」我說,「我們總是在尋找一種完美的語言,一種能夠毫無耗損地傳達心意,既快速又自由,既安全又真實的語言。但那種東西不存在。我們只能在這些殘缺的工具中,試著拼湊出一個勉強能運作的世界。」

「就像這盤義大利麵,」她說,「雖然不是完美的,但在這樣的雨天裡,它已經夠好了。」

「是啊,」我說,「已經夠好了。」

收音機裡的薩克斯風停了,換成了一首鋼琴曲。雨還在下,像是永遠不會停一樣。在這個充滿了 0 與 1 的世界縫隙裡,我們安靜地吃著麵,感受著這一刻的溫暖與無奈。

這就是程式語言。關於尋找,關於失去,以及關於在不完美的世界裡,試圖建立秩序的一種微不足道的努力。


  • first edition time: 2026-02-15
  • last edit time: 2026-02-15