Ленточный Конвейер Для Линейных Данных

Пять лет назад мне представилась возможность разработать программу, обрабатывающую текст с помощью команд управления.

Количество этапов обработки было весьма значительным — 6-7 процессоров последовательно могли проходить через довольно большие объемы данных, как это иногда случается в конвейерах Unix. Чтобы точно выполнить эту задачу, я разработал общий метод, который может оказаться полезным в других местах.

Идея этой статьи действительно очень похожа на конвейеры Unix, но есть несколько существенных отличий:

  • конвейер Unix работает асинхронно, в разных процессах, при этом здесь необходимо реализовывать обработку внутри одной программы, и распараллеливание может быть нежелательным;
  • можно передавать любые данные, не обязательно текстовые, но которые можно охарактеризовать термином «линейные».

Под линейные данные Я пойму последовательность объектов, позволяющую перейти к следующему (если он есть).

Примеры: двоичный файл, текст из символов UTF-8, последовательность токенов, команды.

Сложная программа, обрабатывающая линейные данные, например транслятор, обычно выполняет несколько преобразований.

Вот пример:

  • чтение файла байт-байт,
  • декодирование в UTF-8,
  • препроцессор,
  • лексический анализ,
  • разбор.

Ни для кого не секрет, что в этом случае нет необходимости хранить все данные в памяти.

Гораздо эффективнее читать файл кусками, которые сразу проходят все этапы конвертации, не задерживаясь в памяти.

Конвертеры выстроены в виде «конвейера», каждый следующий получает данные от предыдущего.

Конвертер также может менять тип данных, например, у лексера на входе буквы, а на выходе — токены.

У меня нет достойной публикации реализации этих алгоритмов, поэтому ограничусь общей идеей и схемой реализации.

Примеры диаграмм даны на языке C++, в них используются виртуальный и множественное наследование, а также шаблоны.



Что произойдет, если вы спроектируете линейную обработку данных, не особо заморачиваясь?
Рассмотрим возможную реализацию программного интерфейса преобразователя.

В самом простом варианте возможны три типа преобразователей:

   

class Source {

Теги: #программирование #конвейеры #трансляторы #компиляторы
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.