Spis treści Poprzednia strona: Paradygmaty podstawowe Następna strona: Metodologie i metodyki
Od początku konkurencją dla paradygmatu imperatywnego jest paradygmat deklaratywny. Zamiast mówić komputerowi jak ma zrobić to, co ma zrobić, w programowaniu deklaratywnym mówimy mu tylko co ma zrobić, a sam już musi zadecydować jak to zrobić. Języki deklaratywne pośredniczą między człowiekiem, a tzw. silnikiem decyzyjnym, czyli programem który zawiera już gotowe do wykorzystania algorytmy. Język taki zawiera instrukcje służące do zdefiniowania problemu, określenia jego ograniczeń, zakresu danych i logicznych zależności między nimi. Zwykle jest interpretowany, a nie kompilowany.
Obecnie coraz więcej elementów deklaratywnych przenika do języków imperatywnych (np. wyrażenia regularne, SQL, LINQ, Prolog) i należy się spodziewać, że w przyszłości całe programowanie odbywać się będzie deklaratywnie, o ile nie całkowicie w języku naturalnym (na przykład po angielsku).
Kluczowe dla paradygmatu deklaratywnego jest samodzielne podejmowanie decyzji przez komputer. Ma to związek ze statystyką, badaniami operacyjnymi
i sztuczną inteligencją. Podejmowanie decyzji jest także kluczowe dla działania systemów operacyjnych, które historycznie były zawsze najtrudniejszymi do napisania i najbardziej złożonymi programami. Dzisiaj złożonością przewyższają je jedynie systemy trzeciej generacji do zarządzania przedsiębiorstwami, czyli tzw. systemy klasy ERP.
Przykład różnych paradygmatów: Obliczanie wartości wyrażenia matematycznego.
Deklaratywny (na tym poziomie abstrakcji nie jest ważne jak obliczyć wyrażenie; da się je skompilować bo operatory mają reguły pierwszeństwa i są one zmieniane przez nawiasy)
(5 + 7) * 2 – 6 / 3
albo inaczej w formie „zoptymalizowanej” (komputer wykona to szybciej!)
– 6 * (1/3) + ((5 + 7) << 1)
Imperatywny (program ma stany, a kolejne instrukcje zmieniają te stany – zmienny stan przechowują tzw. zmienne)
- stwórz wynik
- wynik = 5 (przypisz 5 do wyniku)
- wynik = wynik + 7 (zwiększ wynik o 7)
- wynik = wynik * 2 (niech wynik będzie dwa razy większy)
- stwórz podwynik
- podwynik = 6
- podwynik = podwynik / 3 (do nowego podwyniku przypisz stary podwynik podzielony przez trzy)
- wynik = wynik – podwynik
- zniszcz podwynik
- zwróć wynik
Funkcyjny („bezstanowe” obliczanie i podstawianie wartości funkcji, oczywiście stany istnieją ale nie interesują nas na tym poziomie abstrakcji)
odejmij(pomnóż(dodaj(5, 7), 2), podziel(6, 3))
albo bez nawiasów w tzw. notacji polskiej
– * + 5 7 2 / 6 3
albo w tzw. odwrotnej notacji polskiej, przekładającej się bezpośrednio na języki 2GL (asemblery)
5 7 + 2 * 6 3 / –
Uwaga! Ten akapit jest tak głęboki, że aż się boję. Nie czytaj go! Oczywiście w Polsce tak odwrotnie nie piszemy; piszemy normalnie, tzn. deklaratywnie, ale reszta programistów tego świata zna tą nazwę i zdarza się, że autentycznie wydaje im się, że my tu u nas w Polsce mamy jakieś inne reguły matematyki :-). A to wszystko dzięki słynnym pracom polskich logików: Jana Łukasiewicza i Alfreda Tarskiego. Dzięki nim, a także dzięki pracom Kurta Gödla wiemy dziś, że prawda nie jest celem, ale artefaktem zakresu, jaki bierzemy pod uwagę. Prawda jest narzucona z zewnątrz tego zakresu, na podstawie zakresu większego. Nie może być inaczej, ze względu na niezupełność systemów aksjomatycznych. To, że bywamy nieracjonalni nie rzutuje na to, że nasze sądy są dalekie od prawdy, ale po prostu nie zawsze wybór zakresu należy do nas.
Równolegle z rozwojem języków programowania rozwijają się sposoby przechowywania danych, a w szczególności tzw. bazy danych. Najpopularniejszym rodzajem baz danych są bazy relacyjne i ich rozwinięcia – hurtownie danych, ale istnieją także bazy hierarchiczne (np. system plików i katalogów (przy okazji folder, to taki katalog, tyle że w wirtualnym systemie plików)), bazy obiektowe (nie wymagające mapowania obiektowo-relacyjnego ORM [Object-Relational Mapping]) oraz semantyczne bazy wiedzy [semantic web] (patrz RDF i OWL ontology).
Należy tu także wspomnieć o sztucznej inteligencji, której jednym z celów jest zamiana systemów ekspertowych (doradczych) w systemy potrafiące automatycznie programować, albo pozwalające programować w języku naturalnym (np. normalnie po angielsku) zamiast w języku formalnym (np. w języku C, D, E, F, J, …). Według niektórych naukowców nie istnieje algorytm pozwalający na tworzenie innych algorytmów i automatyczne programowanie nigdy nie będzie możliwe. Nie zgadzam się z tym, ponieważ algorytm do tworzenia algorytmów istnieje – jest zawarty w ludzkim mózgu, a możliwość jego symulacji w komputerze jest tylko kwestią czasu. Taka jest moja prywatnie optymistyczna opinia i nie koniecznie musi być prawdziwa.
Naturalnym rozwinięciem paradygmatu deklaratywnego jest tzw. metaprogramowanie. Pozwala ono pisać programy, które mogą same siebie pisać i rozszerzać własną funkcjonalność (tj. uczyć się). Uczenie maszynowe to co innego. W nim szkolimy system podając mu dużo typowych danych, a następnie wypuszczamy go na prawdziwe dane i patrzymy jak sobie poradzi. Zwykle radzi sobie dość dobrze, a nawet jeśli nie to i tak jesteśmy w lepszej sytuacji niż gdyby tego systemu nie było. I najlepsza zaleta: działa znacznie szybciej w środowisku pełnym nieścisłości i przypadkowości, w czym przypomina wręcz działanie człowieka.
Spis treści Poprzednia strona: Paradygmaty podstawowe Następna strona: Metodologie i metodyki