UNIX哲学中的编程是否与函数式编程相同?


30

UNIX编程环境(经典文本)指出,UNIX编程方法是构建小型的,定义明确的工具,可以将其组合起来以解决更复杂的问题。在学习C和Bash shell时,我发现这是一个功能强大的概念,可用于处理各种编程问题。

仅使用Linux平台,这个概念就很清楚并且一直使用。在命令行上形成的用于重定向I / O,链接系统工具(如ls,grep等)的任何表达式都表明了此概念的强大之处。

让我感到困惑的是,其中许多程序都是使用命令性/过程式编程风格以C语言编写的,但是在命令行上使用它们并将它们结合在一起的方式对我来说更像是函数式编程,其中每个程序都是一个独立的函数,不依赖于它可能加入的任何其他程序的状态。

理解UNIX编程原理是否准确,基本上就是使用可能是用命令式编程风格构建的工具进行的函数式编程吗?


5
我认为类推是否正确并不重要。问题是,这对您有用吗?用这些术语来思考它是否可以帮助您编写程序并完成工作?

Answers:


19

我想你说的有道理,但是cprmcd和许多其他的改变状态,所以他们不是真正的功能。UNIX的哲学更多地是只做一件事,但要做好。通常做得好意味着允许功能使用,但并非总是如此。


9

答案在Oleg Kiselyov撰写的“ Monadic I / O和UNIX Shell编程”中

这是一篇受Philip Wadler的论文“ How to Declare Imperative” [ Wadler97 ] 启发的文章。我们将展示Haskell中的单子I / O与基于管道和重定向的UNIX过滤器组合之间的不可思议的相似性。UNIX管道(在语义上被视为写入临时文件)与monad非常相似。此外,在UNIX编程级别上,所有I / O都可以视为单线程。


6

好吧,我想如果您忽略了整个副作用问题,那么可以这样看。Unix命令对于总是返回具有相同输入的相同数据集通常不起作用。但是,正如您提到的,管道方面类似于如何进行功能编程。


1
你真的有飞机吗?;)(对不起,我的评论很抱歉)
-BlackBear

@BlackBear不是我自己的个人。我在一个俱乐部里,我们当中大约有50个人总共拥有4架飞机。这样比较便宜。:-)
Brian Knoblauch

@Brian Knoblauch:我希望将来有飞机..钱允许的话:P
BlackBear

5
函数式编程并不意味着“没有副作用”。相同功能始终产生相同结果的概念称为“幂等”,它不是程序正常运行的必要条件。这也称为“纯功能”。

2

在一定程度上你可以这样说。但这不一定是正确的。我认为您应该将其更多地理解为“通过简单的设计方法实现更多目标的能力”。为了简单起见,您必须将任务划分为易于理解和易于组装的部分。坦率的UNIX哲学,可以用下面的例子来解释。

所有编程都是某种数据操作!在某些情况下,编程本身就是程序操纵(元编程)。现在,UNIX哲学的工作方式是想象处理文本。什么是文字?文本毕竟是某种数据。当组装成有组织的定义时,文本也将变成XML和JSON。文字也可以是数字列表,文字也可以是csv,tsv和其他内容!在其他情况下,仅因为文本或上下文可以扭曲并变成我们想要的内容,所以Text或字符串可以代表真正巨大的编程数据区域!

所有编程都需要某种形式的数据组织。整理需要搜索...

一种。在那里,仅需使用“ grep”,“ fgrep”及其家人即可。

搜索后,您需要进行一些排序。

b。现在我们有了“ sort”命令。

您刚刚对两个文件进行了排序,现在希望对其进行比较。

C。现在我们有了'diff','cmp'等。

您刚刚发现文件之间没有区别。您现在需要更多的组织数据。

d。您具有“ cat”,管道和重定向运算符来写入文件。

您需要更具体的解析。

e。你有头,尾,多,少,割等来做...

所有这些都使用'|'缝在一起 在一段时间内无需编写任何代码即可生成真正强大的东西。为了更多的搜索和缝纫,您有..

F。awk,shell和sed。

awk,shell和sed使您对文本的控制远胜于cut,diff等人所能提供的。您是否曾经想过使用command1 | command2 | command3 ...系列是一种工作流机制。与If's结合使用时,此功能将变得更加强大。

现在变得更加有趣。

您是否曾经听说过一个名为“ Perl”的实用程序,它是如此强大,您几乎可以用想象不到的工作来完成手头的任何任务。与DBM之类的实用程序一起缝制,您甚至可以对应用程序执行较小的时间持久性要求。请记住,我们甚至还没有走出文本世界,但是设法涵盖了编程环境的大多数方面。

因此,我认为UNIX不仅仅是操作系统。它是旨在以最简单的方式解决问题的工具和环境的集合。简单的方法不一定意味着解决方案的实现简单。但是,简单性本身并不能带您太多。

我在reddit上读过一些。

“如果您唯一的设计目标是简单性,那么您将获得与Plan9一样多的用户”


1

它们在命令行上结合在一起并彼此交互的方式非常实用。但是,我要说的是,这与Shell的设计有更多关系,而与那些底层程序是强制性编写还是功能性编写无关。大多数优秀的功能语言都支持命令性/过程性概念,即使它们的整体设计适合于功能性编程。是的,许多UNIX shell功能都采用了功能概念,但是,这再次是由于shell的设计所致,而不是底层程序的特定实现。

希望这可以帮助,

-tjw

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.