ライブラリとか
リアクティブプログラミングと関数型プログラミングやオブジェクト指向の比較なぞをやりましたが、実際のリアクティブプログラミングの多くは、
関数型プログラミングやオブジェクト指向と組み合わせて使われることの方が多いです。
とくに関数型との組み合わせは、FRP(Functional Reactive Programming)と呼ばれたりします。
また用途としては、
- シミュレーションやアニメーション
- GUI
- 非同期イベント処理
- 並列処理
などが主です。
あと、変更が起こった場所を起点に変更を伝播させていくのをpush-base、振る舞いの現在の値を取得する側を起点に計算を行うのをpull-baseと呼んで、各ライブラリでいろいろな戦略が取られています。
実際のライブラリやフレームワークとしては、
HaskellのFRP http://www.haskell.org/haskellwiki/Functional_Reactive_Programming
HaskellにはいくつもFRPのライブラリが存在します。モナドベースだったりアローベースだったりします。
アニメーションやシミュレーション系が多い印象です。
Concurrent Cell http://ccell.forge.ocamlcore.org/
Concurrent Cellは、OCamlのマルチスレッドライブラリで、Erlangのようなメッセージ・パッシングスタイルをサポートするとともに、FRPもサポートされています。
Rx(Reactive Extensions for .NET) http://msdn.microsoft.com/en-us/devlabs/ee794896
Rx(Reactive Extensions for .NET)は、LINQのシーケンス処理をベースに、非同期イベント処理のリアクティブな記述を、push-base、pull-baseの両面からサポートしています。
RxJS(Reactive Extensions for JavaScript) http://channel9.msdn.com/Blogs/Charles/Introducing-RxJS-Reactive-Extensions-for-JavaScript
RxJSは、RxをJavaScriptへポートしたものです。
Flapjax http://www.flapjax-lang.org/
Flapjaxはブラウザ上で動くJavaScriptベースのリアクティブフレームワークで、サーバーサイドの永続化までサポートしています。<追記>
FrTime http://docs.racket-lang.org/frtime/index.html
FrTimeは、RacketというScheme処理系上で実装されたSchemeベースのDSLで、描画統合環境上でリアクティブプログラミングができるようです。
教えていただいたところによると実装上の効率の問題がかなり解決されているようです。
(id:osiire様に教えていただきました。ありがとうございます!)追記>
Data binding
GUI上のウィジェットとその背後に用意したモデルを結びつけるリアクティブな手法は、特にData bindingと呼ばれます。
上に述べたライブラリに比べるとシンプルでリアクティブな要素が少ないですが、WikipediaのReactive Programmingのページに例として次に紹介するWPF Data Bindingが載っていたので、Data bindingもReactive Programmingの一部として考えています。
WPF Data Binding http://msdn.microsoft.com/en-us/library/ms750612.aspx
Cocoa Bindings http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaBindings/Concepts/WhatAreBindings.html
<追記>2010/12/27
Flex Data Binding http://blog.flexexamples.com/2007/10/01/data-binding-in-flex/
忘れていましたがFlexにもData Bindingはあります。最近のGUIツールキットには軒並み搭載されているようです。
MathematicaのDynamic http://reference.wolfram.com/mathematica/tutorial/IntroductionToDynamic.html
数式処理ソフトのMathematicaに搭載されている動的インタラクティブ機能言語であるところのDynamicは、
上記のData Bindingに似つつもさらに突っ込んだ機能を、WPFなどに先んじて実現しているようです。
id:saiya_moebiusさんに教えていただいた、id:NyaRuRuさんの記事も大変面白いのでぜひご覧ください。
http://d.hatena.ne.jp/NyaRuRu/20080314/p1
http://d.hatena.ne.jp/NyaRuRu/20080317/p1
Verilog HDL http://en.wikipedia.org/wiki/Verilog
いちごさんのコメントで思いだしましたが、ハードウェア記述言語であるところのVerilog HDLも並列動作する電子回路を記述するためにデータフローアーキテクチャが採用されており、これもReactive Programmingの一例とも言えます。追記>