Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

Podobne dokumenty
Programowanie obiektowo zorientowane. Mirosław Głowacki Wykład w języku C++

Programowanie w języku C++ Podstawowe paradygmaty programowania

Języki i paradygmaty programowania. I. Wprowadzenie

Języki programowania zasady ich tworzenia

Języki i paradygmaty programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Java EE produkcja oprogramowania

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Paradygmaty programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Programowanie komputerów

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1 Podstawy c++ w pigułce.

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Programowanie w języku Python. Grażyna Koba

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie obiektowe

Wykład 1 Wiadomości wstępne

Wstęp do programowania obiektowego. Wykład 1 Algorytmy i paradygmaty Podstawowe pojęcia PO

Zapisywanie algorytmów w języku programowania

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki programowania deklaratywnego

1 Podstawy c++ w pigułce.

Języki programowania deklaratywnego

Technologie cyfrowe semestr letni 2018/2019

Metody Metody, parametry, zwracanie wartości

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Algorytm. a programowanie -

Programowanie w języku C++ Grażyna Koba

Wykład V. Rzut okiem na języki programowania. Studia Podyplomowe INFORMATYKA Podstawy Informatyki

Podstawy programowania w języku C

Podstawy Programowania Obiektowego

Jerzy Nawrocki, Wprowadzenie do informatyki

4 Literatura. c Dr inż. Ignacy Pardyka (Inf.UJK) ASK MP.01 Rok akad. 2011/ / 24

Zadanie analizy leksykalnej

Wstęp do informatyki Paradygmaty programowania

Wprowadzenie do języka Java

4. Funkcje. Przykłady

ForPascal Interpreter języka Pascal

Paradygmaty Programowania dr inŝ. Cezary Bolek

Język JAVA podstawy. wykład 1, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Algorytmy od problemu do wyniku

7. Pętle for. Przykłady

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

Wstęp do programowania

Programowanie Obiektowe i C++

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Java jako język programowania

Komputer nie myśli. On tylko wykonuje nasze polecenia. Nauczmy się więc wydawać mu rozkazy

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Technologie cyfrowe semestr letni 2018/2019

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

Język ludzki kod maszynowy

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Paradygmaty programowania

Podstawy programowania w Pythonie

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

Podstawy Programowania C++

Programowanie i projektowanie obiektowe

Technologie i usługi internetowe cz. 2

Podstawy Programowania. Wykład 1

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Wstęp do programowania. Różne różności

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Programowanie obiektowe

Metody Kompilacji Wykład 1 Wstęp

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

Programowanie obiektowe

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Definicje. Algorytm to:

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Programowanie - instrukcje sterujące

PARADYGMATY PROGRAMOWANIA Wykład 4

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Jerzy Nawrocki, Wprowadzenie do informatyki

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Programowanie Obiektowe i C++ Marcin Benke

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Efektywna analiza składniowa GBK

tablica: dane_liczbowe

Algorytmy zapisywane w pseudojęzyku programowania. Klasa 2 Lekcja 6

KONSTRUKCJA KOMPILATORÓW

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Wykład 5: Klasy cz. 3

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Technologie informacyjne - wykład 12 -

Wprowadzenie. Organizacja pracy i środowisko programistyczne. Mirosław Ochodek

Transkrypt:

Wstęp do Programowania Obiektowego Wykład 13 Paradygmaty. Składnia i semantyka. 1

PRZEGLĄD PODSTAWOWYCH PARADYGMATÓW 2

Cztery podstawowe paradygmaty 1. Programowanie imperatywne. 2. Programowanie funkcyjne. 3. Programowanie logiczne. 4. Programowanie obiektowe. 3

Ad. 1. Programowanie imperatywne Obliczenia rozumiemy tu jako sekwencję poleceń zmieniających krok po kroku stan maszyny, aż do uzyskania oczekiwanego wyniku. Stan maszyny należy z kolei rozumieć jako zawartość całej pamięci oraz rejestrów i znaczników procesora. Jest to ściśle związane z budową sprzętu komputerowego o architekturze von Neumanna. 4

Architektura von Neumanna Podział komputera na trzy podstawowe części: procesor (ALU oraz CU) pamięć komputera (Memory) urządzenia wejścia/wyjścia (IN/OUT) 5

Języki wysokiego poziomu takie jak Fortran, Algol, Pascal, Ada lub C posługują się pewnymi abstrakcjami, ale wciąż odpowiadają paradygmatowi programowania imperatywnego. Np. instrukcja podstawienia działa na danych pobranych z pamięci i umieszcza wynik w tejże pamięci, zaś abstrakcją komórek pamięci są zmienne. 6

Przykładowy program imperatywny (w języku Pascal) program pierwszy; var i, n, s: integer; begin read(n); s := 1; for i := 2 to n do s := s * i; write(s); end. 7

Ad. 2. Programowanie obiektowe Program obiektowy to zbiór porozumiewających się ze sobą obiektów, czyli jednostek zawierających pewne dane i umiejących wykonywać na nich pewne operacje. Ważną cechą jest powiązanie danych (czyli stanu) z operacjami na nich (czyli poleceniami) w całość, stanowiącą odrębną jednostkę obiekt. 8

W programowaniu obiektowym wprowadzono szereg mechanizmów ułatwiających programowanie, m.in. dziedziczenie (możliwość definiowania nowych, bardziej złożonych obiektów, na bazie obiektów już istniejących). 9

paradygmat obiektowy dobrze odzwierciedla ludzkie (przedmiotowe) postrzeganie rzeczywistości. programowanie obiektowe zdobyło ogromną popularność i wypada je uznać za paradygmat obecnie dominujący. 10

Przykładowy program obiektowy (w języku Java) public class Hello { public static void main(string[] args) { System.out.println("Hello world!"); } } 11

Ad. 3. Programowanie funkcyjne Program funkcyjny to po prostu złożona funkcja (w sensie matematycznym), która otrzymawszy dane wejściowe wylicza pewien wynik. 12

Cechy programowania funkcyjnego Brak stanu maszyny; Nie ma (tradycyjnie rozumianych) pętli; Konstruowanie programów to składanie funkcji, zazwyczaj z wykorzystaniem rekurencji. Charakterystyczne jest definiowanie funkcji wyższego rzędu, czyli takich, dla których argumentami i których wynikami mogą być funkcje (a nie tylko proste dane jak liczby lub napisy). 13

Przykładowy program funkcyjny (w języku LISP) (DEFINE (suma m n) (IF (> m n) 0 (+ m (suma (+ m 1) n)) ) ) 14

Ad. 4. Programowanie w logice (programowanie logiczne) Na program składa się zbiór zależności (przesłanki) i pewne stwierdzenie (cel) Wykonanie programu to próba udowodnienia celu w oparciu o podane przesłanki. Obliczenia wykonywane są niejako przy okazji dowodzenia celu. Opisujemy jedynie, co wiemy i co chcemy uzyskać. 15

Przykładowy program logiczny (w języku Prolog) ojciec(jan, jerzy). ojciec(jerzy, janusz). ojciec(jerzy, józef). dziadek(x, Z) :- ojciec(x, Y), ojciec(y, Z).?- dziadek(x, janusz). 16

OGÓLNE WŁASNOŚCI PARADYGMATÓW 17

Istnieje wiele innych paradygmatów, niektóre się przenikają Często paradygmaty obejmują tylko niektóre aspekty programowania, Programowanie skalarne i macierzowe - rozróżnienie między nimi odnosi się do tego, czy działamy na pojedynczych wartościach, czy na całych tablicach (macierzach). Programowanie proceduralne i programowanie strukturalne można traktować jako odmianę programowania imperatywnego. 18

Istnieją paradygmaty przeciwstawne programowanie sterowane zdarzeniami to przeciwieństwo klasycznego programowania z własnym wątkiem sterowania co nie oznacza, że nie można łączyć tych dwóch paradygmatów w jednym programie; tak jest np. w typowych aplikacjach bazodanowych. 19

Konkretne język programowania mogą ucieleśniać jeden lub więcej paradygmatów. Fortran, Pascal i C to języki imperatywne. Java i C# to języki typowo obiektowe, w których programowanie imperatywne zostało mocno ograniczone. Natomiast C++ jest językiem zarówno obiektowym, jak i imperatywnym. Można też uznać, że programowanie imperatywne to szczególny przypadek programowania obiektowego, gdzie wszystko rozgrywa się wewnątrz jednego superobiektu. 20

Architektura współczesnych komputerów Przytłaczająca większość komputerów działa w oparciu o imperatywną architekturę von Neumanna. Każdy program, który chcemy uruchomić, musi być zatem najpierw przetłumaczony do postaci imperatywnej, czyli do ciągu rozkazów w języku wewnętrznym konkretnej maszyny. Mechanizmy z różnych paradygmatów wymagają niekiedy skomplikowanych metod, by odwzorować je w formie rozkazów zwykłego komputera; bardzo różna jest też ich efektywność. 21

SKŁADNIA I SEMANTYKA 22

Składnia Składnia to zbiór reguł, mówiących jak wygląda poprawny program w danym języku, czyli np.: Jak tworzy się polecenia i wyrażenia. Jaką postać mają struktury sterowania (if, while, for itp.). Jak zapisuje się deklaracje zmiennych. 23

Semantyka Semantyka to znaczenie wspomnianych wyżej form, czyli w jaki sposób działają konkretne zapisy. 24

Przykład składni i semantyki Typowa instrukcja warunkowa if w języku C\C++. Składnia: if "(" <wyrażenie> ")" <instrukcja> Semantyka jest następująca: sprawdź wartość logiczną podanego wyrażenia i jeśli jest prawdziwe, to wykonaj podaną instrukcję, jeżeli nie to przejdź do kolejnej instrukcji. 25

Intuicyjność semantyki Najlepiej byłoby, gdyby semantykę dało się łatwo odgadnąć, patrząc na składnię języka. Dla prostych konstrukcji tak zazwyczaj bywa; bardziej skomplikowane twory są niestety mniej oczywiste. Stąd potrzebne są ścisłe metody opisu i składni, i semantyki. 26

Jak opisać składnię i semantykę? Składnię języków będziemy opisywali za pomocą notacji BNF, odpowiadającej gramatykom bezkontekstowym. Semantykę rozmaitych konstrukcji będziemy na ogół opisywali w języku naturalnym. 27

Notacja BNF (Backus Naur Form) Definicja języka w notacji BNF to zbiór reguł. Poszczególne reguły mają postać: <symbol> ::= <definicja symbolu> Sens takiej reguły jest następujący: symbol występujący po lewej stronie znaku ::= można zastąpić tym, co pojawia się po prawej stronie. Symbole pojawiające się po lewej stronie reguł zwane są symbolami nieterminalnymi. Symbole pojawiające się wyłącznie po prawej stronie to symbole terminalne. Generalnie symbole terminalne to symbole z alfabetu definiowanego języka, a zatem docelowe ; symbole nieterminalne spełniają natomiast rolę pomocniczą przy jego definiowaniu. 28

Dodatkowe symbole i konwencje (1/2) Pionowa kreska oznacza alternatywne warianty reguły, np. <typ> ::= char int float double Nawiasy kwadratowe [...] oznaczają opcjonalną część reguły, np. instr_warunk ::= if wyr_logiczne then instr [ else instr ] Nawiasy klamrowe {...} oznaczają fragment, który może być powtórzony dowolnie wiele razy (również zero razy, czyli całkowicie pominięty), np. <lista_arg> ::= <arg> { "," <arg> } 29

Dodatkowe symbole i konwencje (2/2) Zwykłych nawiasów okrągłych (...) używa się do grupowania alternatywnych fragmentów definicji, np. <liczba_ze_znakiem> ::= ("+" " ") <liczba_bez_znaku> Jednoznakowe symbole terminalne umieszcza się w cudzysłowie, dla odróżnienia ich od symboli samej notacji BNF. Symbole terminalne niekiedy pisze się czcionką wytłuszczoną; nie jest wówczas konieczne pisanie nawiasów kątowych wokół symboli nieterminalnych. 30

Powtarzające się elementy Chcąc opisać powtarzające się elementy, możemy stworzyć definicję rekurencyjną lub wykorzystać nawiasy klamrowe. Przykład: definicja niepustej listy identyfikatorów, rozdzielonych przecinkami. Definicja rekurencyjna: <lista_identyfikatorów> ::= <identyfikator> <lista_identyfikatorów> "," <identyfikator> Definicja z nawiasami klamrowymi: <lista_identyfikatorów> ::= <identyfikator> { "," <identyfikator> } 31

Klasyczny przykład użycia notacji BNF to sam opis składni notacji BNF: <składnia> ::= { <reguła> } <reguła> ::= <identyfikator> "::=" <wyrażenie> <wyrażenie> ::= <składnik> { " " <składnik> } <składnik> ::= <czynnik> { <czynnik> } <czynnik> ::= <identyfikator> <symbol_zacytowany> "(" <wyrażenie> ")" "[" <wyrażenie> "]" "{" <wyrażenie> "}" <identyfikator> ::= <litera> { <litera> <cyfra> } <symbol_zacytowany> ::= """ { <dowolny_znak> } """ 32

Niedodefiniowanie symbole domyślne Niektóre symbole, formalnie terminalne, są właściwie niedodefiniowanymi symbolami nieterminalnymi. Gwoli ścisłości powinniśmy zatem dopisać: <litera> ::= "A" "B" "C"... <cyfra> ::= "0" "1"... "9" <dowolny_znak> ::=... 33

PRZETWARZANIE PROGRAMU NA KOD MASZYNY 34

Program w dowolnym języku/paradygmacie musi zostać przetłumaczony na język wewnętrzny maszyny, na której program zamierzamy uruchomić. Są trzy zasadnicze sposoby takiego tłumaczenia: 1. Kompilacja 2. Interpretacja 3. Kompilacja do kodu pośredniego 35

Kompilacja a interpretacja Kompilacja to przetłumaczenie całego programu za jednym zamachem. Otrzymujemy kod wynikowy, który (po konsolidacji zwanej też linkowaniem) wykonuje się bezpośrednio na maszynie docelowej. Interpretacja to tłumaczenie i wykonywanie programu instrukcja po instrukcji, za pomocą programu zwanego interpreterem. 36

Rozwiązanie pośrednie Kompilacja do kodu pośredniego wstępnie skompilowany kod pośredni jest następnie interpretowany lub kompilowany ponownie w ostatniej chwili. Przykład: język Java. Daje to dobry kompromis między efektywnością a przenośnością kodu na różne komputery. 37

Wpływ nieznajomość semantyki na efektywność programu Rozważmy pozornie identyczne pętle for w Pascalu i w C: for i := 1 to length(s) do... for (i = 1; i <= strlen(s); ++i)... Na pierwszy rzut oka pętle te powinny zachowywać się tak samo. Jest jednak istotna różnica: w Pascalu długość napisu s zostanie policzona tylko raz, a w języku C będzie ona liczona przy każdym obiegu pętli. To może prowadzić do fatalnego pogorszenia efektywności programu. Wniosek: trzeba dobrze znać semantykę języka programowania, by tworzyć efektywne programy. 38