SW wykład 2 - Slajd19: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
(Nie pokazano 1 wersji utworzonej przez jednego użytkownika) | |||
Linia 1: | Linia 1: | ||
{{Szablon:Semantyka i weryfikacja programów/Wykład 2}} | {{Szablon:Semantyka i weryfikacja programów/Wykład 2}} | ||
[[Grafika:sw0218.png|frame|center|]] | [[Grafika:sw0218.png|frame|center|]] | ||
Przystępujemy teraz do przedstawienia pierwszej, może najbardziej | |||
oczywistej przez jej związek z rzeczywistymi obliczeniami, metody | |||
opisu semantyki języków programowania. Dla instrukcji naszego | |||
przykładowego języka TINY podamy semantykę operacyjną w stylu | |||
określanym często jako semantyka małych kroków. | |||
Na powyższym slajdzie przedstawiamy wstępnie jej | |||
najważniejsze pojęcia. | |||
Jak będzie za chwilę widać na przykładzie, kluczowe jest tu pojęcie | |||
konfiguracji. O konfiguracjach należy myśleć jako o rzeczywistych | |||
konfiguracjach maszyny realizującej programy naszego | |||
języka. Oczywiście, na ogół konfiguracje abstrahują od pewnych | |||
szczegółów, które konfiguracje rzeczywistych maszyn muszą w sobie | |||
zawierać. W każdym razie, konfiguracje zawierać będą w jakiejś postaci | |||
zarówno sam realizowany program (a przynajmniej tę jego część, której | |||
realizacja nie została jeszcze zakończona), jak i pewną reprezentację | |||
stanu obliczeń maszyny. | |||
Dla takich konfiguracji definiujemy relację przejścia: z grubsza, | |||
modelować ma ona pojedynczy krok maszyny realizującej | |||
programy. Obliczenie to po prostu ciąg kolejnych takich kroków, z | |||
których każdy następny rozpoczyna się w tej konfiguracji, do której | |||
doprowadził krok poprzedni. O obliczeniu, które rozpoczyna się od | |||
konfiguracji zawierającej pewną instrukcję, będziemy niekiedy mówić, | |||
że jest to obliczenie dla tej instrukcji, albo jeszcze krócej: | |||
obliczenie tej instrukcji. | |||
Określimy też zbiór tych konfiguracji, które odpowiadają zakończeniu | |||
obliczeń programu. | |||
Przyjmujemy przy tym, że dla każdego programu w danym języku | |||
programowania, wśród konfiguracji umieścimy konfigurację, która | |||
zawiera ten właśnie program jako "program do wykonania" w pewnym | |||
ustalonym otoczeniu początkowym. Wówczas zbiór możliwych obliczeń | |||
rozpoczynających się od takiej konfiguracji początkowej opisuje | |||
semantykę tego programu, a realizacja języka musi zapewnić, że | |||
rzeczywiste obliczenia maszyny dla tego programu odpowiadać będą | |||
obliczeniom opisanym przez semantykę. |
Aktualna wersja na dzień 11:08, 27 wrz 2006
Składnia Składnia konkretna Składnia abstrakcyjna Przyjmowane założenia Przykład wiodący Kategorie składniowe Kategorie składniowe, c.d. Uwagi Indukcja strukturalna Definicje indukcyjne Kategorie semantyczne Wartościowanie zmiennych Semantyka wyrażeń Semantyka wyrażeń logicznych Semantyka instrukcji Prosty fakt Dowód Przezroczystość odwołań Semantyka operacyjna Obliczenia Semantyka operacyjna Tiny Własności Własności, c.d. Warianty definicji

Przystępujemy teraz do przedstawienia pierwszej, może najbardziej oczywistej przez jej związek z rzeczywistymi obliczeniami, metody opisu semantyki języków programowania. Dla instrukcji naszego przykładowego języka TINY podamy semantykę operacyjną w stylu określanym często jako semantyka małych kroków.
Na powyższym slajdzie przedstawiamy wstępnie jej najważniejsze pojęcia.
Jak będzie za chwilę widać na przykładzie, kluczowe jest tu pojęcie konfiguracji. O konfiguracjach należy myśleć jako o rzeczywistych konfiguracjach maszyny realizującej programy naszego języka. Oczywiście, na ogół konfiguracje abstrahują od pewnych szczegółów, które konfiguracje rzeczywistych maszyn muszą w sobie zawierać. W każdym razie, konfiguracje zawierać będą w jakiejś postaci zarówno sam realizowany program (a przynajmniej tę jego część, której realizacja nie została jeszcze zakończona), jak i pewną reprezentację stanu obliczeń maszyny.
Dla takich konfiguracji definiujemy relację przejścia: z grubsza, modelować ma ona pojedynczy krok maszyny realizującej programy. Obliczenie to po prostu ciąg kolejnych takich kroków, z których każdy następny rozpoczyna się w tej konfiguracji, do której doprowadził krok poprzedni. O obliczeniu, które rozpoczyna się od konfiguracji zawierającej pewną instrukcję, będziemy niekiedy mówić, że jest to obliczenie dla tej instrukcji, albo jeszcze krócej: obliczenie tej instrukcji.
Określimy też zbiór tych konfiguracji, które odpowiadają zakończeniu obliczeń programu.
Przyjmujemy przy tym, że dla każdego programu w danym języku programowania, wśród konfiguracji umieścimy konfigurację, która zawiera ten właśnie program jako "program do wykonania" w pewnym ustalonym otoczeniu początkowym. Wówczas zbiór możliwych obliczeń rozpoczynających się od takiej konfiguracji początkowej opisuje semantykę tego programu, a realizacja języka musi zapewnić, że rzeczywiste obliczenia maszyny dla tego programu odpowiadać będą obliczeniom opisanym przez semantykę.