漫谈PowerShell和Windows之路
有时候我会觉得PowerShell不过是个缝合怪而已,功能强大到令人发指,但是设计上乱七八糟。不过其实你想想,一门系统脚本语言,和严肃的高级编程语言(哪怕是脚本语言)比设计,那就是耍流氓。那照这么说的话,C/C++的设计又怎么说呢?但是再反过来说,其实这样的批判也还是有意义的,如果大家都能原谅C/C++,也不会有后来立志改变现状的Rust和Golang了。
有时候又觉得如果整个Windows NT能根据PowerShell建立的 基于对象的统一抽象 从底层到GUI进行一次彻底的、适当抛却兼容性的、脱胎换骨的改造,Windows整体上的的操作逻辑会比现在通顺得多,甚至很可能超过POSIX(包括BSD、GNU/Linux、Darwin等)阵营。现代Windows留有的很多上可溯至DOS时代的各种历史遗留问题,以及几次设计大改(这其中包括2K/XP时代的DOS(Win9x)/NT合流、Longhorn时代的“第二系统效应”式的激进改造(当时甚至想用C#重写大部分非底层系统组件,完全dotnet化)、Win8时代对多端融合的尝试、直到近几年对Win10的各种现代化改良……)带来的从管理接口到操作逻辑的混乱、多范式的交织,正在日渐成为这个历史长达40年(作为操作系统的历史必须算上MS-DOS)的操作系统的无法承受之重。反观POSIX阵营虽然分支众多,但是一直保持着文件和字符串流的一等公民(first-class)地位,抽象模型虽然可能不是很直观(指对于普通用户,了解计算机原理的很可能会认为很直观),但是简洁、高效(与C、bash工具链配合)而稳定(指不常变动)。
我为什么说PowerShell具备“基于对象的统一抽象”?来看看各种常用命令对应的cmdlet名称,不言而明:cat -> Get-Content;cd -> Set-Location;cp -> Copy-Item;del -> Remove-Item;diff -> Compare-Object;ls -> Get-ChildItem;mv -> Move-Item。出现频率最高的Item和Object,不用我解释了吧。我再告诉你,以上这些cmdlet不止用于管理文件,管理设置等操作也会用到。还有虽然长但是整齐划一的谓词-宾语结构。怎么样,是不是有一种已经赢GNU coreutils太多了的感觉?(笑)
但是话又说回来,我们对这样的改造喜闻乐见,难道微软的工程师不知道吗?他们不喜欢这样整齐划一、同时易于一般用户使用和开发人员调用的抽象模型吗?想想吧,当年Longhorn宏伟的计划变为一地鸡毛,才几年哪?忘了?!!那些满是Bug的Beta版本,还存储在收集网站的硬盘里,天天地盯着你们那!
虽然NT6确实是一座史无前例的里程碑,奠定了现代Windows的基础,远不能不能说是一地鸡毛,什么dotnet、C#、WPF、现代Windows的CBS/Dism组件管理器、各种系统组件、包括PowerShell都是那个伟大的年代的产物,但我们都不可否认的是,Longhorn那个“山无棱,天地合”的目标,暂时还只存在于理想之中。而我们刚才所设想的改造,和当年的Longhorn,其实区别也不是很大。
了解计算机的都清楚,对于一个抽象模型,适应于人的认知和贴近机器底层(高性能),是难以两全的。微软更多地偏向于前者,POSIX阵营更多地偏向于后者。但是无论怎么设计,性能,永远是一个操作系统的生命线。
其实要想达到两全,也不是没有办法。一个逻辑简洁统一,也就是我们常说的设计良好的抽象模型,能够贴近这个两全的目标。毕竟逻辑是人和机器共有的。在这方面POSIX模型无疑是一个比较成功的典范。我也希望以PowerShell为代表的这种基于对象的统一模型能够带领着Windows走向一个更光明的未来。前提是微软不作死。干脆把Windows开源让全世界开发者为此奋斗吧(
还有诸多感慨,文字不能尽之。文中许多想法,也难以表述得正确、清楚,甚至可能未免有歪曲了我的原意。
不管怎么说,PowerShell作为微软dotnet战略上的关键一着,更作为面向对象范式在系统脚本语言上的一次成功尝试(传统的bash、batch都是基于字符串流,PowerShell基于对象),其历史地位不可忽视。