Waldemar Smolik

Języki programowania Wstęp

1

Program komputerowy (ang. computer programme) - sekwencja symboli opisujących działania procesora zapisanych według reguł języka programowania.

 Program to ciąg instrukcji opisujących modyfikacje stanu maszyny. Program jest wykonywany przez komputer, czasami bezpośrednio – jeśli wyrażony jest w języku zrozumiałym dla danej maszyny lub pośrednio – gdy jest interpretowany przez inny program (interpreter).

 Formalne wyrażenie metody obliczeniowej w postaci języka zrozumiałego dla człowieka nazywane jest kodem źródłowym, podczas gdy program wyrażony w postaci zrozumiałej dla maszyny (to jest za pomocą ciągu liczb, a bardziej precyzyjnie zer i jedynek) nazywany jest kodem maszynowym bądź postacią binarną (wykonywalną).

 Programy komputerowe można zaklasyfikować według ich zastosowań. Wyróżnia się zatem systemy operacyjne, aplikacje użytkowe, aplikacje narzędziowe, kompilatory i inne. Programy wbudowane wewnątrz urządzeń określa się jako firmware.

2

W najprostszym modelu wykonanie programu (zapisanego w postaci zrozumiałej dla maszyny) polega na umieszczeniu go w pamięci operacyjnej komputera i wskazaniu procesorowi adresu pierwszej instrukcji. Po tych czynnościach procesor będzie wykonywał kolejne instrukcje programu, aż do jego zakończenia (instrukcja end lub return).

Program może zakończyć się:

o poprawnie (zgodnie z życzeniem twórcy programu i jego użytkownika); o błędnie (z powodu awarii sprzętu bądź wykonania przez program niedozwolonej operacji, np. dzielenia przez zero).

Wykonywanie programu może się nie zakończyć. Np. program powtarza instrukcje w pętli, w której nigdy nie zajdzie warunku zakończenia.

3

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

o segment kodu (sekwencja instrukcji sterujących działaniem procesora);

o segment danych (miejsce, gdzie zapisywane są dane wykorzystywane przez program, stałe, zmienne,

adresy pamięci, komunikaty tekstowe)

o segment stosu (zapamiętywane są argumenty przekazywane funkcjom, adres powrotu z wywołanej funkcji)

4

System operacyjny

Oprogramowanie zarządzające komputerem, tworzące środowisko do uruchamiania i kontroli programów.

Zadania systemu operacyjnego:

 przydział czasu procesora poszczególnym zadaniom (wg priorytetu),  kontrola i przydział pamięci operacyjnej dla uruchomionych zadań,  dostarczanie mechanizmów do synchronizacji zadań i komunikacji pomiędzy zadaniami,  obsługa sprzętu oraz zapewnienie wykonywanym zadaniom równoległego, jednolitego, wolnego od interferencji dostępu do sprzętu,  zarządzanie plikami,  dostarczenie środowiska graficznego dla komunikacji maszyny z użytkownikiem.

Program komputerowy będący w trakcie wykonania nazywany jest procesem lub zadaniem. Większość systemów operacyjnych (to szczególny rodzaj głównego programu) jest wielozadaniowa i pozwala na uruchamianie wielu programów jednocześnie (współbieżność). W przypadku, gdy zasoby komputera są ograniczone, np. ma tylko jeden procesor, zasób ten jest dzielony między procesy przez podział czasowy wg. priorytetu tych procesów.

5

Język programowania – zbiór zasad określających, kiedy ciąg symboli tworzy program oraz jakie obliczenia opisuje.

Podobnie jak języki naturalne, język programowania składa się ze zbiorów reguł syntaktycznych oraz semantycznych, które opisują, jak należy budować poprawne wyrażenia oraz jak komputer ma je rozumieć. Wiele języków programowania posiada pisemną specyfikację swojej leksyki, gramatyki oraz semantyki.

(Formalna notacja – Extended Backus-Naur Form, EBNF)

Leksyka - zasób słów jakim posługujemy się w danym języku.

Gramatyka – logiczne i strukturalne reguły tworzenia wyrażeń i zdań.

Semantyka – w naukach komputerowych, gdzie jest rozważana jako zastosowanie reguł logiki matematycznej, opisuje znaczenie wyrażeń, funkcji i programów.

6

Rozwój języków programowania lata pięćdziesiąte języki maszynowe sześćdziesiąte, siedemdziesiąte programowanie funkcjonalne (FORTRAN) osiemdziesiąte programowanie strukturalne (C, Pascal) 1990 - programowanie obiektowe (C++, Java) 2000 - programowanie komponentowe (.Net)

Historia języka C++ 1960 Algol 60: block structure, static typing 1967 Simula: Algol plus object-orientation (for simulation) 1970 C: statically typed procedural language with low-level features 1972 Smalltalk: object-orientation (for graphical interfaces), no static types 1985 C++: C plus object-oriented features and (later) genericity 1995 Java: C++ greatly simplified 1998 C++ (ISO) 2000 C#

7

8

Algorytmy i struktury danych

 Algorytm – skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego rodzaju zadań. (Nazwa pochodzi od łacińskiego zapisu nazwiska perskiego uczonego.) Algorytm ma przeprowadzić system z pewnego stanu początkowego do pożądanego stanu końcowego. Badaniem algorytmów zajmuje się algorytmika – dział informatyki i matematyki.

Jako przykład stosowanego w życiu codziennym algorytmu podaje się często przepis kulinarny. Może istnieć kilka różnych przepisów dających na końcu taką samą (bardzo podobną) potrawę. Język przepisów kulinarnych nie został jasno zdefiniowany.

Algorytmy zwykle formułowane są w sposób ścisły w oparciu o sformalizowany język.

Algorytm to jednoznaczny przepis przetworzenia w skończonym czasie pewnych danych wejściowych do pewnych danych wynikowych.

9

Iteracja i rekurencja

Iteracja (łac. iteratio) to czynność wielokrotnego powtarzania tej samej instrukcji albo bloku instrukcji (funkcji).

Instrukcja (powtarzania) pętli:

 z licznikiem  z warunkiem

Rekurencja - w matematyce i informatyce, wywoływanie funkcji z jej własnej definicji.

Wykorzystywane przy podziale zadania na mniejsze części.

 Wyszukiwanie  Sortowanie

10

Maszyna algorytmiczna

 1801 – Joseph Marie Jacquard (później współpracował z matematykiem L.M. Carnot). Krosno tkackie programowane za pomocą kart perforowanych  1833 – Charles Babbage stworzył koncepcję maszyny obliczeniowej, mechanicznej; nie udało mu się jej zbudować  1890 – spis ludności w Stanach za pomocą maszyny obliczeniowej bazującej na kartach perforowanych (IBM, Herman Hollerith)  Lata 30 XX wieku – Alan Turing, Godel, Markow - Koncepcje teoretyczne Maszyna Turinga - Abstrykcyjna maszyna z głowicą czytająca nieskończenie długą taśmę zawierającą symbole - instrukcje  Lata 40 XX wieku – pierwsze komputery o MARK I (Howard Aiken, Harward) o ENIAC, University of Pennsylvania o EDVAC, Johannes von Neumann, University of Princeton (rozwój architektury komputerowej zwanej architekturą Von Neumanna) o IBM 604, BULL Gamma3

11

12

Architektura Von Neumanna

13

Struktury danych

 Struktura danych – uporządkowana forma organizacji danych. Narzędzie rozwiązywania złożonych problemów algorytmicznych.

 Im lepsza struktura danych, tym prostszy i szybszy algorytm działania Wyszukiwanie książki w kartotece. Dla listy uporządkowanej alfabetycznie wyszukiwanie idzie sprawnie (nie musi skończyć się sukcesem bowiem książki może nie być na liście). Jeśli wskutek zdarzeń losowych kartoteka zostanie pomieszana, wyszukiwania nie da się przeprowadzić sprawnie.

 Różne zastosowania wymagają specyficznych struktur danych. Niektóre ze struktur są przeznaczone do wysoce specjalizowanych zadań czy algorytmów. Na przykład, binarne drzewa uporządkowane (BST) są wykorzystywane

w algorytmach wyszukiwania.

14

Struktury danych

Podstawowe struktury danych

 rekord lub struktura (ang. record, structure)  tablica  lista o lista dowiązaniowa o stos o kolejka  zbiór  graf o drzewo . drzewo binarne  binarne drzewo poszukiwań

15

Typy Typy złożone Typy abstrakcyjne podstawowe

Boolean Record (rekord) Container (kontener ) Character Union (unia) Deque (lista z dwoma końcami) Integer Tagged union (unia List (lista – uporządkowana kolekcja wartości) String znacznikowa lub Map (tablica asocjacyjna (połączenie kluczy z wartościami) – indeks rozłączna) Float (tablica indeksów)) Double Multimap (klucz może być połączony z wieloma wartościami (hashtable))

Multiset (zbiór pozwalający na powtarzanie się wartości) Priority queue (kolejka z uwzględnieniem priorytetu) Queue (kolejka – lista z określonymi operacjami na końcach, rodzaj listy typu LIFO lub FIFO) (zbiór niepowtarzających się elementów bez ustalonej kolejności) Stack (stos – kolejka elementów typu LIFO z operacjami push i pop) String (łańcuch znaków, sekwencja znaków reprezentujących tekst) (drzewo - acykliczny, spójny graf)

16

Arrays Lists Binary B- Multiway Heaps Space- Applicatio Hashes Graphs trees trees trees partitioning n-specific trees trees

Array Linked list B-tree Ternary Syntax tree Hash table Graph Dynamic Doubly Binary search B+ tree Binary Abstract Bloom filter Adjacency array linked list tree B*-tree And–or tree heap syntax tree Hash list list Hashed Xor linked Self-balancing B sharp Suffix array (a,b)-tree Binomial Bin Parse tree Hash tree Adjacency array tree list FM-index Link/cut heap Kd-tree Decision tree Prefix hash matrix Graph- Parallel Unrolled tree Dancing Generalised tree Fibonacci Implicit kd-tree Alternating tree structured array linked list Randomized tree suffix tree SPQR-tree heap Min/max kd-tree decision tree Hash trie stack Sparse Zipper binary search 2-3 tree B-trie Spaghetti 2-3 heap Adaptive k-d tree Minimax Hash array Scene graph array VList tree 2-3-4 Judy array stack Soft heap Kdb tree tree mapped Binary Matrix Skip list Weight- tree Disjoint-set Pairing Expectimini trie decision Sparse Jump list balanced tree Fusion data heap max tree Distributed diagram matrix Self- Threaded tree structure Leftist Linear hash table Zero Circular organizing binary tree Bx-tree heap Z-order Koorde suppressed buffer list AVL tree Enfilade UB-tree decision Gap Buffer Red-black Exponential Beap R-tree diagram Bit field tree tree Skew heap R+ tree And-inverter graph Bit array AA tree Fenwick Ternary R* tree Propositional Bitboard heap Hilbert R-tree directed Bitmaps tree D-ary X-tree acyclic graph Images heap Metric tree Heightfields T-tree Van Emde Lookup Rope Boas tree M tree table Top Trees VP-tree Tango Trees BK-tree Bounding interval Treap hierarchy BSP tree

17

Złożoność obliczeniowa algorytmów

 ilość zasobów komputerowych potrzebnych do realizacji algorytmu

o czas obliczeń – liczba operacji dominujących o rozmiar pamięci – liczba słów maszyny

 złożoność

o pesymistyczna – kres górny zbioru realizacji o oczekiwana – średni koszt wykonania

 wrażliwość algorytmu – określana jest rozkładem statystycznym kosztu

o pesymistyczna – maksimum - minimum o oczekiwana – odchylenie standardowe

18

Klasa złożoności obliczeniowej

Rozmiar problemu n - liczba elementów w ciągu wejściowym

złożoność obliczeniowa liczba obliczeń (rozmiaru problemu = n)

logarytmiczna log2n liniowa n

logarytmiczno-liniowa nlog2n kwadratowa n2 nk 2n wykładnicza n! nn

 binarne poszukiwanie w ciągu uporządkowanym – złożoność logarytmiczna  sortowanie przez scalanie (merge sort) – złożoność logarytmiczno – liniowa

19

Sortowanie przez scalanie (merge sort)

21, 3, 7, 12, 5, 4

21, 3, 7 12, 4, 5

21, 3 7 12, 4 5

21 3 7 12 4 5

3, 21 7 4, 12 5

3, 7, 21 4, 5, 12

3, 4, 5, 7, 12, 21

20

Przykładowy algorytm - Sortowanie przez selekcję

n-elementowy ciąg t(1:n)

 k = 1  wybierz z ciągu t(k:n) najmniejszy element i : t(i) = min  zamień miejscami element pierwszy z elementem najmniejszym t(k) <-> t(i)  weź podciąg nieposortowany (jeśli ma więcej niż dwa elementy) k=k+1  powtórz te dwa kroki dla podciągu nieposortowanego

o złożoność obliczeniowa O(n2) o mała liczba przestawień o prosta implementacja o nie jest stabilny (jednakowe elementy zmieniają kolejność po przejściu algorytmu)

21

Sortowanie przez selekcję

START t(1:n)

k=1

znajdź minimum w podciągu (k:n)

i: t(i)=min

zamień miejscami

t(k) <->t(i)

k=k+1

tak nie k

koniec 22

Wyszukiwanie minimum (wyszukiwanie liniowe)

START s(1:n)

i=1, min=s(i) k=2

tak nie k<=n

k=k+1 pozycja, wartość minimum nie tak i, s(i) s(k)

i=k min=s(i)

23

Sortowanie znaków w ciągu znaków

 ciąg znaków w języku C o stała tekstowa: ”ciąg znaków w cudzysłowach” o podawany jest adres pierwszego znaku o kolejne bajty to kody liter w standardzie ASCII o znakiem końca jest kod = 0  kody ASCII (American Standard Code for Information Interchange)

24

25

Arytmetyka komputerów

System dwójkowy Cyfry: 0, 1 Liczba (1011.1)2 oznacza 1 * 23 + 0 * 22 + 1 * 21 + 1 * 20 + 1 * 2−1.

System dwójkowy dobrze pasuje do komputera, ale dla człowieka jest zbyt rozwlekły.

System szesnastkowy Cyfry: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Liczba (D7A.F)16 oznacza 13 * 162 + 7 * 161 + 10 * 160 + 15 * 16−1.

Naturalne i łatwe przejście z systemu dwójkowego na system o większej liczbie cyfr. System dobry dla programisty.

Kodowanie znaku liczby w systemie dwójkowym −2N−1 to 2N−1-1 znak-moduł: wygodny dla człowieka, ale sprawia problemy przy realizacji operacji arytmetycznych (zero ma dwie reprezentacje) znak-uzupełnienie do 2 (two's complement): wygodna w realizacji operacji przez jednostkę arytmetyczną (tak samo realizuje się operacje na liczbach bez znaku jak i ze znakiem)

26