Unix实用程序,例如sort,find,grep,diff等非常易于执行快速任务,有时甚至根本不需要编写任何代码。
我想知道它们在内部使用什么算法,以及如何智能地为特定任务确定特定算法?例如,如果sort得到一个巨大的输入文件,是否会对不同的数据大小使用不同的算法?
grep在搜索不同数据集时是否智能切换算法?
Unix实用程序,例如sort,find,grep,diff等非常易于执行快速任务,有时甚至根本不需要编写任何代码。
我想知道它们在内部使用什么算法,以及如何智能地为特定任务确定特定算法?例如,如果sort得到一个巨大的输入文件,是否会对不同的数据大小使用不同的算法?
grep在搜索不同数据集时是否智能切换算法?
Answers:
Unix只是一个标准,它指定了实现应做的事情,但未指定实现的方式。
因此,grep / sort / find的实现很可能会在不同的系统上使用不同的方法(甚至是像Linux这样的系统,也有并发实现)。
对于Linux,您始终可以查看源代码。
UNIX标准没有指定标准系统工具的实现细节,只有极少数情况除外。您可以在这里找到最新的Single Unix Specification版本(警告:需要注册)。
考虑到这一点,每个UNIX(系统V和直接后代,例如BSD,Solaris,Mac OS X等)或基于UNIX的操作系统(远后代或类似系统:Linux,Minix)都有其自己的实现,这些实现在UNIX规范。例如。看一下FreeBSD和Linux / GNU Coreutils。注意,某些工具本身就是单独的整个项目,例如GNU diff或GNU grep。另外一个事实是,这些工具的某些实现可能会像最初为它们编写的系统一样,以标准方式进入其他UNIX之类的系统,例如freebsd或GCC中的某些gnu coreutils。
奖励:绕着UNIX家族树,请看一下这张图。
我想知道它们在内部使用什么算法,以及如何智能地为特定任务确定特定算法?例如,如果sort得到一个巨大的输入文件,是否会对不同的数据大小使用不同的算法?
这是一个有趣的问题(为此+1)。我不知道答案是什么,但是如果我是您,我将查看典型GNU实用程序的源代码以了解它们的算法。
grep在搜索不同数据集时是否智能切换算法?
我不这么认为。不要引用我,因为我无法真正100%肯定地告诉您,但是我真的不这么认为。UNIX的事物哲学是一件事情只能做一件事情,一件事情只能做一件事情。这就是为什么我们使用grep的几个版本(grep
,egrep
,fgrep
)。
同样,该想法是在运行时做一件事,而只做一件事。可以将不同的行为和算法配置为命令行参数,以便同一程序在两次运行之间的行为可能略有不同(并且可能略有优化)。wc
和diff
命令就是很好的例子。
但是,行为适应是基于配置的(通过cmd行参数);它们在运行时不会更改/适应行为。对于UNIX工具旨在成为的工件类型,这通常是不必要的复杂性。
这种复杂性更适合于更复杂,通用性较低的工具IMO。
grep
,egrep
或fgrep
。