JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

「執行程式碼」到底是什麼意思

從你敲下的文字,到電腦上真正發生某件事的全過程。

在被執行之前,程式碼只是文字

當你寫程式碼時,其實只是在往一個檔案裡敲文字——字母、數字和標點,和購物清單或一封電子郵件沒什麼兩樣。這個檔案本身什麼也不會做。無論裡面的指令多麼巧妙,它都靜靜地躺在你的磁碟上,一動不動。

「執行程式碼」就是那段文字變成行動的時刻。某個東西——一個內建在你電腦裡的程式——會讀取你的指令,並一步一步地執行。可以把你的程式碼想成寫在紙上的食譜:很有用,但在廚師拿起它、照著做之前,它做不出任何一道菜。

兩條路:先全部翻譯好,還是一行一行翻譯

文字變成行動主要有兩種方式,區別主要在於時機。這就是編譯型與直譯型語言之分,它決定了用起來是什麼感覺。

編譯型語言(比如 C 或 Rust)會一次性地把你的整個檔案提前翻譯成機器語言,產出一個成品程式,之後可以直接執行。這就像在任何人閱讀之前先把整本書翻譯完:準備起來慢一些,但一旦完成,執行就又快又獨立。

直譯型語言(比如 Python 或 JavaScript)則一行一行地讀取並執行你的檔案,每條指令在需要的那一刻才翻譯。這就像有位口譯員站在你身旁,你說一句他譯一句:你可以改一行就立刻再試一次,不用先單獨「把一切都建置好」。

真正執行它的引擎:執行階段

無論你的語言走哪條路,你的程式碼都需要一個引擎來在其中執行。這個引擎叫做執行階段(runtime)——在你的程式執行期間,一直在場、一直在幹活的那個東西。它提供各種實際的機器:讀檔案、在螢幕上繪製、與網路通訊。

你其實已經在用執行階段,只是沒去叫它的名字。網頁裡的 JavaScript 執行在瀏覽器的執行階段裡;伺服器上同樣的 JavaScript 執行在 Node 裡。Java 程式碼執行在一個叫 JVM 的東西裡。同樣的食譜,不同的廚房——而廚房就是執行階段。

這就是為什麼你會經常聽到「在執行階段」(at runtime)這種說法。它的意思就是「在程式真正執行的時候」,與你寫程式碼的時候相對。有些問題只會在執行階段才暴露出來——當真實的輸入到達、引擎真的去照著你的指令做的時候。

執行中的程式就是一個行程

一旦你的程式碼真正執行起來,作業系統就會把它包進一個行程(process)裡——一個程式的一次活的實例,擁有自己私有的一塊記憶體來存放資料。把同一個應用打開兩次,你就得到兩個行程,各管各的。

你的電腦會同時執行許多行程:一個瀏覽器、一個音樂應用、一個聊天視窗,外加幾十個你從沒見過的背景行程。作業系統就是那個雜耍者,讓每個行程輪流用上處理器,並把它們的記憶體隔開,這樣一個程式就不會踩壞另一個程式的資料。

為什麼有些事得等,以及快取如何加速

並不是每條指令都能瞬間完成。有些——比如抓取一個網頁、讀取一個大檔案——需要時間,因為你的程式得等待它自身之外的某個東西。與其僵住、對著牆發呆,寫得好的程式會用非同步(async)程式碼:先把慢任務發出去,轉頭去做別的有用的活,等答案到了再回來處理。

想像點咖啡:你不會僵在櫃檯前——你拿個號、坐下,等做好了咖啡師會叫你。非同步讓程式保持回應,而不是每次要等慢東西時就卡死。

另一種避開等待的辦法,是乾脆不重複做那些慢活。快取(cache)會把某個昂貴操作的結果就近存起來,下次再需要時,你直接拿那份存好的副本,而不必重新計算或重新取得。這就像冰箱裡的剩菜:做一次,熱很多次。

借來的程式碼:相依套件與套件管理器

幾乎沒有哪個真實程式是完全從零寫出來的。你會借用別人已經寫好並分享的程式碼——比如處理日期、加密,或者繪製圖表。你的專案所相依的每一塊借來的程式碼,都是一個相依套件(dependency):你的程式碼靠它存在才能正常運作。

你不用一個個手動去找這些程式碼。套件管理器(package manager)會替你完成:你說出想要什麼,它就把每個相依套件——以及那些相依套件自己又相依的東西——下載到你的專案裡。對 JavaScript 來說,這個工具通常是 npm;對 Python 來說,則是 pip。

npm install dayjs
一行指令:套件管理器會取下「dayjs」日期函式庫,以及它所需要的一切。

在執行階段,你的程式會像呼叫你自己寫的程式碼一樣,去取用這些已安裝的相依套件。所以「執行你的程式碼」通常意味著:執行你那寥寥幾行,外加一大群安靜的借來程式碼,全都在同一個行程裡協同工作。

小結

你從檔案裡的一段文字出發,一路跟到了它變成行動。程式碼在被執行之前什麼都不做;編譯型語言會提前翻譯它,而直譯型語言一行一行地讀它;執行階段是真正幹活的引擎;執行中的程式作為一個行程存在,擁有自己的記憶體;非同步和快取讓程式不必無謂地等待;套件管理器則把你程式碼所相依的、借來的相依套件拉進來。