windows  

Aug 16, 2017 • Michael Chen

即將跳轉至新頁面,或自行前往這裡

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

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

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

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

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

由於 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 上,缺乏內建的套件管理軟體,使得安裝函式庫相當困難。

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