Руководство пользователя для GNU Awk

Arnold D. Robbins
перевод Балуева А. Н.

Оглавление

Приложение C. Замечания о реализации

Приложение C. Замечания о реализации

В начало страницы

Это приложение содержит информацию, в основном интересную для реализаторов и тех, кто поддерживает gawk. Все в нем относится специально к gawk, а не к другим реализациям.

C.1 Совместимость вниз и отладка

В начало страницы

См. раздел 17.5 [Расширения в gawk, отсутствующие в POSIX awk], стр. 256, с обзором расширений GNU языка и программы awk. Все эти дополнения могут быть выключены вызовом gawk с параметром `--traditional' или с `--posix'.

Если gawk скомпилирована для отладки с `-DDEBUG', то имеется еще один параметр, доступный из командной строки:

-W parsedebug --parsedebug

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

C.2 Внесение добавлений в gawk

В начало страницы

Если вы решите, что вам нужно расширить значительно возможности gawk, вы свободно можете это сделать. Этим преимуществом обладает свободное программное обеспечение; исходный код доступен, и вы свободно можете менять его, если хотите (см. [GNU GENERAL PUBLIC LICENSE], стр. 309).

В этом разделе обсуждаются пути для изменений в gawk, и всякие соображения, которые следует держать в уме.

C.2.1 Добавление новых свойств

В начало страницы

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

1. Возьмите последнюю версию. Для меня гораздо легче вставить изменения, если они относятся к самой последней поставляемой версии gawk. Если ваша версия gawk очень стара, я могу оказаться не в состоянии вообще объединить их. См. раздел B.1.1 [Получение поставки gawk], стр. 279, для информации о том, как получить последнюю версию gawk.

2. Следуйте стандартам кодировки GNU. Этот документ показывает, как должно писаться программное обеспечение GNU. Если вы его не читали, прочтите пожалуйста до того, как приступите к модификации gawk. (The GNU Coding Standards доступен как часть Autoconf distribution из FSF.)

3. Используйте стиль кодировка gawk. Cи-код для gawk следует инструкциям в GNU Coding Standards, с минимальными исключениями. Код отформатирован с использованием традиционного стиля "K&R", в особенности в отношении расположения скобок и использования символов tab. Коротко, правила кодирования для gawk таковы:

Используйте старый стиль (non-prototype) заголовков функций при определении функций.

Помещайте имя функции в начале отдельной строки.

Помещайте тип значения возврата функции, даже если это есть int, в строке над той, где помещаются имя и аргументы функции.

Описания аргументов функции не должны иметь отступа.

Ставьте пробелы вокруг скобок в управляющих структурах (if, while, for, do, switch и return).

Не помещайте пробелов перед скобками, используемыми в вызовах функций.

Ставьте пробелы вокруг всех Си-операторов и после запятых в вызовах функций.

Не употребляйте операторов запятая для произведения кратных побочных эффектов, за исключением инициализации циклов и частей с приращением, и тел макросов.

Используйте real tabs для отступов, а не пробелы.

Используйте стиль "K&R" для расположения скобок.

Используйте сравнения с NULL или '"0' в условиях операторов if, while и for, и в случаях операторов switch вместо простых указателей или значений символов.

Употребляйте символьные постоянные TRUE, FALSE и NULL, и символьную константу '"0' где нужно, вместо 1 и 0.

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

Не употребляйте `#elif'. Многие старые Unix C компиляторы не умеют их обрабатывать.

Не употребляйте функцию alloca для резервирования памяти вне стека. Такое употребление причиняет больше трудностей при переносе, чем небольшое удобство отсутствия необходимости освобождения памяти. Используйте malloc и free.

Если я буду должен переформатировать ваш код в духе, принятом в gawk, я могу не захотеть возиться с ним.

4. Будьте готовы подписать соответствующую статью. Для того, чтобы FSF поставляло ваши изменения, вы должны опубликовать эти изменения, представив подписанный документ такого рода, или передать права на публикацию в FSF. Оба эти действия легко осуществить, и многие авторы это уже сделали. Если у вас есть вопросы, пожалуйста войдите в контакт со мной (см. раздел B.7 [Сообщения о коллизиях и ошибках], стр. 292), или с gnu@gnu.org.

5. Исправьте документацию. Вместе с вашим новым кодом пришлите пожалуйста новые разделы или главы к этой книге. Если возможно, воспользуйтесь Texinfo, вместо представления неформатного текста ASCII (хотя и это лучше, чем совсем никакой документации). Соглашения, которые используются в Эффективном AWK-программировании, помещены после `@bye' в конце Texinfo source file. Если можно, внесите изменения и в справочник man page.

Вы должны будете также подписать письменную статью по вашим изменениям в документации.

6. Согласуйте изменения с context diffs или unified diffs. Используйте `diff -c -r -N' или `diff -u -r -N' для сравнения оригинального дерева gawk с вашей версией. (Я считаю context diffs более удобочитаемым, а unified diffs более компактен.) Рекомендую использовать версию GNU diff. Перешлите мне результаты, выданные каким-нибудь исполнением diff после согласования. См. раздел B.7 [Сообщения о коллизиях и ошибках], стр. 292, об информации по электронной почте. Использование названного формата облегчит мне внесение ваших изменений в эталонную версию исходного кода gawk (установку заплатки). Если я буду должен произвести вставку вручную, используя текстовый редактор, я могу этого не сделать, особенно при наличии множества изменений.

Хотя все это звучит как куча работы, помните, что вы только пишете новый код, а я должен его понять и поддержать, и если это невозможно сделать с минимумом лишней работы, я могу отказаться от этого.

C.2.2 Перенос gawk в новую операционную систему

В начало страницы

Если вы хотите перенести gawk в новую операционную систему, имеется несколько стадий в этом процессе.

1. Следуйте общим указаниям раздела C.2.1 [Добавление новых свойств], стр. 295, касающихся стиля кодирования, подчинения diffs, и пр.

2. Делая перенос, имейте ввиду, что ваш код должен мирно сосуществовать с остальным gawk и с другими переносами. Избегайте беспричинных изменений не зависящих от системы частей кода. Если это возможно, избегайте лишних `#ifdef' в переносимом коде.

Если изменения, необходимые для конкретной системы, захватывают большую часть кода, я бы не поддержал этого. В таком случае вы, конечно, можете распространять ваши изменения самостоятельно, пока вы согласуете свои действия с GPL (см. [GNU GENERAL PUBLIC LICENSE], стр. 309).

3. Некоторые файлы, поставляемые с gawk, курируются другими лицами из Free Software Foundation. Поэтому вы не должны изменять их, если для этого нет весьма веских причин. Т.е., хотя изменения и не невозможны, они будут подчинены весьма строгим рассмотрениям. Это файлы `alloca.c', `getopt.h', `getopt.c', `getopt1.c', `regex.h', `regex.c', `dfa.h', `dfa.c', `install-sh' и `mkinstalldirs'.

4. Будьте готовы продолжать поддерживать этот перенос. Не-Unix операционные системы поддерживаются добровольцами, которые следят за кодами, необходимыми для компиляции и исполнения gawk на таких системах. Если ни один доброволец не будет курировать перенос, он останется без поддержки, и может оказаться необходимым исключить его из поставок.

5. Приготовьте соответствующий `gawkmisc.???' файл. Каждый перенос имеет свой `gawkmisc.???', который реализует некоторые специфические функции операционной системы. Это лучше чем куча `#ifdef', разбросанных по коду. Файл `gawkmisc.c' в главном исходном каталоге включает соответствующий `gawkmisc.???' файл из каждого подкаталога. Не забудьте отредактировать также и его.

Каждый файл `gawkmisc.???' переноса имеет суффикс, напоминающий о машине или операционной системе для переноса. Например, `pc/gawkmisc.pc' и `vms/gawkmisc.vms'. Использование отдельных суффиксов вместо простого `gawkmisc.c' делает возможным передвигать файлы из подкаталога переноса в главный подкаталог без случайной порчи настоящего файла `gawkmisc.c'. (В настоящее время это сделано только в выпуске для переносов на MS-DOS и OS/2.)

6. Обеспечьте `Makefile' и все другие Cи исходные и header-файлы, которые необходимы для вашей операционной системы. Весь ваш код должен быть в отдельном подкаталоге с именем, которое совпадает или напоминает вашу вычислительную или операционную систему. Если можно, старайтесь структурировать объекты так, что не будет необходимости переносить файлы из подкаталога в главный исходный каталог. Если такое невозможно, тогда обязательно не используйте для ваших файлов имена, совпадающие с именами файлов в главном исходном каталоге.

7. Обновите документацию. Составьте раздел (или разделы) для этой книги, описывающие установочные и компиляционные шаги, необходимые для установки и/или компиляции gawk для вашей системы.

8. Приготовьтесь подписать соответствующие статьи. Для того, чтобы FSF распространяло ваши коды, вы должны или поместить ваш код в публичную область и представить подписанное подтверждение этого, или передать права на публикацию вашего кода в FSF.

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

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

C.3 Вероятные будущие расширения

В начало страницы

Язык AWK подобен языку PERL, он только значительно более элегантен. Arnold Robbins.

Здорово! Larry Wall

Этот раздел коротко перечисляет расширения и возможные улучшения в направлениях, планируемых в настоящее время для gawk. Файл `FUTURES' в поставке gawk также содержит эти расширения.

Вот список вероятных будущих изменений, которые будут использоваться теми, кто программирует на языке awk.

Локализация
Проект GNU начинает употребление многих языков. По крайней мере будет возможно заставить gawk печатать ее предостережения и сообщения об ошибках на языках, отличных от английского. Это может быть осуществлено независимо от самой программы gawk.

Базы данных
Возможно преобразование файла GDBM/NDBM/SDBM в массив awk.

Массив PROCINFO
Специальные файлы, которые снабжают относящейся к процессу информацией (см. раздел 6.7 [Специальные имена файлов в gawk], стр. 72) могут быть вытеснены массивом PROCINFO, который будет содержать ту же информацию, но в более легкой для доступа форме.

Управление окружением подпроцессов
Изменения, внесенные в gawk для массива ENVIRON, могут быть распространены на подпроцессы, запускаемые gawk.

Вот список вероятных усовершенствований, увеличивающих производительность gawk.

Улучшенная версия dfa
Программа dfa поиска соответствия образцам из GNU grep имеет ряд недостатков. Либо новая версия, либо исправленная старая будет работать с некоторыми важными случаями regexp.

Использование GNU malloc
Версия GNU этой функции потенциально может ускорить gawk, поскольку интенсивно использует динамическое распределение памяти.

C.4 Предложения по усовершенствованию

В начало страницы

Приведем несколько проектов, которые могут понравиться будущим gawk хакерам. Они могут потребовать от нескольких дней и до недель для программирования, в зависимости от того, что вы выберете и насколько быстрым программистом являетесь. Посылайте написанные вами усовершенствования кураторам проектов в GNU. См. раздел C.2.1 [Добавление новых свойств], стр. 295, с описанием правил добавления новых возможностей в gawk. См. также раздел B.7 [Сообщения об конфликтах и ошибках], стр. 292, по поводу контактов с кураторами.

1. Компиляция программ awk.
gawk использует анализатор Bison (YACC-like), превращающий входной сценарий в синтаксическое дерево; это дерево потом исполняется простым рекурсивным исполнителем. Этот метод требует много лишних действий, так как рекурсивный исполнитель вызывает множество процедур даже в простейших случаях.

Нужно, чтобы gawk превращала дерево разбора сценария в Си-программу, которую пользователь мог бы потом компилировать, используя обычный Си-компилятор и специальную библиотеку, содержащую все нужные функции (regexps, fields, associative arrays, type coercion, и т.д.).

Более легкой возможностью может быть промежуточная фаза awk превращения дерева разбора в линейную байтовую форму, подобную той, которая используется в GNU Emacs Lisp. Тогда рекурсивный исполнитель может быть заменен простым интерпретатором, что даст скорость, промежуточную между исполнением скомпилированной программы и тем, как gawk работает сейчас.

2. Чтобы программы в комплекте тестов могли использовать документацию из этой книги.

3. См. файл `FUTURES' для нахождения других идей. Вступите в контакт с нами, если вы серьезно хотите заняться одной из названных здесь задач.

В начало страницы

<<< Оглавление Страница: Приложение C  Приложение D. >>>