漫談PowerShell和Windows之路
有時候我會覺得PowerShell不過是個縫合怪而已,功能強大到令人發(fā)指,但是設(shè)計上亂七八糟。不過其實你想想,一門系統(tǒng)腳本語言,和嚴肅的高級編程語言(哪怕是腳本語言)比設(shè)計,那就是耍流氓。那照這么說的話,C/C++的設(shè)計又怎么說呢?但是再反過來說,其實這樣的批判也還是有意義的,如果大家都能原諒C/C++,也不會有后來立志改變現(xiàn)狀的Rust和Golang了。
有時候又覺得如果整個Windows NT能根據(jù)PowerShell建立的 基于對象的統(tǒng)一抽象 從底層到GUI進行一次徹底的、適當拋卻兼容性的、脫胎換骨的改造,Windows整體上的的操作邏輯會比現(xiàn)在通順得多,甚至很可能超過POSIX(包括BSD、GNU/Linux、Darwin等)陣營?,F(xiàn)代Windows留有的很多上可溯至DOS時代的各種歷史遺留問題,以及幾次設(shè)計大改(這其中包括2K/XP時代的DOS(Win9x)/NT合流、Longhorn時代的“第二系統(tǒng)效應(yīng)”式的激進改造(當時甚至想用C#重寫大部分非底層系統(tǒng)組件,完全dotnet化)、Win8時代對多端融合的嘗試、直到近幾年對Win10的各種現(xiàn)代化改良……)帶來的從管理接口到操作邏輯的混亂、多范式的交織,正在日漸成為這個歷史長達40年(作為操作系統(tǒng)的歷史必須算上MS-DOS)的操作系統(tǒng)的無法承受之重。反觀POSIX陣營雖然分支眾多,但是一直保持著文件和字符串流的一等公民(first-class)地位,抽象模型雖然可能不是很直觀(指對于普通用戶,了解計算機原理的很可能會認為很直觀),但是簡潔、高效(與C、bash工具鏈配合)而穩(wěn)定(指不常變動)。
我為什么說PowerShell具備“基于對象的統(tǒng)一抽象”?來看看各種常用命令對應(yīng)的cmdlet名稱,不言而明:cat -> Get-Content;cd -> Set-Location;cp -> Copy-Item;del -> Remove-Item;diff -> Compare-Object;ls -> Get-ChildItem;mv -> Move-Item。出現(xiàn)頻率最高的Item和Object,不用我解釋了吧。我再告訴你,以上這些cmdlet不止用于管理文件,管理設(shè)置等操作也會用到。還有雖然長但是整齊劃一的謂詞-賓語結(jié)構(gòu)。怎么樣,是不是有一種已經(jīng)贏GNU coreutils太多了的感覺?(笑)
但是話又說回來,我們對這樣的改造喜聞樂見,難道微軟的工程師不知道嗎?他們不喜歡這樣整齊劃一、同時易于一般用戶使用和開發(fā)人員調(diào)用的抽象模型嗎?想想吧,當年Longhorn宏偉的計劃變?yōu)橐坏仉u毛,才幾年哪?忘了???!那些滿是Bug的Beta版本,還存儲在收集網(wǎng)站的硬盤里,天天地盯著你們那!
雖然NT6確實是一座史無前例的里程碑,奠定了現(xiàn)代Windows的基礎(chǔ),遠不能不能說是一地雞毛,什么dotnet、C#、WPF、現(xiàn)代Windows的CBS/Dism組件管理器、各種系統(tǒng)組件、包括PowerShell都是那個偉大的年代的產(chǎn)物,但我們都不可否認的是,Longhorn那個“山無棱,天地合”的目標,暫時還只存在于理想之中。而我們剛才所設(shè)想的改造,和當年的Longhorn,其實區(qū)別也不是很大。
了解計算機的都清楚,對于一個抽象模型,適應(yīng)于人的認知和貼近機器底層(高性能),是難以兩全的。微軟更多地偏向于前者,POSIX陣營更多地偏向于后者。但是無論怎么設(shè)計,性能,永遠是一個操作系統(tǒng)的生命線。
其實要想達到兩全,也不是沒有辦法。一個邏輯簡潔統(tǒng)一,也就是我們常說的設(shè)計良好的抽象模型,能夠貼近這個兩全的目標。畢竟邏輯是人和機器共有的。在這方面POSIX模型無疑是一個比較成功的典范。我也希望以PowerShell為代表的這種基于對象的統(tǒng)一模型能夠帶領(lǐng)著Windows走向一個更光明的未來。前提是微軟不作死。干脆把Windows開源讓全世界開發(fā)者為此奮斗吧(
還有諸多感慨,文字不能盡之。文中許多想法,也難以表述得正確、清楚,甚至可能未免有歪曲了我的原意。
不管怎么說,PowerShell作為微軟dotnet戰(zhàn)略上的關(guān)鍵一著,更作為面向?qū)ο蠓妒皆谙到y(tǒng)腳本語言上的一次成功嘗試(傳統(tǒng)的bash、batch都是基于字符串流,PowerShell基于對象),其歷史地位不可忽視。