Paradygmaty programowania - Katedra Informatyki > Home
Transkrypt
Paradygmaty programowania - Katedra Informatyki > Home
Paradygmaty programowania Semantyka zmiennych Cezary Bolek Katedra Informatyki UŁ Składnia języka programowania • Składnia języka programowania opisuje: – Rodzaje dostępnych symboli. – Zasady, według których symbole mogą być łączone w większe struktury. • 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 Paradygmaty programowania Cezary Bolek 2 Semantyka języka programowania • Semantyka języka programowania definiuje precyzyjnie znaczenie poszczególnych symboli oraz ich funkcję w programie – Rodzaje dostępnych symboli. – Zasady, według których symbole mogą być łączone w większe struktury. • 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 3 1 Zmienne - idea • Imperatywne języki programowania oferują abstrakcyjne mechanizmy na bazie architektury von Neumanna. – Dwa podstawowe składniki tej architektury to procesor i pamięć. • 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). Paradygmaty programowania Cezary Bolek 4 Zmienna - atrybuty • Zmienna to w języku programowania abstrakcja komórek pamięci. KaŜda zmienna ma sześć istotnych atrybutów: Typ Wartość Nazwa Zmienna Zakres widoczności Adres Okres Ŝycia Paradygmaty programowania Cezary Bolek 5 Nazwa zmiennej • • 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? • 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). Paradygmaty programowania Cezary Bolek 6 2 Adres 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. – 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. Paradygmaty programowania Cezary Bolek 7 Wartość i typ 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). • 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. Paradygmaty programowania Cezary Bolek 8 Wiązania • 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 3 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ą. Paradygmaty programowania Cezary Bolek 10 Przykład wiązań – Pascal • • • • • 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 Cezary Bolek 11 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. – 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” Paradygmaty programowania Cezary Bolek 12 4 Wiązania typu • 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 ? Paradygmaty programowania Cezary Bolek 13 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. – 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 14 Wiązania typu – moment wiązania • 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: – jest kosztowne (trzeba dynamicznie sprawdzać typ) – utrudnia wykrywanie błędów (kompilator ma małe szanse wykryć niezgodność typów). Paradygmaty programowania Cezary Bolek 15 5 Wiązanie dynamiczne - koszt • 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: • w czasie kompilacji nie wiadomo, co będą zawierały zmienne, więc nie da się wygenerować odpowiedniego kodu. Paradygmaty programowania Cezary Bolek 16 Przykład wnioskowania o typie • • • • • 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 Wiązanie pamięci - pojęcia • 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 18 6 Wiązanie pamięci – kategorie zmiennych • 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. Paradygmaty programowania Cezary Bolek 19 Wiązanie pamięci – zmienne statyczne • 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 20 Wiązanie pamięci – zmienne dynamiczne na stosie • 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 21 7 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. delete p; Paradygmaty programowania Cezary Bolek 22 Zmienne dynamiczne na stercie, niejawne • Alokowane i dealokowane niejawnie w trakcie wykonania programu w chwili wykonania podstawienia. • 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. Paradygmaty programowania Cezary Bolek 23 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. Paradygmaty programowania Cezary Bolek 24 8 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 9