(ang. <em>PostScript Printer Definition</em>) konkretnego urządzenia,
aby określić takie ustawienia jak rozmiar papieru czy rozdzielczość.
</p>
+ <h1 id="14.programmingtools">14. Narzędzia programistyczne</h1>
+ <p>
+ Dystrybucje Linuksa, nie wymagają do podstawowej obsługi posiadania
+ jakich kolwiek umiejętności programistycznych. Nie mniej jednak
+ ten rodzaj systemów operacyjnych jest niezwykle często wybierany
+ przez programistów, ze względu na swoją przejrzystość oraz obszerne
+ udokumnetowanie.
+ </p>
+ <p>
+ Odwiedzając tę stronę czy też czytając ten materiał, za pewne
+ oczekujemy od naszych komputerów czegoś więcej niż wyświetlenie
+ żądanej strony internetowej czy odtworzenie wybranego pliku wideo.
+ Może nadejść taka sytuacja, w której będziemy mieli styczność z kodem
+ źródłowym i to nie tylko języków interpretowanych (zostaną one
+ omówione również) ale także języków takich jak C, C++ czy Java.
+ Warto zapoznać się z narzędziami programistycznymi dostępnymi w
+ dystrybucjach, aby czytając pliki README dostarczone do paczek z
+ kodem czy innej jego dokumentacji wiedzieć co się robi i być może
+ dostosować proces tworzenia plików wykonywalnych do własnych wymagań.
+ </p>
+ <h2 id="14.1.ccompiler">14.1. Kompilator języka C</h2>
+ <p>
+ Za pomocą języka C, stworzono cały ten tematyczny obszar wokół,
+ które oscyluje ten materiał. Wszystkie obecnie wykorzystywane Uniksy
+ korzystają z języka C. Dlatego też warto wiedzieć na tym etapie, w
+ jaki sposób możemy uruchomić program, który dostaniem w postaci
+ zrozumiałej dla człowieka - w postaci kodu źródłowego (zwykłego
+ tekstu).
+ </p>
+ <p>
+ W uproszeczniu zamiana kodu źródłowego na postać wykonywalną przez
+ komputer nosi nazwę <strong>kompilacji</strong>. Jednaj 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
+ materiale skupimy się na klasycznym kompilatorze <em>gcc</em>.
+ </p>
+ <p>
+ Kompilator oraz inne narzędzia programistyczne mogą domyślnie nie
+ występować w dystrybucjach. W przypadku Debiana czy Ubuntu wystarczy
+ zainstalować za pomocą domyślnego menedżera pakietów pakiet
+ <em>build-essential</em>, w przypadku rodziny dystrybucji opartych
+ o Red Hat należy użyć grupy instalacyjnej <em>Development Tools</em>.
+ </p>
+ <p>
+ W celu zobrazowania będę umieszczać w przykładach bardzo proste
+ proste programy zapisane w języku C. Tak jak wspominałem, nie jest
+ wymagana umiejętność programowania w żadnym z języków.
+ </p>
+<pre class="code-block">
+#include <stdio.h>
+
+int main() {
+ printf("Hello, World!\n");
+}
+</pre>
+ <p>
+ Zapisany powyżej bardzo prosty program, zapisałem z 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
+ opisać za pomocą zwykłego rozszerzenia plików.
+ </p>
+ <p>
+ Aby zamienić kod źródłowy na postać niskopoziomową wykonywalną przez
+ nasz komputer musimy skompilować kod przy użyciu kompilatora.
+ Program ten może być dostępny za pomocą poleceń <em>cc</em> lub
+ <em>gcc</em>
+ </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ cc hello.c
+</pre>
+ <p>
+ Polecenie to powinno zakończyć się, bez oznajmiania jakiego kolwiek
+ 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.
+ Przekonać się możemy o tym wydając poniższe polecenie:
+ </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ ./a.out
+Hello, World!
+</pre>
+ <p>
+ Wcześnie uruchamiając kompilator nie podaliśmy mu poza kodem żadnych
+ innych informacji. Jeśli chcemy, aby nasz plik wykonywalny miał
+ bardziej odpowienią nazwę możemy ją podać jako wartość opcji
+ <em>-o</em>.
+ </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ cc -o hello hello.c
+xf0r3m@vm-cac72df:~/C$ ls
+a.out hello hello.c
+xf0r3m@vm-cac72df:~/C$ ./hello
+Hello, World!
+</pre>
+ <h3 id="14.1.1.amanyfilecompilation">14.1.1. Kompilowanie wielu plików źródłowych</h3>
+ <p>
+ 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
+ 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ż
+ 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
+ tylko dwa pliki.
+ </p>
+ <p>
+ <em>main.c</em>:
+ </p>
+<pre class="code-block">
+void hello_call();
+int main() {
+ hello_call();
+}
+</pre>
+ <p>
+ <em>aux.c</em>:
+ </p>
+<pre class="code-block">
+#include <stdio.h>
+
+void hello_call() {
+ printf("Hello, World!\n");
+}
+</pre>
+ <p>
+ Teraz dla każdego z plików źródłowych, musimy wygenerować pliki
+ obiektowe. Pliki obiektowe są teoretycznie plikami wykonywalnymi
+ ale brakuje w nich informacji pozwalających na dokończenie
+ kompilacji. Sam system nie wie jak ma uruchomić pliki obiektowe,
+ zazwyczaj na jeden program składa się wiele plików obiektowych.
+ </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ cc -c main.c
+xf0r3m@vm-cac72df:~/C$ cc -c aux.c
+xf0r3m@vm-cac72df:~/C$ ls
+aux.c aux.o main.c main.o
+</pre>
+ <p>
+ W celu połaczenia plików obiektowych w plik wykonywalny użyjemy
+ innego narzędzia, jakim jest <strong>konsolidator</strong>. Na
+ systemach uniksowych nosi on nazwę <em>ld</em> i rzadko jest
+ uruchamiany przez programistów samodzielnie. Kompilator wie w jaki
+ sposób należy go uruchomić, dlatego też skorzystamy z jego pomocy.
+ Mimo tego, że będziemy używać innego narzędzia to polecenie
+ pozostaje to samo. Konsolidator może również występować pod nazwą
+ <em>linker</em>.
+ </p>
+<pre class="code-block">
+xf0r3m@vm-cac72df:~/C$ cc -o myprog main.o aux.o
+xf0r3m@vm-cac72df:~/C$ ls
+aux.c aux.o main.c main.o myprog
+xf0r3m@vm-cac72df:~/C$ ./myprog
+Hello, World!
+</pre>
+ <p>
+ Dla celów dydaktycznych stworzyliśmy program składający z dwóch
+ plików kodu źródłowego, zwykle jednak jest tego o wiele wiele więcej.
+ Tutaj poszczególne czynności wykonaliśmy ręcznie. Jeśli w przypadku
+ normalnego programu mielibyś to robić w ten sposób, zajęło by to
+ masę czasu. Na szczęście nie trzeba robić tego ręcznie. Wykorzystamy
+ do tego narzędzie GNU <strong>make</strong>, które omówimy sobie
+ za chwilę.
+ </p>
+ <h3 id="14.1.2.linkingwithlibs">14.1.2. Konsolidacja z bibliotekami</h3>
+ <p>
+ Obecne systemy do utworzenia pełnoprawnego programu z plików
+ obiektowych wymagają zbiorów wcześniej skompilowanych komponentów.
+ Pliki obiektowe zawierające te zestawy nie są niczym innym jak
+ <strong>bibliotekami</strong>, a w ich skład poza wspomnianymi już
+ plikami wchodzą również pliki nagłówkowego, których używaliśmy już
+ w kodzie programów przy użyciu dyrektywy <em>include</em>.
+ Biblioteki dodawane są na etapie konsolidacji, ich użycie w trakcie
+ tej czynności nazywane jest <strong>konsolidacją na bazie
+ biblioteki</strong>. W przypadku kiedy podczas konsolidacji
+ 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.
+ </p>
+ <p>
+ Do wskazania bibliotek służy opcja <em>-l</em> kompilatora,
+ oczywiście jeśli znajdują się one w domyślnej lokalizacji tj.
+ <em>/lib</em> lub </em>/usr/lib</em> (chociaż w przypadku większości
+ 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ę
+ za pomocą wspomanianej już wcześniej opcji <em>-l</em>.
+ </p>
+ <p>
+ Przekazując do konsolidatora (kompilatora) informacje o bibliotekach
+ wartości opcji wraz z opcjami piszemy <strong>łącznie</strong>.
+ </p>
+<pre class="code-block">
+$ cc -o badobject badobject.o -lcurses -L/usr/junk/lib -lcrud
+</pre>
+ <p>
+ Podczas wyszukiwania bibliotek, przydatne może okazać się polecenie
+ <em>locate</em>, niestety może nie być domyślne zainstalowane w
+ systemie. Dodatkowo wywmaga ono aktualizacji bazy przy użyciu
+ polecenia <em>updatedb</em>.
+ </p>
+ <p>
+ Nasze proste programiki z przykładów, nie są pozbawione bibliotek.
+ Tak jak już wcześnie wspominałem kompilator nie jest wstanie utworzyć
+ pełnoprawnego pliku wykonywalnego. Konsolidator zawsze dołącza do
+ utworzonego pliku obiektowego <strong>standardową bibliotekę języka
+ C</strong> - <em>libc.a</em> - zawiera ona podstawowe komponenty
+ języka C, jest ona zawsze dołączana chyba, że świadomie ją
+ wykluczymy.
+ </p>
+ <h3 id="14.1.3.sharedlibraries">14.1.3. Biblioteki współużytkowane</h3>
</div>
<p style="margin: 15px; padding: 0; outline: 0;">
2024; COPYLEFT; ALL RIGHTS REVERSED;