Paradygmaty programowania - Katedra Informatyki > Home
Transkrypt
Paradygmaty programowania - Katedra Informatyki > Home
Składnia języka programowania • Składnia języka programowania opisuje: Paradygmaty programowania – Rodzaje dostępnych symboli. – Zasady, według których symbole mogą być łączone w większe struktury. Semantyka zmiennych • Czyli jest to zbiór reguł, mówiących jak wygląda poprawny program w danym języku, np.: • Jak tworzy się polecenia i wyraŜenia • Jaką postać mają struktury sterowania (if, while, for itp.) • Jak zapisuje się deklaracje Cezary Bolek Katedra Informatyki UŁ Paradygmaty programowania Cezary Bolek Semantyka języka programowania Zmienne - idea • Semantyka języka programowania definiuje precyzyjnie znaczenie poszczególnych symboli oraz ich funkcję w programie • Imperatywne języki programowania oferują abstrakcyjne mechanizmy na bazie architektury von Neumanna. – Dwa podstawowe składniki tej architektury to procesor i pamięć. – Rodzaje dostępnych symboli. – Zasady, według których symbole mogą być łączone w większe struktury. • Określenie „abstrakcyjne mechanizmy” oznacza, Ŝe mamy do dyspozycji narzędzia pozwalające wykorzystać moŜliwości komputera bez zagłębiania się w szczegóły techniczne. • Jednym z takich mechanizmów są zmienne. Stanowią one abstrakcję komórek pamięci: programista moŜe przechowywać dane w pamięci, nie martwiąc się o techniczne szczegóły (np. przydział pamięci). • Semantykę najczęściej definiuje się słownie, poniewaŜ większość z jej zagadnień jest trudna lub wręcz niemoŜliwa do ujęcia w jakikolwiek formalizm. • Część błędów semantycznych moŜna wychwycić juŜ w momencie wstępnego przetwarzania kodu programu, np. próbę odwołania się do nieistniejącej funkcji, lecz inne mogą ujawnić się dopiero w trakcie wykonywania. Paradygmaty programowania Cezary Bolek 2 3 Paradygmaty programowania Cezary Bolek 4 1 Zmienna - atrybuty Nazwa zmiennej • Zmienna to w języku programowania abstrakcja komórek pamięci. KaŜda zmienna ma sześć istotnych atrybutów: • Nazwa jest cechą zmiennych, ale takŜe innych bytów (funkcji, metod, typów itp.) • O moŜliwościach definiowania nazw decyduje: – Jakie znaki są dozwolone w nazwach? Tradycyjnie są to litery, cyfry i zwykle znak podkreślenia. Ale np. najnowsza wersja języka Ada (2005) przewiduje uŜycie dowolnych znaków z zestawu Unicode. – Liczba dozwolonych znaków: współczesne języki nie nakładają istotnych ograniczeń. Warto jednak pamiętać, Ŝe ze względu na zgodność z zewnętrznymi zasobami systemu operacyjnego nie wszystkie znaki muszą być brane pod uwagę przy rozróŜnianiu nazw. – Czy duŜe i małe litery są rozróŜniane? Typ Wartość Nazwa Zmienna • Nie kaŜda zmienna ma nazwę: przydzielając pamięć za pomocą new (w języku C++) tworzymy zmienną bez nazwy (nazwę ma uŜyty wskaźnik, ale nie sama zmienna). Zakres widoczności Adres Okres Ŝycia Paradygmaty programowania Cezary Bolek 5 Paradygmaty programowania Adres zmiennej • Wartość – Jest to zawartość komórki pamięci związanej z daną zmienną. – Zwana niekiedy r-wartością (gdyŜ ją właśnie odczytujemy, gdy zmienna występuje po prawej stronie przypisania). – Słowa „podprogram” uŜywany tutaj w znaczeniu dowolnej jednostki kodu, która moŜe być wywoływana. Podprogramami są zatem funkcje, procedury, metody itp. • Ta sama zmienna lokalna moŜe mieć róŜne adresy w czasie róŜnych wywołań tego samego podprogramu. • Nie ma zatem jednoznacznej odpowiedniości między nazwą a adresem. • BieŜący adres zmiennej zwany jest l-wartością; to określenie bierze się stąd, Ŝe właśnie l-wartość jest potrzebna po lewej stronie instrukcji przypisania. Cezary Bolek 6 Wartość i typ zmiennej • Program moŜe zawierać dwie zmienne o tej samej nazwie, nie mające ze sobą nic wspólnego, np. dwie zmienne lokalne w dwóch róŜnych podprogramach. Paradygmaty programowania Cezary Bolek • Typ – Zbiór dopuszczalnych wartości, jakie zmienna moŜe przyjmować. – Gdy mówimy o zmiennych w reprezentacji zmiennopozycyjnej, typ określa teŜ precyzję, z jaką liczby są reprezentowane. – Z typem wiąŜe się równieŜ zbiór operacji dopuszczalnych dla danej zmiennej. 7 Paradygmaty programowania Cezary Bolek 8 2 Wiązania Wiązania - przykłady • W czasie projektowania języka programowania jego twórca wiąŜe gwiazdkę (znak) z operacją mnoŜenia. • W czasie implementowania języka na konkretnej maszynie (czyli w czasie projektowania kompilatora) typ int zostaje związany z zakresem liczb całkowitych dostępnym na tej maszynie. • W czasie kompilacji zmienna zostaje związana z zadeklarowanym dla niej typem. • W czasie ładowania programu do pamięci zmienna statyczna zostaje związana z konkretnym adresem w pamięci. • W czasie konsolidacji wywołanie funkcji bibliotecznej zostaje związane z kodem tej funkcji. • W czasie wykonania programu zmienna lokalna zostaje związana z przydzieloną jej na stosie pamięcią. • W językach programowania istotnym jest problem wiązania bytów: – zmienna, operator, wywołania podprogramu • oraz atrybutów: – cech takich jak wartość, typ, adres • Przykładowo: – deklaracja zmiennej powoduje związanie zmiennej z typem, zaś wykonanie instrukcji podstawienia powoduje związanie zmiennej z (nową) wartością. Paradygmaty programowania Cezary Bolek 9 Przykład wiązań – Pascal Cezary Bolek Cezary Bolek 10 Wiązania statyczne i dynamiczne • Wiązania statyczne to te, które następują przed wykonaniem programu i nie zmieniają się w trakcie jego działania. • Typ zmiennej x jest wiązany var (z Integer) w czasie kompilacji. x:Integer; • Sam typ Integer jest wiązany ... z konkretnym zakresem liczb x := x * 3; całkowitych w czasie projektowania kompilatora. • Gwiazdka jest wiązana z konkretnym działaniem arytmetycznym (dopiero) w czasie kompilacji. W tym przypadku nie wcześniej, gdyŜ konkretne znaczenie gwiazdki zaleŜy od typu operandów; gdyby jeden z nich był typu Real, to gwiazdka oznaczałaby mnoŜenie zmiennopozycyjne, a nie całkowite. • Wewnętrzna reprezentacja liczby 3 jest wiązana z pewnym układem bitów w trakcie projektowania kompilatora. • Wartość zmiennej x jest wiązana z konkretną liczbą w chwili wykonania podstawienia. Paradygmaty programowania Paradygmaty programowania – W praktyce określenie „statycznie” oznacza „w czasie kompilacji” • Wiązania dynamiczne to te, które następują lub zmieniają się w trakcie działania programu. – w praktyce, „w czasie wykonania programu” 11 Paradygmaty programowania Cezary Bolek 12 3 Wiązania typu Wiązania typu – określenie typu zmiennej • We współczesnych językach zazwyczaj występuje jawna deklaracja. • Bywają teŜ deklaracje niejawne, np. pierwsze uŜycie zmiennej moŜe stanowić deklarację. • W przypadku deklaracji niejawnych konwencja moŜe określać typ. • KaŜda zmienna musi zostać związana z typem przed pierwszym uŜyciem w programie. Rozpatrywane są dwa aspekty tej sprawy: – Jak określamy ów typ ? – Kiedy następuje wiązanie ? – W Fortranie pierwsza litera nazwy wyznacza typ zmiennej, chyba Ŝe zmienna została zadeklarowana jawnie (taka dowolność bywa myląca...). – W Perlu „zasada pierwszego znaku” jest obligatoryjna. • Występuje takŜe mechanizm wnioskowania o typie z kontekstu, np. w języku ML i Haskell Paradygmaty programowania Cezary Bolek 13 Wiązania typu – moment wiązania 14 • Powody wysokiego koszty wiązania dynamicznego: – Zgodność typów musi być sprawdzana dynamicznie, czyli w trakcie wykonania programu coo oznacza, Ŝe kaŜda wraz z kaŜdą zmienną trzeba przechowywać deskryptor opisujący jej typ. – Operacje na zmiennej są trudniejsze, gdyŜ wartości róŜnych typów mogą wymagać pamięci o zróŜnicowanym rozmiarze i zróŜnicowanych działań. – W praktyce język z dynamicznymi typami musi być interpretowany a nie kompilowany: – jest kosztowne (trzeba dynamicznie sprawdzać typ) – utrudnia wykrywanie błędów (kompilator ma małe szanse wykryć niezgodność typów). Cezary Bolek Cezary Bolek Wiązanie dynamiczne - koszt • Deklaracje dają wiązanie statyczne. • Przy wiązaniach dynamicznych, zmienna jest wiązana z typem przy pierwszym podstawieniu pod nią wartości, np. w PHP i JavaScripcie • Wiązanie dynamiczne gwarantuje elastyczność, ale ma dwie wady: Paradygmaty programowania Paradygmaty programowania • w czasie kompilacji nie wiadomo, co będą zawierały zmienne, więc nie da się wygenerować odpowiedniego kodu. 15 Paradygmaty programowania Cezary Bolek 16 4 Przykład wnioskowania o typie Wiązanie pamięci - pojęcia • W języku funkcyjnym ML: fun f(x) = 2.0 * 3.14 * x; • W funkcji f pojawiają się stałe fun g(x) = 2 * x; zmiennopozycyjne, więc ML fun h(x) = x * x; wnioskuje, Ŝe i parametr, i wynik funkcji są typu zmiennopozycyjnego (real). • Analogicznie w funkcji g ML wnioskuje, Ŝe parametr i wynik są typu całkowitego. • W funkcji h wiadomo tylko, Ŝe chodzi o wartości liczbowe (ze względu na występowanie operatora mnoŜenia). Jako „domyślny” typ liczbowy przyjmowany jest typ całkowity, dlatego ten właśnie typ przypisywany jest parametrowi i wynikowi funkcji. • Jeśli określić, by funkcja h działała na liczbach fun h(x) : real = x * x; zmiennopozycyjnych, wystarczyłoby jawnie wskazać fun h(x : real) = x * x; typ real choćby w jednym miejscu, fun h(x) = (x : real) * x; przy parametrze lub wyniku. fun h(x) = x * (x : real); Paradygmaty programowania Cezary Bolek 17 • Okres Ŝycia zmiennej to czas, w którym jest ona związana z konkretnym miejscem w pamięci. • Alokacja (przydział) pamięci oznacza pobranie bloku pamięci odpowiedniej wielkości z puli wolnej pamięci i związanie go ze zmienną. • Dealokacja (zwolnienie) pamięci oznacza unicestwienie wiązania bloku pamięci ze zmienną i oddanie go do puli wolnej pamięci. • Okres Ŝycia zmiennej to zatem czas pomiędzy alokacją a dealokacją. Paradygmaty programowania Cezary Bolek Wiązanie pamięci – kategorie zmiennych Wiązanie pamięci – zmienne statyczne • Statyczne — mówimy wówczas o zmiennych statycznych. • Dynamiczne na stosie — najczęściej mówi się o zmiennych automatycznych lub po prostu lokalnych (oczywiście lokalność odnosi się w istocie nie do okresu Ŝycia, lecz do zakresu widoczności). • Dynamiczne na stercie, jawne. • Dynamiczne na stercie, niejawne. • Wiązane z miejscem w pamięci przed rozpoczęciem wykonania programu; wiązanie to nie zmienia się w trakcie wykonania. • Zaleta: Efektywne, ze względu na bezpośrednie adresowanie. • Wada: Mało elastyczne, nie mogą być uŜywane do obsługi wywołań rekurencyjnych. • Przykład: Zmienne globalne oraz zmienne zadeklarowane jako static w języku C. • Uwaga: W językach takich jak C++, C# i Java deklaracja zmiennej z uŜyciem static pojawiająca się wewnątrz definicji klasy nie oznacza zmiennej statycznej w powyŜszym rozumieniu, a jedynie zmienną klasową (wspólną dla całej klasy). Paradygmaty programowania Cezary Bolek 19 Paradygmaty programowania Cezary Bolek 18 20 5 Wiązanie pamięci – zmienne dynamiczne na stosie Zmienne dynamiczne na stercie, jawne • Alokowane przez programistę w trakcie wykonania programu za pomocą jawnych poleceń, np. new, malloc. • Dealokowane równieŜ jawnie (w C i C++ za pomocą free i delete) lub niejawnie poprzez mechanizm odśmiecania (Java, C#). • Nie mają nazwy; dostępne są poprzez wskaźnik lub referencję. • Zalety: Mogą być uŜywane do tworzenia dynamicznych struktur danych, np. list wiązanych i drzew. • Wady: Niska efektywność z powodu pośredniego trybu adresowania i skomplikowanego zarządzania stertą. TakŜe duŜe ryzyko naduŜyć ze strony nieostroŜnego programisty. • Uwaga: W kodzie obok int *p; wiązanie typu jest statyczne; p = new int; dynamiczne jest natomiast ... wiązanie pamięci. • Wiązane z pamięcią w chwili, gdy wykonanie programu dociera do ich deklaracji. • Pamięć przydzielana na stosie. • Pamięć zwalniana, gdy kończy się wykonanie bloku zawierającego daną zmienną. • Dla typowych zmiennych prostych (całkowite, zmiennopozycyjne) wszystkie atrybuty z wyjątkiem pamięci są wiązane statycznie. • Zalety: Mogą być uŜywane w wywołaniach rekurencyjnych. • Mniejsza efektywność ze względu na pośrednie adresowanie, narzut związany z alokacją i dealokacją, brak „historii” (kaŜde wywołanie podprogramu tworzy nową instancję zmiennych). • Przykład: Zmienne lokalne w funkcjach w języku C i w metodach w Javie. Paradygmaty programowania Cezary Bolek delete p; 21 Zmienne dynamiczne na stercie, niejawne • Przykład: Napisy i tablice w Perlu. • Zalety: Elastyczność posunięta do granic. • Wady: Wysoki koszt, związany z dynamicznym przechowywaniem atrybutów. Trudne wykrywanie błędów. Cezary Bolek Cezary Bolek 22 Zakres widoczności zmiennej • Zakres widoczności zmiennej to zbiór tych instrukcji programu, w których zmienna ta jest widoczna, tzn. moŜna się do niej odwołać. • Mówi się, Ŝe zmienna jest lokalna (w jednostce programu lub w bloku), jeśli jest zadeklarowana w tej jednostce. • Mówimy się, Ŝe zmienna jest nielokalna, jeśli jest widoczna, ale zadeklarowana gdzie indziej. • Zasady rozstrzygania zakresu w danym języku mówią, w jaki sposób odwołania do nazw są wiązane ze zmiennymi. • Alokowane i dealokowane niejawnie w trakcie wykonania programu w chwili wykonania podstawienia. Paradygmaty programowania Paradygmaty programowania 23 Paradygmaty programowania Cezary Bolek 24 6 Zakres widoczności a okres Ŝycia • Zakres widoczności i okres Ŝycia to dwa róŜne pojęcia. • Zakres widoczności to pojęcie związane z rozmieszczeniem kodu, czyli przestrzenią. • Okres Ŝycia to pojęcie związane z czasem. W wielu typowych sytuacjach jest między nimi związek. • Przykładowo, rozwaŜając zmienną zadeklarowaną w metodzie, która nie wywołuje innych metod. – Jej zakres widoczności rozciąga się od deklaracji do końca metody. – Jej okres Ŝycia zaczyna się przy wejściu do metody i kończy się w chwili, gdy kończy się wykonanie metody. W tym przypadku obydwa pojęcia są bardzo bliskie. Paradygmaty programowania Cezary Bolek 25 7