Windows 求生手冊:腳本語言

使用 Unix-like 系統一段時間後,通常會學習某種腳本語言 (scripting language) 以增進自己的工作效率。腳本語言依其使用方式可分為三類:

  • 殼程式 (shell scripting):命令列環境本身自帶的程式語言,沒有函式庫,依賴其他命令列工具完成各種不同的任務。例如:Bash
  • 通用型直譯語言:本身具有完整的標準函式庫及第三方函式庫的程式語言,也可和命令列互動,可使用外部工具,也可不使用外部工具。這類語言往往越出腳本語言的範圍,可完成各種不同任務。例如:Perl、Python、Ruby 等
  • 命令列工具:某些命令列工具也有自己的小型語言,可以達到相當精細複雜的操作。例如:sed、awk、make 等

  • 註:Perl 兼有通用型直譯語言和命令列工具的特色。*

在這三者之中,殼程式的可攜性是最差的,不同系統間可用的命令列工具可能會有所不同,即使該命令存在於系統上,參數也可能不同,另外,還會受到不同系統的環境變數設定的影響。不過,這不代表殼程式沒有用,對於操作命令列工具為主的命令稿,使用殼程式仍然是最簡易方便的選擇。

Windows 也有自己的腳本語言,包括批次檔 (batch file) 和 VBScript 等。但筆者認為這些 Windows-only 的腳本語言應儘量少用,因為這些腳本語言僅在 Windows 平台上能用,但功能又和前面提及的其他腳本語言功能重疊。使用批次檔的時機是要對外發佈軟體時,剛好需要在軟體中使用某個腳本語言,但對方的電腦很有可能沒有其他的腳本語言,這時就可以用批次檔來包裝主程式。像是 gVim for Windows 中就使用批次檔做為從終端機呼叫主程式的媒介。

在 Windows 上,使用通用型腳本語言是較佳的選擇,因為 CMD 環境的限制,使得一些直接寫在命令列的一行程式 (one-liner),像是 AWK 或是 Perl 等,在 Windows 下較難施展。透過撰寫這些通用型腳本語言的命令稿,可以避開命令列環境本身的限制,例如字串長度等,也不需要使用系統內的命令列工具,可以利用該語言的函式庫所提供的功能和系統互動。比起使用命令列工具,撰寫等效命令稿的程式碼長度通常會比較長。

在 Windows 環境下,使用那個腳本語言比較適合呢?如果有在使用 Cygwin 或是 Bash on Windows 的讀者,其實就沒有這個問題,可自由選擇自己喜歡的腳本語言。若是在 Windows 原生 DOS 環境下,其實不需要刻意去學批次檔,可以用其他的通用型直譯語言來取代。一些常見的腳本語言如下:

  • Perl
  • Python
  • Ruby

另外,還有一些相對少見的替代方案:

  • Groovy
  • Go

Perl 是類 Unix 系統上老牌的腳本語言,幾乎每個類 Unix 系統上都可以見到 Perl 的踪跡。然而,除非各位讀者已經熟悉 Perl,通常不建議再拿 Perl 做為腳本語言的方案;這是因為 Perl 本身的因素還有 Windows 的因素。雖然 Perl 的套件庫的套件數量豐富,但 Perl 社群已經出現老化的現象,不僅許多現有的套件未持續更新,商業公司也不願意替 Perl 社群撰寫新的套件,這樣惡性循環的結果,使得 Perl 社群逐漸縮小。

另外一個問題,是來自於 Windows 對 C/C++ 的不友善,連帶影響到許多高階語言的延伸套件,這不僅是 Perl 的問題而已。Perl 在 Windows 上的半官方版本 Strawberry Perl 採用貼近 Unix 文化的做法,使用者需自行編譯套件,但有些套件在 Windows 上就會水土不服。具有商業色彩的 ActivePerl 提供預先打包好的套件,某種程度上解決了這個問題,但僅限於較流行的套件,其他套件仍要使用者自行處理。

和 Perl 類似,Ruby 對 Windows 的支援也是不佳。同樣地,Windows 上的 RubyInstaller 採取的方針要使用者自行編譯套件,許多 Ruby 套件在 Windows 上無法順利安裝,但 RubyInstaller 在 2.4 版後和 msys2 整合,對 Windows 的支援度有改善一些。目前商業版本的 ActiveRuby 仍在 beta 狀態,希望日後可以改善 Ruby 在 Windows 上的支援度。

而在這些腳本語言中,以 Python 為較好的選擇。在使用腳本語言時,很少會只用標準函式庫的功能,如果要使用第三方函式庫時,Python 的套件對 Windows 的支援度較佳,像是近年來 Python 社群力推的 wheel 套件格式,將一些延伸套件預先編譯,某種程度上解決了 C/C++ 所造成的議題。Python 的用途相當廣泛,現在市面上已經有許多 Python 的中英文專書,有興趣的讀者可自行選購喜歡的書籍。

另外一個替代的選擇是 Groovy,這是一個運行在 Java 平台上的腳本語言,語法上類似 Python 或 Ruby。由於 Groovy 運行在 Java 平台上,大部分以 Java 或 Groovy 撰寫的第三方函式庫也是運行在 Java 平台上,甚少需要處理 C/C++ 相關的問題,對 Windows 的支援度反而比較好,在 Linux 或 Mac 上也可以運行 Groovy 命令稿。但 Groovy 的問題在於使用者較少,學習資源相對缺乏,要在網路上找可用的教程或範例程式較不容易。

Go 雖然是編譯語言,而不是腳本語言,但 Go 程式碼易學易學,算是接近腳本語言的等級。和 Python 命令稿等效的 Go 程式碼,其實不會比 Python 程式碼長太多。大部分和系統互動等腳本語言所需的功能,其實都已經包在標準函式庫裡面;此外,許多第三方套件也是以純 Go 程式碼寫成,某種程度也算是避開了 C/C++ 所造成的議題。

在類 Unix 平台上,大部分使用者會使用 GCC,其實上述的 Perl、Python、Ruby 等語言也是使用 GCC 在 Windows 上的移植品,但每個社群的處理方式各有不同,導致我們會重覆安裝功能相似的套件。由於這三種語言在功能上有所重疊,通常僅需安裝其中一種即可。若重覆安裝 GCC 等工具,透過 PATH 的設定也可解決一部分的問題。透過本文,相信各位讀者對於 Windows 上的腳本語言都有一些概念;希望各位讀者都可以找到適合自己的腳本語言。