Docsity
Docsity

Przygotuj się do egzaminów
Przygotuj się do egzaminów

Studiuj dzięki licznym zasobom udostępnionym na Docsity


Otrzymaj punkty, aby pobrać
Otrzymaj punkty, aby pobrać

Zdobywaj punkty, pomagając innym studentom lub wykup je w ramach planu Premium


Informacje i wskazówki
Informacje i wskazówki

Podstawy programowania - Wykład Dr hab. inż. Grzegorz Dudek, prof. WSTI, Schematy z Kompilatory

Programowanie jest procesem tworzenia programów. Jest to cykliczny proces polegający na: Page 15. 15. • edycji kodu źródłowego ( ...

Typologia: Schematy

2022/2023

Załadowany 24.02.2023

Helena_84
Helena_84 🇵🇱

4.7

(43)

396 dokumenty

Podgląd częściowego tekstu

Pobierz Podstawy programowania - Wykład Dr hab. inż. Grzegorz Dudek, prof. WSTI i więcej Schematy w PDF z Kompilatory tylko na Docsity!

Podstawy

programowania

wykład

Dr hab. inż. Grzegorz Dudek, prof. WSTI

Wyższa Szkoła Technologii

Informatycznych w Katowicach

Katowice 2016

Spis treści

    1. Informacje wstępne.........................................................................................................................
    • 1.1. Zakres tematyczny wykładu
    • 1.2. Zalecana literatura...................................................................................................................
    • 1.3. Podstawowe definicje
    • 1.4. Proces kompilacji
      • Analiza programu źródłowego
      • Fazy kompilatora
      • Zarządzanie tablicą symboli...........................................................................................................
      • Wykrywanie i zgłaszanie błędów
      • Fazy analizy
      • Generacja kodu pośredniego
      • Optymalizacja kodu
      • Generacja kodu
    1. Język C – wiadomości wstępne......................................................................................................
      • Historia
      • Standaryzacje
      • Zastosowania i przyszłość języka C
      • Zintegrowane Środowiska Programistyczne
      • Komunikaty o błędach
    1. Pierwszy program w C
    1. Podstawy języka C
    • 4.1. Struktura blokowa
    • 4.2. Zasięg zmiennych
    • 4.3. Funkcje
    • 4.4. Biblioteki standardowe..........................................................................................................
    • 4.5. Komentarze i styl pisania programu
    • 4.6. Preprocesor
    • 4.7. Nazwy zmiennych, stałych i funkcji
    1. Zmienne
    • 5.1. Czym są zmienne?
      • Deklaracja zmiennych....................................................................................................................
      • Zasięg zmiennej
      • Czas życia
      • Stałe
    • 5.2. Typy zmiennych
      • int...................................................................................................................................................
      • float
      • double............................................................................................................................................
      • char
      • void
    • 5.3. Specyfikatory
      • signed i unsigned
      • short i long
    • 5.4. Modyfikatory
      • volatile
      • register
      • static
      • extern
      • auto
    1. Operatory
    • 6.1. Przypisanie.............................................................................................................................
    • 6.2. Skrócony zapis
    • 6.3. Rzutowanie
    • 6.4. Operatory arytmetyczne
      • Inkrementacja i dekrementacja.....................................................................................................
    • 6.5. Operacje bitowe
      • Przesunięcie bitowe
    • 6.6. Porównanie
      • Częste błędy
    • 6.7. Operatory logiczne
      • Prawda i fałsz w języku C
      • Skrócone obliczanie wyrażeń logicznych
    • 6.8. Operator wyrażenia warunkowego
    • 6.9. Przecinek
    • 6.10. Operator sizeof
    • 6.11. Inne operatory
    • 6.12. Priorytety i kolejność obliczeń
    • 6.13. Kolejność wyliczania argumentów operatora
    1. Instrukcje sterujące
    • 7.1. Instrukcje warunkowe
      • Instrukcja if
      • Instrukcja switch
    • 7.2. Pętle.......................................................................................................................................
      • Instrukcja while
      • Instrukcja for
      • Instrukcja do..while
      • Instrukcja break
      • Break i pętle nieskończone
      • Instrukcja continue
    • 7.3. Instrukcja goto
    • 7.4. Natychmiastowe zakończenie programu — funkcja exit
    1. Podstawowe procedury wejścia i wyjścia
    • 8.1. Wejście/wyjście
    • 8.2. Funkcje wyjścia
      • Funkcja printf()
      • Funkcja puts()
      • Funkcja fputs()
      • Funkcja putchar()
    • 8.3. Funkcje wejścia
      • Funkcja scanf()
      • Funkcja fgets()
      • Funkcja getchar()
    1. Funkcje
    • 9.1. Tworzenie funkcji
      • Procedury
    • 9.2. Wywoływanie funkcji
    • 9.3. Zwracanie wartości................................................................................................................
    • 9.4. Funkcja main()
    • 9.5. Dalsze informacje
      • Jak zwrócić kilka wartości?
      • Przekazywanie parametrów
      • Funkcje rekurencyjne
      • Deklarowanie funkcji
      • Zmienna liczba parametrów
      • Funkcje przeciążone (C++)
      • Domyślne wartości argumentów funkcji (C++)
      • Funkcje inline (C++)
      • Ezoteryka C
    1. Preprocesor
    • 10.1. Dyrektywy preprocesora
      • #include
      • #define...........................................................................................................................................
      • #undef
      • #if #elif #else #endif
      • #ifdef #ifndef #else #endif.............................................................................................................
      • #error
      • #warning
      • #line
      • oraz

      • Predefiniowane makra
    1. Biblioteka standardowa.............................................................................................................
      • Czym jest biblioteka?.....................................................................................................................
      • Po co nam biblioteka standardowa?
      • Jak skonstruowana jest biblioteka standardowa?.........................................................................
      • Gdzie są funkcje z biblioteki standardowej?
      • Opis funkcji biblioteki standardowej
    1. Obsługa plików – zapis i odczyt danych
      • Podstawowa obsługa plików
      • Dane znakowe
      • Pliki a strumienie
      • Obsługa błędów
      • Zaawansowane operacje
      • Rozmiar pliku
      • Przykład — pliki graficzny
    1. Tablice
      • Sposoby deklaracji tablic
      • Odczyt/zapis wartości do tablicy
      • Tablice znaków
      • Tablice wielowymiarowe
      • Ograniczenia tablic
    1. Wskaźniki
      • Co to jest wskaźnik?
      • Operowanie na wskaźnikach
      • Dostęp do wskazywanego obiektu
      • Arytmetyka wskaźników
      • Tablice a wskaźniki
      • Wskaźnik jako argument funkcji..................................................................................................
      • Pułapki wskaźników.....................................................................................................................
      • Na co wskazuje NULL?
      • Stałe wskaźniki.............................................................................................................................
      • Dynamiczna alokacja pamięci......................................................................................................
      • Wskaźniki na funkcje
      • Możliwe deklaracje wskaźników
      • Typowe błędy
      • Ciekawostki..................................................................................................................................
    1. Napisy
    • 15.1. Jak łańcuchy są przechowywane w pamięci?
    • 15.2. Operacje na łańcuchach
      • Porównywanie łańcuchów
      • Kopiowanie napisów
      • Łączenie napisów.........................................................................................................................
    • 15.3. Konwersje
    • 15.4. Operacje na znakach***
    • 15.5. Częste błędy.....................................................................................................................
    • 15.6. Unicode[edytuj]
      • Jaki rozmiar i jakie kodowanie.....................................................................................................
    1. Typy złożone
    • 16.1. typedef
    • 16.2. Typ wyliczeniowy
    • 16.3. Struktury
    • 16.4. Unie
    • 16.5. Pola bitowe
    • 16.6. Studium przypadku - implementacja listy wskaźnikowej
    1. Funkcje matematyczne............................................................................................................
    1. Przykładowe programy w C
    • 18.1. Pierwiastki równania kwadratowego
    • 18.2. Zapis daty i czasu w pliku tekstowym
    • 18.3. Zliczanie znaków w pliku tekstowym...............................................................................
    • 18.4. Sortowanie liczb
    • 18.5. Generacja dziwnego atraktora

1. INFORMACJE WSTĘPNE

1.1. Zakres tematyczny wykładu

Patrz spis treści.

Wykład oparty jest głównie na [Pro].

1.2. Zalecana literatura

[Gre] Grębosz J.: Symfonia C++ Standard. Edition 2000, 2009.

[Pra] Prata S.: Szkoła programowania. Język C. Helion.

[Har] Harris S., Ross J.: Algorytmy od podstaw. Helion.

[Wro] Wróblewski P.: Algorytmy, struktury danych i techniki programowania. Helion.

[Pro] Programowanie w C. Wikibooks. http://upload.wikimedia.org/wikibooks/pl/6/6a/C.pdf

[Pys] Pyszczuk A.: Programowanie w języku C. http://www.arturpyszczuk.pl/files/c/pwc.pdf

1.3. Podstawowe definicje

Algorytm :

 zbiór dobrze zdefiniowanych kroków prowadzących do wykonania pewnego zadania

 w matematyce skończony ciąg jasno zdefiniowanych czynności, koniecznych do wy-

konania pewnego rodzaju zadań

 skończony ciąg/sekwencja reguł, które aplikuje się na skończonej liczbie danych, po-

zwalający rozwiązywać zbliżone do siebie klasy problemów

 zespół reguł charakterystycznych dla pewnych obliczeń lub czynności informatycz-

nych

Algorytm ma przeprowadzić system z pewnego stanu początkowego do pożądanego stanu

końcowego. Badaniem algorytmów zajmuje się algorytmika. Algorytm może zostać zaim-

plementowany w postaci programu komputerowego.

#include <stdio.h> //komentarz main () { int a = 4 ; int b = 7; if (a >= b) printf("a wieksze lub rowne b\n");

Przykładowy program w JavaScript. figure('Renderer','zbuffer') Z = peaks; surf(Z); axis tight set(gca,'NextPlot','replaceChildren'); F(20) = struct('cdata',[],'colormap',[]); for j = 1: surf(.301+cos(1*pi*j/50)*Z,Z) F(j) = getframe; end Przykładowy program w Matlabie.

Ranking popularności języków programowania:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Program komputerowy to sekwencja symboli opisująca obliczenia zgodnie z pewnymi regu-

łami zwanymi językiem programowania. Program jest zazwyczaj wykonywany przez kom-

puter, czasami bezpośrednio – jeśli wyrażony jest w języku zrozumiałym dla danej maszyny

lub pośrednio – gdy jest kompilowany lub interpretowany przez inny program.

Formalne wyrażenie metody obliczeniowej w postaci języka zrozumiałego dla człowieka na-

zywane jest kodem źródłowym , podczas gdy program wyrażony w postaci zrozumiałej dla

maszyny (to jest za pomocą ciągu zer i jedynek) nazywany jest kodem maszynowym bądź

postacią binarną (wykonywalną). Kompilator tłumaczy kod źródłowy zapisany w danym

języku programowania na kod maszynowy, dzięki czemu możliwe staje się jego późniejsze

uruchomienie. Interpreter natomiast odczytuje kod źródłowy na bieżąco, analizuje go i wy-

konuje kolejne porcje przetłumaczonego kodu. Programy przeznaczone do interpretacji często

nazywane są skryptami.

Programy komputerowe można zaklasyfikować według ich zastosowań. Wyróżnia się: apli-

kacje użytkowe, systemy operacyjne, gry wideo, kompilatory i inne.

W najprostszym modelu wykonanie programu polega na umieszczeniu go w pamięci opera-

cyjnej komputera i wskazaniu procesorowi adresu pierwszej instrukcji. Po tych czynnościach

procesor będzie wykonywał kolejne instrukcje programu, aż do jego zakończenia. Program

może zakończyć się w dwojaki sposób: poprawnie lub błędnie.

Program komputerowy będący w trakcie wykonania nazywany jest procesem lub zadaniem.

Program można podzielić na dwie części (obszary):

 część kodu (składającą się z instrukcji sterujących działaniem procesora),

 część danych (składającą się z danych wykorzystywanych i opracowywanych przez

program, np. adresów pamięci, stałych liczbowych, komunikatów tekstowych).

Programowanie jest procesem tworzenia programów. Jest to cykliczny proces polegający na:

Kod asemblera jest mnemonicznym zapisem kodu maszynowego, w którym używa się nazw

zamiast binarnych kodów operacji i adresów pamięci. Typowa sekwencja rozkazów w asem-

blerze może mieć postać (jest to zapis instrukcji b = a + 2;):

w asemblerze:

MOV a, R ADD #2, R MOV R1, b

w kodzie maszynowym:

(np.: „0001 01 00 00000000”) (np.: „0011 01 10 00000010”) (np.: „0010 01 00 00000100”)

Analiza programu źródłowego

W kompilacji analiza składa się z trzech faz:

 Analizy liniowej (analiza leksykalna, skanowanie) , w której strumień znaków, skła-

dający się na program wejściowy, jest wczytywany od lewej do prawej i grupowany w

symbole leksykalne ( atomy leksykalne, tokeny ), czyli ciągi znaków mających razem

pewne znaczenie. Moduł wykonujący analizę leksykalną nazywa się lekserem, skane-

rem lub analizatorem leksykalnym.

 Analizy hierarchicznej (analiza składniowa lub syntaktyczna), w której znaki lub

symbole leksykalne są grupowane hierarchicznie w zagnieżdżone struktury mające

wspólne znaczenie.

 Analizy semantycznej (analizy znaczeniowej), w której przeprowadzone są pewne

działania, mające zapewnić, że składniki programu pasują do siebie pod względem

znaczenia.

Przykładowo w analizie liniowej, znaki instrukcji przypisania:

pozycja:=poczatek+tempo*

są pogrupowane w następujące symbole leksykalne:

 identyfikator pozycja

 symbol przypisania :=

 identyfikator poczatek

 znak plus +

 identyfikator tempo

 znak mnożenia *

 liczba 60

Ewentualne odstępy rozdzielające znaki tych symboli leksykalnych zostaną wyeliminowane

podczas analizy leksykalnej.

Analiza hierarchiczna polega na grupowaniu symboli leksykalnych programu źródłowego w

wyrażenia gramatyczne, które są reprezentowane przez kompilator do syntezy kodu wyniko-

wego. Zwykle wyrażenia gramatyczne są reprezentowane przez drzewo wyprowadzenia lub

drzewo składniowe.

Drzewo wyprowadzenia lub drzewo składniowe opisują składniową strukturę wejścia.

Analiza semantyczna polega na kontroli programu źródłowego wyszukującej błędy seman-

tyczne oraz na zbieraniu informacji dla kolejnej fazy, jaką jest generacja kodu. Do analizy

semantycznej, w celu zidentyfikowania operatorów i argumentów wyrażeń i instrukcji, używa

się hierarchicznej struktury otrzymanej z analizy składniowej. Ważnym elementem analizy

semantycznej jest kontrola typów.

 optymalizator – dokonujący optymalizacji kodu pod różnymi kątami, np. szybkości

wykonywania, ilości pamięci wykorzystywanej przez program, możliwości zrównole-

glenia itp.

 konsolidator (linker) – w trakcie procesu konsolidacji łączy skompilowane pliki za-

wierające kod obiektowy lub pliki bibliotek statycznych tworząc w ten sposób plik

wykonywalny.

 debugger (odpluskwiacz) – program służący do dynamicznej kontroli nad wykona-

niem kodu, w celu odnalezienia i identyfikacji zawartych w nim błędów. Współczesne

debuggery pozwalają na efektywne śledzenie wartości poszczególnych zmiennych,

wykonywanie instrukcji krok po kroku czy wstrzymywanie działania programu w

określonych miejscach.

Zarządzanie tablicą symboli

Ważną funkcją kompilatora jest zapamiętywanie identyfikatorów używanych w programie

źródłowym i zbieranie informacji o różnych atrybutach tych identyfikatorów (rozmiarze pa-

mięci zajętej dla identyfikatora, typie, zasięgu), a w przypadku procedur podają liczbę, typy i

metodę przekazywania argumentów oraz ewentualnie typ wyniku.

Tablica symboli jest strukturą danych zawierającą dla wszystkich identyfikatorów rekordy z

ich atrybutami. Każdy identyfikator znaleziony w programie źródłowym podczas analizy lek-

sykalnej jest dodawany do tej tablicy, a jego atrybuty mogą być dodawane w kolejnych fa-

zach.

Wykrywanie i zgłaszanie błędów

Podczas każdej fazy kompilacji można napotkać błędy w programie źródłowym. Większość

błędów wykrywana jest podczas analizy składniowej i semantycznej.

W fazie analizy leksykalnej mogą zostać wykryte błędy, jeśli znaki znajdujące się na wejściu

nie stanowią żadnego symbolu leksykalnego języka. Kiedy strumień nie pasuje do zasad bu-

dowy strukturalnej (składniowej) języka, błędy są znajdowane w fazie analizy składniowej.

Podczas analizy semantycznej kompilator wykrywa konstrukcje z poprawną strukturą skła-

dniową, ale na których nie daje się zastosować użytej operacji.

Błędy więc mogą być:

 leksykalne, np. błędnie wpisany identyfikator, słowo kluczowe lub operator,

 składniowe, np. wyrażenie arytmetyczne z niewyważonymi nawiasami,

 semantyczne, np. zastosowanie operatora do niekompatybilnego argumentu,

 logiczne, np. wywołanie rekurencyjne w nieskończonej pętli.

Fazy analizy

Podczas postępu translacji zmienia się wewnętrzna reprezentacja programu źródłowego w

kompilatorze.