Wraz z końcem matur nusiałem znaleźć kolejne tematy, na których oprę tematykę bloga. Materiały do matury z informatyki tworzyć bedę nadal. Tym razem na poważnie, staranniej. Sami zobaczycie. Ja sam i moi dotychczasowi czytelnicy jesteśmy co prawda po maturze, ale co nieco przyda się kolejnym rocznikom. Może zostanę takim Matemaksem informatyki… 😉 Dość wybiegania w przyszłość. Postanowiłem poruszyć na blogu dość istotną kwestię, a mianowicie przetwarzanie kodu źródłowego naszych programów krok po kroku. Temat dość uniwersalny, ponieważ ten proces wygląda podobnie w przypadku większości języków kompilowanych.
Bliższe zrozumienie wszystkich procesów i translacji zachodzących podczas przetwarzania kodu jest dobre dla duszy każdego programisty. Pozwala lepiej zrozumieć zachowania kompilatora i nakierowuje nas we właściwą stronę podczas analizy programu pod kątem błędów. Jest to wiedza, którą warto posiąść. Dedykuję ten wpis zarówno młodym adeptom sztuki programowania, jaki i tym którym poruszany temat umknął.
Jaką drogę przebywa nasz kod zanim stanie się pełnoprawnym programem? – Przetwarzanie kodu źródłowego.
Kod źródłowy
Wszystko to, co jest dziełem programisty nazywamy kodem źródłowym. Dla zwykłych śmiertelników jest to po prostu zbiór niezrozumiałych słów i śmiesznych znaczków (opinia autentyczna), ale dla programisty jest to pierwsza stacja wycieczkowca na trasie o nazwie „Przetwarzanie kodu źródłowego„.
Cały proces przetwarzania kodu można porównać (w dużym uproszczeniu) do procesu tłumaczenia dialogu pomiędzy dwiema osobami mówiącymi w kompletnie odmiennych językach. Po prostu nie dogadają się. Analogicznie do tej sytuacji komputer nie może zrozumieć człowieka. Nie zna przecież angielskiego, hiszpańskiego, etc. Z tego powodu, w pocie czoła, równolege z rozwojem sprzętu komputerowego tworzone były pierwsze języki programowania. Za ich pomocą, człowiek w czytelny i zrozumiały dla siebie sposób zapisuje operacje, których wykonaniem ma się zająć komputer. Pokłosie jego pracy, czyli wspomniany kod źródłowy jest pierwszym krokiem w kierunku porozumienia się z komputerem. Bez odpowiednich przekształceń kod źródłowy jest w dalszym ciągu niezrozumiały dla maszyny.
Preprocesor
Jest technologią wykorzystywaną przez część języków programowania (m.in. rodzina języków C, Perl, Pascal, Python), której zadaniem jest translacja kodu źródłowego na kod wyjściowy. Innymi śłowy, jest to program komputerowy, który za pomocą tzw. dyrektyw preprocesora dokonuje istotnych (z punktu widzenia kompilatora) zmian.
Kod zanim się dobierze do niego preprocesor i po tym jak już z nim skończy to dwie różne rzeczy. Preprocesor korzystająć z dyrektyw (w C++ są to dobrze nam znane #include, #define, #ifdef, …) m. in. integruje nasz kod z zawartością załączonych bibliotek standardowych, naszych własnych plików nagłówkowych .h, tworzy makra i definiuje stałe.
Kompilator
W następnej kolejności kod wyjściowy ulega procesowi kompilacji. Kompilacja jest powszechnie używanym określeniem na zbiór działań przeprowadzanych na naszym kodzie. Kod podlega analizie leksykalnej, syntaktycznej oraz semantycznej. W telegraficznym skrócie, kompilator sprawdza kod pod kątem błędów w pisowni słów kluczowych, obecności niedozwolonych znaków i błędów składniowych języka, a następnie sprawdza poprawność typów, użytych instrukcji i nazw. Kodowanie bez użycia kompilatora, a konkretniej jego poszukujących błędów funkcji, mogłoby okazać się nie lada wyzwaniem. Nie trudno przecież o jakąś literówkę, niedomknięty nawias, brak średnika lub o użycie niezadeklarowanej funkcji.
Tak sprawdzony kod podlega procesowi częściowej optymalizacji w celu przyśpieszenia działania gotowego programu, a następnie generowany jest (prawie)finalny kod wynikowy.
Konsolidator
Na etapie pracy konsolidatora (linkera) kod wynikowy łączony jest z innymi skompilowanymi modułami. Są nimi kody wynikowe dołączanych bibliotek oraz biblioteki uruchomieniowej, z której korzysta się w celu ograniczenia miejsca zajmowanego przez gotowy program. Efektem procesu konsolidacji jest gotowy do pracy w danym systemie plik wykonywalny.
Jak widzicie, pod pojęciem przetwarzania kodu źródłowego kryje się coś więcej, niż tylko kompilacja, a ta też nie jest tak oczywista. Za jakiś czas przedstawię wam jak wygląda otwarty program (proces) z punktu widzenia systemu operacyjnego oraz porównam języki kompilowane z interpretowanymi. Dzięki.
itcenter
says:Opisz odwrotną sytuację, skompilowany kod na kod nieskompilowany 🙂 To zawsze taki, dyskusyjny temat.