unix哲学同其他哲学的比较下一篇(unix编程艺术摘录)

  内部边界

 

  Unix的准绳是:程序员最清楚一切。当你对自己的数据进行危险操作(例如执行rm -fr *.)时,Unix并不阻止你,也不会让你确认。另一方面,Unix却小心避免你踩在别人的数据上。事实上,Unix提倡设立多个账户,每个账户具有专属、可能不同的权限,以保护用户不受行为不端程序的侵害。系统程序通常都有自己的“伪用户账号”,以访问专门的系统文件,而不需要无限制的(或者说超级用户的)访问权限。

   Unix 至少设立了三层内部边界来防范恶意用户或有缺陷的程序。一层是内存管理:Unix用硬件自身的内存管理单元(MMU)来保证各自的进程不会侵入到其他进程的内存地址空间。第二层是为多用户设置的真正权限组--普通用户(非root用户)的进程未经允许,就不能更改或者读取其他用户的文件。第三层是涉及关键安全性的功能限制在尽可能小的可信代码块上。在Unix中,即使是shell(系统命令解释器)也不是什么特权程序。

  操作系统内部边界的稳定不仅是一个设计的抽象问题,它对系统安全性有着重要的实际影响。

  彻头彻尾的反Unix系统,就是抛弃或者回避内存管理,这样失控的进程就可以任意摧毁、扰乱或者破坏其他正在运行的程序:弱化甚至不设置权限组,这样用户就可以轻而易举地修改他人的文件和系统的关键数据(例如,掌握了word程序的宏病毒可以格式化硬盘):依赖大量的代码,如整个shell和GUI,这样任何代码的bug或者对代码的成功攻击都可以威胁到整个系统。  

   文件属性和记录结构

   Unix文件就没有记录结构(record structure) 也没有文件属性。在一些操作系统中,文件具有相关的记录结构:操作系统(或者其他服务程序库)通过固定长度的记录,了解文件或者文本行终止符以及CR/LF(回车/换行)是不是该作为单个逻辑字符读取。

  在另一些操作系统中,文件和目录可以具备相关的名字/属性对——(例如)采用编外数据(out-of-band data)将文档文件同能够解读它的应用程序关联起来。(Unix处理这种联系的典型方法是让应用程序识别“特征数”或是文件内的其他数据类型)

  操作系统的记录结构通常都只是一个优化手段,几乎只会使API和程序员的生活复杂化之外没别的用,还会助长不透明的面向记录的文件格式,使得文本编辑器之类的通用工具无法正确获取。

 文件属性会很有用,但是在面向字节流工具和管道的世界中,它可能引发一些棘手的语义问题。对文件属性的操作系统级支持会诱导程序员使用不透明的文件格式,让他们依靠文件属性将文件格式同对应的解读程序绑在一起。

 二进制文件格式

 如果你的操作系统使用二进制文件格式存放关键数据(如用户账号),应用程序采用可读文件格式的传统就很可能无法形成。我们将在后面解释为什么这是一个问题。现在只要注意,这种做法可能会带来一下后果就够了。

 @即使支持命令行接口、脚本和管道,也几乎无法形成过滤器

 @数据文件只有通过专用工具才能访问。开发者的思维会以工具为非数据为中心。这样,不同版本的文件格式很难兼容。

 彻头彻尾的反Unix系统,让所有文件格式都采用不透明的二进制格式,后者要用重量级的工具才能读取和编辑。

 首选用户界风格

 操作系统的设计者把哪一种选作一般变现模式,将影响设计的许多方面——从进程调度、内存管理知道应用程序的应用程序编程接口。

 第一款Macintosh已经发布很多年了,不用说人们也会觉得操作系统的GUI没做好是个问题。Unix的教训则相反:CLI没做好是一个不太明显但同样严重的缺陷。

 如果操作系统的GUI功能很弱或者根本不存在,其后果是: 

 @程序设计不会考虑以未预料到的方式相互协作——因为无法这样设计。输出不能用作输入。

 @远程系统管理更难于实现,更难以使用,更强调风格。

 @即使简单的非交互式程序也将招致GUI开销或者复杂的脚本接口

 @服务器、守护程序和后台程序几乎无法写出,至少很难以优雅的方式写出。

 彻头彻尾的反Unix系统,就是没哟CLI,没有脚本编程能力——或者,存在CLI不能驱动的重要功能。

 目标受众

 不同的操作系统设计是为了适应不同的目标受众。有的为后台工作设计,有的则是设计成桌面系统。有的为技术用户而设计,有的则为最终用户而设计。有的能在实时控制应用中单机工作,有的则为分时系统和普遍联网的环境设计。

 一个重要的差异就是客户端和服务器之分。“客户端”可以理解为:轻量,只支持当个用户,能够在小型机器上运行,随需开关机器,没有抢先式多任务处理,为低延迟做了优化,大量资源都用在花哨的用户界面上。“服务器”可以解释为:重量,能够连续,为吞吐量优化,完全抢占式多任务处理以处理多重会话。所有的操作系统最初都是服务器操作系统。客户端操作系统的概念仅在二十世纪几十年代后期随着价格不高、性能一般的PC硬件的出现才产生。客户端操作系统更关注用户的视觉体验而不是7×24小时的连续正常运行。

 所有这些变数都对开发风格产生影响。其中最明显的就是目标用户能够容忍的界面复杂的级别,以及如何在可感知复杂度和成本、性能等其他变数之间权衡轻重。人们常说,Unix是程序员写给程序员们的——这个目标用户群在界面复杂度的承受力方面是出了名的。

  这与其说好似一个目标不如说是一个结果。如果“用户”这个词带有“单纯得傻乎乎”的蔑视含义,我憎恨一个为“用户”设计的系统。

 彻头彻尾的反Unix系统,就是一个自以为比你自己更懂你在干什么的操作系统,然后雪上加霜的是,它还是错了。

 开发的门槛

 区分操作系统的另一个重要尺度就是纯用户转变为开发者的门槛高度。这里有两个重要的成本动因。一个是开发工具的金钱成本,另一个是成为一个熟练开发者的时间成本,有些开发文化还形成了一个社会性门槛。但这通常是背后的技术成本带来的结果,为不是根本原因。 

 昂贵的开发工具和复杂晦涩测API造就了小群的精英编程文化。在这种文化中,编程项目是大型而严肃的活动——为了证明所投资的软硬资本物有所值,这些工程必须如此。大型而严肃的工程常常产生大型、严肃的程序(而且。更常见的是,大型而昂贵的失败)

 廉价工具和简单接口支持的是轻松编程,玩家文化,和开拓探索。编程项目可以很小,(通常,正式的项目结构显然毫无必要),失败了也不是什么大灾难。这改变了人们开发代码的风格,尤其是,他们往往不会过分依赖已经失败的方法。

 轻松编程往往会产生许多小程序和一个自我增强,不断拓展的知识社区,在廉价硬的世界里,是否存在这样一个社区日益成为一个操作系统能否长寿的重要因素。

Unix开创了轻松编程的先河,Unix的众多首创之一就是将编译器和脚本工具放在默认安装中,可供所有用户使用,支持了一种跨越众多机器的玩家开发文化。在很多Unix下写代码的人并不认为自己在写代码——他们认为是在为普通任务的自动化编写脚本,或者在定制环境。

 彻头彻尾ide反Unix系统,不可能进行轻松编程。

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值