Windows 程式設計的基本概念

    前言

    當我們在談論 Windows 程式設計時,可能是把 Windows 當成執行程式的運行環境,也有可能是把 Windows 當成撰寫程式的開發環境。本系列文章會側重後者的介紹,因為程式設計學習者需要熟悉開發環境。能夠自己部署應用程式的程式設計者,也不會是新手,不太需要這些文章。

    把 Windows 當成運行環境 (Runtime Environment)

    根據應用程式 (application software) 的介面,約略可分為以下數種:

    • 命令列程式 (command-line application)
    • 圖形介面程式 (GUI application)
    • 網頁程式 (web application)
    • 電腦遊戲 (computer game)

    要根據該應用程式的目的,選擇合適的介面。沒有一種界面適用於所有的應用程式。

    當我們撰寫網頁程式時,實際的部署目標是 Windows 上的瀏覽器 (web browser)。由於 (現代) 瀏覽器大抵上是跨平台軟體,撰寫網頁程式時,和 Windows 系統本身其實關連不大。

    把 Windows 當成開發環境 (Development Environment)

    當程式設計者想把 Windows 當成開發環境時,得先選擇合適的語言,接著建置該語言的開發環境。這類知識會隨語言而異,而且可能會隨該語言的版本而變動。所以,我們不在這裡詳談。

    不過,有一些開發相關的知識是共通的,像是檔案系統、命令列環境、系統設置、使用編輯器等。當學過多種語言後,就會發現這類知識是通用的,對各種語言都適用。我們會在這系列文章中逐一加入這些內容。

    當程式設計者把 Windows 當成開發環境時,不代表該程式的目標環境也是 Windows。例如,由於 GNU/Linux 的雲端虛擬主機的價格較低廉,程式設計者會使用跨平台的語言,先在 Windows 上撰寫程式,然後把該程式部署到 GNU/Linux 上。

    選擇程式語言

    選擇程式語言是個老掉牙的主題。而且,實際的選擇是很個人化的。與其由筆者告訴讀者要選什麼語言,不如讓筆者給讀者一個方向,讀者自然會知道要選什麼語言。在本節中,我們將常見的微軟技術和非微軟技術分門別類列出,讀者可按照自己的需求繼續找尋相關資料。

    系統程式語言 (System Programming Language)

    系統程式語言是用來撰寫和電腦硬體 (computer hardware) 溝通的軟體,常見的例子是驅動程式 (Windows driver)。初學者不會碰到這一塊,不需要費太多心思讀這類資料。常見的系統語言是 C 和 C++。

    應用程式語言 (Application Programming Language)

    應用程式語言是用來撰寫給使用者 (user) 使用的應用程式。根據使用者界面的不同,有可能是圖形界面程式、網頁程式、行動程式、命令列程式 (註) 等。通常會使用靜態型態語言 (statically-typed language) 來寫,因為動態型態語言 (dynamically-typed language) 用來寫中大型程式會較難維護。

    (註) 使用者也可能是程式設計師、系統管理者、研究者等專業人士,所以命令列程式仍是有用的型式。

    目前有實質影響力的行動程式平台是 Android 和 iOS。前者不限定開發環境,後者則一定要用 Mac 系統來開發。所以,目前最適合寫行動程式的電腦主機仍是 Mac 電腦。想用微軟技術寫行動程式的話,可以看一下 Xamarin。

    以下是微軟直接支援的應用程式語言:

    • C
    • C++
    • C# (C sharp)
    • Visual Basic
    • F# (F sharp)

    C 和 C++ 不是微軟特有的技術,但 Visual C++ 有支援這兩個語言,故歸類於此。

    以下是非微軟的應用程式語言:

    • Java
    • Java 平台語言
    • Pascal (即 Delphi)
    • Golang
    • Rust
    • Common Lisp

    如果把網頁程式也包進來,選項會更多。部分內容會在下一節介紹。

    通用型命令稿語言 (General-Purpose Scripting Language)

    這類型語言多是指動態型態的通用型程式語言,直接以原始碼的形式發佈其程式。這些語言通常用來寫網頁程式和命令列程式。由於動態型態天生的侷限,這類型的語言較不適合寫中大型程式。

    以下是微軟直接支援的通用型命令稿語言:

    • VBScript
    • Visual Basic for Applications
    • JScript
    • TypeScript

    由於 VBScript 和 JScript 算是過時的技術,以後不會繼續開發新特性,留著只是為了相容於舊程式。若沒學過這兩者就不太需要去學了。倒是 TypeScript 在網頁程式上算是成功的技術,有在寫網頁程式的話可以看一下。

    以下則是非微軟的通用型命令稿語言:

    • Python
    • Perl
    • Ruby
    • PHP
    • JavaScript

    Python 是近年來最受歡迎的通用型命令稿語言,而且又搭上資料科學的順風車。JavaScript 則是網頁前端程式的實質 (de facto) 標準。如果想學這類型語言,可以先從這兩個語言看起。

    命令列腳本語言 (Command-Line Scripting Language)

    命令列腳本語言是內附在命令列環境內的語言,沒有函式庫的概念,藉由呼叫命令列工具 (即指令) 來完成各項任務。命令列腳本會以原始碼的形態來散佈程式。這類語言會用來寫命令列程式和自動化腳本,而不會用來寫應用程式。

    以下是微軟直接支援的命令列腳本語言:

    • Batch
    • PowerShell

    筆者會使用 Batch 寫腳本,因為 PowerShell 環境仍可呼叫 Batch 腳本 (批次檔),但命令提示字元則無法使用 PowerShell 腳本。必要時可在 Batch 腳本中塞入 PowerShell 指令,用來補足 Windows 缺乏命令列工具的議題。

    非微軟的命令列腳本語言會用到非微軟的命令列環境,我們留在下文一併介紹。

    科學運算語言 (Scientific Computing Language)

    將電腦語言用在科學方面的運算,像是物理 (physics)、工程 (engineering)、生物 (biology)、醫學 (medicine)、金融 (finance) 等領域的計算。有些語言會提供互動式運算環境,有些則是純批次運算。

    科學運算不算是微軟技術的傳統強項。不過,有些專業人士會用 F# (F sharp) 進行資料分析。此外,微軟提供 Microsoft R Open,算是另一個 R 語言發行版。

    以下是非微軟的科學運算語言:

    • Fortran
    • Python
    • R 語言
    • MATLAB
    • Octave
    • Julia

    由於科學運算需要領域知識 (domain knowledge),和典型的程式設計有一些差距,本系列文章不會特別去討論科學運算相關的議題。

    開發環境的各個面向

    當程式設計者想把 Windows 當成開發環境時,得要處理開發環境的各個面向。本節不談論特定語言,而是說明和開發環境相關的通用知識。如果讀者想搜尋建置特定語言的方式,請自行搜尋其他資料。

    編譯器 (Compiler) 或直譯器 (Interpreter)

    現代語言會有一個 (或多個) 可使用的官方實作品,可能是編譯器或直譯器。其他的開發工具會以此官方實作品為中心展開。

    相對來說,早期的語言,像 C 語言、C++、Common Lisp 等,並沒有真正的官方實作品,而是以語言標準的型式來發佈。這時候會有開發團隊根據此標準來實作編譯器或直譯器。像 C 或 C++ 常見的實作品有 Visual C++、GCC、Clang 等。

    對於初學者來說,先固定使用同一個特定語言的編譯器或直譯器即可。進階的程式設計者為了測試程式碼在不同實作品間的相容性,會在同一台主機上安裝多個程式語言的實作品。

    編輯器 (Editor)

    這裡所談論的編輯器是加上程式語言輔助功能的文字檔案編輯器 (text editor)。由於編輯器很多功能是共通的,程式化編輯器 (programming editor) 會用外掛 (plugin) 的方式為不同的程式語言各自加入相關的功能,保持可擴充的彈性。

    早期經典的程式化編輯器是 Vim 和 Emacs。但這兩種編輯器比較難學,而且要花時間調校,才能達到真正順手的狀態。近年來有許多更方便的編輯器,像是 VSCode,這些傳統的編輯器就比較少人使用了。

    IDE (integrated development environment) 則是在編輯器外額外加上其他的功能,像是編譯、重構、除錯、版本控制、記憶體檢查等。使用 IDE 無法取代對編譯器或直譯器等開發工具的了解,因為 IDE 在背後仍是呼叫這些開發工具。當 IDE 回報錯誤時,程式設計者還是得回頭了解問題的根源。

    命令列環境 (Command Line)

    許多開發工具是以命令列工具的形式發佈。除了容易處理輸出入外,命令列工具易於批次處理,可以放在持續整合服務中,進行自動化測試和部署。

    對於學習程式設計來說,熟悉命令列環境仍然是必要的。使用 IDE 並不是逃避命令列環境的手段。當 IDE 回報錯誤時,程式設計者可能仍需回到命令列環境下除錯。有時候 IDE 會偷偷加入額外的設置,在命令列環境中不依賴 IDE 執行開發工具是確認這些事項的方式。

    如果會寫一些些命令列腳本就更好了。利用命令列腳本可以自製簡易的命令列工具或是自動化一些常見的任務。比起正統的應用程式,命令列腳本簡短得多,而且很快就能學會。

    軟體專案管理 (Software Project Management)

    程式設計學習者會以為軟體專案是程式語言的必要部分,其實很多語言的程式可以在完全沒有專案的情形下運行。例如,以下用 C 實作的 Hello World 程式:

    #include <stdio.h>
    
    int main(void)
    {
        printf("Hello World\n");
    
        return 0;
    }
    

    只要有編譯器和單一 C 原始碼即可編譯和執行此程式:

    > cl hello.c
    > .\hello.exe
    Hello World
    

    cl 是 Visual C++ 內部的指令,我們在命令列直接執行 Visual C++。程式設計學習者會以為 Visual Studio 對學 C 或 C++ 是必要的。但微軟同時釋放出 Build Tools 這種沒 IDE 的命令列工具。代表 Visual C++ 其實可以和 Visual Studio 的編輯器脫勾。

    軟體專案的目的是管理有規模的程式碼,自動化許多開發應用程式時會碰到的任務,像是編譯、執行、測試、部署程式等。但初學者不妨暫時拋開軟體專案,用純手動的方式編譯和執行原始碼,慢慢了解這些開發工具的使用方式。日後就有能力自行撰寫自動化腳本來簡化各種開發相關任務。

    版本控制系統 (Version Control System)

    版本控制系統用來追蹤程式碼的變化。例如,某段程式碼寫爛了,在還沒提交 (commit) 前,可以用 git checkout 回復到尚未撰寫的狀態。即使是小小的 side project,也可以用 Git 等版本控制系統來管理。

    透過 GitHub 等軟體專案管理網站,Git 變成散佈程式碼的工具。像是 Golang 根本不建自己的函式庫集散地 (central repository),而是直接利用 GitHub 等網站來取得套件。雖然學習 Git 等版本控制系統不是必要的,但卻是相當有用的開發工具。

    其他開發工具

    除了前述開發工具外,還有一些值得注意的開發工具:

    • 除錯器 (debugger)
    • 記憶體用量檢查 (memory checker)
    • 靜態程式碼檢查 (linter)
    • 自動重排程式碼 (auto reformatter)
    • 持續整合 (continuous integration) 服務

    如果讀者覺得開發工具過多,倒也不急著一次學完。先掌握編譯器/直譯器和編輯器的基本用法,再慢慢學習其他的開發工具即可。

    Windows 做為開發環境的議題

    Windows 是設計給一般使用者 (end user) 使用的平台,做為開發平台反而沒那麼好用。相反地,Unix 假定使用者也是程式設計者,相當地靈活,但對一般使用者來說過度複雜。本節從開發平台的角度來看 Windows 會碰到的議題。

    命令列環境和命令列工具

    Windows 著重圖形介面的使用,有一段時間對命令列環境的改良甚少。相對來說,Unix 的命令列環境功能相當豐富。除此之外,Windows 也不太著重命令列工具的發展。命令列腳本語言和命令列工具是相輔相成的,Windows 在這兩者都居於弱勢。

    由於相容性因素,Batch 腳本的特性不會大改了。但 PowerShell 適時補足 Windows 命令列環境的弱點。不論是直接寫 PowerShell 腳本或是把 PowerShell 當成命令列工具來用都很方便。除了要適應兩種腳本語言得花一些時間外,Windows 的命令列環境的確是在進步中。

    和 C 語言的整合

    .NET 和 Java 平台本身就有 (相對) 不錯的速度,即使單純以 C# (C sharp) 或 Java 來實作程式,就可以獲得還過得去的速度。所以這些語言對 C 語言的依賴沒那麼深。

    但 Python 和 Perl 等命令稿語言,實際上包裝著以 C 實作的函式庫,背後運行的仍然是 C 程式。單純以這些語言實作的程式速度偏慢,實用性偏低。所以,這類語言對 C 運行環境的依賴就比較重。

    但 Windows 對 C 語言的整合度沒有 Unix 那麼好,連帶影響許多基於 C 運行環境的高階語言。所以,在 Windows 上,每個高階語言都會重包一次 MinGW 工具箱和常見函式庫。其實只是重覆下載相同的開發工具而已。

    熱門的函式庫通常都有預編好的版本,這些問題就隱藏起來了。但在 Windows 上想從原始碼編譯軟體,反而是件困難的任務。微軟也想改善這一點,所以會出現 vcpkg 這類軟體專案。希望之後 Windows 對 C 的支援度能再改善一些。

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Yahoo
    【追蹤本站】
    Facebook Facebook Twitter