Wprowadzenie do języka C++

Języki wysokiego poziomu i kompilacja

Mikroprocesory współczesnych komputerów rozumieją tylko jeden język programowania - binarny kod maszynowy (ang. binary machine code). W pamięci komputera zapisywane są rozkazy dla procesora w postaci binarnej, czyli przy pomocy bitów. Procesor odczytuje te kody, dekoduje na odpowiednie polecenia i wykonuje pożądane operacje - w ten sposób realizowany jest program.

Polecenia binarne mogą wyglądać np. tak:
 

11010010100010101001010101010111
01010101011110100101111010101110
11101001001011101010101001011110
00011010100111001000101111010011
10100100100010010010111000101010
 

Przyznasz, że program zapisany w takiej formie jest dla człowieka zupełnie nieczytelny. Czasy programowania komputerów w binarnym kodzie maszynowym bezpowrotnie skończyły się na początku lat 50-tych ubiegłego wieku. Chociaż procesory wciąż rozumieją tylko i wyłącznie swój kod binarnych poleceń, to ludzie programują je w językach bardziej zrozumiałych dla siebie. Pierwszym takim językiem był Asembler - binarne kody instrukcji procesora są w nim reprezentowane przez nazwy symboliczne, które odzwierciedlają wykonywaną przez procesor operację.

Na przykład zamiast kodu binarnego (po lewej stronie) programista zapisuje symboliczne nazwy operacji (po prawej stronie):
 

11010010100010101001010101010111 → MOV AX,va
01010101011110100101111010101110 → ADD AX,vb
11101001001011101010101001011110 → MUL vc
00011010100111001000101111010011 → ADD AX,vd
10100100100010010010111000101010 → MOV ve,AX
 

Symboliczny zapis instrukcji procesora jest bardziej czytelny od ich reprezentacji binarnej, chociaż wciąż wymaga wyuczenia się nazw poszczególnych instrukcji. Jednakże istnieje tutaj pewien problem. Jeśli zapiszemy program tak:

MOV AX,va
ADD AX,vb
MUL vc
ADD AX,vd
MOV ve,AX

to nie nadaje się on do bezpośredniego wykonania - procesor go nie zrozumie, ponieważ nie są to jego instrukcje binarne, tylko tekst zbudowany z literek. Dlatego programiści nazywają to programem źródłowym (ang. source program). Do wykonania program należy przetłumaczyć na instrukcje binarne, które procesor rozumie. Powstanie wtedy tzw. program wynikowy lub program wykonywalny (ang. executable):
 

[program źródłowy] → TŁUMACZENIE → [program wykonywalny]
 

Zaletą jest to, iż tłumaczenia nie dokonuje człowiek, lecz program, zwany w tym przypadku asemblerem. Tłumaczenie tekstu programu źródłowego na program wykonywalny nosi nazwę kompilacji, a języki programowania wymagające takiego tłumaczenia nazywamy językami kompilowanymi.

Język asemblera jest tzw. językiem programowania niskiego poziomu (ang. Low Level Programming Language). Pomimo stosowania symbolicznych nazw instrukcji programowanie w języku niskiego poziomu jest uciążliwe - wymaga od programisty doskonałej znajomości funkcjonowania poszczególnych rozkazów maszynowych procesora oraz składników systemu komputerowego. Ilość informacji jest przytłaczająca. Z tego powodu opracowano już w latach 50-tych ubiegłego wieku tzw. języki wysokiego poziomu (ang. High Level Programming Language), które koncentrowały się na realizowanym przez komputer algorytmie, a nie na wykonywanych przez procesor operacjach. Programista nie musi znać instrukcji procesora lub budowy wewnętrznej komputera, aby efektywnie programować w języku wysokiego poziomu. Dla przykładu powyższy program maszynowy można zapisać w języku wysokiego poziomu na przykład tak:

e = (a + b) * c + d;

Zwróć uwagę, iż jeden wiersz programu w języku wysokiego poziomu wymaga kilku instrukcji maszynowych procesora. Dzieje się tak dlatego, iż instrukcje maszynowe są bardzo proste - wykonują proste, jednostkowe operacje. Bardziej złożone działania musimy zestawiać z wielu instrukcji maszynowych - to dodatkowo utrudnia programowanie w asemblerze, ponieważ każdą operację algorytmu musimy rozbijać na proste operacje elementarne, które potrafi wykonywać procesor komputera. Programując w języku wysokiego poziomu nie musimy się tym przejmować.

Program źródłowy w języku wysokiego poziomu również nie nadaje się do bezpośredniego wykonania. Musi zostać przetłumaczony na odpowiedni ciąg binarnych kodów instrukcji procesora. W porównaniu z asemblerem zadanie jest dużo bardziej skomplikowane - w asemblerze wystarczy przetłumaczyć nazwy symboliczne instrukcji na ich binarne kody, a w języku wysokiego poziomu najpierw należy przeanalizować treść poleceń i dopiero wtedy przetłumaczyć je na ciągi instrukcji maszynowych dla procesora. Proces ten wykonywany jest przez kompilator języka wysokiego poziomu:
 

[program źródłowy] → KOMPILATOR → [program wykonywalny]
 

Dla dociekliwych:

W praktyce proces tworzenia programu wynikowego jest trochę bardziej skomplikowany. Program może składać się z wielu plików źródłowych - tak jest zawsze przy większych projektach. Zatem kompilator najpierw sprawdza, które z tych plików zostały zmienione od czasu ostatniej kompilacji - nie ma przecież sensu ponowne tłumaczenie plików raz przetłumaczonych. Pliki zmienione są tłumaczone do postaci obiektowej. Następnie uruchamiany jest program łączący - tzw. linker lub konsolidator. Linker łączy wszystkie pliki obiektowe w jeden program wykonywalny.

[plik źródłowy 1] → preprocesor kompilator  → [plik obiektowy 1] → linker  → [program wykonywalny]
[plik źródłowy 3] → preprocesor  → [plik obiektowy 2] →
[plik źródłowy 2] → preprocesor  → [plik obiektowy 3] →

 

Często pliki źródłowe zawierają różne dyrektywy i makropolecenia. Zatem przed właściwą kompilacją są wstępnie przetwarzane przez tzw. preprocesor. Jest to część programu kompilatora, która przegląda plik źródłowy w poszukiwaniu poleceń dla preprocesora i wykonuje je - np. rozwija makroinstrukcje w podstawowe polecenia, dołącza do pliku źródłowego treść innych plików. W efekcie kompilator otrzymuje przetworzony już program źródłowy, który jest gotowy do kompilacji.

 

Środowisko IDE Dev-C++

Język C++ został zaprojektowany w połowie lat 80-tych ubiegłego wieku przez profesora Bjarne Stroustrupa, pracującego w owym czasie w laboratoriach firmy Bell. Język ten jest rozszerzeniem powstałego wcześniej języka C (autor Dennis Richie). Jest to narzędzie bardzo potężne, na podstawie którego powstało wiele współczesnych technologii programistycznych - JavaScript, Action Script, Java, PHP.

obrazek

Prof. Bjarne Stroustrup

Na dzień dzisiejszy język C++ stał się standardem przemysłowym i doczekał się ogromnej literatury. Stosowany jest praktycznie we wszystkich dziedzinach informatycznych i chociaż zaczynają się pojawiać nowe technologie (np. Java), to wciąż trzyma się mocno i prawdopodobnie nieprędko zniknie ze sceny. Dlatego umiejętność programowania w języku C++ jest podstawą dla informatyków, fizyków, astronomów i wszystkich tych, którzy chcą poważnie wykorzystywać komputery w swojej pracy.

Język C++ jest językiem programowania wysokiego poziomu i językiem kompilowanym. Na lekcjach informatyki będziemy korzystali z kompilatora MinGW zawartego w pakiecie Dev-C++ firmy Bloodshed. Pakiet można darmowo pobrać ze strony firmowej i legalnie zainstalować na swoim komputerze. Jest to bezwzględny obowiązek każdego ucznia klasy informatycznej w I LO.

Zintegrowane Środowisko Programowania (ang. IDE - Integrated Developement Environment) zawiera wszystkie składniki niezbędne do tworzenia programów źródłowych, kompilacji ich oraz łączenia w programy wynikowe. Pakiet Dev-C++ składa się z wygodnego edytora tekstowego, w którym tworzymy pliki źródłowe, oraz bardzo dobrego kompilatora MinGW, który umożliwia tworzenie programów dla środowiska Windows.

Instalacja Dev-C++

Z witryny firmy Bloodshed pobierz na swój dysk twardy plik instalatora pakietu Dev-C++.

obrazek

Uruchom instalator. Pojawi się okienko powitalne:

obrazek

W okienku umieszczony jest następujący tekst:

Witamy w programie instalacyjnym Dev-C++. Proszę nie instalować tej wersji Dev-C++ na istniejącej już instalacji (jeśli wcześniej instalowałeś starszą wersję Dev-C++, to najpierw odinstaluj ją).

Po zatwierdzeniu pojawi się okienko informujące o uruchomieniu się programu instalacyjnego:

obrazek

W następnej kolejności wybieramy język instalacji:

obrazek

Zatwierdzamy umowę licencyjną (warto ją przeczytać):

obrazek

Wybieramy komponenty do instalacji - jeśli nie ma specjalnych przeciwwskazań, to najlepiej pozostawić opcje proponowane przez instalator.

obrazek

Wybieramy miejsce na dysku do instalacji pakietu Dev-C++. Najlepiej pozostawić proponowany katalog - C:\Dev-Cpp.

obrazek

Po kliknięciu przycisku Instaluj rozpoczyna się instalacja pakietu Dev-C++:

obrazek

Pod koniec instalacji pakietu Dev-C++ instalator pyta nas, czy chcemy zainstalować Dev-C++ tylko dla swojego profilu, czy też dla wszystkich użytkowników danego komputera. Opcja ta jest istotna, gdy komputer jest skonfigurowany dla wielu profili użytkowników - najlepiej kliknij przycisk Tak:

obrazek

Na koniec pojawi się okienko z informacją o pomyślnym zainstalowaniu pakietu Dev-C++:

obrazek

Jeśli w okienku jest zaznaczona opcja jak powyżej, to uruchomi się środowisko Dev-C++. Przy pierwszym uruchomieniu dostajemy okienko ostrzegawcze:

obrazek

W okienku jest następujący komunikat:

To jest wersja beta pakietu Dev-C++. Prosimy o zgłaszanie błędów na stronie http://bloodshed.net/bugs. Często dostarczamy uaktualnienia, zatem sprawdzaj ich dostępność w opcji menu Narzędzia > Sprawdzanie Uaktualnień/Pakietów.

Twój plik konfiguracyjny zostanie umieszczony w C:\Documents and Settings\Nazwa użytkownika\Dane aplikacji\Dev-Cpp.

Jeśli ci to nie odpowiada, to możesz przekazać do Dev-C++ następujący parametr: < c:\katalog konfiguracyjny

Po zatwierdzeniu okienka informacyjnego przejdziesz do okna dialogowego pierwszej konfiguracji pakietu Dev-C++:

obrazek

W okienku konfiguracyjnym ustawiamy język pakietu - Polish i klikamy przycisk Next:

obrazek

W kolejnym okienku mamy następujący komunikat:

Dev-C++ może pobrać informację z plików nagłówkowych (patrz kolejne lekcje) w celi łatwiejszego wyszukiwania prototypów funkcji, klas i własności zmiennych w przeglądarce klas i na liście uzupełnień kodu.

Chociaż cecha ta jest użyteczna, wymaga jednak więcej mocy procesora oraz pamięci i może nie odpowiadać każdemu programiście. Czy chcesz jej użyć? Możesz ją później włączyć lub wyłączyć w menu:

    Narzędzia > Opcje Edytora > Przeglądarka klas.

(*) Tak, chcę używać tej cechy
( ) Nie, wolę używać Dev-C++ bez niej

Jeśli posiadasz w miarę nowoczesny komputer, to pozostaw tę opcję wybraną i kliknij przycisk Next. Jeśli wybrałeś Tak, to pojawi się kolejne okno konfiguracyjne:

obrazek

W oknie znajduje się następujący tekst:

Zdecydowałeś się na używanie autouzupełnienia kodu. Aby zoptymalizować ten proces, zalecane jest utworzenie bufora dla standardowych plików nagłówkowych.

Czy chcesz utworzyć teraz bufor dla autouzupełnień kodu? Może to zając kilka minut. Możliwe jest późniejsze utworzenie tego bufora za pomocą menu:

    Narzędzia > Opcje Edytora > Przeglądanie Klas/Uzupełnianie kodu

(*) Tak, utwórz bufor teraz
( ) Nie, nie twórz bufora

[ ] Użyj tego katalogu zamiast standardowego

Pozostaw standardowe opcje i kliknij przycisk Next. Rozpocznie się proces buforowania plików nagłówkowych, które zawierają różne definicje obiektów często wykorzystywanych w programach w języku C++. Dzięki buforowaniu komputer szybciej będzie dokonywał kompilacji.

obrazek

Po zakończeniu buforowania kliknij myszką przycisk OK. Środowisko Dev-C++ zostało zainstalowane na twoim komputerze i jest gotowe do rozpoczęcia pracy - powinieneś zobaczyć poniższe okno robocze:

obrazek

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2024 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe