W tym dodatku zawarto informacje istotne głównie dla osób tworzących
i rozwijających gawk. Całość jest swoista dla gawk i nie
odnosi się do innych implementacji.
Zob. 17.5. Rozszerzenia gawk poza POSIX awk,
gdzie podsumowano rozszerzenia GNU w stosunku do programu i języka awk.
Wszystkie te możliwości można wyłączyć wywołując gawk z opcją
`--traditional' lub z opcją `--posix'.
Jeżeli gawk skompilowano do diagnostyki z `-DDEBUG', to
w wierszu poleceń jest dostępna jeszcze jedna opcja:
-W parsedebug
--parsedebug
Opcję tę przewidziano tylko dla poważnych twórców gawk, a nie dla
przypadkowego użytkownika. Prawdopodobnie nie została nawet wkompilowana
w twoją wersję gawk, gdyż spowalnia wykonywanie.
gawk
Jeżeli masz zamiar w znaczący sposób poszerzyć gawk, masz pełną
swobodę w tej kwestii. To właśnie jest zasadniczą cechą wolnego
oprogramowania: kod źródłowy jest dostępny i możesz bez swobodnie zmieniać go
jak zechcesz (zob. 18. Powszechna Licencja Publiczna GNU).
W tej sekcji omówiono dziedziny, w jakich można zmienić gawk,
i warunki, o których powinno się pamiętać.
Jeżeli chcesz, możesz swobodnie dodawać nowe możliwości do gawk.
Jeśli jednak chciałbyś, by te zmiany zostały zawarte w dystrybucji
gawk, to jest kilka kroków, jakie powinieneś podjąć, bym mógł
wcielić twoje zmiany.
gawk. Jeśli twoja wersja gawk będzie
bardzo stara, mogę nie być w stanie zintegrować jej w ogóle.
Zob. B.1.1. Pozyskiwanie pakietu dystrybucyjnego gawk, gdzie opisano
pozyskiwanie najnowszej wersji gawk.
gawk. (Standardy Kodowania GNU
są częścią pakietu dystrybucyjnego Autoconf, z FSF.)
gawk.
Kod C użyty do budowy gawk kieruje się instrukcjami zawartymi w
Standardach Kodowania GNU, z pomniejszymi wyjątkami.
Kod sformatowano korzystając z tradycyjnego stylu "K&R", szczególnie
tyczy się to umieszczania nawiasów klamrowych i zastosowania tabulacji.
W skrócie, reguły kodowania użyte w gawk są następujące:
int, umieszczamy
w wierszu powyżej wiersza z nazwą i argumentami funkcji.
if, while, for, do, switch
i return) umieszczamy spacje.
for,
oraz w ciałach makr.
NULL i '\0' w warunkach instrukcji
if, while i for oraz w przypadkach case
instrukcji switch, zamiast zwykłego, jawnego wskaźnika czy wartości
znakowej.
1 i 0 stosujemy, gdzie jest to właściwe, stałe
symboliczne TRUE, FALSE i NULL i stałą znakową
'\0'.
alloca.
Korzystanie z niej powoduje więcej kłopotów z przenośnością niż daje
niewielkich korzyści brak konieczności zwalniania przydziału pamięci.
Zamiast tego, używamy malloc i free.
gawk, być może nie będzie mi się chciało.
gnu@gnu.org.
gawk ze swoją wersją
zastosuj `diff -c -r -N' lub `diff -u -r -N'.
(Pliki różnic kontekstowych są dla mnie czytelniejsze, ale pliki w formacie
zunifikowanym mają mniejsze rozmiary.) Polecam wykorzystywanie diff
w wersji GNU. Dostarczając zmiany prześlij mi, proszę, wyjście
utworzone przez któryś z podanych przebiegów diff.
Zob. B.7. Zgłaszanie problemów i błędów, gdzie podano informacje o
poczcie elektronicznej.
Stosowanie tego formatu ułatwia mi nanoszenie twoich zmian na główną wersję
kodu źródłowego gawk (za pomocą patch). Jeśli będę musiał
nanosić zmiany ręcznie, korzystając z edytora tekstów, mogę tego nie
zrobić, szczególnie jeśli to wiele zmian.
Chociaż wygląda to na mnóstwo pracy, proszę pamiętaj, że choć ty sam piszesz nowy kod, ja muszę się nim opiekować i obsługiwać, a jeżeli nie będę mógł tego robić przy minimum dodatkowej pracy, to prawdopodobnie nie będę robił.
gawk na nowy system operacyjny
Jeżeli chciałbyś przenieść gawk na nowy system operacyjny, to
należy przestrzegać kilku zasad.
gawk i wersjami na inne platformy. Unikaj nieuzasadnionych
zmian w częściach kodu niezależnych od systemu. Jeżeli jest to możliwe,
unikaj rozsiewania `#ifdef'-ów tylko dla swojej wersji po całym kodzie.
Jeżeli niezbędne dla danego systemu zmiany będą zbytnio wpływać na kod,
prawdopodobnie ich nie zaakceptuję. W takim przypadku, będziesz mógł,
oczywiście, rozpowszechniać zmiany na własną rękę, dopóki będziesz działać
zgodnie z GPL (zob. 18. Powszechna Licencja Publiczna GNU).
gawk opiekują się inni ludzie
z Free Software Foundation. Nie powinieneś zatem ich zmieniać, chyba że
masz bardzo mocne uzasadnienie. Tzn. zmiany nie są wykluczone, ale zmiany
w tych plikach będą analizowane szczególnie uważnie. Plikami tymi są:
`alloca.c', `getopt.h', `getopt.c', `getopt1.c',
`regex.h', `regex.c', `dfa.h', `dfa.c',
`install-sh' i `mkinstalldirs'.
gawk na ich
systemach. Jeżeli żaden z ochotników nie opiekuje się wersją na daną
platformę, przeniesienie takie staje się nieobsługiwane, i może być
konieczne usunięcie go z dystrybucji.
gawk na MS-DOS i OS/2.)
gawk w twoim systemie.
Przestrzeganie tych wskazań znacznie ułatwi zintegrowanie twoich zmian
z gawk i umożliwi szczęśliwe współistnienie z kodem przeznaczonym
do innych systemów operacyjnych, który już tu jest.
W kodzie, jaki dostarczasz i którym się opiekujesz, możesz swobodnie stosować taki styl kodowania i układ nawiasów klamrowych, jaki ci odpowiada.
AWK jest językiem podobnym do PERLA, tylko znacznie bardziej eleganckim. Arnold Robbins Hey! Larry Wall
W tej sekcji wymieniono pokrótce rozszerzenia i możliwe usprawnienia,
wskazujące kierunki rozwoju gawk, jakie obecnie rozważamy.
Plik `FUTURES' w pakietach dystrybucyjnych gawk również
podaje te rozszerzenia.
Oto zestawienie prawdopodobnych przyszłych zmian do użytku programujących
w języku awk.
gawk ostrzeżeń i komunikatów o błędach w językach
innych niż angielski. Możliwe, że, prócz samego gawk, programy
awk będą mogły korzystać ze programów wspomagających z obsługą wielu
języków.
awk.
PROCINFO
gawk)
zostaną zastąpione tablicą PROCINFO, która dostarczy tych samych
danych, w sposób łatwiejszy w dostępie.
lint
gawk w tablicy ENVIRON mogą przenosić się
na procesy uruchamiane przez gawk.
Oto lista prawdopodobnych ulepszeń, które spowodują, że gawk będzie
miał lepszą wydajność.
dfa
dfa z programu GNU grep na pewne
problemy. Nowa lub poprawiona wersja będzie sobie radzić z niektórymi
ważnymi kwestiami dotyczącymi dopasowywania wyrażeń regularnych.
malloc
malloc w wersji GNU może potencjalnie przyspieszyć gawk,
gdyż w dużym stopniu opiera się na stosowaniu dynamicznej alokacji pamięci.
Oto kilka projektów, jakie być może zechcą podjąć przyszli hakerzy
gawk. Wielkość projektów waha się od kilku dni do kilku tygodni
programowania, w zależności od tego, który wybierzesz i jak szybkim jesteś
programistą. Wszystkie napisane ulepszenia proszę przesyłać do opiekunów
w projekcie GNU.
Zob. C.2.1. Dodawanie nowych możliwości,
gdzie zamieszczono wytyczne, jakich należy przestrzegać dodając nowe
możliwości do gawk. Zob. B.7. Zgłaszanie problemów i błędów,
gdzie podano informacje o kontaktowaniu się z opiekunami gawk.
awk: gawk do konwersji podanego skryptu
na drzewo składni wykorzystuje analizator składni Bison (podobny do YACC).
Następnie drzewo składniowe wykonywane jest przez prosty rekurencyjny
ewaluator. Odbywa to się sporym kosztem, gdyż ewaluator wykonuje wiele
wywołań procedur do zrobienia nawet najprostszych rzeczy.
Powinno być możliwe, by gawk przekształcał drzewo składniowe skryptu
w program C, który użytkownik mógłby następnie skompilować, korzystając
ze zwykłego kompilatora C i specjalnej biblioteki gawk,
dostarczającej wszystkich niezbędnych funkcji (wyrażenia regularne, pola,
tablice asocjacyjne, koercja typów, i tak dalej).
Łatwiejszą możliwością może być faza pośrednia awk, konwersji
drzewa składniowego na postać liniowego kodu bajtowego jak to jest
w GNU Emacs Lisp. Ewaluator rekurencyjny można by wówczas zastąpić
zwykłym interpreterem kodu bajtowego, co byłoby wypośrodkowane
szybkością między uruchamianiem skompilowanego programu a robieniem tego,
co gawk robi obecnie.
Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.