您的位置:首页 > 编程语言

游戏编程的未来 —— FRP(函数式反应型编程)

2015-02-25 10:40 337 查看


编程范式

先要说说编程范式。

编程范式(Programming
paradigm) 其实就是计算机编程所使用的方法,是设计程序结构所采用的设计风格。

目前主流的编程范式有:命令式编程(Imperative programming)、函数式编程(Functional programming)、面向对象编程(Object-oriented programming)等。我们普通码农最熟悉的应该就是面向对象编程了。

我们常见的架构、设计模式等都是在面向对象这个范式下面进行的设计,而编程范式则是更高一层的概念,它关注的不是怎么用写程序来解决问题,而是关注各种不同的设计程序的思考方式。

最近,函数式编程 越来越流行,我们也开始关注编程范式这个概念了。编程范式有很多种,维基http://en.wikipedia.org/wiki/Programming_paradigm 列出来的大大小小的编程范式有几十种之多。


反应型编程

再说一下反应型编程。

反应型编程(Reactive
programming) 有的中文翻译为 响应式编程,也是一种编程范式。这种编程范式面向和关注数据流和变化的扩散,它可以方便的建立动态的数据流,其底层机制会让数据流的变化自动扩散到相应的逻辑。

使用维基的例子可以清楚说明这个思想:

一个语句:

a
= b + c


在命令式编程语言中,这个语句一旦执行完毕,b 和 c 再发生变化就和 a 无关了,a 并不会跟着变化。如果需要 a 变化时,我们一般会封装一个类似 update_a() 这样的函数,在 b 或 c 变化的时候调用一下,来更新a。

而在反应型编程的思想中,上面的语句实际上是建立了 a 和 b、c 的关联关系,这样,当 b 或 c 发生变化的时候,a 可以自动变化。

注意这只是一个思想,或者说是目标,我们可以使用个各种语言来实现这个目标,并不是说必须要有一种专门的反应型编程语言,当然,语言可以根据这个思路来设计,会让反应型编程的实现更为简单。

更详细的说明可以参考这篇文章:异步编程与响应式框架


面向对象的反应型编程

上面的例子,大多数情况下,在面向对象编程语言中,a 也是不会跟随 b 或 c 变化的,但实际上,因为面向对象的确是一种很强大的编程范式,我们可以利用它来实现一些反应型编程的思想。例如上面的例子,我们有两种方法可以模拟反应型的特点:

我们可以把 a 定义为一个函数对象,重载 b 和 c 之间的 
+
 ,
每次使用 a 的时候都是一个函数调用,这样可以保证 a 为正确的值。

重载对 b 和 c 的赋值操作(set方法),在其中调用更新 a 的逻辑。这种方法比方法1更高效一些,我们平时写程序很多时候已经在这样用了。


函数式编程

函数式编程(Functional programming)虽然最近才变得流行,但是它却不是一个新的概念,其代表语言 Lisp 早在上个世纪50年代就有了。

关于函数编程的信息和介绍到处都是,不再多说了。函数式编程为什么现在才开始流行起来,我觉得有几个原因:

性能 函数式编程是一种抽象层度很高的思维方式,和冯诺依曼体系的思维有很大不同,因此长期以来,没有很高性能的编译器。直到目前,随着硬件水平和编译技术的发展,才使得函数式编程具有真正的工业实用价值。

编程语言的发展 各种编程语言不断从函数式编程的思想中“窃取”元素,像 lambda,匿名函数,函数绑定,map/reduce 这些概念已经广泛普及,就连 c++ 都加入了 lambda 试图焕发青春。这些都给函数式编程的流行扫除一些障碍。

需求发展 软件行业已经发展了几十年,码农们已经写了无数代码,解决了无数的问题,很多需要软件的领域都有了相应的软件,目前软件业已经不是解决从无到有的基本需求了,需求正在变得越来越复杂,变化也越来越快,传统的面向对象的思维已经越来越难以应付复杂和快速变化的需求,很多程序员把希望寄托在了函数式编程上。


函数式反应型编程

这才说到正题,不过相信你已经明白这个概念了。恩,函数式反应型编程(Functional Reactive Programming(FRP))就是利用函数式编程的基本元素,实现反应型编程范式。

1997年 Conal Elliott 和 Paul
Hudak 发表论文 《Functional
Reactive Animation》 正式提出了函数式反应型编程的概念,并且用 Haskell 实现了
FRP。其中 Paul Hudak (耶鲁大学教授)就是 Haskell 的设计者之一。Haskell 是最近非常流行的函数式编程语言,有两本通俗的 Haskell 入门书推荐:《Learn
You a Haskell for Great Good!》 和 《Real
World Haskell》,都可以免费在线阅读。

2012 年 Evan Czaplicki 发表论文 《Elm:
Concurrent FRP for Functional GUIs

》 推出了 FRP 编程语言 Elm.

Elm 是专门为 FRP 设计的一种函数式编程语言,它的编译器会将它编译成 HTML,CSS 和 Javascript,在浏览器中运行。它非常适合用来开发强交互的GUI程序,在它的官网上有一些例子:http://elm-lang.org/Examples.elm

强交互的 GUI 程序,不就是游戏嘛!

Elm 的文档中也对 FRP 进行了简单明了的介绍(http://elm-lang.org/learn/What-is-FRP.elm),其中关于为什么FRP是个好主意 是这样说的:

FRP 是一种陈述式的 GUI 程序设计方法,这和传统的编程方法有很大不同。传统方法关注‘what’和‘how’,而一个陈述式的语言让你可以只说明显示什么内容,而不用去编程告诉计算机具体怎么做。

当前多数 GUI 编程框架都不是陈述式的,这让程序员陷入各种琐碎而不必要的细节之中,忙于处理用户输入,然后手动更新显示内容。

而在 FRP 中,很多无关细节都交给编译器来处理,程序员可以解放出来处理更重要的事情。这意味着不再有事件处理器,不再有回调函数,不需要操作 DOM,这些在 Elm 实现的 FRP 中都不需要。

FRP 看起来确实十分美好,或许它真的是游戏开发的未来。有开发者说我为什么从基于组件的游戏引擎转向
FRP。

FRP 的发展一方面是来自 Elm、Haskell 这些较新的函数式语言,另一方面,由于传统语言也不断加入函数式编程的元素,所以也出现了一些基于传统语言的 FRP 框架,其中 ReaciveCocoa 就是基于
ObjectiveC 的 FRP 框架,在 GitHub 上非常活跃,有3000多个赞(star)

我是最近才开始关注 FRP,无法给出更深的解释,更专业的介绍可以参考下面的资料:


参考资料

http://www.infoq.com/cn/articles/functional-reactive-programming

http://en.wikipedia.org/wiki/Programming_paradigm

http://blog.leezhong.com/ios/2013/06/19/frp-reactivecocoa.html

http://en.wikipedia.org/wiki/Functional_reactive_programming

http://blog.zhaojie.me/2010/09/async-programming-and-reactive-framework.html

http://lambdor.net/?p=171

http://www.alexcurylo.com/blog/2013/03/27/reactivecocoa/

http://stackoverflow.com/questions/13341937/whats-the-status-of-current-functional-reactive-programming-implementations
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息