程式是如何運作的

Elementry
最後更新: 標籤: 介紹

先備知識

那麼,程式到底是什麼?

上一篇文章你學到了作業系統如何管理硬體並執行應用程式。但應用程式到底是什麼?OS 實際上在執行什麼?

從本質上說,**程式(program)**只是一份電腦依序執行的指令清單,速度非常快。想像成一份食譜。食譜告訴廚師:*先做這個,再做那個,如果這個條件成立就做另一件事。*程式對電腦做的是同樣的事。

你一生都在使用程式,只是沒有特別去想。Spotify 是一個程式。TikTok 是一個程式。就連你手機上的計算機也是一個程式。當你點擊應用程式圖示,你就是在告訴 OS:「嘿,開始執行那些指令。」

但有趣的地方來了——並非所有程式看起來和運作方式都一樣。程式有很多不同的形態,了解這些形態將幫助你更清楚地理解電腦是如何運作的。

類型一:你能看到並點擊的應用程式——GUI 應用程式

最熟悉的程式類型是那種你能看到的。它有視窗、按鈕、文字方塊、圖片——你可以用滑鼠或觸控螢幕看到並互動的東西。這些被稱為 GUI 應用程式(GUI applications),其中 GUI(發音為 「gooey」)代表圖形使用者介面(Graphical User Interface)

簡單說:如果它有一個可見的視窗,就是 GUI 應用程式。

你幾乎肯定用過的一些例子:

  • Chrome / Safari / Firefox——網頁瀏覽器
  • Spotify / Apple Music——音樂播放器
  • Discord / WhatsApp Desktop——訊息應用程式
  • Minecraft / Roblox——遊戲
  • Microsoft Word / Google Docs——文件編輯器

當你開啟一個 GUI 應用程式時,OS 會載入它並給它一塊螢幕空間。應用程式接著在那個空間裡繪製自己的介面——按鈕、選單、內容。當你點擊一個按鈕,應用程式接收到那個點擊作為輸入,並做出相應反應。

這個「輸入→處理→輸出」的迴圈,在 GUI 應用程式開啟的時候不斷地發生。你點擊某個東西(輸入),應用程式計算出要做什麼(處理),螢幕上某些東西改變了(輸出)。即使你只是在滾動,那也是正在被處理的輸入。

手機上的應用程式也是 GUI 應用程式

行動應用程式也是 GUI 應用程式——只是它們用觸控介面而不是滑鼠介面。滑動、點擊、捏合縮放:這些全都是進入應用程式的輸入,應用程式透過更新你所看到的東西來回應。

類型二:看不見的工作者——背景服務

這可能會讓你驚訝:並非所有程式都有可見的視窗。事實上,就在你閱讀這篇文章的當下,你的電腦正靜靜地執行著數十個你完全看不到的程式。

這些被稱為背景服務(background services),或簡稱服務,它們在不向你顯示任何介面的情況下默默完成工作。它們在你的電腦開機時啟動,一直執行到關機。

它們實際上在做什麼?各種各樣的事:

  • **防毒軟體(antivirus software)**正在靜靜地掃描你開啟的每個檔案,檢查威脅——不需要你做任何事。
  • 同步服務(sync services),如 iCloud、Google Drive 或 OneDrive,正在監視你的資料夾並即時將變更上傳到雲端。
  • 系統更新服務定期檢查是否有新的軟體更新可用。
  • 音訊服務持續管理你的喇叭和麥克風,讓任何應用程式隨時可以使用它們。
  • 網路服務在背景維護你的網際網路連線並處理 Wi-Fi。

你永遠不會知道這一切正在發生——直到它停止運作。曾經想過為什麼你的防毒軟體在你沒做任何可疑的事時還是顯示通知嗎?那就是一個背景服務注意到某件事並決定需要告訴你。

你怎麼知道它們在執行?

在 Windows 上,你可以開啟工作管理員(Ctrl+Shift+Esc),點擊「處理程序」或「服務」分頁——你會看到一個龐大的從未手動開啟過的程式清單。在 macOS 上,你可以開啟活動監視器來看到同樣的東西。第一次看到這個畫面,其實有點令人震驚。

背景服務是為什麼即使在剛開機的電腦上,CPU 和記憶體就已經在被少量使用的原因之一。OS 本身就是服務的集合,它們在你的電腦醒來的那一刻全都啟動了。

類型三:沒有視窗的程式——命令列介面

你已經在提到 Linux 時短暫地看到了終端機。現在是真正解釋它是什麼的時候了。

有些程式完全沒有圖形介面——沒有按鈕,沒有圖示,沒有視窗。相反,它們完全透過文字與你溝通。你輸入一個命令,按下 Enter,程式以文字回應。這被稱為命令列介面(command-line interface),或 CLI

實際上看起來是這樣的。假設你想看一個資料夾裡的檔案清單。在 GUI 中,你會開啟檔案總管或 Finder,用眼睛瀏覽。在 CLI 中,你會輸入類似這樣的東西:

ls

……程式會把檔案名稱以純文字的形式直接印在終端機視窗裡。

這聽起來很老派——說實話,某種程度上確實如此。CLI 在圖形介面出現之前就已存在。但它從未消失,因為一旦你學會了,它非常強大。

為什麼 CLI 仍然存在?

幾個原因:

  • 速度——對於知道自己在做什麼的人來說,輸入命令通常比點擊選單快得多。
  • 自動化(automation)——你可以把一串命令寫在一個檔案裡(稱為腳本),電腦就會一個接一個地自動執行它們。想像你告訴電腦:「每天早上 8 點,下載最新的新聞標題並儲存到一個檔案裡。」用 CLI 就可以做到。
  • 遠端控制——當工程師管理伺服器(那些運行網站的強大電腦)時,他們通常無法實際碰到那台機器。他們透過網際網路連線,完全透過 CLI 控制它。
  • 精確性——有些任務根本沒有 GUI。CLI 讓你能做任何沒有按鈕可以實現的事。

每個 OS 都有 CLI:

  • Windows 有**命令提示字元(Command Prompt)**和 PowerShell
  • macOS終端機(Terminal)
  • Linux 有各種終端機應用程式,依發行版而異

大多數一般使用者從不需要碰 CLI。但如果你進入科技行業,你會頻繁使用它——而且它沒有看起來那麼可怕。

類型四:程式中的程式

現在到了真正有趣的地方。

有些程式不是直接在 OS 上執行——而是在另一個程式內部執行。一個更大的宿主程式建立了一種迷你環境,而較小的程式在其中生存和執行。

瀏覽器中的網站

最常見的例子是網站

當你開啟一個網站,你的瀏覽器(Chrome、Safari、Firefox)從網際網路下載一堆檔案。其中一些檔案包含一種叫做 JavaScript 的程式語言。瀏覽器讀取這些檔案並執行程式碼——它替你執行程式。

從某種意義上說,每個互動式網站都是一個在你的瀏覽器內執行的程式。瀏覽器是宿主,而網站是住在其中的訪客程式。

這就是為什麼現在的網站能做這麼多事情:Google Docs 可以編輯文件,Figma 可以做設計工作,遊戲可以在瀏覽器分頁中執行。這些不是簡單的文字頁面——它們是完整的程式,只是託管在瀏覽器裡而不是安裝在你的電腦上。

這也是為什麼你的瀏覽器是電腦上最耗資源的應用程式之一。它不只是在顯示頁面——它在同時執行數十個程式,每個分頁各一個。

擴充功能和外掛程式

「程式中的程式」的另一種形式是擴充功能(extension)外掛程式(plug-in)

瀏覽器擴充功能(如廣告攔截器或密碼管理器)是在你的瀏覽器內載入並修改其行為的小程式。它們可以改變頁面的外觀、在工具列添加按鈕、攔截內容,或與你造訪的網站互動。

其他應用程式也這樣做。影片編輯器有添加新效果的外掛程式。音樂製作軟體有合成器和音訊效果的外掛程式。Minecraft 有模組(mod)。Google 試算表讓你安裝附加元件。

每種情況下,模式都是一樣的:宿主程式建立一個定義好的空間,讓第三方程式可以插入並執行。

為什麼不直接把所有東西安裝在 OS 上?

在宿主程式內執行有一些重要好處:

  • 沙箱(sandboxing)——宿主程式可以控制訪客程式被允許做什麼。在你瀏覽器中執行的網站無法存取你的檔案(除非你給它權限),因為瀏覽器限制了它能碰的東西。這是一個巨大的安全優勢。
  • 可攜性(portability)——網站在 Windows、macOS、Linux 和行動裝置上的運作方式是一樣的,因為瀏覽器處理了差異。網站不需要擔心底層是什麼 OS。
  • 易於散布——你不需要「安裝」網站。你只需訪問一個網址(URL)。

統整起來

所以當你想到「程式」時,它不是一個單一的東西。它是一個大家族:

類型有可見的視窗嗎?誰啟動它?範例
GUI 應用程式Spotify、Chrome、Minecraft
背景服務OS(自動)防毒軟體、同步服務、系統驅動程式
CLI 程式無(僅文字)你,透過終端機檔案工具、自動化腳本、伺服器軟體
程式中的程式取決於宿主宿主程式網站、瀏覽器擴充功能、遊戲模組

這些全都只是電腦遵循的指令。它們的不同在於在哪裡執行、如何獲取輸入,以及如何顯示輸出——但歸根究底,每個程式都在做同樣的基本事情:接收一些資訊,處理它,並產生某個結果。

摘要

  • **程式(program)**是電腦遵循的一組指令。
  • GUI 應用程式是有可見視窗和互動式介面的程式——是你直接開啟並使用的應用程式。
  • 背景服務是沒有任何可見視窗、在幕後靜靜執行重要工作的程式。
  • CLI 是一種透過輸入命令來執行程式的文字方式——沒有視窗,只有文字輸入和輸出。
  • 有些程式在其他程式內部執行——網站在瀏覽器內執行,擴充功能在應用程式內執行——通常是為了安全性和可攜性。

下次你開啟筆電或手機時,你不只是在啟動一個程式——你正踏入一整個程式的生態系,每個都在做它的部分,大多數對你來說完全看不見。