Języki Programowania Wstęp
Total Page:16
File Type:pdf, Size:1020Kb
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) Set (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) Tree (drzewo - acykliczny, spójny graf) 16 Arrays Lists Binary B- Tries Multiway Heaps Space- Applicatio Hashes Graphs trees trees trees partitioning n-specific trees trees Array Linked list Binary tree B-tree Trie Ternary Heap Segment tree Syntax tree Hash table Graph Dynamic Doubly Binary search B+ tree Radix tree search tree Binary Interval tree Abstract Bloom filter Adjacency array linked list tree B*-tree Suffix tree And–or tree heap Range tree 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 binary search tree 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 Quadtree Expectimini trie decision Sparse Jump list balanced tree Fusion data heap Octree max tree Distributed diagram