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