Dzisiaj byłem na szkoleniu .NET i słuchając tak prelegenta naszło mnie kilka myśli. Nowoczesne środowiska programistyczne są jak filmy akcji - dzieje się dużo i dzieje się szybko. Prowadzący w ciągu kilku minut wygenerował ponad 200 linii kodu, przy czym niewiele w tym było jego własnej pracy, ponieważ większość kodu generowana jest automatycznie.
Może to i dobrze, że narzędzia programowania są coraz bardziej intuicyjne i łatwe w obsłudze, ale zastanawiam się jak się to ma do wydajności? Wszystko jest obiektem, garbage collector czuwa nad alokacją pamięci, mechanizmy analizy poprawności kodu bronią programistę przed pomyłkami, edytory WYSIWYG ułatwiają tworzenie interfejsu (międzymordzia ;P), wbudowane biblioteki dostarczają klasy generyczne do 99% zastosowań. Tylko co z wydajnością ja się pytam? Kolega słusznie zauważył, że kiedyś wystrzelenie i sterowanie rakietą kosmiczną wymagało pracy procesora 130MHz, a dzisiaj do uruchomienia systemu Vista potrzeba procesor > 2GHz. Najnowsza wersja IDE Microsoftu zajmuje ponad 5GB, a szybkość działania, mówiąc bardzo lakonicznie, pozostawia wiele do życzenia.
Kolejną ciekawą rzeczą jest fakt, że ów prelegent stosował pewne konstrukcje, o których na pierwszych zajęciach z wprowadzenia do programowania usłyszeliśmy, że są one nieoptymalne i należy się ich wystrzegać. Mam na myśli skok continue, powodujący przejście do kolejnej iteracji pętli. Jest to o tyle dziwne, że w innym miejscu prowadzący przekonywał nas o zasadności stosowania operatora as do rzutowania typu, aby zaoszczędzić jedno rzutowanie.
Ogólna refleksja (NIE mam na myśli mechanizmu refleksji ;)) na temat nowoczesnych języków programowania nasuwa mi się dość pesymistyczna, ponieważ w miarę ułatwiania życia programiście zwiększa się ilość obliczeń, a przez to wymagania sprzętowe i koszty związane z eksploatacją oprogramowania.
Bardzo ciekawy jestem, czy może w przyszłości nastąpi pewny wstrząs w tej kwestii i ktoś odpowiedzialny za projektowanie kolejnej generacji narzędzi programistycznych pójdzie w stronę zmniejszenia wymagań sprzętowych albo chociaż nie zwiększania ich. Przecież absurdem jest, jak kolega zauważył, żeby uruchomienie środowiska programistycznego wywoływało obciążenie komputera przywodzące na myśl obliczenia trajektorii lotu całej stacji kosmicznej z uwzględnieniem efektu relatywistycznego i grawitacji od najbliższych 10 000 ciał niebieskich!
Kolejna pesymistyczna myśl związana z nowoczesnymi językami 3 i 4 generacji dotyczą stopnia abstrakcji kodu. Usłyszałem, że jakiś czas temu absolwenci WATu potrafili prześledzić wykonanie operacji języka wysokiego poziomu (3 generacji) od wypisania funkcji w tym języku do poziomu mikrooperacji występujących w procesorze. W dzisiejszych czasach taka sztuka jest o wiele bardziej złożona, bo o ile kiedyś istniał poziom np. C -> asembler -> mikrorozkazy, to dzisiaj droga ta wygląda mniej więcej tak C# (Java)-> CLR (byte code)-> asembler -> mikrorozkazy -> (nanorozkazy). Powstały nowe, abstrakcyjne, poziomy nie mające wiele wspólnego z tym, co było kiedyś.
Jak widać, przyszłość informatyki napawa mnie pewnym lękiem, że kiedyś nie będzie programista w stanie zrozumieć, co się tak naprawdę dzieje i jak to jest wykonywane, powstaną kolejne poziomy pośrednie, które będą wymuszały pewne sztuczne założenia służące jedynie obsłudze komunikacji między tymi "poziomami skomplikowania". Wydłuży się droga do sprzętu, a kolejne generacji języków programowania będą tak bardzo abstrakcyjne, że być może definicja programu będzie polegała na opisie w języku naturalnym.
Morał z tej opowieści jest taki: VIVAT ASSEMBLER! :)
Subskrybuj:
Komentarze do posta (Atom)
1 komentarz:
Hahah,dobry tekst,ale puenta mnie zaskoczyla xD.
Prześlij komentarz