Warm tip: This article is reproduced from serverfault.com, please click

其他-为什么看不到大多数高级语言的管道运算符?

(其他 - Why don't I see pipe operators in most high-level languages?)

发布于 2009-10-19 03:39:31

在Unix Shell编程中,管道运算符是一个非常强大的工具。使用少量的核心实用程序,系统语言(如C)和脚本语言(如Python),你可以构建极其紧凑且功能强大的Shell脚本,这些脚本将由操作系统自动并行化。

显然,这是一个非常强大的编程范例,但是我没有将管道视为除Shell脚本之外的任何语言的第一类抽象。使用管道复制脚本功能所需的代码似乎总是很复杂。

所以我的问题是,为什么在现代高级语言(如C#,Java等)中看不到类似于Unix管道的东西?是否有支持一流管道的语言(shell脚本除外)?这是一种表达并发算法的方便,安全的方法吗?

以防万一有人提出它,我看了看F#管道转发运算符(forward pipe operator),它看起来更像是函数应用程序运算符。据我所知,它对数据应用了一个函数,而不是将两个流连接在一起,但是我可以接受更正。

后记:在对实现协程进行一些研究时,我意识到存在某些相似之处。马丁·沃尔夫(Martin Wolf)博客文章中描述了与我类似的问题,但用协程而不是管道来描述。

Questioner
cdiggins
Viewed
11
Mark Aufflick 2009-10-19 11:59:45

你可以在Erlang中非常轻松地对类型并行性进行流水线操作。以下是我在2008年1月发布的博文中的无耻复制/粘贴内容。

另外,格拉斯哥Parallel Haskell允许并行函数组合,这相当于同一件事,为你提供隐式并行化。

你已经在管道方面进行了思考-“ gzcat foo.tar.gz | tar xf-”如何?你可能还不知道,但是shell并行运行unzip和untar-读入tar的stdin只会阻塞,直到gzcat将数据发送到stdout为止。

好吧,很多任务可以用流水线来表达,如果可以做到的话,那么使用David King的帮助程序代码(甚至跨erlang节点,即机器)就可以达到一定程度的并行化:

pipeline:run([pipeline:generator(BigList),
          {filter,fun some_filter/1},
          {map,fun_some_map/1},
          {generic,fun some_complex_function/2},
          fun some_more_complicated_function/1,
          fun pipeline:collect/1]).

因此,基本上,他在这里要做的是列出步骤列表-每个步骤都以有趣的方式实现,可以接受任何先前步骤的输出作为输入(当然,这些有趣的内容甚至可以内联定义)。请查看David的博客条目以获取代码和更详细的说明。