the joy of Smalltalk

Jedno mam za złe szkołom i uczelniom, do których dane mi było uczęszczać — nie nauczyli mnie Smalltalka, przez co mój kontakt z prawdziwym sensem programowania obiektowego opóźnił się o całe lata.

Opowiadanie o obiektowości na przykładzie języków pochodnych od C jest z gruntu nieporozumieniem. Niewątpliwie C++, C# czy Java rządzą dzisiejszym światem. Są wydajne, znane, często nawet rozumiane, rozpoznawane i prawdopodobnie jest jakiś dobry powód, dla którego są tak bardzo do siebie podobne. I faktycznie języki te obiektowe. Jednak jako heterogeniczne są z założenia skażone nieobiektowym pochodzeniem i przez to brak im czystości. Z akademickiego punktu widzenia to kundle, ich obiektowość jest sztuczna i w gruncie rzeczy niewiele warta.

Nie chciałbym być źle zrozumiany — nie jestem fanatykiem Smalltalka i nie spędzam życia na porównywaniu go z Javą tylko po to, żeby sobie poprawić samopoczucie i ponarzekać na świat, który wydaje się nie doceniać jego potęgi. Pisałem i pisuję w Javie, C++ i C# zawodowo i hobbystycznie, nawet w PHP doceniam próby obiektowości (choć, mówiąc między nami, to akurat brzmi dosyć niedorzecznie). Jednak kundel zawsze pozostanie kundlem.

Smalltalk jest czysty i rasowy w tym sensie, że nie ma nieobiektowych naleciałości. Konstrukcja i składnia języka jest wręcz zaskakująco prosta — wszystko jest obiektem, a między obiektami są wysyłane komunikaty. Do tego dochodzi kilka banalnie prostych koncepcji zapisu i 5 (słownie: pięć) słów kluczowych. Żadnych sztucznie zakręconych typów danych, żadnych typów prymitywnych, żadnych nieobiektowych konstrukcji w stylu if czy for... Tak jest, nawet pętli jako takiej nie uświadczysz. Przykładowo — kod wypisujący cyfry 0 do 9 może w Smalltalku wyglądać tak:

0 to: 9 do: [:i | Transcript show: i; cr]

Może się wydawać, że poza składnią niewiele różni się to od zapisu pętli for w dowolnym innym języku. Jednak dzieje się tu coś zupełnie innego. 0 jest tutaj obiektem klasy SmallInteger, do którego wysyłamy komunikat to:do: przekazując jako pierwszy parametr obiekt 9, a jako drugi parametr blok do wykonania (to w nawiasach []). Metoda będąca reakcją na komunikat to:do: jest zdefiniowana w klasie Number, po której dziedziczy SmallInteger i wygląda tak:

to: stop do: aBlock 
| nextValue |
nextValue := self.
[nextValue <= stop]
whileTrue:
[aBlock value: nextValue.
nextValue := nextValue + 1]

czyli powoduje wysłanie komunikatu value: do bloku będącego drugim parametrem tyle razy ile wynosi wartość pierwszego parametru (oczywiście tutaj również wszystko się odbywa obiektowo, np. wysłanie komunikatu whileTrue: do obiektu będącego wynikiem porównania). W przykładowym bloku w "pętli" zadeklarowałem parametr :i, którego wartość będzie przekazana przez komunikat value:. Ta wartość jest przekazywana dalej komunikatem show: do obiektu Transcript, który w Squeaku stanowi okienko używane jako standardowe wyjście. Następnie do tego samego obiektu Transcript jest jeszcze przekazywany komunikat cr powodujący wstawienie znaku nowej linii.

Zatem nawet w takiej banalnej konstrukcji jak pętla nie ma nic, co byłoby czymś innym niż sekwencja komunikatów między obiektami. Moc, konsekwencja i prostota koncepcji.

Smalltalk jest nie tylko językiem programowania, ale również biblioteką klas i środowiskiem programistycznym (napisanym oczywiście w Smalltalku) — all in one. To właśnie tutaj (a nie w Javie wielu się wydaje) powstały takie koncepcje jak maszyna wirtualna i garbage collector. Również tutaj wykiełkowała idea eXtreme Programming. Przez implementacje takie jak Squeak robi się z tego nie tylko ciekawe narzędzie, ale również multimedialna zabawa.

Zdecydowanie polecam i zachęcam zarówno do poczytania (np. w Wikipedii polskiej i angielskiej) oraz do spróbowania (najlepiej Squeaka właśnie) — w ramach rozrywki intelektualnej, zamiast telewizji ;-)

Komentarze

Brak komentarzy do tego wpisu.

 

Uwaga: Ze względu na bardzo intensywną działalność spambotów komentowanie zostało wyłączone po 60 dniach od opublikowania wpisu. Jeżeli faktycznie chcesz jeszcze skomentować skorzystaj ze strony kontaktowej.