Unix / C中不一致和不完整的例子有哪些?


20

在理查德·加布里埃尔(Richard Gabriel)的著名文章《更糟的崛起》中,他将MIT / Stanford(Lisp)和新泽西(C / Unix)设计哲学的漫画版本沿简单性,正确性,一致性和完整性进行了对比。他举例说明了“ PC失败者的问题”(Josh Haberman在其他地方讨论过),以为Unix优先于实现的简单性而不是接口的简单性。

我想出的另一个例子是不同的数字方法。Lisp可以表示任意大的数字(最大取决于内存的大小),而C将数字限制为固定的位数(通常为32-64)。我认为这说明了正确性轴。

有什么例子可以保持一致性和完整性?以下是加百列的所有描述(他承认是漫画):

麻省理工学院/斯坦福大学的方法

  • 简单性-设计必须在实现和界面上都简单。接口要比实现简单,这一点更为重要。
  • 正确性-设计在所有可观察的方面都必须正确。根本不允许不正确。
  • 一致性-设计一定不能不一致。为了避免不一致,允许设计稍微简单一些,不太完整。一致性与正确性一样重要。
  • 完整性-设计必须涵盖尽可能多的重要情况。必须涵盖所有合理预期的情况。不允许过分简化完整性。

新泽西州方法

  • 简单性-设计必须在实现和界面上都简单。简单的实现比接口更重要。简洁是设计中最重要的考虑因素。
  • 正确性-设计在所有可观察的方面都必须正确。简单比正确要好一些。
  • 一致性-设计一定不能过分不一致。在某些情况下,为了简化起见,可以牺牲一致性,但是最好将设计中处理不常见情况的那些部分放掉,而不是引入实现复杂性或不一致。
  • 完整性-设计必须涵盖尽可能多的重要情况。所有合理预期的情况都应包括在内。可以牺牲完整性来支持任何其他质量。实际上,每当实现简单性受到威胁时,都必须牺牲完整性。如果保持简单性,可以牺牲一致性来实现完整性。尤其是一文不值的是接口的一致性。

请注意,我并不是在问Gabriel是否正确(这个问题不适用于StackExchange),而是要举例说明他可能一直在指的是什么。


6
如果您好奇,这不是作业问题。我是老师 :-)再三考虑,也许这就是我的功课。
Ellen Spertus'4

4
我很难理解为什么这个问题不在Unix&Linux(或软件工程?)上。您能详细说明您需要以哪种方式从CS角度处理此事吗?另外,请说明您要正面还是负面的例子。
拉斐尔

这个问题不是更适合Programs.stackexchange.com吗?
Basile Starynkevitch 2015年

之所以将其发布到CS上是因为我认为语言设计是计算机科学的基础深层领域之一,涵盖了可计算性,复杂性,体系结构,可用性等。我可以将其发布到Unix / Linux,尽管我正在寻找更广泛的领域。视图。对于程序员,即使在我发布主题时,人们几乎总是对我充满敌意,即使我以为是话题,所以我也要远离那里。
Ellen Spertus

Answers:


15

该问题的标题表明,一些基本的用户界面不一致可能使您感兴趣:

Unix命令不遵循任何用于指定选项和标志的特定语法。例如,大多数命令使用以'-'开头的单个字母作为标志:cat -n some_file,但是像tar tf some_file.tar和这样的异常dd in=some_file out=some_other_file count=2存在于常用命令中。

Unix及其后代和亲戚具有多种略有不同的正则表达式语法。外壳程序使用“ *”,而其他程序(grep,egrep,vi)使用“。*”。egrep具有“ +”和“ |” 作为运算符,grep不会。

基本的“一切都是文件”系统调用界面可能被视为不完整:读/写/搜索/关闭并不适合所有I / O设备。急需的异常被集中到“ ioctl”调用中,但是像声卡之类的设备甚至不能很好地适应这种情况。


好答案。当我看到标题时,我立即想到了“ ioctl”(和fcntl),但现在不必键入答案了。
路易(Louis)

1
glob模式不是正则表达式
jk。

8

一致性

Lisp具有非常一致的语法,所有语言扩展都可以通过宏等自然地嵌入。另一方面,C具有相当的代码语法,该语法使人可以采用一些“捷径”,因此在某些情况下,C代码实际上看起来更简单。

完整性

在Lisp中,如果您没有所需的特定语言功能,则可以使用宏自己实现它。C也有预处理器,但是它很困惑。


8

C的字符串不能包含字符0,并且其库函数不适合处理二进制数据。

Unix系统上的文件名不能包含字符0或字符47(斜杠)。

在Unix的原始实现中,文件名限制为14个字符。更高版本仅放宽了此限制。他们没有消除它。

已添加E2BIG系统错误条件,当尝试exec使用参数列表过多,或占用过多内存或环境太大时。

Unix因这种任意限制而臭名昭著。在1987年Perl出现之前,处理大型数据集或具有长记录的数据集或二进制数据一直是非常不可靠的。


不允许/不是任意的,/与路径分隔符一样,必须(?)解决歧义。我刚刚创建了一个文件000,显然,在现代GNU / Linux时代,特定的限制已经消失了。
拉斐尔

我并不是说禁止的/是任意的,只是行长度和文件大小的限制是任意的,但是要点是,不同的设计可以允许文件名包含斜杠,但是Unix的设计者没有认为很重要。
Mark Dominus

我确信当时是出于性能方面的考虑而引入了这些限制。未开发的技术也可能参与其中。从今天的角度来看,它们似乎值得怀疑。关于/,我很好奇:假设路径应编码为字符串,那么如何在没有保留字符的情况下进行路径分隔呢?
拉斐尔

我不明白你的意思。该问题询问“ Unix / C中不一致和不完整的示例”;它没有提到性能。
Mark Dominus 2013年

1
@Raphael:您可以通过定义path抽象数据类型来摆脱愚蠢的分隔符问题,并在您的接口中使用它,而不是公开特定的实现(以null结尾的ascii字符串)。
Wandering Logic

4

IIRC的老师说,无法在C语言的语句中使用char *变量switch是一个不一致的问题,但对我而言,这是普遍性(完整性)问题。我认为这是更好地使用刚刚在“一致性” 不是在编程语言本身(至少在语言,如C.也许马车语言具有一致性问题)的算法,软件设计,因为编程语言具有定义的规则域固体标准通过将输入应用于规则来工作。因此,如果某些内容不允许使用语言,恕我直言,这是计划不允许的,并且不会出现语言不一致的情况。


  1. 我将通用性用作完整性。我认为他们是同一回事。也许我错了。
  2. 这不是答案。也许是建议或我的意见。

3

我最好的例子是可怜的用户,该用户的文件名为.. -r并键入rm *

无论这个故事是否真实,它都已成为Unix仇恨者的经典。

有关很多示例,请参见Dennis Ritchie本人的介绍的Unix-Haters手册

我还要补充一点,避免这些类型的问题是Microsoft Power Shell设计中的主要力量。


我在Unix-Haters手册的后面阅读了Richard Gabriel的文章。:-)
Ellen Spertus

3
  • 当然,命令的相同(短)标志的无数含义是不一致的。
  • 每个使用正则表达式的程序都有自己的语法
  • 服务的配置文件是所有不同的语法(可以部分原谅,您的邮件守护程序与Web服务器或系统启动几乎没有共同之处,但仍然如此)
  • 有不同的编辑器!用户使用不同的外壳!为什么会有这么多的桌面环境?!

OTOH(外壳会扩展球体而不是程序)会消除其他系统中存在的许多令人不快的不一致之处。同样,您可以使用同一命令将文件从文件系统中的一个位置复制到另一个位置,复制到软盘或从Zip磁盘复制到磁带。

因此,是的,Unix是不一致的。其他系统也是如此,只是有所不同;-)


2

LISP支持无限精度数字,而C仅支持机器整数,这不是语言“正确性”的示例。这是一个简单的问题,因为这些语言具有不同的设计目标。

C的要点是接近于可用于实现操作系统的机器的语言。机器(大部分)不支持无限精度的十进制数字。机器(大多数情况下)确实具有固定位长的整数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.