Programowanie intencyjne

Z Wikipedii, wolnej encyklopedii

Programowanie intencyjne lub intencjonalne PI ( Intentional programming IP) – koncepcja programowania komputerowego stanowiąca próbę ułatwienia pisania i pielęgnowania programów komputerowych. Nazwa ta jest związana ze sposobem, w jaki systemy usiłują pojąć dodatkowe znaczenia – zamysły (intencje programistów) – niezależnie od tego jak kody źródłowe prezentują te zamysły. Robiąc tak system pozwala się programiście znacznie łatwiej śledzić rozwlekły kod. Termin wprowadził Charles Simonyi, wieloletni pracownik firmy Microsoft i kierownik zespołu badawczo-rozwojowego pracującego nad systemem znanym jako IP.

W „normalnym” programowaniu operuje się pewną liczbą zbiorów tekstowych zwanych kodami źródłowymi. Kody źródłowe są przetwarzane przez programy takie jak kompilatory (lub interpretery), co można obrazowo opisać jako łączenie i przekształcenie wielu programów źródłowych do pewnej specyficznej postaci, która w wyniku innych koniecznych zmian tworzy w końcu wykonywalny program komputerowy. W sensie ogólnym kod (program) źródłowy zawiera w sobie zamiary (intencje) programisty, ale na bardzo niskim poziomie, głęboko ukryte.

Przypuśćmy na przykład, że zamierzamy napisać program wypisujący liczby od 1 do 10. Przy użyciu syntaktyki języka Java program taki można napisać jak poniżej:

 for (int i = 1; i <= 10; ++i) {
   System.out.println("liczba " + i);
 }

Powyższy kod zawiera jedną z najbardziej rozpowszechnionych w większości języków programowania konstrukcję – pętlę zamkniętą – reprezentowaną przez instrukcję for. Kod ten, po skompilowaniu, otrzymaniu następnie programu wykonywalnego i jego uruchomieniu wykona 10 iteracji, w każdej drukując aktualną wartość zmiennej i zwiększając wartość tej zmiennej o 1 za każdym razem.

Tym niemniej kod ten nie w pełni obrazuje zamysł programisty – było nim proste „wydrukuj liczby od 1 do 10”. Jeśli ktoś będzie miał się zajmował tym kodem, to prawdopodobnie odtworzy tę prostą intencję, ale nie zawsze jest to tak oczywiste.

W systemach PI powyższa pętla lub podobna do niej będzie skutkiem translacji powyższej intencji „wydrukuj liczby od 1 do 10”. Kluczową różnicę stanowi to, że tak wygenerowany kod będzie pozbawiony poziomu semantycznego, gdyż jest on domeną zarządzaną przez system PI, co pozwala, zwłaszcza dla wielkich (długich) programów drastycznie zwiększyć ich czytelność.

Kluczem do zrozumienia PI (IP) jest koncepcja tożsamości (deklaracji lub typu) zmiennych. W powyższym kodzie mamy symbol „i”, który w tym przypadku jest licznikiem pętli. W wielkich programach symbol ten może być użyty wiele razy, i do tego do różnych celów. Rozważmy na przykład taki kod:

 String i = "Jestem Polką/Polakiem";
 for (int i = 1; i <= 10; ++i) {
   System.out.println(i);
 }
 System.out.println(i);

Jest on całkowicie poprawny, nawet jeśli wygląda dość ułomnie. Znaczenie symbolu „i” zmienia się – na górze i na dole wskazuje na znakowy (string) obiekt zawierający wartość „Jestem Polką/Polakiem”, a w pętli oznacza jak poprzednio wartość licznika typu integer. Tożsamość „i” zmienia się zgodnie z ogólną cechą większości języków programowania – definiowania tożsamości na podstawie tego, gdzie jest zawarty symbol, czyli jego zasięgu, jak też innych różnych reguł. W kodzie ciągnącym się przez wiele stron trudnym staje się określenie, który symbol odnosi się do jakiego obiektu. Jeśli podejmie się decyzje o zmianie nazwy jednego z nich, to należy starannie sprawdzić cały kod, aby stwierdzić gdzie jest on używany.

W systemie PI (IP) oba powyższe symbole „i” będą reprezentowane przez oddzielne, prywatne identyfikatory. System PI będzie śledził każdy z nich, i potrafi w każdej chwili wskazać jaki obiekt odnosi się do jakiej definicji. Jeśli zostanie podjęta decyzja o przenazwaniu, np. dość nieszczęśliwej zmiennej znakowej, to system PI „wiedząc” o wszystkich użyciach tego identyfikatora, potrafi zmienić go we wszystkich tych miejscach na przykład na „mojeZnaki” bez problemów.

Systemy PI oferują ponadto kilka poziomów szczegółowości, pozwalając programiście niejako włączać lub wyłączać powiększanie (zoom) w postrzeganiu kodu. W powyższym przykładzie programista może wejść na poziom, który „oznajmi” coś w rodzaju:

 <<wydrukuj liczby od 1 do 10>>
 <<wydrukuj "Jestem Polką/Polakiem">>

Tak więc systemy PI w wielkim stopniu samodokumentują się, co pozwala programiście postrzegać program w postaci obrazu na wysokim poziomie uogólnienia.

Faktycznie systemy IP zawierają bazę symboli i ich definicji, oraz operacji (manipulacji) nad nimi. System generuje z takiej bazy kod źródłowy, który jest następnie kompilowany jak zwykle, itd. Możliwe jest wygenerowanie dowolnego rodzaju źródła wymaganego przez użytkownika, o ile jest dostępny odpowiedni translator. Pod tym względem systemy PI stanowią rodzaj generatorów kodu.

Microsoft nigdy nie utworzył takiego systemu, ale Simonyi po opuszczeniu Microsoftu założył własną firmę i kontynuował prace rozwojowe.

Linki zewnętrzne[edytuj | edytuj kod]