曾經,Shell(殼)與Script(劇本)彼此涇渭分明;如今,Shell混進了Script,Script混進了Shell,雙方的血統融合得難以分離,想要區分Shell語言和編劇語言(Scripting Language),真的沒有一翻兩瞪眼的作法。現在,你往往可以用Shell做Script的事,用Script做Shell的事。

過去,我們區分Shell和Script最簡單的方式,就是看它的名稱(我可沒說這是最聰明的方式)。名稱以Shell結尾的,就是Shell,以Script結尾的,就是Script。但是這樣的區分方式,在現在顯然不管用了。

例如:PowerShell,雖然結尾名為Shell,但是它的功能實在太強大,你甚至還可以用它開發.NET應用,這是一種類似AppleScript的用法。

你也許會問,什麼是Shell?和命令解譯器(Command Interpreter)有何不同?何謂編劇語言(Scripting Language)?如果可以用Shell語言來編劇,那是否表示Shell語言也是編劇語言?編劇語言和編程語言(Programming Language)有何不同?為了回答這些問題,我們必須細說從頭,先從Shell開始講起。

定義何謂Shell(殼),可能有一點棘手,特別是對微軟來說,因為微軟幾乎任何產品內,都有被稱為Shell者。Windows Explorer是檔案管理員,也是一個Shell,甚至連Xbox也有一個shell。從遠古時代的定義來看,Shell(殼)指的是「位於作業系統核心功能之上」的一個「軟體」,核心(Core)功能就是作業系統的核心(Kernel)。(又是核,又是殼的……你體會出這個比喻了嗎?)總之,Shell是一個軟體,讓你可以存取作業系統所提供的功能。

Windows Explorer之所以被稱為Shell,因為它讓你可以存取Windows系統的功能。但是我們比較感興趣的是傳統的文字環境,使用者在此輸入命令,接收回應。換句話說,Shell是一種命令列解譯器。大多數情況下,這兩個術語可以交替使用。

什麼是編劇?編劇語言和Shell有何差異?某種程度來說,兩者差別不大。許多編劇語言(例如:Ruby、Python、REBOL、Common Lisp)都有提供「互動模式」,可以讓使用者輸入命令,然後立刻執行命令,並傳出結果。這種操作模式稱為「Read-Evaluate-Print」迴圈,或簡稱REP迴圈。

編劇語言如果具有REP迴圈,為何不能被視為Shell?差異主要是在使用者的體驗。好的命令列Shell也會是好的使用者介面。命令列必須提供一些特色,好讓使用者感覺舒服、可以依照其喜好改變環境。改善使用者體驗的特色,則包括Alias(讓難輸入的命令有輸入的捷徑),萬用字元比對(Wildcard Matching,不用輸入完整名稱),輕易啟動其他程式。最後,命令列Shell讓使用者可以察看、編輯、重新執行之前輸入過的命令,此機制稱為「命令歷史」。

如果編劇語言可以當Shell使用,那麼Shell可以當編劇語言使用嗎?答案是可以的。隨著世代的演進,UNIX Shell語言的威力越來越強大,使用現代的Shell語言(例如bash或zsh)寫出實用的應用,這是有可能的。

盡管如此,編劇語言在特性上還是比Shell語言強,主要是因為編劇語言允許你將一個大型劇本拆解成多個元件或模組,這樣的機制能讓你開發出較大的劇本。

而且,編劇語言通常提供更複雜的除錯能力,其執行環境能讓程式碼的執行更有效率,所以,「用編劇語言寫的劇本」會比「其使用對應的Shell劇本」執行得更快。再者,編劇語言的語法比較傾向於寫應用,而不是寫互動式發出的命令。

但是,請注意,「讓編劇語言成為好語言」的特色,卻可能帶給Shell使用者不好的體驗;「讓使用者具有良好互動Shell體驗」的特色,卻可能會妨礙編劇的進行。

至於編劇語言和編程語言有何不同?簡單的區分方式是:解譯式的就是編劇語言,用編劇語言編寫出來的就是劇本(Script);而編譯式的就是編程語言,而用編程語言編寫出來的就是程式(Program)。但這種方式現在也不管用了。目前許多編劇語言,都可以選擇解譯或編譯的作法。例如,最近出現的JavaFX Script,雖然是解譯式語言,但是Sun已經做出JavaFX的編譯器。而C/C++雖然是編譯式語言,Ch卻可以用解譯的方式執行C/C++。

如同好律師會變成爛總統、記者會變成政論節目的名嘴、編程員會放棄寫程式改寫「言程序」專欄。我只能說,這是一個不務正業、大家都想多方位發展的時代。

所以,對於Shell想變成編劇語言,編劇語言想變成Shell;解譯式語言想變成編譯式語言,編譯式語言想變成解譯式語言,我們IT界的人都應該習以為常了。或許,有一天,「自然語言」和「電腦語言」的界線,也會模糊了吧?

蔡學鏞-專職作家
清華大學資訊工程碩士,曾任華碩集團軟體工程師、元智大學資訊系講師、美商歐萊禮出版社技術編輯、臺灣微軟特約專欄作家。

熱門新聞

Advertisement