Введение
Парадигма компьютерного программирования
В компьютерном программировании, программирование с потоком данных — это парадигма программирования, которая моделирует программу как ориентированный граф потоков данных между операциями, тем самым реализуя принципы и архитектуру потоковой обработки данных. Языки программирования с потоком данных имеют некоторые общие черты с функциональными языками и, как правило, разрабатывались с целью привнесения некоторых функциональных концепций в язык, более подходящий для численных вычислений. Некоторые авторы используют термин "поток данных" вместо "потоковое программирование", чтобы избежать путаницы с потоковой вычислительной архитектурой или архитектурой потоковой обработки данных, основанной на недетерминированной вычислительной модели. Программирование с потоком данных было разработано Джеком Деннисом и его аспирантами в Массачусетском технологическом институте в 1960-х годах.
In computer programming, dataflow programming is a programming paradigm that models a program as a directed graph of the data flowing between operations, thus implementing dataflow principles and architecture. Dataflow programming languages share some features of functional languages, and were generally developed in order to bring some functional concepts to a language more suitable for numeric processing. Some authors use the term datastream instead of dataflow to avoid confusion with dataflow computing or dataflow architecture, based on an indeterministic machine paradigm. Dataflow programming was pioneered by Jack Dennis and his graduate students at MIT in the 1960s.
Государство
Одним из ключевых понятий в компьютерном программировании является идея состояния – по сути, моментальный снимок различных условий в системе. Большинство языков программирования требуют значительного объема информации о состоянии, которая обычно скрыта от программиста. Зачастую сам компьютер не знает, какая часть информации кодирует устойчивое состояние. Это серьезная проблема, поскольку информацию о состоянии необходимо передавать между несколькими процессорами в параллельных вычислительных системах. Большинство языков вынуждают программиста добавлять дополнительный код для указания того, какие данные и части кода важны для состояния. Этот код, как правило, обходится дорого с точки зрения производительности, а также его сложно читать и отлаживать. Явный параллелизм – одна из основных причин низкой производительности Enterprise Java Beans при создании приложений, интенсивно работающих с данными, не относящихся к OLTP. Если последовательную программу можно представить как одного работника, перемещающегося между задачами (операциями), то программа, основанная на потоке данных, больше похожа на серию рабочих на конвейере, каждый из которых выполняет определенную задачу, когда поступают необходимые данные. Поскольку операции зависят только от наличия входных данных, они не имеют скрытого состояния для отслеживания и все находятся в состоянии "готовности" одновременно.
Представительство
Программы потоковой обработки данных могут быть представлены разными способами. Традиционная программа обычно представляется как последовательность текстовых инструкций, что оправдано для описания последовательной системы, передающей данные между небольшими, специализированными утилитами, которые принимают, обрабатывают и возвращают результат. Программы потоковой обработки данных начинаются с входных данных, например, параметров командной строки, и демонстрируют, как эти данные используются и модифицируются. Поток данных является явным и часто визуально отображается в виде линии или канала. С точки зрения кодирования, программа потоковой обработки данных может быть реализована как хеш-таблица, где уникально идентифицированные входные данные служат ключами для поиска указателей на инструкции. Когда операция завершается, программа просматривает список операций, пока не найдет первую операцию, для которой все входные данные в данный момент действительны, и запускает её. После завершения этой операции она обычно выдает данные, тем самым делая другую операцию готовой к выполнению. Для параллельной обработки достаточно совместно использовать только список операций – он представляет собой состояние всей программы. Таким образом, задача управления состоянием снимается с программиста и передается среде выполнения языка. На машинах с одним процессорным ядром, где реализация, предназначенная для параллельной обработки, просто создает накладные расходы, эти накладные расходы можно полностью устранить, используя другую среду выполнения.
Постепенное обновление
Некоторые современные библиотеки потоковой обработки данных, такие как Differential/Timely Dataflow, используют инкрементные вычисления для значительно более эффективной обработки данных.
История
Пионером в области языков потоковой обработки данных был BLODI (BLOCK DIagram), опубликованный в 1961 году Джоном Ларри Келли-младшим, Кэрол Локбаум и Виктором А. Виссоцким для спецификации систем обработки дискретных сигналов. Спецификация BLODI функциональных блоков (усилителей, сумматоров, линий задержки и т.д.) и их соединений компилировалась в единый цикл, который обновлял всю систему за один такт. В 1966 году в докторской диссертации "Онлайн графическая спецификация компьютерных процедур" Берт Сазерленд создал одну из первых графических сред программирования, основанных на потоках данных, чтобы упростить параллельное программирование. Последующие языки потоковой обработки данных часто разрабатывались в крупных лабораториях, занимающихся разработкой суперкомпьютеров. POGOL, язык обработки данных, разработанный в NSA, компилировал крупномасштабные приложения, состоящие из множества операций над файлами (например, слияния, выборки, суммирования или преобразования), в эффективный код, который в максимальной степени исключал создание или запись промежуточных файлов. SISAL, популярный язык потоковой обработки данных, разработанный в Национальной лаборатории Лоуренса Ливермора, во многом похож на языки, управляемые операторами, но переменным должно присваиваться значение только один раз. Это позволяет компилятору легко определять входные и выходные данные. Было разработано несколько производных от SISAL, включая SAC (Single Assignment C), который стремится быть максимально совместимым с популярным языком программирования C. ВМС США финансировали разработку ACOS и SPGN (нотация графов обработки сигналов) начиная с начала 1980-х годов. В настоящее время он используется на ряде платформ. Более радикальной концепцией является Prograph, в котором программы строятся в виде графов на экране, а переменные полностью заменяются линиями, соединяющими входы с выходами. Кстати, Prograph изначально был написан для Macintosh, который оставался однопроцессорным до выхода DayStar Genesis MP в 1996 году. Существует множество аппаратных архитектур, ориентированных на эффективную реализацию моделей программирования потоков данных. Архитектура потоковой обработки данных с тегами, разработанная в MIT, была создана Грегом Пападопулосом. Потоковая обработка данных была предложена в качестве абстракции для спецификации глобального поведения компонентов распределенных систем: в модели программирования живых распределенных объектов распределенные потоки данных используются для хранения и передачи состояния, и таким образом играют роль, аналогичную переменным, полям и параметрам в языках программирования, подобных Java.