データフロープログラミング言語とは何ですか?なぜそれを使用するのですか?それに何か利点はありますか?
制御フロー言語では、外部データを操作する一連の命令があります。条件付き実行、ジャンプ、およびプロシージャコールは、実行する命令ストリームを変更します。これは、データを流れる命令として見ることができます(たとえば、命令は、命令によってデータがロードされるレジスタで動作します-命令ストリームが移動しない限り、データは静的です)。制御フローの「if」ステートメントは、命令ストリームの正しいブランチにジャンプしますが、データは移動しません。
データフロー言語では、処理される命令から命令に渡されるデータのストリームがあります。条件付き実行、ジャンプ、およびプロシージャコールは、データを異なる命令にルーティングします。これは、電気信号が回路を流れる方法や水がパイプを流れる方法など、静的な命令を流れるデータと見なすことができます。データフローの「if」ステートメントは、データを正しいブランチにルーティングします。
データフロー機能と言語のいくつかの例:
テキスト言語
視覚言語
ビジュアルデータフロー言語を組み込んだ製品:
データフロープログラミング言語は、プログラムの状態に焦点を合わせ、状態の変化に応じて操作を発生させる言語です。データフロープログラミング言語は本質的に並列です。これは、操作が入力に依存するため、入力が満たされると操作が実行されるためです。つまり、1つの操作の後に次の操作が続く通常のプログラムとは異なり、データフロープログラムでは、入力が満たされ、順序が設定されていない限り操作が実行されます。
多くの場合、データフロープログラミング言語は、キーがプログラムのデータであり、テーブルの値がプログラムの操作へのポインタである大きなハッシュテーブルを使用します。これにより、データフロープログラミング言語でのマルチコアプログラムの作成が容易になります。各コアが機能するために必要なのはハッシュテーブルのみだからです。
データフロープログラミング言語の一般的な例は、スプレッドシートプログラムです。このプログラムには、他のデータ列の影響を受けるデータ列があります。 1つの列のデータが変更された場合、他の列の他のデータもおそらく変更されます。スプレッドシートプログラムは、データフロープログラミング言語の最も一般的な例ですが、それらのほとんどはグラフィカル言語である傾向があります。
データフロープログラミングの1つの種類は、 リアクティブプログラミング です。このスタイルのプログラミングが関数型言語で使用される場合、それは 関数型リアクティブプログラミング と呼ばれます。 Web用の関数型リアクティブプログラミング言語の例は、 Flapjax です。
また、 anic は最近のデータフロー言語です discussed はHacker Newsで。
別の例は Martlet オックスフォードからです。
データフロープログラミング言語は、いわゆる「actors」でいくつかのローカル動作を分離することを提案します」、これは並行して実行され、ポイントツーポイントチャネルを介してデータを交換することになっています。 コンピューターのフォンノイマンモデル とは異なり、中央メモリ(コードとデータの両方)の概念はありません。
これらのアクタは入力でデータトークンを消費しデータトークンを入力し、produceで新しいデータを出力。
この定義は、実際にこれを実行する手段を強制しません。ただし、データの生成/消費は慎重に分析する必要があります。たとえば、アクターBがデータを生成するアクターAと同じ速度で消費しない場合、それらの間に潜在的に無制限のメモリ(FIFO)が必要です。 。 deadlocks のような他の多くの問題が発生する可能性があります。
多くの場合、内部動作のインターリーブは扱いにくいため、この分析は失敗します(今日の正式な方法の範囲を超えて)。
それにもかかわらず、データフロープログラミング言語は多くのドメインで魅力的なままです:
Excel(およびその他のスプレッドシート)は、本質的にデータフロー言語です。データフロー言語は関数型プログラミング言語に非常に似ていますが、プログラムグラフ全体のリーフの値はまったく値ではなく、変数(または値ストリーム)であるため、変化すると変化が波及してグラフを上に流れます。 。
実際にはかなり古い概念です-1970年代には、効率的なデータフローのプログラミングと実行のために構築された言語+マシンさえありました( Manchester DataflowMachine )。
それの素晴らしいところは、Haskellのような遅延関数型言語との二重性です。したがって、処理ステップが純粋に機能し、それらを評価して結果を渡すのに十分な処理ユニットがある場合、プログラミングの労力を必要とせずに自動的に最大の並列性が得られます!
多くのETLツールもこの領域にあります。 MS SSISのデータフロータスクは良い例です。この場合のグラフィカルツール。
Cameleon: www.shinoe.org/cameleon を試してみてください。これは使いやすいようです。これは、データ(作業)フローアプローチを持つ関数型プログラミング用のグラフィカル言語です。
C++で記述されていますが、任意のプログラミング言語で記述された任意のタイプのローカルまたは遠隔プログラムを呼び出すことができます。
マルチスケールのアプローチがあり、 Turing complete (これは Petri net 拡張です)のようです。
特定のドメインでは、データフロープログラミングの方がはるかに意味があります。リアルタイムメディアはその一例であり、広く使用されている2つのグラフィカルデータフロープログラミング環境であるPure DataとMax/MSPは、どちらもリアルタイムメディアプログラミングに焦点を当てています。それらの視覚的性質もデータフロープログラミングにうまく対応していると思います。