Samopiszące się programy
Odnosząc się do artykułu http://www.dobreprogramy.pl/Wolfram-Language-tworca-pakietu-Mathematica-obiecuje-przelom-w-informatyce,News,49485.html ...
Pomysł oczywiście jest bardzo stary - może tak stary jak same komputery. Automatyzacja (nawet odniesiona do siebie samego - tj. maszyny w tym przypadku) stoi ostatecznie u samej podstawy "maszyn liczących"- to jest dokładnie to (i w sumie - tylko to) co komputery robią.
Na pewną skalę coś takiego było robione oczywiście wcześniej, nawet w asemblerze / kodzie maszynowym. W tym przypadku problem jednak polega na tym, że kod maszynowy sam z siebie nie ma żadnych narzędzi umożliwiających tworzenie jakiejkolwiek abstrakcji - i albo ktoś, kto chciał stworzyć program piszący programy, męczył się, albo w ogóle tego nie robił. Z reguły takie asemblerowe "samo-piszące się / samo-modyfikujące się programy" polegały na prostackim kopiowaniu już napisanego uprzednio przez programistę kodu, z ewentualnymi drobnymi modyfikacjami. Tak więc de facto "program sam piszący programy" wymagał nawet dodatkowego wysiłku od programisty - i nic dziwnego, że pomysł nie zdobył popularności.
Swego czasu (nie tak dawno zresztą - 2 lata temu?) intensywnie sam myślałem o automatyzacji (o)programowania, czyli "samo-piszących / samo-modyfikujących" się programach. Moje wnioski są następujące: [item] Aby coś takiego stworzyć, trzeba dysponować dobrze przemyślanym meta-systemem koncepcyjnym - innymi słowy wejść na wyższy poziom abstrakcji niż ten, na którym operują języki programowania. Chodzi o abstrakcję w rodzaju matematycznej (czyli de facto - filozoficznej), a nie programistycznej (np. mechanizm refleksji nie ma z tym nic wspólnego). To już zagadnienie samo w sobie jest tematem, którym można by obłożyć co najmniej kilka prac magisterskich.[/item][item] Uniwersalność takiego rozwiązania jest w zasadzie niemożliwa - albo koncentrujemy się na określonym typie aplikacji (np. do obsługi przez pewien rodzaj interfejsu użytkownika, typu obliczeniowego, typu rozrywkowego... itd.), albo jesteśmy w stanie stworzyć co najwyżej jakiś pośredni kod, który i tak potem musi zostać uzupełniony przez programistów, albo - wynik będzie pozostawiał zawsze wiele do życzenia, co w praktyce czyni "automatycznie napisany programy" bezużytecznym. (Wyobraź sobie np. bank tworzący złożony system w ten sposób, by oszczędzić na firmie tworzącej oprogramowanie. Nie trudno się domyślić, że w przypadku "oprogramowania pisanego na miarę" (takim są systemy bankowe) nie zda to egzaminu, jeśli rola człowieka (choćby przy projektowaniu interfejsu, ale także innych rodzajach interakcji użytkownika z komputerem - np. modelowaniu samej obsługi funkcjonalności) będzie zbytnio ograniczona)[/item] Temat trudny, długi, z mnóstwem pułapek i wymagający ogromnych nakładów pracy, a nawet nie wiadomo, czy jest w ogóle sens to robić. Chyba tylko dla ludzi o zawodzie lub zacięciu akademickim. Być może da się kiedyś coś z tym zrobić, nie ponosząc dużych "kosztów", jednak przy obecnym stanie technologii - na pewno lepiej poczekać... chyba że mówimy o narzędziu tworzącym oprogramowanie o ściśle określonym przeznaczeniu (np. strony internetowe - które tworzy głównie projektant wizualny, określone typy gier - proste zręczniościówki, przygodówki itp.) - takie jednak już oczywiście istnieją.
Wracając do artykułu... Cytuję: [nowy język programowania] "kończy z wyraźnym rozróżnieniem pomiędzy danymi i algorytmami". Obecne trendy w tworzeniu oprogramowania (i uważam, że słusznie) dążą w kierunku tworzenia poziomów abstrakcji oraz separacji różnych elementów bądź aspektów oprogramowania. Brak rozróżnienia między tak elementarnymi kwestiami, jak proces (algorytm, metody, pod-programy itd.) oraz dane wydaje mi się na pierwszy rzut oka nieporozumieniem: to tak, jakby w matematyce odrzucić funkcje i wszystko nazywać liczbami. Nasuwają się też na myśl problemy z elastycznością: czy można używać dowolnych mechanizmów składowania (powiedzmy baza MySQL, PostreSQL...) danych w przypadku, gdy dana może być algorytmem?