Semantyka i Weryfikacja Programów Laboratorium 1 - prz
Transkrypt
Semantyka i Weryfikacja Programów Laboratorium 1 - prz
Semantyka i Weryfikacja Programów Laboratorium 1 Wprowadzenie do semantyki denotacyjnej języka imperatywnego TINY Literatura: 1. Cameron R. D., Denotational semantics, w formie pdf dostępny na stronie www.cisek.prz rzeszow.pl 2. Gordon M. J. C., Denotacyjny opis języków programowania, WNT 1992 Podczas wykładów i laboratoriów stosowana jest notacja z [1]. 1. Wprowadzenie Dana jest semantyka denotacyjna języka TINY (Maly). .Dziedziny syntaktyczne to identyfikatory, wyrażenia i instrukcje oznaczane dalej jako. Składnia wyrażeń: Składnia instrukcji Stan programu (pamięć, wejście, wyjście): Pamięć jest odwzorowaniem zbioru identyfikatorów na wartości: Wejście i wyjście określono jako: Funkcja denotacyjna dla wyrażeń jest typu: Funkcja denotacyjna dla instrukcji jest typu: Denotacje dla wyrażeń w lambda-notacji : Pytania kontrolne: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Co to jest dziedzina semantyczna. Określ, co rozumiesz pod pojęciem wyrażenie. Co to instrukcja i czym istotnym różni się od wyrażenia. Co to jest stan programu i z jakich się składa elementów? Co to jest wartość? Jakiego może być typu w języku TINY. Jak rozumiesz pojęcie pamięć? Jak się wiąże z pojęciem identyfikator? Mówi się, że identyfikator w języku imperatywnym wiąże się z typem, wartością i adresem w pamięci. Jak to należy rozumieć? Jak zdefiniujesz pojęcie wejścia i wyjścia w języku imperatywnym. Odnieś to do pojęcia taśmy wejściowej i wyjściowej w modelu maszyny RAM. Co to jest funkcja semantyczna w semantyce denotacyjnej? Określ typ funkcji semantycznej dla wyrażeń. Wyjaśnij słownie posługując się językiem potocznym. Określ typ funkcji semantycznej dla instrukcji. Wyjaśnij słownie posługując się językiem potocznym. Opisz za pomocą algorytmu (graficznie) sposób obliczania wartości wyrażeń w języku TINY. Uwzględnij konieczność sprawdzenia zgodności typów. 1. Negacja 2. Porównanie 3. Suma arytmetyczna Opisz za pomocą algorytmu (graficznie) sposób wykonania instrukcji języka TINY. Uwzględnij na rysunku zmiany stanu programu 1. Instrukcja przypisania. 2. Instrukcja if...then...else fi. 3. Pętla while ... do ... od. 2. Przykłady realizacji programów – operatory logiczne Realizację brakujących operatorów logicznych w języku TINY można zrealizować za pomocą instrukcji if alternatywa p or q if p then y:= true else if q then y := true else y := false fi fi Narysuj schemat blokowy i sprawdź dla wszystkich czterech możliwych kombinacji poprawność realizacji funkcji. Wyniki umieść w tabeli. p q false false false true true false true true koniunkcja p and q y if not p then y:= false else if not q then y := false else y := true fi fi Narysuj schemat blokowy i sprawdź dla wszystkich czterech możliwych kombinacji poprawność realizacji funkcji. Wyniki umieść w tabeli. p q false false false true true false true true y – mnożenie jako wielokrotne dodawanie y := m * n iloczyn := 0; //instr1 licz := 0; //instr2 while not licz = n do //wyr iloczyn := iloczyn + m; //instr3 licz := licz +1 //instr4 od Sporządź schemat blokowy dla programu. Przeprowadź obliczenia sprawdzające dla danych m = 3 i n = 2. Wyniki obliczeń (stan programu) umieść w tabeli : Stan po: instr1 instr2 instr3 instr1 instr2 instr3 instr1 instr2 instr3 instr1 instr2 instr3 iloczyn licz not licz = n 3. Elementarne programy i ich poprawność programów Zad. 1. Czy poprawny jest podany niżej program: y := 1 + x Podaj, z jakich elementów składa się program. Określ słownie algorytm wykonywania działań. Powołaj się na funkcje semantyczne języka TINY. Jakie sytuacje mogą powodować powstanie błędu? Odpowiedź Program składa się z pojedynczej instrukcji przypisania. Zgodnie z regułą składniową 10. Po lewej stronie operatora przypisania występuje identyfikator, a po prawej wyrażenie. Zgodnie z funkcją denotacyjną wykonanie instrukcji polega na obliczeniu wartości wyrażenia. W tym przypadku jest to wyrażenie z operatorem +, stosuje się więc regułę 9. Mówi ona, że najpierw oblicza się wartość wyrażenia po lewej stronie operatora a następnie po prawej i jeżeli można je wyznaczyć i są to wartości numeryczne, to wartość wyrażenia jest sumą arytmetyczną operandów. Z lewej strony operator mamy wyrażenie stałe 1 jego wartością zgodnie z funkcją semantyczną nr 2 jest jeden. Z prawej strony mamy identyfikator, stosujemy regułę 6. Z treści programu nie wynika, czy identyfikatorowi x została przyporządkowana jakaś wartość w pamięci (jest warunek konieczny poprawności). Przyjmując, że tak, należy pamiętać, że wartość ta powinna być numeryczna (konieczne dla reguły 10). Zad. 2. Zbadaj poprawność podanego programu: x := 1 + true; Napisz na czym polega błąd (błędy). Powołaj się na właściwą funkcję semantyczną. Popraw ewentualne błędy. Określ stan programu po wykonaniu instrukcji. Zad. 3. Czy poprawny jest podany niżej program: x := 1 + 1 = 1 Wskazówka: Zastanów się, który operator + (dodawania) czy = (porównania) ma wyższy priorytet. Czy wynika to z funkcji semantycznych? Napisz na czym polega niejednoznaczność. Jakiego typu będzie zmienna x. Zad. 4. Zapisz w języku TINY instrukcję: y := x>0 Do jakiej dziedziny należą zmienne x i y? Wskazówka: Ponieważ w języku TINY liczby mogą być tylko nieujemne można użyć operatora porównania i negacji. Zad. 5. Zapisz w języku TINY instrukcję: y := x>1 Wskazówka: Użyj dwukrotnie (zagnieżdżonej) instrukcji if … then … else … fi. Zwróć uwagę na średniki (czy są potrzebne?). Przed napisaniem programu sporządź algorytm. Do jakiej dziedziny należą zmienne x i y? Zad. 6. Napisz program obliczający sumę dwóch liczb wprowadzanych ze strumienia wejściowego (instrukcja read). Wynik wyprowadzany jest do strumienia wyjściowego (output). Zacznij od sporządzenia algorytmu. Zad. 7. Poniżej dany jest program x := read; y := read; i := 0; koniec := false; y_wieksze_x := false; while (not koniec) do if x = i then y_wieksze_x:=true; koniec:=true else if y = i then y_wieksze_x: = false; koniec := true else i:= i+1 fi fi od; if y_wieksze_x then output y else output x fi Czy program ten jest składniowo poprawny (zwróć szczególną uwagę na użycie średników). Narysuj schemat blokowy. Wypisz kolejno warunki poprawnego zakończenia programu wynikające z funkcji semantycznych. Czy pętla while może być tu nieskończona? Wykonaj obliczenia dla danych podanych przez prowadzącego.