Пять лет назад мне представилась возможность разработать программу, обрабатывающую текст с помощью команд управления.
Количество этапов обработки было весьма значительным — 6-7 процессоров последовательно могли проходить через довольно большие объемы данных, как это иногда случается в конвейерах Unix. Чтобы точно выполнить эту задачу, я разработал общий метод, который может оказаться полезным в других местах.
Идея этой статьи действительно очень похожа на конвейеры Unix, но есть несколько существенных отличий:
- конвейер Unix работает асинхронно, в разных процессах, при этом здесь необходимо реализовывать обработку внутри одной программы, и распараллеливание может быть нежелательным;
- можно передавать любые данные, не обязательно текстовые, но которые можно охарактеризовать термином «линейные».
Примеры: двоичный файл, текст из символов UTF-8, последовательность токенов, команды.
Сложная программа, обрабатывающая линейные данные, например транслятор, обычно выполняет несколько преобразований.
Вот пример:
- чтение файла байт-байт,
- декодирование в UTF-8,
- препроцессор,
- лексический анализ,
- разбор.
Гораздо эффективнее читать файл кусками, которые сразу проходят все этапы конвертации, не задерживаясь в памяти.
Конвертеры выстроены в виде «конвейера», каждый следующий получает данные от предыдущего.
Конвертер также может менять тип данных, например, у лексера на входе буквы, а на выходе — токены.
У меня нет достойной публикации реализации этих алгоритмов, поэтому ограничусь общей идеей и схемой реализации.
Примеры диаграмм даны на языке C++, в них используются виртуальный и множественное наследование, а также шаблоны.
Что произойдет, если вы спроектируете линейную обработку данных, не особо заморачиваясь?
Рассмотрим возможную реализацию программного интерфейса преобразователя.В самом простом варианте возможны три типа преобразователей:
Теги: #программирование #конвейеры #трансляторы #компиляторыclass Source {
-
Электрохимия
19 Oct, 24