Lambda函数&闭包将成为C++标准新特性

hurd 2008-04-15
如果说函数式程序设计语言的复兴还未成为主流的话,那么函数式程序设计的重要特征Lambda函数与闭包已经真正成为主流了。
据图灵出版的《Exceptional C++ Style中文版》作者Herb Sutter的报道,C++标准委员会已经投票通过,将Lambda函数与闭包加入C++0x。同时批准的新特性有:
* N2535 Namespace associations (inline namespace)
* N2540 Inheriting constructors
* N2541 New function declarator syntax
* N2543 STL singly linked lists (forward_list)
* N2544 Unrestricted unions
* N2546 Removal of auto as a storage-class specifier
* N2551 Variadic template versions of std::min, std::max, and std::minmax
* N2554 Scoped allocator model
* N2525 Allocator-specific swap and move behavior
* N2547 Allow lock-free atomic in signal handlers
* N2555 Extended variadic template template parameters
* N2559 Nesting exceptions (aka wrapped exceptions)
加上已经率先拥抱Lambda的C#和其他许多CLR语言(比如VB2008),以及Java 7,还有本就出身“正派”的一堆动态语言……函数式编程的春天已经来了。
当然,对于语言不断增加特性的这种赶集扎堆现象,批评之声也一直不绝于耳。图灵出版的《修改代码的艺术》一书作者Michael Feathers就发出疑问了:“Will Java 7 Be Beautiful?” 一种新的特性,有其利,也必然有其弊。而且各种语言本来就各有擅长,何必勉强地改得越来越像?从另一角度来说,混合使用多语言,在虚拟机一层为多语言的集成更多地努力,也许是更正确的做法?

转自 http://blog.csdn.net/turingbook/archive/2008/03/30/2231691.aspx
oldrev 2008-04-15
D新闻组里报道的时候就看过了,C++ 的新'入'语法真丑
自言200801 2008-04-15
hurd 写道
《修改代码的艺术》一书作者Michael Feathers就发出疑问了:“Will Java 7 Be Beautiful?” 一种新的特性,有其利,也必然有其弊。而且各种语言本来就各有擅长,何必勉强地改得越来越像?从另一角度来说,混合使用多语言,在虚拟机一层为多语言的集成更多地努力,也许是更正确的做法?

转自 http://blog.csdn.net/turingbook/archive/2008/03/30/2231691.aspx


很赞同上面的观点,在OO类语言中加入 Lambda函数/闭包简直变成了四不像。

为迎接多核现在各个都加 Lambda函数/闭包,

都没人考虑通过不可变对象加上传统线程模型的方式,

我最近就在构思怎样在OO类语言中把 Lambda函数/闭包赶下台。
qiezi 2008-04-16
Lambda/Closure和多核没什么关系吧,它只是方便FP,还有就是很容易根据当前上下文构造处理逻辑。

我觉得语言里加任何东西都没什么关系,这些你可以不用,只要不影响旧的用法。
ychael 2008-04-16
引用
在OO类语言中加入 Lambda函数/闭包简直变成了四不像。
RUBY的block就是闭包closuer可以构造continuation
自言200801 2008-04-16
qiezi 写道
Lambda/Closure和多核没什么关系吧,它只是方便FP,还有就是很容易根据当前上下文构造处理逻辑。

我觉得语言里加任何东西都没什么关系,这些你可以不用,只要不影响旧的用法。


请看:
http://mail.openjdk.java.net/pipermail/challenge-discuss/2008-February/000047.html

里面有一段话:
The Clear Need
==============

A discussion of the needs satisfied by this proposal appears in a
draft JSR proposal at http://www.javac.info/consensus-closures-jsr.html.
In summary, the draft specification supports the development and use
of APIs that significantly improve the use of concurrency for
multicore systems
, and enables the development of APIs that
significantly reduce boilerplate for some common programming patterns.
自言200801 2008-04-16
Lambda/Closure这种东西你可以认为它是一个黑箱,
只要黑箱里不涉及I/O调用,外部想跟它发生关系,只能通过入口提供参数给它,
然后它返回一个结果给你,它不像Java中的对象,一个对象它可能包涵了很多字段,
还提供了很多公用方法来操作这些字段,在多线程的场合你就得小心的进行同步,
防止对象字段的值不一致。

也就是说对象是有状态的,对象里头的字段记录了每次的操作结果,
而Lambda/Closure实际上就是一个函数(不管是一阶还是高阶),
它仅仅相当于一个对象中提供的某一个公用方法,它没有字段,
你可以认为它是没有状态的,有多个线程要来执行这个函数,仅仅是执行这个函数中的指令代码而已,执行完了就得到一个结果,多个线程之间不需要同步或互斥来保证任何的数据是否一致,这样就省掉了与对象锁有关的任何开销。

Erlang之所以支持那么高的并发量,除了它是基于消息传递的进程通信模式外,
最主要还是要归功于它的进程之间是没有数据共享的,
而要做到无数据共享最后又可归结到Lambda/Closure。

我现在想,要是用不可变对象来模拟Lambda/Closure的形为,
然后在VM的层次调整一下传统的线程调度模型,这样也许也是一条可形的路子,
在Java,C++中加入Lambda/Closure只会让写出的代码越来越缺乏美感。
qiezi 2008-04-16
自言200801 写道

而Lambda/Closure实际上就是一个函数(不管是一阶还是高阶),
它仅仅相当于一个对象中提供的某一个公用方法,它没有字段,
你可以认为它是没有状态的,有多个线程要来执行这个函数,仅仅是执行这个函数中的指令代码而已,执行完了就得到一个结果,多个线程之间不需要同步或互斥来保证任何的数据是否一致,这样就省掉了与对象锁有关的任何开销。

这个是基于一些纯函数式语言的结论吧,在OO里面应该没办法禁止在Lambda/Closure里面多个线程修改同一对象。。

自言200801 写道

在Java,C++中加入Lambda/Closure只会让写出的代码越来越缺乏美感。

C++里面少点美感也无所谓了,能少写点代码还是很值。
自言200801 2008-04-16
qiezi 写道
自言200801 写道

而Lambda/Closure实际上就是一个函数(不管是一阶还是高阶),
它仅仅相当于一个对象中提供的某一个公用方法,它没有字段,
你可以认为它是没有状态的,有多个线程要来执行这个函数,仅仅是执行这个函数中的指令代码而已,执行完了就得到一个结果,多个线程之间不需要同步或互斥来保证任何的数据是否一致,这样就省掉了与对象锁有关的任何开销。

这个是基于一些纯函数式语言的结论吧,在OO里面应该没办法禁止在Lambda/Closure里面多个线程修改同一对象。。


是的,我前面已说了不涉及I/O之类的外部调用啦,指的就是纯函数的情况。

OO里面有没有办法禁止在Lambda/Closure里面多个线程修改同一对象,现在不确定,
Java的Closure也是个草案,不代表以后的正式规范。
自言200801 2008-04-16
在Java的Closure草案中
http://www.javac.info/closures-v05.html

有这样一段话:
it is a compile-time error if the function being converted refers to a non-final local variable declared in an enclosing scope.


貌似在编译期间就不准在Lambda/Closure里涉及non-final变量,
换句话说只能是final变量,也就是不可变的。

这跟我上面提的“不可变对象”其实思路都差不多。