Windows 求生手冊:緣起

「Windows 用得好好的,怎麼需要求生?」一般使用者大概只有電腦出問題,像是中電腦病毒 (computer virus) 或是勒索病毒 (ransomware) 時才會想要找求生之道。不過,這系列的文章並不是防毒或防駭手冊,也不是電腦 DIY 大全。這系列文章,是筆者經歷 Winodws、Mac、GNU/Linux 三種系統之後,所發想的文字記錄,目的在於記錄一些讓 Windows 更好用的方式,畢竟有時候還是會用 Windows 做事。這系列文章有一些偏向類 Unix 使用者的觀點,但筆者會儘量地平實公正地敘述自已的想法。

Windows 系統會讓人覺得不好用,主要有以下兩點:

  • 缺乏良好的命令列環境
  • 對 C (或 C++) 支援不友善

現在的電腦都已經有圖形化介面了,為什麼還要用命令列?其實,圖形化介面和終端機介面各自有好用的情境。平常上網、收電子郵件、打文件、看影片、聽音樂等日常活動,當然是用圖形化介面;不過,有時候命令列工具會意料不到地好用,像是要對數百數千張圖片做縮圖,用 ImageMagick 相關指令加上簡單的殼命令迴圈很快就可以達成,或是要在文字檔案中搜尋特定內容,用 grep 或 AWK 等指令很快就可以過濾掉大量文字檔,迅速找到所要的資訊。

Windows 系統在設計上僅注重圖形化介面,幾乎忽略命令列環境,使得 Windows 開發者沒有意願去開發新的命令列工具,造成 Windows 上相對缺乏夠好用的命令列工具。像是 Windows 上有一個利用常規表示式 (regular expression) 原理製作的工具稱為 PowerGREP,其實這個軟體本身設計得蠻不錯的,但是,在類 Unix 系統上,結合幾個常用的指令,像是 find、grep、sed 等,就可以達到類似的功能。因為命令列環境已經提供一個良好的使用者介面,開發者只要專心開發程式即可。

由於 Windows 缺乏夠好的 shell 程式,許多利用 shell 開發的程式在 Windows 上無法使用。如果想要針對 Python 2.7、3.5、3.6 三種版本測試自已的模組的相容性,在類 Unix 系統上,可以利用 pyenv 任意安裝數個版本的 Python;但 pyenv 是以 Bash 寫成,而 Windows 上缺乏夠好的 shell 程式,故缺乏對應的程式。另外一個 Java 生態圈的管理工具 SDKMAN,可以任意安裝不同的 Java 平台語言或工具,包括 Java、Groovy、Scala、Clojure、Kotlin、Gradle 等,而且每種語言或工具都可以安裝數個版本;同樣地,這個工具是以 Bash 寫成,限類 Unix 系統使用。

Perl 是一個通用型程式語言,在類 Unix 系統上是必備的工具。Perl 設計相當靈活,吸收了許多類 Unix 系統上的工具和語言的優點,不僅可以寫命令稿 (scripts),也可以直接在命令列上直接寫程式 (one-liner),使用 Perl 工作的效率相當好。但由於 Windows 上的命令列環境的限制,許多 Perl one-liner 在 Windows 上無法順利使用,相當可惜。

Windows 另外一個問題是對 C (或 C++) 不友善,這個問題比想像中地還重要。說實在的,現在有那麼多高階語言,不一定需要直接寫 C,像筆者先前主要做資料分析和撰寫網頁程式相關的任務,很少直接使用 C。但 C 在電腦科學中有其特殊的地位,許多高階語言,包括 Perl、Python、Ruby、PHP 等,本身都是以 C 撰寫,這些語言都提供 C API,必要時可用來撰寫延伸模組,這些延伸模組有時需要呼叫相對應的 C 函式庫,這時在 Windows 上就會因無法安裝這些函式庫造成許多延伸套件無法使用。

這些 C 函式庫無法安裝,來自於兩個原因,一個是 C 函式庫支援不足,一個是缺乏良好的套件。由於 C 標準函式庫功能較少,在類 Unix 系統另外提供一組 POSIX 介面,這些介面就成了許多 C 函式庫共通相依的底層功能,但 Windows 系統不支援 POSIX 介面,許多函式庫難以在 Windows 上編譯使用。

當初 C 和 C++ 在發展時,沒有制式的套件格式,將這個議題留給各個系統自行處理。在 GNU/Linux 系統上,直接將這些 C 或 C++ 函式庫和系統套件結合,像是在 Debian/Ubuntu/Linux Mint 上可見以 dev 結尾的套件,就是函式庫的標頭檔 (header);在 GNU/Linux 系統上,只要用一兩行指令就可以安裝這些函式庫。然而,在 Windows 上,缺乏內建的套件管理軟體,使得安裝 C 或 C++ 函式庫相當困難。

由於這些議題可看出,Windows 系統上缺乏一些類 Unix 系統上的特性,有些部分可以靠第三方套件補足,有些則無法更動。筆者撰寫這一系列的文章,就是要記錄一些可以加強 Windows 功能的第三方軟體或工作流程,希望對各位讀者能夠有所幫助。