Paradygmaty programowania/Ćwiczenia 2: Semantyka zmiennych

From Studia Informatyczne

Spis treści

Zadanie 1

Wymienić momenty, w których mogą następować wiązania różnych rodzajów.

Zadanie 2

Jakie zmienne w C++ są zawsze aliasowane?

Zadanie 3

Napisz funkcję, w której przydatna będzie „zmienna z historią”, czyli zmienna, której wartość nie znika pomiędzy wywołaniami funkcji. Jak powołać do życia taką zmienną w języku C (lub podobnym)?

Zadanie 4

Zapisz przykładową instrukcję podstawienia w paru znanych Ci językach. Określ, jakie wiązania wchodzą tu w grę. Kiedy następują? Czy są różnice pomiędzy językami? Zrób to samo dla przykładowego wywołania funkcji.

Zadanie 5

Podaj przykłady języków, które mają niejawną dealokację pamięci ze sterty.

Zadanie 6*

Obiekty w języku C++ mogą być dynamiczne na stosie lub na stercie. Czy w Javie jest tak samo? Jaki to ma związek z metodami polimorficznymi?

Wskazówka:

Zastanów się nad rozmiarem pamięci potrzebnej do przechowywania obiektu z pewnej klasy i obiektu z klasy rozszerzającej tę pierwszą.

Zadanie 7

Jaki jest związek dynamicznego wiązania typu z niejawną alokacją zmiennych na stercie?

Zadanie 8

Na czym polega różnica między podtypem a typem pochodnym w Adzie?

Zadanie 9

Rozważmy program napisany w składni języka Ada. Jaka wartość zostanie wydrukowana przez Put, jeśli zakresy są ustalane statycznie? Jaka przy dynamicznym ustalaniu zakresów?

     procedure Main is
       X: Integer;
       procedure PrA is begin Put(X) end;
       procedure PrB is X: Integer; begin X := 1; PrA end;
       begin X := 2; PrB end;

Zadanie 10

Rozważmy poniższy program. Co zostanie wypisane, jeśli zakresy są ustalane statycznie? Co przy dynamicznym ustalaniu zakresów?

     int x = 2;
     int y = 1;
     
     void f() {
       x = x + 1;
       y = y + 2;
       print(x, y);
     }
     
     void g() {
       int x = 1;
       x = x + 2;
       y = y + 1;      
       print(x, y);
       f();      
     }
     
     void main() {
       g();
       f();
     }