UNIX — универсальная среда программирования - Брайан Керниган
Шрифт:
Интервал:
Закладка:
Основы теории, на базе которой построены yacc и другие программы анализаторы, излагаются в книге А. В. Ахо и Д. Д. Ульмана "Principles of Compiler Design" (Addison Wesley, 1977). Сама программа yacc описана в справочном руководстве по UNIX (том 2B). В этом разделе также представлен калькулятор, сравнимый с hoc2: для вас такое сравнение может оказаться полезным.
Программа lex первоначально было написана М. Леском. Теория lex освещена в книге Ахо и Ульмана, а сам язык lex описан в справочном руководстве по UNIX.
Программы yacc и в меньшей степени lex использовались для реализации многих языковых процессоров, включая переносимый компилятор Си, процессоры на Паскале, Фортране 77, Ратфоре, awk, be, egn и pick.
Программа make создана С. Фельдманом и описана в статье "MAKE a program for maintaining computer programs" (Software-Practice & Experience, April, 1979).
В книге Д. Бентли "Writing Efficient Programs" (Prentice-Hall, 1982) обсуждается техника ускорения выполнения программ. Акцент в ней делается на создание подходящего алгоритма, а также на улучшение кода, если в этом есть необходимость.
Глава 9
Подготовка документации
Средства редактирования и форматирования документации стали одним из ранних приложений системы UNIX. Администрация Bell Labs, приобретая первую установку PDP-11, хотела иметь систему подготовки документации, а не операционную систему. (К счастью, заказчики получили больше, чем ожидали.)
Первая форматирующая программа roff — небольшая, быстрая программа, с которой легко было работать до тех пор, пока выпускались простые документы с помощью печатающего устройства. Следующая форматирующая программа nroff обладала большими возможностями. Ее автор Дж. Осанна вместо того, чтобы обеспечивать каждый вид документации по желанию пользователя, сделал свою программу программируемой, т.е. многие задачи форматирования решались путем программирования на языке nroff.
После приобретения в 1973 г. небольшого наборного устройства nroff была расширена и смогла поддерживать множество символов, а также шрифты разных кеглей и гарнитур. Новая программа получила название troff (по аналогии с "en-roff', а произносили это как "tee-roff".) Программы nroff и troff имели одну и ту же основу и один и тот же входной язык; nroff игнорировала команды типа смены размера шрифта, которые она не могла выполнить. В настоящей главе речь пойдет главным образом о troff, но большинство наших пояснений можно отнести и к nroff с учетом ограничений, налагаемых выводными устройствами.
Самое большое достоинство troff гибкость базового языка и ее возможности программирования. Она может выполнить почти любую задачу форматирования. Но гибкость обходится недешево, использовать troff часто бывает весьма трудно. Следует отметить, что почти все программное обеспечение UNIX для подготовки документации сконструировано таким образом, чтобы заместить некоторые фрагменты "чистой troff". Одним из примеров может служить разметка страницы: общий вид документа, как выглядят названия, заголовки и абзацы, где появляются номера страниц, как велики размеры страницы и т.д. Все соответствующие средства не встроены и должны программироваться. Однако пользователю не нужно специфицировать перечисленные выше детали для каждого документа, так как есть стандартный пакет форматирующих команд. Пользователь пакета не говорит: "Следующая строка должна центрироваться, состоять из прописных букв, выделенных жирным шрифтом". Вместо этого он должен сказать: "Следующая строка — заголовок", и тогда используется определение вида названия из пакета. Пользователи имеют дело с логическими компонентами документа названиями, заголовками, абзацами, сносками и т.п., а не с размерами, шрифтами и позициями.
К сожалению, планируемый как "стандартный" пакет команд форматирования не является более стандартным: распространение получили несколько пакетов плюс многие их варианты. Мы рассмотрим здесь два пакета общего назначения: ms, первоначальный "стандарт", и mm, более новую версию, стандартную в System V, а также пакет man для печати справочников. Основной акцент сделан на ms как на стандарт в седьмой версии; он может служить хорошим примером и является достаточно мощным для выполнения работы (с его помощью подготовлена наша книга, правда, пришлось добавить команду для задания требуемого нам шрифта).
Этот опыт типичен — пакеты макроопределений подходят для выполнения многих задач форматирования, но иногда необходимо вернуться к основным командам troff. В данной главе мы опишем лишь небольшую часть troff.
Хотя troff обеспечивает возможность полностью управлять выходным форматом, ее непросто использовать для набора более сложного материала, такого, как формулы, таблицы и рисунки. Их разметка так же трудна, как разметка страницы. Решить упомянутые выше проблемы можно по-разному. Существуют языки специального назначения для формул, таблиц и рисунков, которые заменяют пакеты команд форматирования. Каждый язык поддерживается отдельной программой, транслирующей его в команды troff. Программы взаимодействуют через программные каналы. Эти препроцессоры служат хорошим примером подхода к проблемам в UNIX: вместо расширения и усложнения troff с ней взаимодействуют отдельные программы. (Конечно, средства развития языка, описанные в гл. 8, были использованы для облегчения реализации.) Ниже описываются две программы: tbl, форматирующая таблицы, и eqn, форматирующая математические выражения.
Мы постараемся дать вам советы по подготовке документации и применению поддерживающих инструментов. Приводимые здесь примеры войдут в документ, описывающий язык hoc, из гл. 8 и справочного руководства. Сам документ приведен в приложении 2.
9.1 Пакет макроопределений ms
Основная идея, заложенная в пакет макроопределений, состоит в том, что документ описывается в терминах его логических частей названия, заголовков разделов, абзацев, а не в деталях: расстановка пробелов, выбор шрифтов, определение размеров букв. Это спасает вас от рутинной работы и освобождает документ от несущественных подробностей. Фактически вы можете сделать свой документ совершенно иным, использовав другое множество макроопределений с теми же логическими именами. Так, один и тот же документ мог бы последовательно превращаться в технический отчет, доклад на конференции, журнальную статью и главу из книги с помощью одинаковых команд форматирования, интерпретируемых четырьмя разными пакетами макроопределений.
Входной поток troff представляет собой обычный текст, размеченный командами форматирования, независимо от использования пакета макроопределений. Существуют два вида команд. Команда первого вида состоит из точки в начале строки и следующей за ней одной (двух) буквы либо цифры и, возможно, параметра, как показано ниже:
.PP
.ft В
Это небольшой абзац, выделенный жирным шрифтом.
Все встроенные команды troff имеют имена, образованные строчными буквами, поэтому по соглашению командам в пакетах даются имена из прописных букв. В нашем примере .PP есть команда ms для абзаца, a .ff — команда troff, вызывающая замену обычного шрифта жирным. (Имена команд, управляющих шрифтами, состоят из прописных букв; шрифты могут быть разными на разных наборных устройствах.)
Команда второго вида это последовательность символов, начинающаяся с обратной дробной черты , которая может оказаться в любом месте входного потока. Например, команда fB также вызывает переключение на жирный шрифт. Она является примером чистой troff; ниже мы коротко ее рассмотрим.
Для форматирования достаточно вводить команду .PP перед каждым абзацем. В принципе при подготовке большинства документов можно обойтись дюжиной разных команд ms. Так, приложение 2, описывающее hoc, имеет название, имена авторов, резюме, автоматически нумеруемые заголовки разделов и абзацы. Здесь используется всего 14 различных команд, причем некоторые из них парами. В ms документ принимает следующую общую форму:
.TL
Название документа (одна или более строк)
.AU
Имена авторов, одно на строке
.AB
Резюме, оканчивающееся .AE
.AE
.NH
Нумеруемые заголовки (автоматически)
.PP
Абзац...
.PP
Другой абзац...
.SH
Подзаголовок (нет нумерации)
.PP
...
Команды форматирования могут появиться в начале строки. Входной текст между командами размещается в произвольной форме: расположение концов строк в нем не существенно, так как troff переносит слова с одной строки на другую, чтобы сделать строки более полными (процесс, называемый заполнением), и расставляет дополнительные пробелы между словами, чтобы выровнять границы (выравнивание). Тем не менее начинать каждое предложение с новой строки считается хорошим стилем; это облегчает последующее редактирование.