Języki i paradygmaty
programowania
III.
Zmienne i typy
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-2
Języki imperatywne
●
Abstrakcyjne mechanizmy
na bazie
architektury von Neumanna
●
Dwa podstawowe składniki tej architektury to
procesor
i pamięć
●
„Abstrakcyjne mechanizmy”
– mamy do
dyspozycji narzędzia pozwalające wykorzystać
możliwości komputera bez zagłębiania się
w szczegóły techniczne
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-3
Zmienne
●
Zmienne są 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)
●
Odpowiedniość między zmiennymi
a komórkami pamięci może być bardzo
bezpośrednia (np. dla zmiennych typu
całkowitego) lub dość odległa
(np. wielowymiarowe tablice)
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-4
Atrybuty zmiennej
●
nazwa
●
adres
●
wartość
●
typ
●
okres życia
●
zakres widoczności
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-5
Nazwa
●
Cecha nie tylko zmiennych
●
Nazwa to szczegół techniczny, nie mający nic
wspólnego z przyjętym paradygmatem
–
Jakie znaki są dozwolone w nazwach?
–
Liczba dozwolonych znaków
–
Czy duże i małe litery są rozróżniane?
●
Nie każda zmienna ma nazwę
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-6
Adres a nazwa
●
Program może zawierać dwie różne zmienne
o tej samej nazwie
●
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
●
Także w drugą stronę: aliasowanie
●
Adres zwany jest czasem l-wartością
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-7
Aliasowanie
●
Niekiedy do tej samej komórki pamięci można
dotrzeć za pomocą różnych nazw
●
Tak jest np. wtedy, gdy dwa wskaźniki
ustawimy na ten sam adres:
int x, *p, *q; p = &x; q = &x;
●
Aliasowanie może prowadzić do przeoczeń
i niejasności w kodzie, lepiej go unikać, jeśli
to możliwe
język C
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-8
Wartość
●
Wartość to... wartość
●
Czasem zwana r-wartością
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-9
Typ
●
Typ to 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
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-10
Wiązania
●
Różne byty i ich atrybuty w różnych
momentach zostają powiązane
●
Wiązania dotyczą bardzo rozmaitych bytów –
takich jak zmienna, operator, wywołania
podprogramu
●
Wiązania dotyczą także ich cech – takich jak
wartość, typ, adres
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-11
Przykłady wiązań
●
Deklaracja zmiennej powoduje związanie
zmiennej z typem
●
Wykonanie instrukcji podstawienia powoduje
związanie zmiennej z (nową) wartością
●
W czasie projektowania języka programowania
jego twórca wiąże znak * z operacją mnożenia
●
W czasie implementacji kompilatora języka
typ int zostaje związany z zakresem liczb
całkowitych dostępnym na tej maszynie
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-12
●
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 jej kodem
●
W czasie wykonania programu zmienna
lokalna/dynamiczna zostaje związana
z przydzieloną jej na stosie/stercie pamięcią.
Przykłady wiązań
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-13
int x;
język C
...
x = x * 3;
●
Typ zmiennej jest wiązany w czasie kompilacji
●
Typ int jest wiązany z konkretnym zakresem liczb w
czasie projektowania kompilatora
●
*
jest wiązana z konkretnym działaniem arytmetycznym
dopiero w czasie kompilacji
●
Liczba 3 jest wiązana z konkretnym układem bitów
podczas projektowania kompilatora
●
Wartość zmiennej x jest wiązana z konkretną liczbą w
chwili wykonania podstawienia
Przykłady wiązań
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-14
Podział wiązań
●
wiązania statyczne
–
następują przed wykonaniem programu (w czasie
jego ładowania, kompilacji lub na wcześniejszych
etapach)
oraz
–
nie zmieniają się w trakcie działania programu
●
wiązania dynamiczne
–
następują w trakcie działania programu
lub
–
zmieniają się w trakcie działania programu
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-15
Wiązanie typu
●
Każda zmienna musi zostać związana z typem
przed pierwszym użyciem w programie
(a najpóźniej w momencie pierwszego użycia)
●
Jak określamy typ?
●
Kiedy następuje wiązanie?
(Czy wiązanie jest statyczne czy dynamiczne?)
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-16
Jak określamy typ zmiennej?
●
Zazwyczaj jawna deklaracja
●
Możliwa deklaracja niejawna (zwykle pierwsze
użycie zmiennej stanowi deklarację)
–
W przypadku deklaracji niejawnych konwencja
może określać typ
–
Fortran, niektóre wersje „starego” BASICa: pierwsza litera
nazwy wyznacza typ zmiennej, chyba że zmienna została
zadeklarowana jawnie
–
Perl: pierwszy znak nazwy (ale nie jest to litera lecz znak typu
$
, #, @) wyznacza typ
–
Wnioskowania o typie z kontekstu (ML, Haskell)
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-17
Kiedy następuje wiązanie?
●
Deklaracje
(jawne i niejawne!) dają
wiązanie statyczne
●
Przy wiązaniach dynamicznych, zmienna jest
wiązana z typem zwykle przy pierwszym
podstawieniu
pod nią wartości (np. PHP,
JavaScript)
●
Wiązanie dynamiczne gwarantuje
elastyczność
, ale ma dwie wady:
–
koszt
–
utrudnienie wykrywania błędów
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-18
Koszt dynamicznego wiązania typu
●
Zgodność typów musi być sprawdzana dynamicznie, czyli
w trakcie wykonania programu
─
wydłuża to jego czas
działanie
●
A więc z każdą zmienną trzeba przechowywać deskryptor
opisujący jej typ
─
zwiększa się rozmiar programu
●
Operacje na tej samej zmiennej mogą wymagać
zróżnicowanej ilości pamięci i różnych działań
(w zależności od typu)
●
Język taki musi być raczej interpretowany niż
kompilowany
, bo wygenerowanie odpowiedniego kodu
w czasie kompilacji jest bardzo skomplikowane a kod
nieefektywny i długi
2009-03-05
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
III
-19
Wnioskowanie o typie
●
fun f(x) = 2.0 * 3.14 * x;
●
fun g(x) = 2 * x;
●
fun h(x) = x * x;
●
fun h(x) : real = x * x;
●
fun h(x : real) = x * x;
●
fun h(x) = (x : real) * x;
●
fun h(x) = x * (x : real);
język ML