background image

Języki i paradygmaty 

programowania

III.

 Zmienne i typy

background image

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

background image

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)

background image

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

background image

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ę

background image

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ą

background image

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

background image

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ą

background image

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

background image

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

background image

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

background image

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ń

background image

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ń

background image

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

background image

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?)

background image

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)

background image

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

background image

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

background image

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