Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В компьютерном программировании , программирование потоков данных является парадигма программирования , которая моделирует программу в виде ориентированного графа данных , протекающих между операциями, таким образом , реализации потоков данных принципов и архитектуры. Языки программирования потоков данных имеют общие черты с функциональными языками и, как правило, были разработаны для того, чтобы привнести некоторые функциональные концепции в язык, более подходящий для обработки чисел. Некоторые авторы используют термин поток данных вместо потока данных, чтобы избежать путаницы с вычислением потока данных или архитектурой потока данных., основанный на парадигме недетерминированных машин. Программирование потока данных было впервые предложено Джеком Деннисом и его аспирантами Массачусетского технологического института в 1960-х годах.

Свойства языков программирования потока данных [ править ]

Традиционно программа моделируется как серия операций, выполняемых в определенном порядке; это может упоминаться как последовательные, [1] : стр.3 процедурные, [2] управление потоком [2] ( с указанием , что программа выбирает конкретный путь), или императивное программирование . Программа фокусируется на командах в соответствии с видением фон Неймана [1] : стр. 3 последовательного программирования, при котором данные обычно находятся в состоянии покоя. [2] : стр.7

Напротив, программирование потока данных подчеркивает движение данных и моделирует программы как серию соединений. Явно определенные входы и выходы соединяют операции, которые работают как черные ящики . [2] : p.2 Операция запускается, как только все ее входные данные становятся действительными. [3] Таким образом, языки потоков данных по своей сути параллельны и могут хорошо работать в больших децентрализованных системах. [1] : стр.3 [4] [5]

Состояние [ править ]

Одна из ключевых концепций компьютерного программирования - это идея состояния , по сути, снимка различных состояний в системе. Большинство языков программирования требуют значительного количества информации о состоянии, которая обычно скрыта от программиста. Часто компьютер сам не знает, какая часть информации кодирует устойчивое состояние. Это серьезная проблема, поскольку информация о состоянии должна совместно использоваться несколькими процессорами на машинах с параллельной обработкой . Большинство языков заставляют программиста добавлять дополнительный код, чтобы указать, какие данные и части кода важны для состояния. Этот код имеет тенденцию быть дорогим с точки зрения производительности, а также сложен для чтения или отладки. Явный параллелизмявляется одной из основных причин низкой производительности Enterprise Java Beans при создании приложений , не использующих OLTP, с интенсивным использованием данных. [ необходима цитата ]

В то время как последовательную программу можно представить как одного рабочего, перемещающегося между задачами (операциями), программа потока данных больше похожа на серию рабочих на сборочной линии , каждый из которых выполняет определенную задачу всякий раз, когда доступны материалы. Поскольку операции касаются только доступности входных данных, они не имеют скрытого состояния, которое нужно отслеживать, и все они «готовы» одновременно.

Представление [ править ]

Программы потока данных представлены по-разному. Традиционная программа обычно представлена ​​в виде серии текстовых инструкций, что разумно для описания последовательной системы, которая передает данные между небольшими одноцелевыми инструментами, которые получают, обрабатывают и возвращают. Программы потока данных начинаются с ввода, возможно, с параметров командной строки , и демонстрируют, как эти данные используются и изменяются. Поток данных явный, часто визуально изображается в виде линии или конвейера.

С точки зрения кодирования, программа потока данных может быть реализована в виде хеш-таблицы с однозначно идентифицированными входными данными в качестве ключей, используемых для поиска указателей на инструкции. Когда любая операция завершается, программа просматривает список операций, пока не найдет первую операцию, в которой все входные данные в настоящее время действительны, и запустит ее. Когда эта операция завершается, она обычно выводит данные, тем самым делая другую операцию действительной.

Для параллельной работы требуется общий доступ только к списку; это состояние всей программы. Таким образом, задача поддержания состояния снимается с программиста и передается среде выполнения языка . На машинах с одним ядром процессора, где реализация, предназначенная для параллельной работы, просто привела бы к накладным расходам, эти накладные расходы можно полностью устранить, используя другую среду выполнения.

История [ править ]

Первым языком потока данных стал BLODI (BLOck DIagram), разработанный Джоном Ларри Келли-младшим , Кэрол Лохбаум и Виктором Высоцким для определения систем выборочных данных . [6] Спецификация BLODI функциональных блоков (усилителей, сумматоров, линий задержки и т. Д.) И их взаимосвязей была скомпилирована в один цикл, который обновлял всю систему за один такт.

В 1966 году доктор философии. Тезис, он-лайн Графическое описание процедур Компьютера , [7] Bert Сазерленд создал одну из первых графических основ программирования потоков данных для того , чтобы сделать параллельное программирование проще. Последующие языки потока данных часто разрабатывались в крупных суперкомпьютерных лабораториях. POGOL, в остальном традиционный язык обработки данных, разработанный в NSA , компилировал крупномасштабные приложения, состоящие из нескольких операций «файл-файл», например слияния, выбора, суммирования или преобразования, в эффективный код, который исключал создание или запись промежуточных файлы в максимально возможной степени. [8] SISAL , популярный язык обработки данных, разработанный вНациональная лаборатория Лоуренса Ливермора похожа на большинство языков, ориентированных на утверждения, но переменные следует назначать один раз . Это позволяет компилятору легко идентифицировать входы и выходы. Ряд отстоящих SISAL были разработаны, в том числе SAC , Single Assignment C , который пытается оставаться рядом с популярным языком программирования С , как это возможно.

ВМС США финансировали разработку ACOS и SPGN (обозначение графа обработки сигналов), начиная с начала 1980-х годов. Сегодня это используется на нескольких платформах в полевых условиях. [9]

Более радикальная концепция - это Prograph , в котором программы строятся в виде графиков на экране, а переменные полностью заменяются линиями, связывающими входы с выходами. Кстати, Prograph изначально был написан на Macintosh , который оставался однопроцессорным до появления DayStar Genesis MP в 1996 году.

Существует множество аппаратных архитектур, ориентированных на эффективную реализацию моделей программирования потоков данных. Архитектура потока данных с тегированным токеном Массачусетского технологического института была разработана Грегом Пападопулосом .

Поток данных был предложен как абстракция для определения глобального поведения компонентов распределенной системы: в модели программирования живых распределенных объектов распределенные потоки данных используются для хранения и передачи состояния, и, как таковые, они играют роль, аналогичную переменным, полям. , и параметры на языках программирования, подобных Java.

Языки [ править ]

Языки программирования потока данных включают:

  • ASCET
  • Язык сценариев AviSynth для обработки видео
  • Машина двоичного модульного потока данных BMDFM
  • CAL
  • Cuneiform , функциональный язык рабочего процесса.
  • Конвейеры CMS
  • Юм
  • Джоуль
  • Keysight VEE
  • KNIME - это бесплатная платформа для анализа данных, отчетности и интеграции с открытым исходным кодом.
  • LabVIEW , G [3]
  • Линда
  • Lucid [2]
  • Блеск
  • Макс / MSP
  • Microsoft Visual Programming Language - компонент Microsoft Robotics Studio, предназначенный для программирования робототехники.
  • Orange - инструмент визуального программирования с открытым исходным кодом для интеллектуального анализа данных , статистического анализа данных и машинного обучения .
  • Oz теперь также распространяется с версии 1.4.0
  • Пилот трубопровода
  • Prograph
  • Чистые данные
  • Quartz Composer - разработан Apple ; используется для графической анимации и эффектов
  • SAC Единичное назначение C
  • SIGNAL (синхронный язык, ориентированный на поток данных, обеспечивающий многочастотные спецификации)
  • Simulink
  • СИЗАЛ
  • SystemVerilog - язык описания оборудования
  • Verilog - язык описания оборудования, включенный в стандарт SystemVerilog в 2009 году.
  • VHDL - язык описания оборудования
  • Инженерная среда XEE (Starlight) XML
  • XProc

Интерфейсы прикладного программирования [ править ]

  • Apache Beam : Java / Scala SDK, который объединяет потоковую (и пакетную) обработку с несколькими поддерживаемыми механизмами выполнения (Spark, Flink, поток данных Google ...)
  • Apache Flink : библиотека Java / Scala, которая позволяет выполнять потоковые (и пакетные) вычисления поверх распределенного кластера Hadoop (или другого).
  • SystemC : библиотека для C ++, в основном предназначенная для проектирования оборудования.
  • TensorFlow : библиотека машинного обучения, основанная на программировании потоков данных.

См. Также [ править ]

  • Актерская модель
  • Программирование, управляемое данными
  • Цифровая обработка сигналов
  • Событийно-ориентированное программирование
  • Программирование на основе потоков
  • Функциональное реактивное программирование
  • Глоссарий реконфигурируемых вычислений
  • Высокопроизводительные реконфигурируемые вычисления
  • Инкрементальные вычисления
  • Модель параллельного программирования
  • Разделенное глобальное адресное пространство
  • Конвейер (Unix)
  • Квантовая схема
  • Сигнальное программирование
  • Потоковая обработка
  • Yahoo Pipes

Ссылки [ править ]

  1. ^ a b c Джонстон, Уэсли М .; Младший Пол Ханна; Ричард Дж. Миллар (март 2004 г.). «Достижения в языках программирования потоков данных» (PDF) . ACM Computing Surveys . 36 : 1–34. DOI : 10.1145 / 1013208.1013209 . Проверено 15 августа 2013 года .
  2. ^ a b c d e Уэдж, Уильям В .; Эдвард А. Эшкрофт (1985). Lucid, язык программирования потока данных (иллюстрированный ред.). Academia Press. ISBN 9780127296500. Проверено 15 августа 2013 года .
  3. ^ a b «Основы программирования потока данных» . Начало работы с продуктами NI . Корпорация National Instruments . Проверено 15 августа 2013 года .
  4. ^ Хартер, Ричард. «Языки потока данных и программирование - Часть I» . Мир Ричарда Хартера . Архивировано из оригинала 8 декабря 2015 года . Проверено 15 августа 2013 года .
  5. ^ «Почему языки программирования потока данных идеальны для программирования параллельного оборудования» . Серия технических документов по основам многоядерного программирования . Корпорация National Instruments . Проверено 15 августа 2013 года .
  6. ^ Джон Л. Келли младший; Кэрол Лохбаум; В.А. Высоцкий (1961). «Компилятор блок-схемы». Bell System Tech. Дж . 40 (3): 669–678. DOI : 10.1002 / j.1538-7305.1961.tb03236.x .
  7. ^ WR Сазерленд (1966). «Он-лайн графическое описание компьютерных процедур». Массачусетский технологический институт. Цитировать журнал требует |journal=( помощь )
  8. ^ Глория Ламберт (1973). «Масштабная обработка файлов: ПОГОЛ». POPL '73: Материалы 1-го ежегодного симпозиума ACM SIGACT-SIGPLAN по принципам языков программирования . ACM . С. 226–234.
  9. ^ Обработка подводных акустических данных, YT Chan

Внешние ссылки [ править ]

  • Книга: Поток данных и системы реактивного программирования
  • Основы программирования потока данных на F # и C #
  • Программирование потока данных - концепция, языки и приложения
  • Статическое планирование программ синхронного потока данных для цифровой обработки сигналов
  • Обработка огромных нагрузок без увеличения сложности Основные концепции программирования потоков данных, доктор Добб, сентябрь 2011 г.
  • Поток данных конвейера чистой функции