Concepte fundamentale ale limbajelor de...

35
Concepte fundamentale ale limbajelor de programare Atributele entitatilor de program. Legarea dinamica a atributelor Curs 05 conf. dr. ing. Ciprian-Bogdan Chirila

Transcript of Concepte fundamentale ale limbajelor de...

Concepte

fundamentale ale

limbajelor de

programareAtributele entitatilor de program. Legarea

dinamica a atributelor

Curs 05

conf. dr. ing. Ciprian-Bogdan Chirila

Cuprins

Domeniul variabilelor

Durata de viata a variabilelor

Alocarea memoriei

Valorile variabilelor

Tipurile variabilelor

Atribute de program

Un limbaj de programare opereaza cu mai multe

entitati:

variabile

constante

subprograme

tipuri

instructiuni

Entitatile

pot avea un nume – cand le este asociat un identificator

pot fi anonime

de ex. cand obiectele sunt referite de pointeri

Numele este doar unul din posibilele atribute ale unei

entitati

Atribute de program

In limbajele de programare imperative:

o variabila are

nume

tip

adresa de memorie

un subprogram are

nume

parametri formali

secventa de actiuni asociate

o instructiune are

actiuni implicite

Legarea

asocierea dintre o entitate si atributele

acesteia se numeste legare

limbajele de programare se diferentiaza

prin modul in care atributele sunt legate

la entitati

legarea atributelor poate fi

implicita

explicita

Exemple

Pentru variabilele din Fortran:

legarea numelui se face

in primul loc unde variabila este folosita

legarea tipului

depinde de numele variabilei

I,J,K,L,M,N – intregi

alte nume – real

sau prin declarare explicita

In ML:

numele, tipul si valoarea variabilei sunt legate in

momentul atribuirii

Exemple

redundanta utila se obtine

prin legarea explicita a atributelor

declaratiile din Pascal, C, Java

Momentul legarii atributelor

Legarea la definirea limbajului

Legarea la compilare

Legarea la executie

Legarea la definirea

limbajului

In C:

identificatorii speciali: char, int, float, …

sunt asociati cu multimile de valori corespunzatoare

In Pascal:

Constantele: true, false, Maxint

Tipurile: integer, real, char

Functiiile: abs, trunc, chr, ord

In Java:

null este legat prin definite

null este asociat pointerului vid

Legarea la compilare

tipuri de variabile

var i:integer; (Pascal)

int i; (C)

valori constante

const a=3; (Pascal)

tipuri si valori

int a=3; (Java)

Legarea la momentul

executiei

atribuirea de valori unei variabile

Legarea statica

inainte de executie

In definitia limbajului

la momentul compilarii

nu poate fi schimbata ulterior

Legarea dinamica

in momentul executiei

poate fi schimbata ulterior

Variabile

domeniu

durata de viata

valoare

tip

nume

daca nu este anonima si referita de pointer

Domeniul variabilei

zona de program unde variabila este cunoscuta si

folositoare

variabila

este vizibila in domeniu

este invizibila in afara domeniului

conceptul de domeniu este legat de

context

mediu

Domeniul variabilei

context

toate variabilele cu valori intr-un punct al programului

mediu

subdomeniu definit in mod explicit pentru una sau mai

multe variabile

de exemplu: corpul functiei este mediul pentru

variabilele locale si parametri

Legarea statica a

domeniului

reguli clasice pentru limbajele de programare bazate peblocuri

domeniul unei variabile este blocul unde aceasta a fostdeclarata si toate blocurile sale interne

variabila este invizibila in afara acelui bloc in care ea a fostdefinita

domeniul variabilei

este determinat de structura lexicala a programului

este determinata static de textul programului

nu depinde de dinamica executiei

orice referinte de variabila va fi relationata de catrecompilator cu declararea (implicita sau explicita) a acesteia

astfel rezulta o legare statica a domeniului

Exemplu in limbajul Pascal

program domain;

var x:integer;

procedure f;

begin

write(x) { refers to globally declared x }

end;

procedure f1(x:integer);

begin

f

end;

begin { main program }

x:=10;

f; { 10 is printed }

f1(5); { 10 is printed }

end.

Comentarii la exemplu

procedura f refera variabila x care este globala

nu conteaza de unde este aceasta apelata

in legarea statica a domeniului

declaratia valida este cautata in mediul in care este

referita

daca lipseste atunci este cautata in mediile externe

este cazul pentru

Pascal, Ada, C, Java, Fortran, Modula 2

Legarea dinamica a

domeniului

domeniul variabilei

este determinat in timpul executiei programelor

depinde de calea de executie

variabila se leaga la o declaratie care

este vizibila in textul programului

este determinata in timpul executiei

o declaratie de variabila devine disponibila cand

este intalnita pe o cale de executie

leaga de ea toate referintele viitoare la numele aceleivariabile

pana cand apare o noua declaratie cu acelasi nume

Exemplu in limbajul Lisp

(setq x 10)

(defun f()

(print x))

; may refer the global x or the parameter

x

(defun f1(x)

(f))

- print x se poate referi la variabila globala x sau la parametrul x

- legarea se face in momentul executiei

Comentarii la exemplu

(f)

se afiseaza 10

valoarea variabilei globale x

(f1 5)

se afiseaza 5

valoarea parametrului x

legarea dinamica a domeniului

afecteaza lizibilitatea programelor

faciliteaza implementarea limbajelor interpretate

este prezenta in limbajele functionale de ex. Lisp sau APL

Legarea statica a

domeniului in Lisp

prezenta in versiunile noi de Lisp

Scheme

Common Lisp

Example

>(defun f1(x) (f))

>(defun f( ) x)

>(f1 5)

*** - EVAL: variable X has no value

Comentarii

valoarea lui x din functia f este cautata

static in mediul lui f

apoi in maniera globala

daca nu este definit acolo

se genereaza o eroare

Legarea dinamica a domeniului

la cererea programatorului

in Common-Lisp

variabile locale speciale

>(defun f1(x)

(declare (special x))

(f))

>(defun f()

x)

>(f1 5)

5

Legarea dinamica a domeniului

la cererea programatorului

variabile definite global

>(defvar x)

>(defun f1(x)

(f))

>(defun f(x)

x)

>(f1 5)

5

Timpul de viata al variabilei

intervalul de timp in care o zona de memorie este

asociata cu variabila

asocierea unei zone de memorie unei variabile se

numeste alocare

Alocarea

Statica

inainte de executie

o anumita zona de memorie decisa la compilare

va ramane asociata pe tot parcursul executiei

programului

Dinamica

alocarea este facuta in timpul executiei programului

zona de memorie poate fi eliberata ulterior

Alocarea dinamica

automata

fara cerere din partea programatorului

la cerere

prin cerere din partea programatorului

cu instructiuni de tipul: new, malloc, calloc, realloc

Alocarea memoriei

nu este specifica limbajului de programare

depinde de decizia implementatorului

Exemple de alocare de

memorie

Fortran si Cobol

alocarea memoriei variabilelor se face static in majoritateaimplementarilor

pot fi echipate de asemenea cu alocarea dinamica a memoriei

Pascal, C, Java

pentru variabilele declarate local se foloseste alocareadinamica

la fel ca la un aple de functie toate variabilele locale sunt alocate pe stiva

dupa apel stiva este curatata

alocarea memoriei bazata pe organizare de stiva

Exemple de alocare de

memorie

alocare definitta de programator

In limbajul de programare C

in interiorul functiei

in mod implicit este dinamica

statica daca este folosit cuvantul cheie “static”

in afara functiilor

in mod implicit este static

Lisp si Prolog

alocarea si eliberarea memoriei

nu sunt bazate pe modelul de stiva

obiectele pot fi create si distruse la momente arbitrare la

rulare

limbaje dinamice

Valorile variabilei

valoarea este legata dinamic

atribuirea schimba valoarea variabilei

valoarea poate fi legata static

in cazul constantelor

valoarea nu poate fi modificata in timpul vietii acestora

Momentul legarii

la compilare

Constantele in Pascal

constantele sau expresiile formate din constante in Ada

constante definite cu directiva define in C

la compilare constantele legate se numesc constante

manifest

la executie

expresia de constante poate contine variabile si operatori

C, Ada, Algol

const int k=3*i+j;

k: constant integer:=3*i+j;

Tipul variabilei

Determina

valoarea pe care o variabila o poate avea

setul de operatii ce poate crea si modifica aceste valori

legarea statica

la compilare

implicita

in Fortran tipul este dat de prima litera a identificatorului

constantele Pascal const k=3;

explicita

Pascal var x:integer;

C, Java int x;

Tipul variabilei

Lisp si ML

tipul este legat dinamic

aceeasi variabila poate avea tipuri de valori asociate

diferite

CAML (ML dialect)

# let a=2*2;

val a:int=4

#a;;

-:int=4

Tipul variabilei

Lisp

defun f(x) (car x))

(setq y ‘a)

-----------------------

(setq y ‘(a b))

-----------------------

(f y)