UNIX实用程序的智能程度如何?


8

Unix实用程序,例如sort,find,grep,diff等非常易于执行快速任务,有时甚至根本不需要编写任何代码。

我想知道它们在内部使用什么算法,以及如何智能地为特定任务确定特定算法?例如,如果sort得到一个巨大的输入文件,是否会对不同的数据大小使用不同的算法?

grep在搜索不同数据集时是否智能切换算法?


4
他们是如此聪明,有一天他们将占领地球。但现在你必须决定你会走哪使用,如grepegrepfgrep
基思

1
但是,如果您定期使用egrep,然后突然切换到fgrep,它可能会因为不忠而决定在睡眠中杀死您。
2011年

1
他们像挥舞他们的双手一样聪明。
luis.espinal 2011年

Answers:


7

Unix只是一个标准,它指定了实现应做的事情,但未指定实现的方式。

因此,grep / sort / find的实现很可能会在不同的系统上使用不同的方法(甚至是像Linux这样的系统,也有并发实现)。

对于Linux,您始终可以查看源代码。


2
完成您的答案:gnu.org/software/coreutils
sahid 2011年

为什么需要查看源代码?greps算法是众所周知的并已记录在案。甚至在Wikipedia页面上的grep。链接
已删除帐户,

@删除我认为您在实施时误会了原则。
西蒙·托斯

@Let_Me_Be:该算法,甚至其实现都是众所周知的,并已记录在案。链接 链接
已删除帐户,

@Deleted也许我不明白您要说的是什么,但是coreutils的Linux grep使用的是特定算法,并不意味着所有实现都使用该算法。是的,您是对的,因为算法往往是众所周知的(因为这就是设计算法的重点)。
西蒙·托斯


1

UNIX标准没有指定标准系统工具的实现细节,只有极少数情况除外。您可以在这里找到最新的Single Unix Specification版本(警告:需要注册)。

考虑到这一点,每个UNIX(系统V和直接后代,例如BSD,Solaris,Mac OS X等)或基于UNIX的操作系统(远后代或类似系统:Linux,Minix)都有其自己的实现,这些实现在UNIX规范。例如。看一下FreeBSDLinux / GNU Coreutils。注意,某些工具本身就是单独的整个项目,例如GNU diffGNU grep。另外一个事实是,这些工具的某些实现可能会像最初为它们编写的系统一样,以标准方式进入其他UNIX之类的系统,例如freebsd或GCC中的某些gnu coreutils

奖励:绕着UNIX家族树,请看一下这张图


0

我想知道它们在内部使用什么算法,以及如何智能地为特定任务确定特定算法?例如,如果sort得到一个巨大的输入文件,是否会对不同的数据大小使用不同的算法?

这是一个有趣的问题(为此+1)。我不知道答案是什么,但是如果我是您,我将查看典型GNU实用程序的源代码以了解它们的算法。

grep在搜索不同数据集时是否智能切换算法?

我不这么认为。不要引用我,因为我无法真正100%肯定地告诉您,但是我真的不这么认为。UNIX的事物哲学是一件事情只能做一件事情,一件事情只能做一件事情。这就是为什么我们使用grep的几个版本(grepegrepfgrep)。

同样,该想法是在运行时做一件事,而只做一件事。可以将不同的行为和算法配置为命令行参数,以便同一程序在两次运行之间的行为可能略有不同(并且可能略有优化)。wcdiff命令就是很好的例子。

但是,行为适应是基于配置的(通过cmd行参数);它们在运行时不会更改/适应行为。对于UNIX工具旨在成为的工件类型,这通常是不必要的复杂性。

这种复杂性更适合于更复杂,通用性较低的工具IMO。


2
这里的主题更多是“ 不”,它们实际上是愚蠢的!。您必须确切告诉他们必须做什么。无论如何,我们不希望他们对我们太聪明。
tshepang 2011年

0

grep在搜索不同数据集时是否智能切换算法?

我不这么认为,但是当给定-f标志(或作为fgrep调用)时,它的确切换为“快速”非RE算法。


即不是很聪明:)
tshepang 2011年
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.