Что такое язык программирования потока данных? Зачем это использовать? И есть ли в этом польза?
Языки программирования потоков данных
Ответы (10)
На языке потока управления у вас есть поток инструкций, которые работают с внешними данными. Условное выполнение, переходы и вызовы процедур изменяют поток инструкций, который необходимо выполнить. Это можно рассматривать как инструкции, проходящие через данные (например, инструкции работают с регистрами, которые загружаются данными инструкциями - данные являются статическими, если поток инструкций не перемещает их). Оператор «if» потока управления переходит к правильной ветке в потоке инструкций, но данные не перемещаются.
В языке потока данных у вас есть поток данных, который передается от инструкции к инструкции для обработки. Условное выполнение, переходы и вызовы процедур направляют данные в разные инструкции. Это можно рассматривать как поток данных через статические инструкции, например, как электрические сигналы проходят по цепям или вода течет по трубам. Оператор потока данных «если» направит данные в правильную ветвь.
Некоторые примеры функций и языков потока данных:
- Электронные таблицы — это, по сути, поток данных
- Unix-каналы
- Фьючерсы и обещания — это потоки данных или конструкции, подобные потокам данных, встречающиеся во многих современных языках.
- Обмен сообщениями в акторной модели представляет собой поток данных.
- Some languages have dataflow features:
- Oz has dataflow variables
- Groovy имеет GPars
- Clojure содержит clojure.contrib.dataflow, Reagi и Джавелин
Языки текста
- VHDL, Verilog и другие языки описания оборудования по существу являются потоками данных.
- Чак
- Cunieform
- Lustre, используется в оборонной, аэрокосмической и энергетической промышленности.
- Птолемей II
- Найквист
Визуальные языки
- LabVIEW (скриншот [источник])
- Max/MSP (скриншот [источник ])
- Чистые данные (скриншот [источник])
- Reaktor (скриншот [источник])
- SCADE (скриншот [источник]), графическая среда программирования для Lustre
- SynthMaker (скриншот [источник]) и FlowStone
- vvvv (скриншот [источник])
- Expecco (скриншот [источник])
- Shake (скриншот [источник])
- [BLOK] (скриншот [источник])
- Quartz Composer (скриншот [источник])
- AudioMulch (скриншот [источник])
Продукты, в которые встроен язык визуального потока данных:
- Блендер
- Ворин (скриншот)
- Kismet от Unreal Engine (скриншот)
- Схема ANKHOR (скриншот)
- Dynamo для Autodesk Revit (скриншот)
- LiveBlox (скриншот)
Языки программирования потоков данных — это те, которые фокусируются на состоянии программы и вызывают выполнение операций в соответствии с любым изменением состояния. Языки программирования потоков данных по своей сути параллельны, потому что операции зависят от входных данных, которые при встрече вызывают выполнение операции. Это означает, что в отличие от обычной программы, где за одной операцией следует следующая операция, в программе с потоком данных операции будут выполняться до тех пор, пока выполняются входные данные и, следовательно, нет установленного порядка.
Часто языки программирования потоков данных используют большую хеш-таблицу, где ключи — это данные программы, а значения таблицы — указатели на операции программы. Это упрощает создание многоядерных программ на языке программирования потоков данных, поскольку каждому ядру для работы потребуется только хеш-таблица.
Типичным примером языка программирования потока данных является программа электронных таблиц, в которой есть столбцы данных, на которые влияют другие столбцы данных. Если данные в одном столбце изменятся, другие данные в других столбцах, вероятно, изменятся вместе с ним. Хотя программа электронных таблиц является наиболее распространенным примером языка программирования потока данных, большинство из них, как правило, являются графическими языками.
Одним из видов программирования потока данных является реактивное программирование. Когда этот стиль программирования используется на функциональном языке, он называется функциональное реактивное программирование. Примером функционального реактивного языка программирования для Интернета является Flapjax.
Кроме того, anic недавно стал языком потока данных обсуждается в Hacker News.
Другой пример — Martlet из Оксфорда.
Языки программирования потоков данных предлагают изолировать некоторые локальные модели поведения в так называемых "актерах", которые должны работать параллельно и обмениваться данными по каналам "точка-точка". Не существует понятия центральной памяти (как для кода, так и для данных), в отличие от модели компьютеров фон Неймана.
Эти акторы потребляют токены данных на своих входах и производят новые данные на своих выходах.
Это определение не навязывает средства для выполнения этого на практике. Однако производство/потребление данных необходимо тщательно анализировать: например, если актор B не потребляет с той же скоростью, что и актор A, производящий данные, то между ними требуется потенциально неограниченная память (FIFO). . Могут возникнуть многие другие проблемы, такие как взаимоблокировки.
Во многих случаях этот анализ потерпит неудачу, потому что чередование внутренних поведений неразрешимо (за пределами досягаемости сегодняшних формальных методов).
Несмотря на это, языки программирования потоков данных остаются привлекательными во многих областях:
- например, для определения эталонных моделей для кодирования видео: программа на чистом C не будет выполнять эту работу, потому что она предполагает, что все выполняется как последовательность операций, что неверно для компьютеров (конвейер, VLIW, mullicores и VLSI) . Может быть, вы могли бы взглянуть на это: последняя докторская диссертация. Язык потока данных CAL предлагается в качестве унифицирующего языка для справочника по видеокодировщикам/декодерам следующего поколения.
- Критически важен там, где требуется безопасность: если вы добавите несколько строгих предположений о производстве/потреблении данных, то вы получите язык с большим потенциалом с точки зрения генерации кода, доказательств и т. д. (см. синхронные языки)
Excel (и другие электронные таблицы) по сути являются языками потоков данных. Языки потоков данных во многом похожи на языки функционального программирования, за исключением того, что значения на концах всего графа программы являются вовсе не значениями, а переменными (или потоками значений), так что когда они изменяются, изменения колеблются и текут вверх по графу. .
Mozart поддерживает синхронизацию наподобие потока данных и имеет несколько коммерческих приложений. Вы также можете возразить, что make — это язык программирования потока данных.
Многие инструменты ETL также относятся к этой области. Хорошим примером являются задачи потока данных в MS SSIS. Графический инструмент в данном случае.
На самом деле это довольно старая концепция — в 1970-х годах был даже создан язык + машина для эффективного программирования и выполнения потоков данных (Манчестерский поток данных Машина).
Самое замечательное в нем — его двойственность по отношению к ленивым функциональным языкам, таким как Haskell. Таким образом, если ваши шаги обработки чисто функциональны, и если у вас достаточно процессорных блоков для их оценки и передачи результатов, вы получаете максимальную параллельность бесплатно - автоматически и без каких-либо усилий по программированию!
Есть определенные области, в которых программирование потоков данных имеет гораздо больше смысла. Мультимедиа в реальном времени является одним из примеров, и две широко используемые графические среды программирования потоков данных, Pure Data и Max/MSP, ориентированы на программирование мультимедиа в реальном времени. Я предполагаю, что их визуальная природа также прекрасно соответствует программированию потока данных.
Вы можете попробовать Cameleon: www.shinoe.org/cameleon, который кажется быть простым в использовании. Это графический язык для функционального программирования, который использует подход потока данных (работы).
Он написан на C++, но может вызывать любые локальные или удаленные программы, написанные на любом языке программирования.
Он имеет многомасштабный подход и кажется Turing Complete (это расширение сети Петри).