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 są 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 ;-)
2004.04.30 | skomentujesz? |
tagi » sztuka programowania
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.