歡迎來到應用程式生成的世界!

在本章中,我們將探索日常使用的軟體是如何製作,並準備讓電腦運行的。你可以把這看作是軟體開發的「幕後花絮」。我們將研究不同類型的軟體、開源與閉源軟體的爭論,以及那些將人類編寫的程式碼轉換成電腦處理器能理解的語言的聰明工具。如果看到一些技術術語覺得有點難懂,別擔心,我們會把它們拆解開來,逐一擊破!

1. 應用程式的本質

應用程式 (Application),簡稱「App」,是為了協助使用者執行特定任務而設計的軟體。與負責維護電腦系統本身的「系統軟體」不同,應用程式的核心在於為使用裝置的人提供服務。

軟體目的的合理性分析

當我們選擇或構建一個應用程式時,必須分析它是否合適。這通常取決於以下幾點:

  • 功能性 (Functionality): 它真的能滿足使用者的需求嗎?(例如:這個相片編輯器支援圖層功能嗎?
  • 易用性 (Ease of Use): 介面對於目標受眾來說是否直觀好用?
  • 兼容性 (Compatibility): 它能在使用者的硬體和作業系統上運行嗎?
  • 成本 (Cost): 它是否在預算範圍內?

快速回顧:應用程式的類型

  • 通用軟體 (General Purpose): 可用於多種用途的軟體(例如:文書處理軟體)。
  • 專用軟體 (Special Purpose): 為單一特定工作而設計的軟體(例如:薪資結算系統)。
  • 訂製軟體 (Bespoke): 為單一公司或使用者量身打造的軟體。

核心重點: 應用程式是使用者的工具。選擇正確的軟體意味著在功能、成本和易用性之間取得平衡。


2. 工具程式 (Utilities)

工具程式 (Utility Software) 就像你電腦裡的「維修團隊」。它們是一些小型、專門的程式,旨在協助管理、維護及控制電腦資源。

工具程式範例:

  • 磁碟重組工具 (Disk Defragmenter): 將硬碟上的檔案重新整理,使它們存放在一起,從而提升電腦運行速度。
  • 壓縮軟體 (Compression Software): 縮小檔案大小以節省空間(例如:WinZip 或 7-Zip)。
  • 防毒軟體 (Antivirus): 掃描並移除惡意軟體。
  • 備份工具 (Backup): 自動複製檔案,以備系統崩潰時使用。

比喻: 如果你的電腦是一間房子,應用程式就是你生活中使用的家具,而工具程式則是放在工具箱裡,用來修補漏水水龍頭或割草的維修工具。

核心重點: 工具程式能讓系統保持流暢和安全。它們的目的不是為了「執行工作」,而是為了「保持工作空間整潔」。


3. 開源 vs. 閉源軟體

這是計算機領域中一個重大的爭論!其關鍵在於誰有權查看並修改原始碼 (Source Code)(由程式設計師編寫的原始指令)。

開源 (Open Source)

原始碼是公開可見的。任何人都可以查看、修改和分發它。通常它是免費使用的。

  • 優點: 高度可定製;許多人可以共同尋找並修復程式錯誤(Bug);通常免費。
  • 缺點: 可能缺乏專業技術支援;安裝過程可能較複雜;如果程式碼沒有定期審核,安全性可能成為隱憂。
  • 範例:Linux, Python, VLC Media Player。

閉源 (Closed Source / Proprietary)

原始碼經過編譯 (Compiled)並被隱藏起來。只有原開發公司能夠修改。你通常需要支付授權費用才能使用。

  • 優點: 附帶專業技術支援/保養服務;通常成品非常精緻且用戶友善。
  • 缺點: 你無法自行修復錯誤;必須付費;會被「鎖定」在該公司的生態系統中。
  • 範例:Microsoft Windows, Adobe Photoshop。

你知道嗎? 「開源」並不一定代表「零成本」,但由於程式碼是公開的,它幾乎總是免費的!

核心重點: 開源強調自由與社群共享;閉源則著重於利潤與專業支援。


4. 轉譯器:組譯器、編譯器與直譯器

電腦只能理解機器碼 (Machine Code)(即 1 和 0)。人類則使用高階語言 (High-Level Languages)(如 Python 或 C#)來編寫程式。轉譯器 (Translators) 正是連接這兩者的橋樑。

三大主要類型:

  1. 組譯器 (Assembler):組合語言 (Assembly Language)(如 LDA, ADD, STO 等低階代碼)轉換成機器碼。每個組合語言指令通常對應一條機器碼指令。
  2. 編譯器 (Compiler): 一次過將整個高階程式轉換為單一的可執行檔案(機器碼)。
  3. 直譯器 (Interpreter): 逐行 (Line-by-line) 轉換並運行高階程式碼。一旦發現錯誤,它會立即停止。
編譯器 vs. 直譯器:比較表

編譯器:
+ 程式一旦翻譯完成,執行速度非常快。
+ 使用者無法查看原始碼。
- 需要花較長時間來「構建」(Build) 程式。
- 錯誤通常只會在過程結束時才報告。

直譯器:
+ 非常適合開發與調試 (Debugging),因為它會在錯誤發生的那一行停止。
- 因為邊執行邊翻譯,程式運行速度較慢。
- 使用者必須安裝直譯器軟體才能運行程式碼。

比喻: 編譯器就像在開始煮菜前,先把整本食譜從法文翻譯成中文;而直譯器就像有一位法國主廚站在你旁邊,邊煮邊逐句為你翻譯指令!

核心重點: 編譯器適合已完成的產品;直譯器則非常適合學習與測試。


5. 編譯的階段

當你點擊「Build」或「Compile」時,電腦會經過四個主要步驟將你的程式碼轉換為機器碼。如果覺得複雜也不要擔心,把它想成是一個篩選過程,不斷變得越來越具體。

步驟 1:語法分析 (Lexical Analysis)

編譯器會移除註解和空白等不必要的內容,將剩下的程式碼拆解成標記 (Tokens)(例如關鍵字、常數與識別字)。同時,它會建立一張符號表 (Symbol Table) 來記錄程式中的變數。

步驟 2:語法分析 (Syntax Analysis)

編譯器檢查程式碼是否符合該語言的「文法」規則。它會建立一棵抽象語法樹 (Abstract Syntax Tree)。如果你忘記寫分號,這裡就是「語法錯誤 (Syntax Error)」產生的地方!

步驟 3:程式碼生成 (Code Generation)

「乾淨」的程式碼最終會被轉換為目標代碼 (Object Code)(即機器碼)。雖然還不能直接運行,但已經很接近了!

步驟 4:程式碼優化 (Code Optimisation)

編譯器會尋找方法使程式執行得更快或佔用更少記憶體。例如,它可能會移除從未被使用過的變數。

記憶小技巧: 使用口訣「Little Spiders Generate Orchids」(Lexical, Syntax, Generation, Optimisation,即詞法、語法、生成、優化)。

核心重點: 編譯是一個多階段過程,從清理程式碼到檢查邏輯,最後轉換為二進制並進行效能優化。


6. 連結器、載入器與函式庫

你的程式並不總是一個巨大的檔案。通常,它會使用其他人已經寫好的部分程式碼。

函式庫 (Libraries)

函式庫 (Libraries) 是預先編寫且預先編譯好的函式集合。它們能為程式設計師節省大量時間。例如:使用函式庫來處理複雜的數學運算或在螢幕上繪製視窗。

連結器 (Linkers)

連結器 (Linker) 是一種將你已編譯的程式碼與所需的函式庫程式碼進行「連結」的軟體。它確保當你的程式呼叫 print() 這類函式時,電腦知道去哪裡找到該函式的指令。

載入器 (Loaders)

一旦程式連結完成並準備就緒,載入器 (Loader) 就是作業系統中將程式從硬碟複製到主記憶體 (RAM) 的部分,以便 CPU 可以執行它。

常見錯誤!

學生經常搞混連結器和載入器。記住:連結器是把程式的各個片段拼在一起,而載入器是把完成後的程式放入 RAM

核心重點: 函式庫節省時間,連結器將不同的程式碼檔案縫合在一起,載入器則將結果放入記憶體,讓程式真正開始運作!