What's the status of current Functional Reactive Programming implementations?
我试图在哈斯克尔设想一些简单的自动物理系统(比如摆锤、机械臂等)。通常这些系统可以用如下方程来描述
其中
所以我抓起了保罗·哈达克的书《哈斯克尔表情学校》,并且发现在这里呈现的特定于领域的语言"fal"(对于功能动画语言)实际上对我的简单玩具系统非常有效(尽管一些功能,特别是
我的问题是,当今更为成熟、最新、维护良好、性能调优的替代方案是什么,适用于更高级甚至更实用的应用程序?
这个wiki页面列出了haskell的几个选项,但我不清楚以下方面:
Conal Eliott的"反应式"项目(据我所知)是这种编程范式的发明者之一,它的状态看起来有点过时。我喜欢他的代码,但也许我应该尝试其他更新的选择?在语法/性能/运行时稳定性方面,它们之间的主要区别是什么?
引自2011年的一项调查,第6节,"…FRP实现在性能上仍然不够有效或不够可预测,无法在需要延迟保证的域中有效使用……。尽管调查显示有一些有趣的可能的优化,考虑到玻璃钢存在超过15年的事实,我觉得这个性能问题可能是非常或甚至固有的困难,至少在几年内解决。这是真的吗?
调查的同一位作者在他的博客中谈到了"时间泄露"。这个问题是FRP特有的,还是我们在用纯的、非严格的语言编程时通常遇到的问题?你有没有发现,如果性能不够的话,随着时间的推移,稳定一个基于玻璃钢的系统太难了?
这仍然是一个研究级项目吗?像植物工程师、机器人工程师、财务工程师等这样的人真的在使用它们吗(用什么样的语言来满足他们的需要)?
虽然我个人更喜欢Haskell实现,但我愿意接受其他建议。例如,有一个Erlang实现会特别有趣---然后很容易有一个智能的、自适应的、自学习的服务器进程!
现在主要有两个实用的haskell库用于函数反应式编程。两者都是由单人维护的,但也从其他Haskell程序员那里获得代码贡献:
NetWire注重效率、灵活性和可预测性。它有自己的事件范式,可以用于传统FRP不起作用的领域,包括网络服务和复杂模拟。样式:应用和/或箭头。初始作者和维护者:Ertugrul S?伊莱梅兹(这是我)。
活性香蕉建立在传统玻璃钢范式的基础上。虽然它是实用的,但也可以作为经典玻璃钢研究的基础。它的主要焦点是用户界面,并且有一个现成的WX界面。风格:实用。最初的作者和维护者:海因里希·阿非默斯。
您应该同时尝试这两种方法,但根据您的应用程序,您可能会发现其中一种更适合您。
对于游戏,网络,机器人控制和模拟,你会发现网络是有用的。它为这些应用程序提供了现成的连线,包括各种有用的微分、积分和许多透明事件处理的功能。有关教程,请访问我链接的页面上的
对于图形用户界面,当前您的最佳选择是反应式香蕉。它已经有了一个WX接口(作为一个独立的库反应香蕉WX),Heinrich的博客在这方面有很多关于FRP的内容,包括代码示例。
回答你的其他问题:FRP不适合你需要实时预测的场景。这主要是由于haskell,但不幸的是,FRP在低级语言中很难实现。一旦haskell本身准备好了,FRP也会到达那里。从概念上讲,网络已经为实时应用做好了准备。
时间泄漏不再是真正的问题,因为它们在很大程度上与一元框架相关。实际的FRP实现不提供单一接口。Yampa已经启动了它,NetWire和反应香蕉都建立在它之上。
我现在不知道有商业或其他大型项目使用玻璃钢。图书馆已经准备好了,但我认为人们还没有准备好。
虽然已经有了一些很好的答案,但我将尝试回答你的具体问题。
由于时间泄漏问题,反应式不适用于严重的项目。(见3)。目前设计最相似的图书馆是反应性香蕉,它是以反应性为灵感开发的,并与Conal Elliott进行了讨论。
尽管haskell本身不适合于硬实时应用程序,但在某些情况下,可以将haskell用于软实时应用程序。我不熟悉目前的研究,但我不认为这是一个无法克服的问题。我怀疑像Yampa这样的系统,或者像Atom这样的代码生成系统,都可能是解决这一问题的最佳方法。
"时间泄漏"是可转换玻璃钢特有的问题。当系统无法释放旧对象时会发生泄漏,因为如果将来某个时间点发生切换,可能需要这些旧对象。除了内存泄漏(可能非常严重),另一个后果是,当发生切换时,系统必须暂停,同时遍历旧对象链以生成当前状态。
不可切换的FRP库(如Yampa和旧版本的反应性香蕉)不会受到时间泄漏的影响。可切换的FRP库通常使用两种方案中的一种:要么它们具有创建FRP值的特殊"creation monad",要么它们使用"ageing"类型参数来限制可以发生切换的上下文。elerea(可能还有netire?)使用前者,而最近的活性香蕉和葡萄柚使用后者。
"可切换的frp"是指实现conal函数
这与@ertes关于一元接口的说法并不矛盾:事实证明,为一个
最后,尽管FRP还有很多工作要做,但我认为一些较新的平台(反应香蕉、Elerea、NetWire)足够稳定和成熟,您可以从中构建可靠的代码。但是你可能需要花很多时间来学习进进出出,以便了解如何获得良好的性能。
我将列出Mono和.NET空间中的两个项,以及不久前找到的Haskell空间中的一个项。我先从哈斯克尔开始。
榆树-链接根据现场描述:
Elm aims to make front-end web development more pleasant. It
introduces a new approach to GUI programming that corrects the
systemic problems of HTML, CSS, and JavaScript. Elm allows you to
quickly and easily work with visual layout, use the canvas, manage
complicated user input, and escape from callback hell.
号
它有自己的玻璃钢变体。从它的例子来看,它似乎相当成熟。
无功扩展-链路首页说明:
The Reactive Extensions (Rx) is a library for composing asynchronous
and event-based programs using observable sequences and LINQ-style
query operators. Using Rx, developers represent asynchronous data
streams with Observables, query asynchronous data streams using LINQ
operators, and parameterize the concurrency in the asynchronous data
streams using Schedulers. Simply put, Rx = Observables + LINQ +
Schedulers.
号
反应式扩展来自MSFT,它实现了许多优秀的操作员,可以简化事件处理。几天前它还是开源的。它非常成熟,在生产中使用;在我看来,对于Windows 8 API来说,它比TPL库提供的API更好;因为看得见的东西可以是热的、冷的、重试/合并的等等,而任务总是代表正在运行、出错或完成的热计算或已完成的计算。
我已经使用RX编写了服务器端代码以实现异步性,但我必须承认用C语言编写功能性代码可能有点烦人。F有几个包装器,但很难跟踪API开发,因为该组相对封闭,并且不像其他项目那样由MSFT推广。
它的开放源代码来自于它的IL-to-JS编译器的开放源代码,因此它可能可以很好地与JavaScript或ELM一起工作。
您可以使用消息代理(如rabbitmq和socksjs)非常好地将f/c/js/haskell绑定在一起。
Bling UI工具包-链接首页说明:
Bling is a C#-based library for easily programming images, animations,
interactions, and visualizations on Microsoft's WPF/.NET. Bling is
oriented towards design technologists, i.e., designers who sometimes
program, to aid in the rapid prototyping of rich UI design ideas.
Students, artists, researchers, and hobbyists will also find Bling
useful as a tool for quickly expressing ideas or visualizations.
Bling's APIs and constructs are optimized for the fast programming of
throw away code as opposed to the careful programming of production
code.
号
免费LTU文章。
我已经测试过这个,但没有为客户项目使用它。它看起来很棒,有很好的C操作符重载,形成值之间的绑定。它使用wpf/sl/(winrt)中的依赖属性作为事件源。它的3D动画在合理的硬件上运行良好。如果我最终使用一个需要可视化的项目,我会使用这个;可能会将它移植到Windows8。
反应用户界面-链接PaulBetts以前在MSFT,现在在Github,写了这个框架。我已经做了相当广泛的工作,喜欢这个模型。它比blink(从使用rx和它的抽象的本质上来说)分离得多,这使得使用它对代码进行单元测试更加容易。Github Git Client for Windows就是这样写的。
评论反应式模型的性能足以满足大多数高性能应用的需要。如果您考虑的是硬实时,我敢打赌大多数GC语言都有问题。Rx,reactiveUI创建了一些需要gced的小对象,因为这就是创建/处理订阅的方式,中间值在回调的"monad"中进行。通常,在.NET上,我更喜欢反应式编程,而不是基于任务的编程,因为回调是静态的(在编译时是已知的,没有分配),而任务是动态分配的(不知道,所有调用都需要一个实例,创建垃圾),而lambda编译成编译器生成的类。
很明显,C和F是严格评估的,所以时间泄漏在这里不是问题。JS也一样。不过,这可能是可重放或缓存的可观测数据的问题。