I.
Wprowadzenie do  języków zapytań (1)
II.
Wprowadzenie do  języków zapytań (2)
III.
Pojęcia obiektowości w bazach danych (1)
IV.
Pojęcia obiektowości w bazach danych (2)
V.
Podstawy semantyczne języków zapytań
  Wstęp
  1. Składnia, semantyka i pragmatyka języka formalnego
  2. Składnia abstrakcyjna i semantyka kierowana składnią
  3. Semantyka języka zapytań z lotu ptaka
  4. Optymalizacja zapytań
  5. Zasady języków zapytań
  6. Zapytania eliptyczne
  7. Typowe wady teorii języków zapytań
  8. Czym jest (lub powinna być) teoria języków zapytań?
  9. Założenia semantyczne podejścia stosowego
  10. Nazwy, zakresy i wiązanie
  11. Operacyjna semantyka zapytań i programów
  Podsumowanie
  Zadania
VI.
Modele składu obiektów
VII.
Stos środowisk, rezultaty zapytań, funkcja nested
VIII.
Język SBQL (Stack-Based Query Language) (1)
IX.
X.
Dalsze własności SBQL
XI.
Operatory order by i group by
XII.
Przetwarzanie struktur nieregularnych
XIII.
Rozszerzenie języków zapytań o konstrukcje imperatywne
XIV.
Procedury, procedury funkcyjne, metody, reguły zakresu
XV.
Parametry procedur i metod, procedury rekurencyjne, optymalizacja poprzez modyfikację zapytań

 

1. Składnia, semantyka i pragmatyka języka formalnego

Przy objaśnianiu dowolnego języka, szczególnie takiego języka, który jest lub ma być zaimplementowany na komputerze, istotne jest wyraźne oddzielenie trzech jego aspektów: składni, semantykipragmatyki. Twórcy języków komputerowych wywodzący się ze środowisk przemysłowo-komercyjnych dość często plączą te aspekty, uważając, że składnia języka, nieformalna semantyka użytych w nim (często przypadkowych) słów kluczowych, krótkie objaśnienie działania poszczególnych konstrukcji, oraz parę przykładów ilustrujących użycie języka jest kompletną specyfikacją języka. Takie podejście reprezentują twórcy standardu obiektowych baz danych ODMG. Nie jest ono w stanie spełnić tych celów, które były motywem rozpoczęcia prac nad konstrukcją języka.


1.1. Składnia

Składnia oznacza reguły tworzenia wyrażeń języka z elementarnych symboli (alfabetu).

Z podanych trzech aspektów języka najbardziej zrozumiała jest składnia. Oznacza ona reguły tworzenia wyrażeń języka z elementarnych symboli (alfabetu). Z matematycznego punktu widzenia składnia jest (zwykle nieskończonym) zbiorem ciągów symboli alfabetu. Taka definicja składni (często spotykana w podręcznikach pisanych przez matematyków) jest niekompletna i mało wartościowa z punktu widzenia definicji języka. Istotną cechą składni są reguły składniowe określające sposób budowania wyrażeń języka. Jakkolwiek reguły te rzeczywiście określają zbiór poprawnych ciągów alfabetu, stanowią one nieodłączny element definicji języka, niezbędny do definicji jego dalszych cech. W szczególności, może się zdarzyć, że różne zestawy reguł składniowych R1 i R2 generują dokładnie taki sam zbiór ciągów symboli alfabetu, ale zestaw R1 jest poprawny z punktu widzenia definicji tego języka, podczas gdy zestaw R2 jest niepoprawny. Powodem poprawności bądź niepoprawności składni jest semantyka przypisana do konstrukcji składniowych.


1.2. Semantyka

Semantyka określa znaczenie wyrażeń języka, czyli stosunku napisów tego języka do rzeczy, które te napisy wyrażają lub oznaczają.

Ogólna definicja semantyki nie jest tak prosta jak definicji składni, gdyż wymaga co najmniej zdefiniowania wspomnianych "rzeczy", czyli pewnej dziedziny znaczeń, pewnego uniwersum dyskusji o znaczeniach. Definicja takiej dziedziny nie jest jednoznaczna i zależy od tego, na jakim poziomie definiujemy semantykę, kto jest odbiorcą naszej definicji i jaki jest cel definicji. Przykładowo, semantyką pewnego programu w języku Java może być pewien ciąg instrukcji maszyny abstrakcyjnej. Przyjmuje się przy tym, że semantyka instrukcji takiej maszyny jest nam dana, stanowi coś w rodzaju niedefiniowalnego aksjomatu. Można także przyjąć, że semantyką tego programu jest ciąg rozkazów pewnego komputera, przyjmując jak poprzednio, że definicja tych rozkazów jest nam dana. Tego rodzaju definicje semantyki byłyby jednak bezwartościowe dla programisty, którego nie interesuje to, w jaki sposób jego program zostanie odwzorowany na wspomniane ciągi lecz to, jaka będzie zależność pomiędzy danymi wejściowymi programu a wynikiem programu. Semantyka języka komputerowego ma więc dwóch adresatów. Z jednej strony, jej adresatem jest umysł programisty: semantyka jest tym, co programista "rozumie" poprzez napis języka. Pojęcie "rozumienia" jest jednak bardzo nieprecyzyjne. Zatem z drugiej strony, adresatem semantyki jest komputer. Potrzebna jest semantyka, która odwzoruje napisy języka na określone skutki wewnątrz komputera, przy czym odwzorowanie to powinno odwoływać się do pewnych pojęć i operacji abstrakcyjnych, a nie do fizycznego kodu programu lub fizycznej organizacji danych. Jest bardzo istotne, aby nieformalne "rozumienie" napisów języka przez programistę było całkowicie zgodne z wyrażonym formalnie, precyzyjnym odwzorowaniem tych napisów na wspomniane pojęcia i operacje abstrakcyjne. Niezgodność pomiędzy nieformalnym rozumieniem napisów języka a formalnym odwzorowaniem tego napisu w akcje komputera jest określana jako semantyczna rafa. SQL jest przykładem języka obfitującego w różne semantyczne rafy, np. związane z klauzulą group by lub pojęciem wartości zerowej.

Jak widać, pojęcie semantyki nie jest jednoznaczne i może być rozpatrywane z wielu punktów widzenia. W niniejszym wykładzie będziemy przyjmować punkt widzenia realizatorów języka. Semantyką będzie wszystko to, co realizator języka powinien widzieć, aby ten język efektywnie zaimplementować. Oczywiście, zależy nam na takim opisie, który jest na nieco wyższym poziomie abstrakcji niż odwzorowanie napisów języka w ciąg instrukcji maszyny wirtualnej Java lub w ciąg rozkazów konkretnego komputera. Tego rodzaju semantykę nazywa się często abstrakcyjną implementacją. Taki też charakter noszą wszystkie znane podejścia do semantyki języków zapytań, włączając algebrę relacji, rachunek relacyjny lub podejścia oparte na logice matematycznej. Z drugiej strony, zależy nam na tym, aby wprowadzone przez nas pojęcia abstrakcyjne były naturalne, czyli łatwo rozumiane przez programistów. Będziemy starać się unikać wszelkich semantycznych raf jako potencjalnego źródła błędów w oprogramowaniu.


1.3. Pragmatyka

Pragmatyka języka wyznacza jego funkcję użytkową w interakcji międzyludzkiej lub w interakcji pomiędzy człowiekiem a maszyną.

Pragmatyka opisuje, w jaki sposób należy używać tego języka, w jakim celu, i przy użyciu jakich reguł praktycznych. Jak już dyskutowaliśmy, pragmatyka oznacza dopasowanie wyrażeń języka do konkretnego problemu, który mamy do rozwiązania. W szczególności, można doskonale znać składnię i semantykę danego języka programowania, natomiast być całkowicie bezradnym stając przed problemem, jak za pomocą tego języka zrobić użyteczny system (przypadek wielu tzw. "teoretyków informatyki"). Pragmatyka nie podlega formalizacji: można ją objaśniać za pomocą przypadków, przykładów i analogii i nauczyć poprzez wielokrotne próby zastosowania języka do konkretnych problemów. Większość kursów nauczania języka dotyczy jego pragmatyki, która jest objaśniana na dziesiątkach przykładów, kontrprzykładów, objaśniania dobrego i złego stylu użycia itd. Dobry sposób nauczania pragmatyki języka musi opierać się na jego używaniu i stopniowym nabieraniu doświadczenia i wprawy.

W literaturze przemysłowo-komercyjnej pragmatyka jest dość często plątana z semantyką. Semantyka jest objaśniana poprzez przykłady użycia języka dopasowane do pewnej konkretnej sytuacji lub zadania. Np. zdanie z podręcznika języka zapytań "podaj nazwiska i zarobki osób posiadających stanowisko nauczyciela" (poparte odpowiednim zapisem w SQL lub OQL) jest typowym użyciem pragmatyki języka do objaśnienia jego semantyki. Tę metodę stosuje m.in. ODMG. Pragmatyka nie jest jednak dobrą metodą objaśniania semantyki, gdyż nie jest w stanie oddać wiernie tego aspektu, a szczególnie nie jest w stanie oddać wzajemnego związku poszczególnych konstrukcji języka, zwłaszcza w sytuacji jego rekurencyjnej definicji. Z tego powodu w niniejszym wykładzie będziemy posiłkować się pragmatyką dla objaśniania pewnych konstrukcji języka, ale to nie zmieni faktu, że podstawowym naszym celem będzie precyzyjne objaśnienie semantyki.

Copyrights © 2006 PJWSTK
Materiały zostały opracowane w PJWSTK w projekcie współfinansowanym ze środków EFS.