并行映射(生成器)运算符

时间:2009-10-26 13:25:12

标签: concurrency functional-programming generator semantics language-design

我有兴趣为我的语言定义一个并行映射运算符。它将列表转换为给定表达式的新列表。它的语法类似于生成器。与C#和Python中的生成器不同,如果编译器需要(例如,存在空闲核心,并且列表非常大),它可能会并行评估。它将被称为witheach,以区别于顺序执行的foreach

例如考虑:

var f = function(int x) : int { return x * 2; }
var my_list = 0..1000000;
var my_mapped_list = witheach (i in mylist) yield f(i);

我的问题是,对于那些可能会在f中产生副作用的程序员来说,这是否太不直观了?当然,我会说不要在文档中这样做,但大多数程序员不会阅读语言文档。 : - )

我想更大的问题是,现代程序员能否适应他们语言中的隐式并行列表处理语义,还是他们需要更明确的事情呢?

2 个答案:

答案 0 :(得分:2)

你说得对,大多数用户都不会阅读文档,因此可能会将非线程安全的代码放在witheach块中(特别是名称和语法与{{1}相似}})。您要么必须信任您的用户,要么对该块的并发安全性执行一些静态分析。如果您选择了较晚的版本,那么您也可以免费使用foreach - 只在可能的情况下自动并行witheach

至于用户是否已准备好承担选择潜在危险的责任,只要他们事先知道什么是安全的,我就会打赌“是”。许多语言迫使你每天做出这个选择(指针,手动内存管理,共享内存并发)。您可能希望使语法不那么模糊(即称之为foreach),以便人们知道他们注册了什么。

答案 1 :(得分:1)

你的意思是pmap