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