Języki programowania z trwałością - Instytut Podstaw Informatyki PAN

advertisement
Języki programowania z trwałością początek historii
Listopad 1998
Kazimierz Subieta
Instytut Podstaw Informatyki PAN
Warszawa
[email protected]
http://www.ipipan.waw.pl/~subieta
Polsko-Japońska Wyższa Szkoła
Technik Komputerowych
Warszawa
K.Subieta. Języki programowania z trwałością, Folia 1
October 1998
Historia trwałości
1964
1965
koniec lat 60-tych
1971
1971-1980
1970
1980-1990
1980-do teraz
koniec lat 80-tych
1991
1986, 1989, 1992
1985-1995
1995
1996-do teraz
K.Subieta. Języki programowania z trwałością, Folia 2
Pierwszy SZBD - IDS - Integrated data Store
Ch. Bachman, pierwszy sieciowy model danych
IBM wypuszcza IMS + DL/I - masowe zastosowania
Propozycja DBTG CODASYL modelu sieciowego
Wiele nowych systemów opartych o propozycję DBTG
Wszystkie systemy były dostępne poprzez jezyki dość
niskiego poziomu, przeważnie COBOL
E.F. Codd proponuje model relacyjny
Masowy rozwój i zastosowanie relacyjnych SZBD
Badania nad nowymi modelami baz danych, w tym
obiektowymi
Masowe pojawienie się obiektowych SZBD
(ObjectDesign, Versant, Gemstone, O2, Objectivity,...)
Utworzenie grupy (komitetu) ODMG
Kolejne standardy SQL, rozpoczęcie prac nad SQL3
Wiele jezyków z trwałością: Pascal-R, DBPL, PS-Algol,...
Java
Kolejne wersje Java z trwałością - PJava, ..., PJama
October 1998
Systemy obiektowo-relacyjne
Powstają w wyniku ostrożnej ewolucji systemów relacyjnych w kierunku obiektowości,
liczą na pozycję systemów relacyjnych na rynku i odwołują się do ich wiernej klienteli.
Nacisk dwóch tendencji:
Rynek domaga się cech pozwalających zniwelować niedostatki relacyjnej technologii,
szczególnie w zakresie danych multimedialnych, związania z danymi informacji
behawioralnej (reguł, metod), modelowania pojęciowego i środków programowania
aplikacji.
Pokusa wprowadzenia wielu cech obiektowości, takich jak klasy, metody, dziedziczenie,
abstrakcyjne typy danych, pozwalających na twierdzenia o „częściowej obiektowości”
systemów relacyjnych.
Podejście jest określane jako „hybrydowe” lub „obiektowo-relacyjne”.
Ostatnio karierę robi także termin „uniwersalny serwer” (universal server)
K.Subieta. Języki programowania z trwałością, Folia 3
October 1998
Manifest baz danych “trzeciej generacji” (3GDB)
początek 1990
Doktryny:
M.Stonebraker, L.Rowe, B.Lindsay, J.Gray, M.Carey, M.Brodie, P.Bernstein, D.Beach
 3GDB mają wspomagać bogatsze struktury danych i reguły
 3GDB muszą posiadać wszystkie pozytywne cechy 2GBD
 3GDB muszą być otwarte dla innych systemów
13 postulatów:
 3GDB muszą posiadać bogaty system typów
 Dziedziczenie jest dobrym pomysłem
 Funkcje (włączając zapamiętane procedury i metody) + hermetyzacja są dobrymi pomysłami.
 Unikalne identyfikatory powinny być stosowane wtedy, gdy nie są dostępne klucze główne.
 Reguły (wyzwalacze, więzy) staną sie główną cechą przyszłych systemów
 Cały dostęp do bazy danych powinien odbywać się poprzez nieproceduralny język wys.poz.
 Kolekcje powinny być specyfikowane zarówno przez ich wyliczenie, jak i poprzez zapytanie
 Aktualizowanle perspektywy są istotne
 Własności fizyczne nie mają związku z modelem danych i powinny być z niego usuniete
 3GDB muszą być dostępne z wielu języków wysokiego poziomu
 Języki te powinny być wyposażone w cechę trwałości i możliwości języków zapytań
 Na lepsze i gorsze, SQL jest intergalaktycznym językiem danych
 Zapytania i odpowiedzi na zap. powinny być dolnym poziomem komunikacji klient-serwer
K.Subieta. Języki programowania z trwałością, Folia 4
October 1998
Trzeci manifest Darwena i Date
Darwen i Date podzielają większość poglądów autorów trzeciego manifestu,
ale nie zgadzają się z zasadniczymi tezami:
SQL, źródło wypaczeń, powinien być odrzucony całkowicie i bezwzględnie.
Proponują założenia zupełnie nowego języka zapytań/programowania (niestety,
niespójne, niekompletne i dość niekompetentne).
Model relacyjny w czystej matematycznej postaci wystarczy do wszystkiego.
Won ze wszystkimi ulepszaczami modelu, który jest przecież doskonały.
(Powołują się tu na E.F.Codd’a, traktując go jak osobę świętą.)
Odrzucić wszystkie pseudo- pomysły w rodzaju obiektów, klas, hermetyzacji,
itd. Klasy są tym samym co dziedziny (domains).
Hermetyzacja jest bzdurą, bo uniemożliwia realizację języków zapytań.
Argumenty super-specjalistów mają oczywiście charakter religijny.
Wraz z żarliwą wiarą w jedyną słuszność modelu relacyjnego prezentują
wręcz infantylną niekompetencję w przedmiocie (co może trochę dziwić).
K.Subieta. Języki programowania z trwałością, Folia 5
October 1998
Manifest obiektowych baz danych
Formułuje podstawowe założenia obiektowych baz danych w postaci
charakterystyk, które są podzielone na trzy grupy:
Obowiązkowe, czyli takie, które musi posiadać każdy system zarządzania
bazą danych określany mianem „obiektowy”. Do nich należą: złożone
obiekty, tożsamość obiektów, hermetyzacja, typy lub klasy, dziedziczenie,
przesłanianie wraz z późnym wiązaniem, rozszerzalność, kompletność
obliczeniowa, trwałość, zarządzanie pamięcią pomocniczą, współbieżność,
odtwarzanie oraz udogodnienia dla zapytań ad hoc.
Opcyjne, czyli takie, które nie są obowiązkowe, ale które mogą podnieść
jakość systemu. Do nich zaliczono: wielokrotne dziedziczenie, kontrolę typu
i wnioskowanie o typie, rozproszenie bazy danych, transakcje projektowe
(długie lub zagnieżdżone) oraz wersje.
Otwarte, czyli takie, gdzie projektanci systemów mają pewną dowolność co
do ich wyboru. Do nich zaliczono paradygmat programowania, system
typów, system reprezentacji oraz zuniformizowanie.
K.Subieta. Języki programowania z trwałością, Folia 6
October 1998
Języki programowania z trwałością (baz danych)
Bardzo ważny nurt pozostajacy w cieniu wielkich komercyjnych rozgrywek.
Wprowadza trwałe (persistent) zmienne lub obiekty do języków programowania.
Trwałą zmienną nazywa się taką zmienna, która ma wszystkie własności zmiennej języka
programowania, ale zachowuje swoją wartość pomiędzy kolejnymi uruchomieniami
programu. Bazy danych można traktować jako zestaw trwałych zmiennych lub obiektów.
Projektów o statucie eksperymentalnym zwanych językami programowania baz danych
(Data Base Programming Languages, DBPL): Amber, Galileo, Fibonacci, PS-Algol, OPAL,
DBPL, Napier88, Tycoon, MUMPS, Machiavelli i ostatnio PJama. Intelektualnie
zaawansowane i kompetentne. Wielu perspektywicznych koncepcji, takich jak:
• polimorficzny system mocnej kontroli typów,
• ortogonalna trwałość (orthogonal persistence),
• ortogonalność konstruktorów typów masowych: zbiorów, sekwencji i tablic, i inne)
Koncepcje te napotykają na opór ze strony środowisk przemysłowych, ponieważ popularne
systemy i języki takie jak Smalltalk, C++ i SQL i Java nie są do nich przygotowane.
K.Subieta. Języki programowania z trwałością, Folia 7
October 1998
Krytyka obecnego nurtu jezyków z trwałością
Przesadny nacisk na polimorficzny system mocnej kontroli typów.
Ktoś (Cardelli?) tym ludziom wmówił, że typy są najważniejsze, co owocuje w tak
skomplikowane systemy typów, ze prawdopodobnie nie istnieją programiści, którzy je
zaakceptują. Wiąże się to prawdopodobnie z tym, że typy są dobrze zdefiniowanym
problemem, który można badać przy pomocy metod akademickich, w tym matematycznych.
Zaniedbanie innych, znacznie ważniejszych zagadnień, takich jak:
języki zapytań,
obiektowość,
programowanie wizyjne i zdarzeniowe,
integracja ze środowiskiem programistycznym.
Temat języków zapytań został tak zdominowany przez typy (a raczej, przez obecne
poglądy na temat, czym jest typ), że pozostały z niego jakieś marne szczątki, jakieś
drobne operatory typu „join” (np. w Machiavelli). Generalnie, temat ten jest
lekceważony w tych kręgach. Dominuje pogląd, że operatory języka zapytań nie
powinny być „wbudowane” (build in), a raczej „nadbudowane” (add on).
Ta filozofia (żarliwie uzasadniana) jest nie do przyjęcia.
K.Subieta. Języki programowania z trwałością, Folia 8
October 1998
Krytyka obecnego nurtu komercyjnego
Wady:
Dominuje filozofia zanurzania (SQL + C, OQL + C++, OQL+ Java), która już wcześniej była
krytykowana za niezgodność impedancji.
Języki 4GL, narzędzia RAD: dość eklektyczne, o nieprzewidywalnych regułach,
nieprzewidywalnych możliwościach, licznych ograniczeniach i barokowych konstrukcjach.
Dziesiątki własnych rozszerzeń (ad hoc) SQL, włączając w to 4GL, PL/SQL, ODBC, JDBC,
ASP, SQL3, itd. Wielki chaos, bez szans na reguły, zasady, uporządkowanie.
Zalety:
Dobre potraktowanie graficznego interfejsu użytkownika.
Dobre potraktowanie kwestii wydajności maszynowej i ludzkiej.
Oparcie interfejsów na programowaniu zdarzeniowym i wizyjnym.
Zintegrowanie ze środowiskiem programistycznym.
Kompatybilność z innym oprogramowniem.
Standardyzacja SQL i interfejsów? Bzdura. Nie będą działać.
Standardy nie pomogą, jeżeli chory jest ideologiczny i koncepcyjny kręgosłup.
A to jest własnie przypadek modelu relacyjnego i SQL.
K.Subieta. Języki programowania z trwałością, Folia 9
October 1998
Może by zacząć od zasad ... ?
Ostatnio zasady w informatyce są kwestionowane.
Ludzie z komercji argumentują, że zasady są dobre do wykładania na uniwersytetach.
Jeżeli dane rozwiązanie nie odpowiada zasadom, to oznacza, że te zasady są pomijalne,
ponieważ w informatyce nie chodzi o narzucone reguły, lecz o efektywność i zysk
Racja, ale w ten sposób można uzasadniany każdy informatyczny bubel.
Porównując tę argumentację do sytuacji w architekturze można powiedzieć, że każdy może
szybko zbudować szopę, w której może prowadzić bardzo dochodowy interes. Jednakże zasady
architektury są przeznaczone dla takich budowli, które przetrwają dziesiątki lub setki lat, będą
w tym czasie spełniać funkcje, do których zostały przeznaczone, będą spełniać kryteria
estetyczne i funkcjonalne, oraz będą świadectwem ludzkiej cywilizacji i kultury. Zasady są
niekiedy idealistyczne i nie zawsze mogą być spełnione w 100%.
Niemniej ustalenie zasad pozwala na świadomy wybór rozwiązań, zaś decyzje odnośnie
odstępstwa od zasad są podejmowane z pełną świadomością przyczyn tego odstępstwa oraz
konsekwencji, które ono powoduje.
Wiele produktów informatycznych powstało w wyniku przypadkowych decyzji.
Paradygmatem twórczości staje się majsterkowanie; następnie efekt tego majsterkowania
próbuje się zamienić na wiedzę dorabiając do niego mętną i pokręconą filozofię.
Patrz np. produkty Microsoft’u i wypowiedzi Rogera Sessions.
K.Subieta. Języki programowania z trwałością, Folia 10
October 1998
Zasady (1)
Naturalność: zgodność z naturalnym myśleniem potencjalnych użytkowników.
Niekoniecznie oznacza ona wyrażanie instrukcji lub zapytań w języku naturalnym
(ponieważ jest on zbyt mało precyzyjny) i niekoniecznie oznacza umieszczanie w
języku dużej ilości słów kluczowych sugerujących cel danej konstrukcji językowej
(dotyczy to np. lukru select...from...where..., który w wielu przypadkach jest mylący
lub niepotrzebny).
Prostota: klarowność konstrukcji syntaktycznych, oczywistość semantyki, łatwość
uczenia się i nauczania, łatwość dokumentowania, implementacji, pielęgnowania i
użycia.
Modelowanie pojęciowe: łatwość dopasowania wyrażenia języka do aktualnego
myślenia nad programem, łatwe rozumienie znaczenia wyrażeń.
Ortogonalność: każda kombinacja cech języka, która ma sens, powinna być
dozwolona. Ortogonalność pozwala na zredukowanie do minimum definicji języka
oraz znaczne podwyższenie jego mocy. Ma ona ogromne znaczenie dla przypadku,
gdy wyrażenia języka nie są pisane przez ludzi, a są automatycznie generowane z
innych interfejsów.
K.Subieta. Języki programowania z trwałością, Folia 11
October 1998
Zasady (2)
Kompozycyjność: unikanie dużych zlepków syntaktycznych i zależności
semantycznych pomiędzy odległymi kontekstowo fragmentami wyrażeń języka.
Relatywizm: identyczna składnia i semantyka wyrażeń języka odnoszących się do
dowolnego poziomu zagnieżdżenia struktur danych. Np. zapytania odnoszące się
do całej bazy danych i odnoszące się do wnętrza pojedynczego obiektu (które może
zawierać podobiekty) powinny być konstruowane na dokładnie tych samych
zasadach.
Minimalność (brzytwa Occama): unikanie cech redundantnych. Dotyczy to
zarówno redundantnej składni, jak i wprowadzania takich konstrukcji językowych,
które można łatwo zastąpić przez inne konstrukcje.
Uniwersalność: język powinien w maksymalnym stopniu przykrywać dziedzinę,
do której został przeznaczony. Uniwersalność nie oznacza mocy maszyny Turinga,
ponieważ to pojęcie jest całkowicie nierelewantne. Chodzi o uniwersalność
pragmatyczną, czyli spełnienie wszystkich aktualnych (i rozsądnych) oczekiwań
użytkowników na dzisiaj i na przewidywaną przyszłość.
K.Subieta. Języki programowania z trwałością, Folia 12
October 1998
Zasady (3)
Brak anomalii: unikanie specjalnych przypadków, cech wyjątkowych,
nieregularnego traktowania, itd. Wszystkie takie cechy stają się przyczyną błędów
oraz zwiększają objętość dokumentacji języka. Szczególnie groźne są tzw.
semantyczne rafy (znane np. z konstrukcji group by SQL, wartości zerowych, itd.),
które powodują błędny (nieoczekiwany) wynik wyrażenia bez jakichkolwiek
ostrzeżeń.
Koncepcyjna kontynuacja: mała zmiana celu, dla którego budowane jest wyrażenie
języka, nie powinno wywoływać dramatycznej zmiany w myśleniu użytkownika i w
formie tego wyrażenia.
Modularność (hermetyzacja): umożliwienie użytkownikowi posługiwania się
fragmentami języka tak jak zamkniętymi bryłami, bez potrzeby wnikania w ich
wewnętrzną budowę. Zmiana kontekstu użycia takich brył nie powinna prowadzić
do zmiany ich znaczenia.
K.Subieta. Języki programowania z trwałością, Folia 13
October 1998
Zasady (4)
Bezpieczeństwo: wzbogacenie języka o specjalne środki (takie jak deklarowanie
typów, asercje, więzy integralności, transakcje) przeciwdziałające niepoprawnemu
użyciu konstrukcji języka, prowadzących do naruszenia integralności bazy danych
lub integralności przetwarzania.
Specjalna troska o przypadki skrajne: puste zbiory, puste stringi, wartości
zerowe, niezainicjowane zmienne, itd. są bardzo często nie objęte definicją
semantyki języka, co powoduje rezultaty nie oczekiwane przez użytkowników.
Ta lista ogólnych zasad jest prawdopodobnie niekompletna.
Budowanie teorii języków programownia baz danych w oparciu o te i inne zasady
jest niezbędne, jeżeli chcemy ustalić pewne kanony, paradygmaty danej dziedziny,
które mogą być nauczane i które mogą efektywnie służyć do budowy, analizy,
porównania i rozwoju produktów wytwarzanych w danej dziedzinie.
Sama znajomość produktów (np. biegła znajomość SQL, OQL lub C++) jest dla tych
celów niewystarczająca.
K.Subieta. Języki programowania z trwałością, Folia 14
October 1998
Bazy danych a języki programowania
20 lat historii życia i rozwoju “obok siebie”.
Obóz baz danych praktycznie ignoruje dokonania obozu języków programowania.
Obóz języków programowania praktycznie ignoruje dokonania obozu baz danych.
Bazy danych - podejście kosmopolityczne.
Udogodnienia takie jak języki zapytań, opis danych, interfejsy programistyczne
mogą być użyte w wielu językach programowania.
Podejście takie owocuje powstaniem ogromnej ilości “kleju” (a raczej klajstru),
którego zadaniem jest zlepienie wielu jezyków programowania w jedną całość.
Efektem kosmopolityzmu są różnorodne, często nieuświadomione ograniczenia na
model danych i interfejsy do bazy danych.
Języki programowanie - bazy danych jako drugi plan.
Bazy danych są traktowane jako peryferia obsługiwany przez funkcje biblioteczne.
Zasoby baz danych są “plikami zewnętrznymi” do których się “pisze” i z których
się “czyta”.
Debuggery i udogodnienia nie uwzględniają baz danych jako specjalnego tematu.
Temat języków zapytań i niezależności danych jest ignorowany.
K.Subieta. Języki programowania z trwałością, Folia 15
October 1998
Integracja języków progr. i baz danych
Droga “akademicka”
Droga “komercyjna”
Tradycyjny
paradygmat
języka
programowania
Język
zapytań
(SQL)
Zintegrowany jezyk
programowania baz dancyh
Zintegrowany jezyk
programowania baz dancyh
?
K.Subieta. Języki programowania z trwałością, Folia 16
October 1998
Systemy zintegrowane: bazy danych, języki
programowania, systemy operacyjne
Podział na te tradycyjne dziedziny oprogramowania jest anachronizmem.
Więcej, jest już fikcją.
Przypisanie typów do języków programowania jest anachronizmem.
Typy są przypisane do danych, języki programowania powinny korzystać ze
zuniformizowanego, niezależnego od nich systemu typów.
Trwałość dowolnych bytów powoływanych w języku programowania
Kompletność i pełna ortogonalność systemu typów
Języki zapytań jako wyrażenia języka programowania
Uniwersalność: typy polimorficzne, funkcje wyższego rzędu.
System
wspomagania
trwałości
Docelowa
architektura:
System
wspomagania
interfejsu użytk.
Programy aplikacyjne
Programiści
K.Subieta. Języki programowania z trwałością, Folia 17
Użytkownicy
Świat zewnętrzny
October 1998
Ortogonalna trwałość
Wiele języków ma pewne cechy do obsługi trwałości, ale dość ograniczone, np.:
Pascal: własność implementacyjna, specjalna struktura danych (file)
C/C++: wyłącznie poprzez funkcje biblioteczne
Ortogonalna trwałość (orthogonal persistence) oznacza nowy typ języka
programowania, w którym cecha trwałości jest ortogonalna w stosunku do
konstruktorów typu.
Wszystkie cechy (w tym języki zapytań) nie powinny robić różnicy w środkach dostępu i
przetwarzaniu trwałych i nietrwałych danych.
Popularne języki obiektowe Smalltalk, C++, Java nie mają trwałych zmiennych i mają silnie
ograniczone typy masowe, wobec czego nie można tam mówić o ortogonalnej trwałości.
Standard ODMG nie zakłada ortogonalnej trwałości, co jest przedmiotem krytyki.
Przedstawiciele świata komercyjnego krytykują ortogonalną trwałość jako niepraktyczną.
Powód jest jasny: wiele firm zajmujących się obiektowymi bazami danych rozwija obecnie
interfejsy oparte na językach obiektowych, dla których cecha ortogonalnej trwałości nie jest
łatwa do wprowadzenia. Były one zaprojektowane przez obóz jezyków programownia, który
zignorował problem baz danych.
K.Subieta. Języki programowania z trwałością, Folia 18
October 1998
Download