tekstu).
</p>
<p>
- W uproszeczniu zamiana kodu źródłowego na postać wykonywalną przez
- komputer nosi nazwę <strong>kompilacji</strong>. Jednaj jak się za
+ W uproszczniu zamiana kodu źródłowego na postać wykonywalną przez
+ komputer nosi nazwę <strong>kompilacji</strong>. Jednak jak się za
chwilę okaże jest tylko połowa sukcesu (w większości przypadków).
Obecnie w dystrybucjach Linuksa dostępne są dwa kompilatory
<em>GNU C Compiler</em> (gcc) oraz <em>Clang/LLVM</em>. W tym
}
</pre>
<p>
- Zapisany powyżej bardzo prosty program, zapisałem z w pliku
+ Zapisany powyżej bardzo prosty program, zapisałem w pliku
<em>hello.c</em>. Pliki kodu źródłowego języka C powinny mieć
rozszerzenie <em>.c</em>. Chociaż wiemy, że w przypadku Uniksów nie
to znaczenia, to dla utrzymania porządku w plikach, warto je pokrótce
działania na standardowym wyjściu. Wynikiem jego pracy jest
pojawienie się tuż obok pliku <em>a.out</em>, który ma odpowiednii
rodzaj uprawnień, aby móc go odrazu uruchomić - jest to plik
- wykonywalny efekt - działania kompilatora na powierzonym mu kodzie.
+ wykonywalny, efekt działania kompilatora na powierzonym mu kodzie.
Przekonać się możemy o tym wydając poniższe polecenie:
</p>
<pre class="code-block">
W przypadku pojednyczych programów takie działanie może wystarczyć,
jednak rzadko się zdarza, aby programy były pojedynczymi plikami
kodu źródłowego, zazwyczaj zawierają go znacznie, znacznie więcej.
- Sama praca z pojedyncz plikiem, może być niepożądana przez
+ Sama praca z pojedynczym plikiem, może być niepożądana przez
programistów jak i kompilatory mogą mieć problem z ich
przetworzeniem.
</p>
<p>
Główne składowe programów są najczęściej grupowane a w pojedynczych
- plikach umieszcza się ich poszczególne elementy. Kompilator również
+ plikach umieszcza się ich poszczególne elementy. Kompilacja również
wygląda nieco inaczej. Wymagane jest użycie opcji <em>-c</em> w celu
utworzenia dla każdego ze składowych
<strong>plików obiektowych</strong> - zawierających kod obiektowy,
- który finalnie przyjmie formę pliku wykonywalnego. Załóżmy, że mam
+ który finalnie przyjmie formę pliku wykonywalnego. Załóżmy, że mamy
tylko dwa pliki.
</p>
<p>
zapomnimy wspomnieć o bibliotece konsolidatorowi to zostaniem nam
zwrócony błąd. Chociaż błedy związane z niewłaściwym odwołaniem się
do biblioteki, może nie wynikać z naszych ustawień konsolidatora.
- Może to również być wynikiem braku zainstalownych w systemie.
+ Może to również być wynikiem braku zainstalownych bibliotek w
+ systemie.
</p>
<p>
Do wskazania bibliotek służy opcja <em>-l</em> kompilatora,
dystrybucji jest to ten sam katalog - kiedy program typu <em>init</em>
to <em>systemd</em>), wystarczy podać jej nazwę. W przeciwnym razie
musimy na początku wskazać ścieżkę, na której można znaleźć tą
- bibliotekę - za pomocą opcji <em>-L</em> a następnie podać jej nazwę
+ bibliotekę - za pomocą opcji <em>-L</em>, a następnie podać jej nazwę
za pomocą wspomanianej już wcześniej opcji <em>-l</em>.
</p>
<p>
Jak wiemy konsolidator zawsze dodaje do programów standardową
bibliotekę języka C - <em>libc.a</em>. Ten plik jest
<strong>biblioteką statyczną</strong>. Oznacza to, że konsolidator
- podczas tworzenia właściwego pliku wykonywalne będzie kopiować do
+ podczas tworzenia właściwego pliku wykonywalnego będzie kopiować do
naszego pliku fragmenty kodu maszynowego z biblioteki, wówczas plik
biblioteki nie będzie nam potrzeby do uruchomienia.
</p>
<p>
- Tego typu ma dwie dość znaczące wady. Pierwszą z nich są rozmiary
+ Tego typu rozwiązanie ma dwie dość znaczące wady. Pierwszą z nich są
+ rozmiary
bibliotek statycznych, a co za tym idzie rozmiary naszych programów
oraz zajętosć pamięci operacyjnej podczas ich pracy. Drugą wadą, ale
i nie kiedy zaletą, jest fakt przechowywanie kopii kodu biblioteki
<strong>biblioteki współdzielone</strong>. Podczas konsolidacji z
wykorzystaniem bibliotek współdzielonych, nie są kopiowane całe
fragmenty kodu, a tylko odwołania do nazw w bibliotece. W tym
- przypadku biblioteka jest ładowana do pamięci w momencie gdy są
- potrzebne. Dodatkową zaletą tego rozwiązania jest fakt, że procesy
+ przypadku biblioteka jest ładowana do pamięci w momencie gdy jest
+ potrzebna. Dodatkową zaletą tego rozwiązania jest fakt, że procesy
mogą współdzielić ze sobą obszar pamięci, w którym znajdują się
biblioteki, aby nie ładować ich za każdym razem, gdy uruchamiamy
jakiś program.
<li>W jaki sposób należy dokonać konsolidacji z bibliotekami
współdzielonymi?</li>
<li>Jakie mogą wyniknąć problemy podczas używania tych bibliotek i
- jak ich ominąć?</li>
+ jak ich uniknąć?</li>
</ul>
<h4>Wypisywanie zależności od bibliotek współużytkowanych</h4>
<p>
bardziej szczegółowych komunikatów.
</p>
<p>
- Program <em>ld.so</em> może wykorzystać wykorzystać jescze jedno
+ Program <em>ld.so</em> może wykorzystać jeszcze jedno
miejsce w celu znalezienia informacji na temat gdzie mogą znajdować
- się biblioteki - zmienne <strong>LD_LIBRARY_PATH</strong>. Nie
+ się biblioteki - zmienną <strong>LD_LIBRARY_PATH</strong>. Nie
we wszystkich systemach jest ona zdefiniowana i może zostać
wykorzystana do wskazania niestandardowych bibliotek tuż przed
uruchomieniem programu.
wcześniej - w przypadku bibliotek statycznych). Tutaj niezbędne
będzie również wskazanie katalogu w celu dodania go do ścieżki
wyszukiwania bibliotek. W tego typu przypadkach nie należy posługiwać
- się ustawieniemi konsolidatora dynamicznego.
+ się ustawieniami konsolidatora dynamicznego.
</p>
</p>
Opcja, o której mowa to: <code class="code-inline">-Wl,-rpath</code>.
<code class="code-inline">LD_LIBRARY_PATH</code>. Zawartość tej
zmiennej jest odczytywana przez konsolidator, który następnie
przeszukuje podane ścieżki pod kątem występowania bibliotek. Ta
- zmianna ma pierwszeństwo przez pozostałymi lokalizacjami, w których
+ zmiana ma pierwszeństwo przez pozostałymi lokalizacjami, w których
mogą wystąpić biblioteki w systemie. Dlatego też ustawienie jej
globalnie gdzieś w systemie (np. w plikach konfiguracyjnych powłoki)
może spowodować znaczy spadek wydajności systemu. Jeśli już musimy
była szybka i przyjmna. Jednak w 99% przypadków z jakim możemy
spotkać się raczej tak nie będzie folder będą zawierać podkatalogi
a w nich sterty plików ręczna kompilacja, przy nie których
- mogła by zająć tygodnie jak nie lata. Dlatego też powstało narzędze
+ mogła by zająć tygodnie jak nie lata. Dlatego też powstało narzędzie
typu <strong>make</strong>. Narzędzie <em>make</em> ma za zadanie
zarządzać procesem kompilacji. Mimo, że jest to potężny program to
jest on dość prosty w działaniu. Jeśli gdzieś w paczkach z kodem
- znajdziemy plik <em>makefile</em> lub <em>Makefile</em> ozanacza to
+ znajdziemy plik <em>makefile</em> lub <em>Makefile</em> oznacza to
możemy użyć programu <em>make</em> do kompilacji projektu.
</p>
<p>
zależnościami.
</p>
<p>
- W czasie wykonywania celów, narzędzię postępuje zgodnie z
+ W czasie wykonywania celów, narzędzie postępuje zgodnie z
<strong>regułą</strong> (ang. <em>rule</em>), która może np. określać
sposób w jaki kod źródłowy ma zostać zmieniony na plik obiektowy.
Sam <em>make</em> posiada już zdefiniowane reguły, ale możemy je
<code class="code-inline">myprog:</code> widzimy już jakieś konkrety:
pierwszym jest odwołanie się do makra, jest ono rozwiązywane do
nazw zapisanych na początku pliku <em>Makefile</em>, w pliku nie
- znajduje się żadne inne elementy systemu <em>Make</em> tak więc
- ten cel jest o tych plików uzależniony. Warto dodać, że
+ znajduje się żadne inne elementy systemu <em>Make</em> o tej nazwie
+ tak więc ten cel jest od tych plików uzależniony. Warto dodać, że
<em>Make</em> zakłada, że plki źródłowe znajdują się w tym samym
katalogu co pliki <em>Makefile</em>. Uruchomienie polecenia
<em>make</em> w tym katalogu prezentuje się następująco.
Każde polecenie w pliku <em>Makefile</em> musi zostać
wprowadzone w nowej linii i poprzedzone
znakiem tabulacji równym czterem znakom spacji.
- Makro <code class="code-inline">$(CC)</code> jest zmienną, która
+ Makro <code class="code-inline">$(CC)</code>
przechowywuje nazwę programu kompilatora C, w wiekszości przypadku
jej wartość będzie ustawiona na <em>cc</em>.
</p>
make: Nie ma nic do zrobienia w 'all'.
</pre>
<p>
- Natomiast jeśli chociażby zmienimy datę, któregoś z plików kodu
+ Natomiast jeśli chociażby zmienimy czas modyfikacji, któregoś z
+ plików kodu
źródłowego za pomocą prostego polecenia <em>touch</em>. Wówczas plik
obiektowy będzie starszy niż plik źródłowy i <em>Make</em> dokona
budowy naszego programu ponownie.
<p>
Uzupełniając wywołanie programu <em>make</em> o różne opcje oraz
argumenty możemy zmusić go do wykonani kilku przydatnych czynności.
- Najprostrzym przykładem może być zmiana wartości makra <em>CC</em>,
+ Najprostszym przykładem może być zmiana wartości makra <em>CC</em>,
wskazując inny niż domyślny kompilator.
</p>
<pre class="code-block">
<p>
Tego typu uruchmianie narzędzia <em>make</em> bedzie sprawdzać się
w przypadku programów zapisanych w jednym pliku lub programów, w
- których jezykiem nie jest C. Jest to drobre rozwiązanie gdy dopiero
+ których jezykiem nie jest C. Jest to dobre rozwiązanie gdy dopiero
rozpoczynamy pracę z danym językiem i nie wiem jeszcze jak działa
kompilator czy inne narzędzia z nim związane. Jeśli nawet zbudowanie
celu się niepowiedzie to i tak otrzymamy informację zwrotną co jest
<ul>
<li><strong>CFLAGS</strong> - opcje kompilatora C. <em>Make</em>
przekazuje je kompilatorowi w czasie tworzenia kodu obiektowego z
- plikików <em>.c</em>.</li>
+ plików <em>.c</em>.</li>
<li><strong>LDFLAGS</strong> - opcje przekazywane do konsolidatora w
czasie tworzenia pliku wykonywalnego z plików obiektowych.</li>
<li><strong>LDLIBS</strong> - w przypadku gdy niechcemy łączyć opcji
<li><strong>test</strong> lub <strong>check</strong> - cel pozwala
sprawdzić czy po skompilowaniu wszystko działa jak należy.</li>
<li><strong>depend</strong> - cel ten tworzy zależności
- wywołują kompilator ze specjalną opcją -M nakazującą mu sprawdzenie
+ wywołując kompilator ze specjalną opcją -M nakazującą mu sprawdzenie
kodu. Cel ten nie jest już powszechnie używany, aczkolwiek mogą
zdarzyć się projekty, które będą wymagać wywołanie tego celu.</li>
<li><strong>all</strong> - najczęściej pierwszy cel w pliku
<em>Makefile</em>. W wielu projektach będziemy spotykać się z
potrzebą wywołanie tego celu, a nie samego pliku wykonywalnego.
Wiele projektów składa się z wielu plików wykonywalnych i często
- nie ma tego jednego głównego. Natomiast użycie celu <em>all</em>.
+ nie ma tego jednego głównego. Natomiast użycie celu <em>all</em>
+ pozwala na zbudowanie ich wszystkich w trakcie jednej czynności.
</li>
</ul>
<h3 id="14.2.6.makefilesstyles">14.2.6. Organizowanie pliku Makefile</h3>
</pre>
<p>
W pozostałej częsci plików występują już cele, które składają główne
- pliki wykonywalne. Jeśli trzeb przygować regułę dla pliku obiektowego
+ pliki wykonywalne. Jeśli trzeba przygować regułę dla pliku obiektowego
należy ją umieścić zaraz nad regułą programu pliku wykonywalnego.
Jeśli z tego pliku obiektowego korzysta więcej plików wykonywalnych
niż ten jednen to trzeba je przenieść nad nie wszystkie.
programowania, zmieniło się to wraz z rozpowszechnieniem się takich
języków jak <strong>Perl</strong> a w poźniejszych latach
<strong>Python</strong>. Niektóre z narzędzi systemowych zostały
- przepisane z klasycznego C do np. Pytona - na przykład narzędziem
+ przepisane z klasycznego C do np. Pythona - na przykład narzędziem
<em>whois</em>. Języki skryptowe obecnie przechylają szalę na swoją
korzyść względem języków kompilowanych, mimo to zalety takich języków
jak C oraz wpisanie się tego języka w rdzeń nauk komputerowych
Uniksowych. Język ten ma ogromne możliwości porównywalne z Pythonem,
jednak nie jest on taki prosty w użyciu. Jego głównym zadaniem jest
obróbka tekstu. Obecnie wiele narzędzi wykorzystuje jego możliwości
- np. znany wszyskim system kontroli wersji - <em>Git</em>.</li>
+ np. znany wszystkim system kontroli wersji - <em>Git</em>.</li>
<li><strong>PHP</strong> - jest językiem służacym do dynamicznego
tworzenie treści na stronach internetowych. Można wykorzystać go
do generowania stron hipertekstowych oraz do modyfikacji
<p>
Innym wartym wspomnienia językiem jest <strong>m4</strong>
odpowiedzialny z przetwarzanie makr. Dostępny jest on w systemie
- GNU <em>autotools</em>.
+ GNU <em>autotools</em>. Bierze udział w automatycznym generowaniu
+ pliku <em>Makefile</em> (Wiecej w 15 rozdziale).
</p>
<h2 id="14.5.java">14.5. Język Java</h2>
<p>