Рубрика «конвейеры»
Как я, не разработчик, читаю туториал, который ты, разработчик, написал для меня
2025-09-29 в 15:21, admin, рубрики: брандашмыг, конвейерыЛенточный конвейер для линейных данных
2013-06-21 в 11:33, admin, рубрики: Компиляторы, конвейеры, Песочница, Программирование, трансляторы, метки: конвейеры, Программирование, трансляторыПять лет назад мне довелось проектировать одну программу, обрабатывающую текст с управляющими командами. Количество этапов обработки было весьма существенным — 6-7 обработчиков последовательно могли пропускать через себя довольно большие объёмы данных, как бывает иногда в конвейерах Unix. Чтобы аккуратно выполнить поставленную задачу я разработал общий метод, который может пригодиться и в других местах. Идея, лежащая в основе этой статьи, действительно очень напоминает конвейеры Unix, но имеется несколько существенных отличий:
- конвейер Unix работает асинхронно, в разных процессах, в то время, как здесь требуется реализовать обработку в рамках одной программы, и распараллеливание может быть нежелательно;
- возможна передача любых данных, не обязательно текстовых, но которые можно охарактеризовать термином «линейные».
Под линейными данными я буду понимать последовательность объектов, допускающую переход к следующему (если он имеется). Примерами могут служить: бинарный файл, текст из символов UTF-8, последовательность лексем, команд. Сложная программа, обрабатывающая линейные данные, такая как транслятор, обычно выполняет несколько преобразований. Вот пример:
- чтение файла по байтам,
- декодирование в UTF-8,
- препроцессор,
- лексический анализ,
- синтаксический анализ.
Ни для кого не секрет, что в этом случае нет необходимости хранить данные целиком в памяти. Гораздо эффективнее, считывать файл порциями, которые сразу же проходят через все этапы преобразования, не задерживаясь в памяти.
Преобразователи выстраиваются в виде “конвейера”, каждый следующий получает данные от предыдущего. Преобразователь также может менять тип данных, например, у лексера буквы на входе, на выходе — лексемы.
У меня нет реализации этих алгоритмов, достойной публикации, поэтому я ограничусь общей идеей и схемой реализации. Примерные схемы даны на C++, в них используется виртуальное и множественное наследование, а также шаблоны. Читать полностью »
Команда sponge: «губка» для стандартного ввода
2013-04-26 в 14:52, admin, рубрики: bash, i/o, linux, конвейеры, перенаправление, метки: bash, i/o, конвейеры, перенаправлениеВсе мы знаем, что при выполнении команд в шелле мы можем перенаправлять стандартный вывод на стандартный ввод других команд, а также записывать его в файл.
Это достаточно детально описано в главе I/O Redirection в «Продвинутом руководстве по программированию на Bash» (Advanced Bash-Scripting Guide).
В частности, иногда бывает так, что вам нужно прочитать какой-то файл, как-то его обработать (например, выбрать оттуда только те строки, которые подходят под некое регулярное выражение), и затем записать результат в тот же самый файл. Допустим, ваш файл называется «messages.log», и вы хотите оставить в нём только те строки, которые начинаются со слова «Success», двоеточия и пробела (а все остальные строки убрать).
Можно предположить, что для этого подойдёт такая команда:
grep "^Success:s" messages.log > messages.log
Но это предположение окажется неправильным — при выполнении этой строчки файл messages.log будет открыт на запись и очищен ещё до того, как grep начнёт его просматривать.
Читать полностью »

