几年前,Unix哲学的支持者David Korn在a Slashdot interview中指责Perl程序员编写单片的Perl脚本,而没有通过管道、重定向等使用Unix工具包。"Unix不仅仅是一个操作系统,“他说,”它是一种做事的方式,而shell起着关键的作用,它提供了使其工作的粘合剂。“
似乎提醒也同样适用于Ruby社区。Ruby通过popen,STDIN,STDOUT,STDERR,ARGF等与其他Unix工具协同工作具有很好的特性,但似乎越来越多的Ruby开发者选择使用Ruby绑定和Ruby库来构建整体式Ruby程序。
我知道,在某些情况下,使用单一的Ruby进程并在一个Ruby进程中完成所有工作可能有性能上的原因,但肯定有很多离线和异步任务可以由Ruby程序和其他小程序一起很好地处理,每个小程序都以Unix方式做好一件事,并具有这种方法提供的所有优势。
也许我只是遗漏了一些明显的东西。Unix哲学在今天是否仍然和10年前一样重要?
发布于 2009-12-21 12:22:11
管道和简单工具的Unix哲学是用于文本的。它仍然是相关的,但可能不像以前那么相关了:
但是,尽管世界发生了一点变化,我仍然同意Korn的批评。创建不能与其他程序互操作的大型、整体式程序绝对是糟糕的设计,无论使用哪种语言。规则一如既往:
/usr/share/dict/words.ksh,但任何与POSIX兼容的shell都是一个合理的选择。)总之,有两种高度相关的重用代码的方法
import、#include、load、require或use (Ruby、C++ STL、C Interfaces and Implementations和许多其他)连接时能够很好地结合在一起。在第一个范例中,依赖关系结构很简单(总是线性的),因此很容易理解,但您可以表达的内容更有限。在第二种范式中,您的依赖结构可以是任何非循环图-更具表现力的图,但这包括创建不必要的复杂性的能力。
这两种范式仍然是相关和重要的;对于任何特定的项目,您选择哪一个更多地与您的客户和您的起点有关,而不是与该范式的任何内在优点有关。当然,它们并不是相互排斥的!
发布于 2009-12-21 12:10:55
我认为,随着Emacs的创建,Unix哲学开始失宠。
发布于 2009-12-21 12:11:35
我投赞成票。主观的,但优秀的编程问题。
这只是一段个人趣闻,当时我们正在为保险公司重写一个批量打印输出程序。我们因为在shell中“编程”而被顾问责备。我们意识到它是如何脱节的,语言也是如此的不同以至于不完整。
也许吧。
突然之间,多处理器Intel boxen变得司空见惯,而fork()在新的应用程序时代(想想VB时代)并没有像每个人总是被警告的那样糟糕。批量打印程序(查询数据库,转换为troff输出,然后通过msgsnd转换为PostScript,然后以数十万计输出到LPD队列)在所有系统上都能很好地扩展,并且在VB运行时发生变化时不需要重写。
Perl回答你的问题:我同意Korn先生的观点,但这不是Perl的错,是Perl程序员认为Perl就足够了。在多进程系统中,它可能已经足够好了。
我希望Ruby、Perl、Python甚至Java开发人员都能在shell管道中保持优势。隐式扩展和接口、职责分离和模块化设计的开发哲学具有内在价值。
如果处理得当,随着我们的大规模核心处理单元的出现,Unix哲学可能会再次获得支持。
https://stackoverflow.com/questions/1938068
复制相似问题