-->
Остров пингвинов
- - - - - - - - - - - - - - - - - - - - - - -
Сольные выступления

Для начинающих

Для знатоков

Для души

О нас
Путь к совершенству

... и выпила залпом еще сто пятьдесят,
ибо она была совершенна,а совершенству нет предела...
Венедикт Ерофеев. Москва - Петушки

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

Мы уже посмотрели скрипт, отчасти облегчающий сопровождение сайта. Вся служебная информация из заголовка представлена теперь в удобоваримом виде. Рутинные процедуры по компиляции из текста в настоящую html страницу, архивированию, загрузке на сервер, проверке ссылок и прочему собраны в один Makefile. Тело документа с параграфами, разделёнными пустыми строками, представляет собой обычный html код без надоедливых меток <p>.

В программировании, когда есть необходимость сократить часто набираемую команду или заменить одно выражение на другое, более изящное, используются макросы, или макроподстановки. Это средство имеется во многих компиляторах, есть также отдельные специализированные макропроцессоры. Давайте глянем, что можно сделать со стандартным для Unix'а макропроцессором m4.

Удивительно, но эта крошечная, менее 100 килобайт утилита представляет собой настоящий язык программирования. Миниатюрна она также по количеству встроеных функций, всего 45. Подобный минимализм внушает надежду что этот язык можно освоить за один приём, благо он снабжён подробной документацией и хорошими примерами.

Мощь m4 оценили многие программисты. Например, autoconf и automake используют макропроцессор m4 для генерации файлов configure и Makefile соответственно. Программа sendmail свои файлы настроек хранит в виде макросов m4. Интересный пример использования этого языка для создания web-сайта предлложил Bob Hepple. В статье "Using m4 to write HTML" он описал библиотеку макросов, выполняющих именно то, к чему стремимся мы - упростить, усовершенствовать язык html.

Как обычно, вместе с программой m4 идёт качественная онлайновая документация и примеры. А вот отыскать обычную, бумажную книгу, посвященную этому языку, мне не удалось, ни на английском, ни, тем более, на русском. Так что воспользуюсь случаем и попробую рассказать о собственном опыте знакомства с макропроцессором m4.

Макропроцессор m4 копирует свой стандартный ввод на стандартный вывод, попутно обрабатывая все обнаруженные макросы. Макрос может быть либо функцией, встроенной в язык, либо определён пользователем. Макросы могут иметь произвольное количество аргументов. В числе 45 встроенных есть функции перенаправления ввода/вывода, включения файлов, выполнения внешних команд, арифметических операций, обработки текста, рекурсии, создания новых функций.

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

... $ echo dumpdef|m4

Здесь, чтобы не возиться с файлами, имя функции подаётся прямо со стандартного ввода. Можно также опробовать полезный ключ -P, который модифицирует имена всех встроенных функций, добавляя префикс m4. Вот что происходит в этом случае:

... $ echo m4_dumpdef|m4 -P

Давайте в дальнейших примерах использовать встроенные функции с этим префиксом. Это снизит вероятность для макропроцессора принять обычное слово за макрос и попытаться его исполнить.

Начнём знакомство со встроенными макросами с функций перенаправления вывода. Попробуем, для примера, переставить вводимые строки в другом порядке:

... $ echo -e "строка один\nстрока два"
строка один
строка два
... $ echo -e "m4_divert(5)строка один\nm4_divertстрока два"|m4 -P
строка два
строка один

Здесь функция m4_divert(5) переназначила вывод во временный файл под номером 5, а следующий вызов m4_divert без параметра восстановил нормальный вывод. После последней строки ввода все отложенные файлы вывода печатают свою содержимое по очереди, в соответствии с номерами. Можно также вставить содержимое отложенного вывода с помощью команды m4_undivert(N).

Переназначение вида m4_divert(-1) совсем отменяет вывод последующих строк. Эта функция часто используется при определении собственных макросов, чтобы не засорять вывод пустыми строками. Другой способ отключить вывод символа новой строки - функция m4_dnl. Попробуйте создать у себя вот такой файл и обработать его через макропроцессор m4:

... $ cat proba01.m4
m4_divert(1)m4_dnl
line 1
m4_divert(2)m4_dnl
line 2
m4_divert`'m4_dnl
line 3
m4_undivert(2)m4_dnl
m4_undivert(1)m4_dnl

m4 выдаст в этом примере строки в обратном порядке. Здесь используется тот же механизм переназначения вывода, но видна ещё одна особенность этого языка. Это механизм кавычек, или квотирования. Кавычки в m4 служат вместо скобок, поэтому есть отдельные открывающая и закрывающая кавычки. Закавыченный текст может простираться на несколько строк, символы кавычек можно при желании переопределить. Возможно, именно из-за особенностей квотирования этот миниатюрный изящный язык почему-то считают сложным.

С исходным кодом m4 собраны поучительные примеры. Вкупе со встроенными в язык возможностями отладки можно детально увидеть механизм работы макропроцессора. Один из примеров демонстрирует использование рекурсии на примере задачи Ханойской башни. Вот как работает этот макрос:

... $ echo 'hanoi(3)'|m4 hanoi.m4 -
Move one disk from source to destination.
Move one disk from source to auxilliary.
Move one disk from destination to auxilliary.
Move one disk from source to destination.
Move one disk from auxilliary to source.
Move one disk from auxilliary to destination.
Move one disk from source to destination.

Более интересно, однако, будет включить, с помощью опции -d, режим трассировки и проследить рекурсию по шагам:

... $ echo 'hanoi(3)'|m4 -dateq hanoi.m4 - 2>&1|less

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

Как бы мы ни усовершенствовали язык разметки html и процесс сопровождения сайта, результат должен быть совершенен ещё в одном отношении - наш код не должен содержать ошибок. Здесь удобно воспользоваться парой утилит для проверки правильности ссылок и html-кода, соответственно linklint и tidy. Вызовы этих утилит выполняются через Makefile.

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

Олег Филон, Дм. Федорович, Ал-др Качанов Статьи Олега Филона Статьи Олега Филона Литературная страница Дм. Федоровича Литературная страница Дм. Федоровича дизайн А. Качанова дизайн А. Качанова Статьи Олега Филона