This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2016:intro [2016/10/11 10:58] pkleczek [Zintegrowane środowisko programistyczne] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Wprowadzenie do C ====== | ||
- | ===== Cel laboratorium ===== | ||
- | |||
- | * Zapoznanie z językiem C na przykładzie prostego programu //"Hello world!"//. | ||
- | * Zapoznanie ze zintegrowanym środowiskiem programistycznym (IDE). | ||
- | * Omówienie procesu zamiany kodu w języku C na kod zrozumiały dla komputera. | ||
- | * Znajdowanie i usuwanie błędów składniowych kodu. | ||
- | |||
- | ===== Hello world! ===== | ||
- | |||
- | Poniższy kod to jeden z najprostszych programów w języku C -- program wyświetla na ekranie komunikat ''Hello world!''. | ||
- | |||
- | <file c hello_world.c> | ||
- | /* Nasz pierwszy program w jezyku C. */ | ||
- | |||
- | #include <stdio.h> | ||
- | |||
- | int main(void) { | ||
- | /* Funkcja printf() wypisuje dane w konsoli... */ | ||
- | printf("Hello world!\n"); | ||
- | return 0; | ||
- | } | ||
- | </file> | ||
- | |||
- | Poszczególne elementy programu (wraz z ich znaczeniem) zostały opisane poniżej. | ||
- | ==== Komentarze ==== | ||
- | |||
- | * tekst ograniczony kombinacjami znaków ''/* ... */'' (zakres) bądź ''<nowiki>//</nowiki>'' (od tego miejsca do końca wiersza) | ||
- | * ignorowany przez kompilator | ||
- | * przydatny dla programistów, aby opisać zachowanie programu i jego fragmentów, założenia i oczekiwania co do jego działania itp. \\ (można uniknąć sytuacji (po miesiącu): //"a co ja tutaj chciałem zrobić?"// -- i spędzenia pół godziny na rozgryzaniu paru linijek programu) | ||
- | |||
- | Przykład: | ||
- | |||
- | <code c> | ||
- | // Komentarz w jednej linii | ||
- | instrukcje; | ||
- | /* Komentarz w | ||
- | kilku liniach */ | ||
- | </code> | ||
- | |||
- | ==== Derektywa #include ==== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | </code> | ||
- | |||
- | ''#include'' to derektywa preprocesora, a nie instrukcja języka C. Bez wchodzenia w szczegóły -- ta linia ma na celu danie czytelnego sygnału, że będziemy korzystać z tego, co zawiera plik ''stdio.h'' (czyli m.in. z funkcji służących wypisywaniu danych na ekran). | ||
- | |||
- | |||
- | ==== Funkcja main() ==== | ||
- | |||
- | **Funkcja** to logiczny fragment programu, odpowiedzialny za wykonanie pewnego ciągu operacji. | ||
- | |||
- | Funkcja w języku C przypomina trochę funkcję matematyczną -- też może przyjmować argumenty i zwracać wartość... ale nie musi! | ||
- | |||
- | <code c> | ||
- | int main(void) { | ||
- | // instrukcje... | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Funkcja ''main()'': | ||
- | * "główna" funkcja: specjalna funkcja w języku C (każdy program musi mieć dokładnie jedną funkcję main()) | ||
- | * komputer zawsze zaczyna wykonywanie programu od funkcji main() | ||
- | * program kończy działanie z chwilą opuszczenia funkcji main() | ||
- | * ''%%return 0;%%'' oznacza zwrócenie przez funkcję wartości ''0'' \\ (Dokąd ta wartość zostaje zwrócona? Do miejsca, w którym funkcja została wywołana, czyli w tym przypadku do systemu operacyjnego. Wartość ''0'' oznacza, że podczas wykonania programu nie wystąpiły błędy.) | ||
- | |||
- | ==== Funkcja printf() ==== | ||
- | |||
- | <code c> | ||
- | printf("Hello world!\n"); | ||
- | </code> | ||
- | |||
- | * funkcja biblioteczna (z biblioteki ''stdio'') | ||
- | * wypisuje dane w konsoli ("na ekran") | ||
- | * ''\n'' -- kombinacja znaków interpretowana jako znak nowego wiersza | ||
- | |||
- | **Uwaga!** W języku C wielkość liter ma znaczenie, tzn. nazwy ''printf'' i ''Printf'' oznaczają dwie różne funkcje! | ||
- | |||
- | ===== Kompilacja i konsolidacja ===== | ||
- | |||
- | **Kompilacja.** Proces przetwarzania kodu źródłowego i plików nagłówkowych na kod przejściowy (przez kompilator). | ||
- | |||
- | **Konsolidacja.** Proces łączenia kodu przejściowego z pozostałym kodem (kodem startowym i kodem bibliotek) w celu utworzenia pliku wykonywalnego. Konsolidacją zajmuje się //konsolidator//, zwany też //linkerem// (linker). | ||
- | |||
- | W wyniku procesu kompilacji i konsolidacji powstaje plik binarny, zawierający kod maszynowy. | ||
- | |||
- | |||
- | {{ :dydaktyka:cprog:2015:compile_and_link.jpg?nolink |}} | ||
- | |||
- | |||
- | Etapy tworzenia pliku wykonywalnego: | ||
- | - Programista pisze kod źródłowy programu (jako pliki tekstowe). | ||
- | - Preprocesor dołącza pliki nagłówkowe i przeprowadza inne czynności przygotowawcze, a następnie generuje plik kodu obiektowego (object file, ''.obj'' pod Windowsem). Plik kodu obiektowego zawiera kod przejściowy, czyli taki, w którym brakuje: | ||
- | * kodów funkcji bibliotecznych | ||
- | * kodu startowego (odpowiada za uruchomienie na danym systemie operacyjnym) | ||
- | - Linker dokonuje konsolidacji, czyli dołącza standardowe biblioteki oraz ewentualne biblioteki stworzone przez użytkownika (a dokładniej gotowy kod binarny użytych funkcji bibliotecznych) i tworzy plik gotowy do wykonania (''.exe'' pod Windowsem). | ||
- | |||
- | **Uwaga!** Pliki binarne ''.obj'' i ''.exe'' są przeznaczone dla danego systemu operacyjnego i dla danej architektury komputera. Aby stworzyć program dla innego systemu trzeba dokonać ponownej konsolidacji, z innymi parametrami. | ||
- | |||
- | ===== Zintegrowane środowisko programistyczne ===== | ||
- | |||
- | Co jest potrzebne, żeby zacząć programować? -- Wystarczy edytor tekstu i kompilator języka C! | ||
- | |||
- | //ale...// | ||
- | |||
- | Proces tworzenia programu można znacznie uprościć korzystając ze zintegrowanego środowiska programistycznego (integrated development environment, IDE). | ||
- | |||
- | Główne funkcje IDE: | ||
- | * wbudowany edytor tekstu pod kątem języka programowania | ||
- | * kolorowanie składni | ||
- | * podpowiadanie | ||
- | * automatyczna kompilacja i linkowanie | ||
- | * debugger | ||
- | |||
- | Podczas laboratoriów korzystamy ze środowiska programistycznego [[http://www.codeblocks.org/|Code::Blocks]] -- jest ono darmowe. | ||
- | |||
- | :!: Instalując na swoim komputerze //Code::Blocks// zwróć uwagę, by pobrać wersję z dołączonym kompilatorem. Plik instalatora możesz pobrać [[http://www.codeblocks.org/downloads/26|tutaj]] (pobierz wersję //codeblocks-<nr_wersji>mingw-setup.exe//). | ||
- | ===== Tworzenie projektu w Code:Blocks ===== | ||
- | |||
- | - Otwórz aplikację Code:Blocks. | ||
- | - Wybierz z menu: //File -> New -> Project...// | ||
- | - Zaznacz typ projektu -- //Console application//. | ||
- | - Wybierz //C// jako język projektu. | ||
- | - Wybierz tytuł projektu oraz katalog, w którym projekt zostanie on utworzony. | ||
- | - Zatwierdź przyciskiem //Finish//. | ||
- | - Po utworzeniu projektu w bocznym panelu rozwiń element //Sources// i kliknij na element z nazwą zakończoną na //.c// -- plik z **kodem źródłowym** naszego programu. | ||
- | |||
- | Plik z kodem powinien wyglądać następująco: | ||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | printf("Hello world!\n"); | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Aby uruchomić program, wybierz z menu: //Build -> Build and run// | ||
- | |||
- | Pojawi się okno **konsoli**, w którym wyświetlony zostanie napis: ''Hello world!'' (wraz ze statystykami wykonania programu) | ||
- | |||
- | :!: Regularnie zapisuj efekty swojej pracy, gdyż CodeBlocks czasem się zawiesza... | ||
- | ===== Błędy i ostrzeżenia (podczas kompilacji lub linkowania) ===== | ||
- | |||
- | Spróbuj skompilować poniższy kod: | ||
- | <code c hello_world_errors.c> | ||
- | #include <stdlib.h> | ||
- | |||
- | int ain() | ||
- | { | ||
- | printf("Hello world!\n") | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | Co się stało? | ||
- | |||
- | * //Błądzenie jest rzeczą ludzką// -- kompilator często pomoże nam wykryć błędy (pot. bugs). | ||
- | * Kompilator wykrywa błędy składniowe (syntax errors), czyli niezgodności ze specyfikacją i standardami języka. Natomiast nic nie obchodzą go błędy semantyczne (semantic errors), czyli poprawność od strony logicznej -- czy programista napisał faktycznie to, co chciał osiągnąć. | ||
- | * Przykład 1: W języku polskim zdanie w stylu mistrza Yody //Błędy frustrować być mogą!// składa się z poprawnych słów, ale w złym szyku i nie zawsze dobrze dobranych -- to błąd składniowy. Z kolei zdanie //Włochata inflacja myśli na zielono.// zawiera błąd semantyczny (no chyba, że ktoś jest poetą...) | ||
- | * Przykład 2: ''n2 = n * n; n3 = n2 * n2;'' -- błąd semantyczny, gdyż ''n3'' miało być sześcianem, a wyszła czwarta potęga. | ||
- | * Wszystkie błędy zgłoszone przez kompilator i linker muszą być poprawione. | ||
- | * Błąd uniemożliwia działanie programu; ostrzeżenie sygnalizuje możliwe problemy (program jest poprawny, ale być może np. użyliśmy konstrukcji nie należącej do standardu języka i dlatego część kompilatorów może nie potrafić skompilować naszego kodu). | ||
- | |||
- | |||
- | Dobre praktyki: | ||
- | |||
- | * W pierwszej kolejności usuwamy błędy (w kolejności jak się pojawiają – od pierwszej linii pliku do ostatniej), a dopiero potem zajmujemy się ostrzeżeniami. | ||
- | * Czytać opisy błędów! (Na tym etapie zajęć) Zazwyczaj to wystarczy, by zorientować się jak je usunąć. | ||
- | |||
- | ---- | ||
- | |||
- | Aby ułatwić sobie pracę, z menu wybierz //Settings > Compiler...//, a następnie na karcie //Compiler settings// i podkarcie //Compiler Flags// zaznacz pole: | ||
- | * Enable warnings demanded by strict ISO C and ISO C++ [-pedantic] | ||
- | |||
- | W ten sposób kompilator ostrzeże cię, gdy w kodzie znajdą się elementy niezgodne ze standardem ANSI C. | ||
- | |||
- | |||
- | ===== Podstawowe fakty===== | ||
- | |||
- | * Język C to język wysokiego poziomu, czyli jednej instrukcji w kodzie odpowiada wiele instrukcji dla procesora (w przeciwieństwie do języka niskiego poziomu, jak asembler, gdzie każdej instrukcji kodzie odpowiada dokładnie jedna instrukcja dla procesora). | ||
- | * Język C wymaga kompilatora (dedykowanego dla danego systemu operacyjnego). | ||
- | * Istnieją trzy standardy języka (K&R, ANSI, C99). Standard definiuje dopuszczalne konstrukcje języka i ich działanie. \\ :!: Na laboratoriach omawiamy standard ANSI. | ||
- | * Filozofia C: //Zaufaj programistom – oni dobrze wiedzą, co robią!// \\ | ||
- | W języku C wiele konstrukcji jest dopuszczalnych, a "wielka moc to wielka odpowiedzialność!" -- programista musi zachować czujność :-) | ||
- | |||
- | |||
- | ===== Zadania ===== | ||
- | |||
- | Zapoznaj się z: | ||
- | * zasadami tworzenia czytelnego kodu: **[[dydaktyka:cprog:clean_code|(klik)]]** | ||
- | * dostępnymi materiałami dydaktycznymi: **[[dydaktyka:cprog:learning_resources|(klik)]]** \\ //(chodzi o to, aby kojarzyć gdzie ewentualnie szukać wiedzy i pomocy)// |