[Windows] 求生手冊:Windows 的程式開發環境出了什麼問題?

【分享本文】
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    前言

    「Windows 用得好好的,怎麼需要求生?」一般使用者大概只有電腦出問題,像是中電腦病毒時,才會想要找求生之道。不過,這系列的文章並不是防毒或防駭手冊,也不是電腦 DIY 大全。

    這系列文章,是筆者使用過 Winodws、MacOS、GNU/Linux 等系統之後,所發想的文字記錄,目的在於記錄一些讓 Windows 在程式開發上更好用的方式,畢竟有時候程式人還是會用 Windows 寫程式;而且,Windows 在桌面系統是大宗 (市佔率 85% 左右),程式人不得不考慮將程式發佈到 Windows 系統的方式。這系列文章有一些偏向類 Unix 系統使用者的觀點,但筆者會儘量地平實公正地敘述自已的想法。

    Windows 系統在程式開發上會讓人覺得不好用,主要有以下兩點:

    • 缺乏良好的命令列環境
    • 對 C 語言不友善

    Windows 缺乏良好的命令列環境

    現在的電腦都已經有圖形化介面了,為什麼還要用命令列?其實,圖形化介面和終端機介面各自有好用的情境。平常的日常活動,當然是用圖形化介面;不過,有時候命令列工具反而比較有效率。像是要對數百數千張圖片做縮圖,用 ImageMagick 相關指令加上簡單的殼命令迴圈很快就可以達成。或是要在文字檔案中搜尋特定內容,用 grep 或 AWK 等指令很快就可以過濾掉大量文字檔,迅速找到所要的資訊。許多程式開發的軟體,是以命令列工具的方式來發佈,好用的命令列環境,可增進工作效率。

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

    由於 Windows 缺乏夠好的殼程式,許多利用殼程式開發的程式在 Windows 上無法使用。例如,如果想要針對 Python 2.7、3.5、3.6 三種版本測試自已的模組的相容性,在類 Unix 系統上,可以利用 pyenv 任意安裝數個版本的 Python;但 pyenv 是以 Bash 寫成,在 Windows 上無法使用。另外一個 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 語言不友善

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

    這些 C 函式庫無法安裝,來自於兩個原因,一個是 C 函式庫支援不足,一個是缺乏良好的套件管理程式。

    由於 C 標準函式庫功能較少,在類 Unix 系統另外提供一組 POSIX 介面,這些介面就成了許多 C 函式庫共通相依的底層功能,但 Windows 系統不支援 POSIX 介面,許多函式庫難以在 Windows 上編譯使用。

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

    結語

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

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤新文章】
    Facebook Twitter Plurk
    標籤: INTRO, WINDOWS