データフロー プログラミング言語とは なぜそれを使用するのですか?そして、それには何か利点がありますか?
10 に答える
制御フロー言語では、外部データを操作する一連の命令があります。条件付き実行、ジャンプ、およびプロシージャ呼び出しは、実行される命令ストリームを変更します。これは、データを流れる命令と見なすことができます(たとえば、命令は、命令によってデータがロードされるレジスタで動作します。命令ストリームがデータを移動しない限り、データは静的です)。制御フローの「if」ステートメントは、命令ストリームの正しいブランチにジャンプしますが、データは移動されません。
データフロー言語では、処理される命令から命令に渡されるデータのストリームがあります。条件付き実行、ジャンプ、およびプロシージャコールは、データをさまざまな命令にルーティングします。これは、電気信号が回路を流れる方法や水がパイプを流れる方法など、静的な命令を流れるデータと見なすことができます。データフローの「if」ステートメントは、データを正しいブランチにルーティングします。
データフロー機能と言語のいくつかの例:
- スプレッドシートは本質的にデータフローです
- Unixパイプ
- Futures and Promiseは、多くの現代言語で見られるデータフローまたはデータフローのような構造です。
- アクターモデルのメッセージングはデータフローです
- 一部の言語にはデータフロー機能があります。
テキスト言語
視覚言語
- LabVIEW(スクリーンショット[ソース])
- Max / MSP(スクリーンショット[ソース])
- 純粋なデータ(スクリーンショット[ソース])
- Reaktor(スクリーンショット[ソース])
- SCADE(スクリーンショット[ソース])、Lustreのグラフィカルプログラミング環境
- SynthMaker(スクリーンショット[ソース])とFlowStone
- vvvv(スクリーンショット[ソース])
- Expecco(スクリーンショット[ソース])
- シェイク(スクリーンショット[ソース])
- [BLOK](スクリーンショット[ソース])
- Quartz Composer(スクリーンショット[ソース])
- AudioMulch(スクリーンショット[ソース])
ビジュアルデータフロー言語を組み込んだ製品:
データフロープログラミング言語は、プログラムの状態に注目し、状態の変化に応じて操作を発生させる言語です。データフロー プログラミング言語は本質的に並列です。これは、操作が満たされたときに操作が実行される入力に依存しているためです。これは、1 つの操作の後に次の操作が続く通常のプログラムとは異なり、データフロー プログラムでは、入力が満たされている限り操作が実行されるため、順序が設定されていないことを意味します。
多くの場合、データフロー プログラミング言語は、キーがプログラムのデータであり、テーブルの値がプログラムの操作へのポインターである大きなハッシュ テーブルを使用します。これにより、データフロー プログラミング言語でマルチコア プログラムを簡単に作成できるようになります。
データフロー プログラミング言語の一般的な例は、他のデータ列の影響を受けるデータ列を持つスプレッド シート プログラムです。1 つの列のデータが変更された場合、他の列の他のデータも変更される可能性があります。スプレッド シート プログラムはデータフロー プログラミング言語の最も一般的な例ですが、そのほとんどはグラフィカル言語である傾向があります。
データフロー プログラミングの 1 つは、リアクティブ プログラミングです。このスタイルのプログラミングが関数型言語で使用される場合、関数型リアクティブ プログラミングと呼ばれます。Web 用の関数型リアクティブ プログラミング言語の例として、Flapjaxがあります。
また、anicは最近Hacker Newsで取り上げられたデータフロー言語です。
もう 1 つの例は、オックスフォードのMartletです。
データフロー プログラミング言語は、いわゆる「アクター」でいくつかのローカル動作を分離することを提案しています。これは、並列に実行され、ポイント ツー ポイント チャネルを介してデータを交換することになっています。コンピューターのフォン ノイマン モデルとは異なり、中央記憶装置 (コードとデータの両方) の概念はありません。
これらのアクターは、入力でデータ トークンを消費し、出力で新しいデータを生成します。
この定義は、実際にこれを実行する手段を強制するものではありません。ただし、データの生成/消費は注意して分析する必要があります。たとえば、アクター B がデータを生成するアクター A と同じ速度で消費しない場合、潜在的に無制限のメモリ (FIFO) がそれらの間に必要になります。 . デッドロックなど、他にも多くの問題が発生する可能性があります。
多くの場合、この分析は失敗します。これは、内部動作のインターリーブが扱いにくいためです (今日の正式な方法では手の届かないところにあります)。
それにもかかわらず、データフロー プログラミング言語は多くの分野で魅力的なままです。
- たとえば、ビデオ エンコーディングの参照モデルを定義する場合: 純粋な C プログラムでは、すべてが一連の操作として実行されると想定されているため、その仕事はできませんが、これはコンピューター (パイプライン、VLIW、マルチコア、および VLSI) では当てはまりません。 . 最近の博士論文. CAL データフロー言語は、次世代のビデオ エンコーダー/デコーダー リファレンス用の統一言語として提案されています。
- 安全性が要求されるミッション クリティカル: データの生成/消費にいくつかの強力な仮定を追加すると、コード生成、証明などの点で強力な可能性を秘めた言語が得られます (同期言語を参照) 。
Excel (およびその他のスプレッドシート) は、基本的にデータフロー言語です。データフロー言語は関数型プログラミング言語によく似ていますが、プログラム グラフ全体のリーフにある値はまったく値ではなく、変数 (または値ストリーム) であるため、それらが変更されると、変更が波及してグラフを上っていきます。 .
これは実際にはかなり古い概念です。1970 年代には、効率的なデータフローのプログラミングと実行のために構築された言語 + マシンさえありました ( Manchester Dataflow Machine )。
それの素晴らしいところは、Haskell のような遅延関数型言語に対する二重性です。したがって、処理ステップが純粋に機能的であり、それらを評価して結果を渡すのに十分な処理ユニットがある場合、最大の並列性が無料で自動的に得られ、プログラミングの手間もかかりません!
多くの ETL ツールもこの領域にあります。MS SSIS のデータフロー タスクはその良い例です。この場合のグラフィカルツール。
データフロー プログラミングのほうがはるかに理にかなっている特定のドメインがあります。リアルタイム メディアはその一例であり、広く使用されている 2 つのグラフィカル データフロー プログラミング環境である Pure Data と Max/MSP は、どちらもリアルタイム メディア プログラミングに重点を置いています。それらの視覚的な性質も、データフロー プログラミングにうまく対応していると思います。