Nadchodzi Clojure
2009-02-09
Odkąd w dawnych czasach zrozumiałem, że Pascal to nie jest najlepszy język programowania na świecie i narzuca mi pewne ramy w myśleniu o programach, postanowiłem regularnie poszukiwać lepszych narzędzi.
Co to znaczy, że dany język programowania jest "lepszy"? Dla mnie definicja jest zrozumiała i nieskomplikowana, choć trudna do zwięzłego spisania. Lepszy język to taki, który pozwala mi łatwo budować nowe abstrakcje i w jak najmniejszej ilości kodu wyrażać coraz to bardziej skomplikowane koncepcje. Innymi słowy taki, który pozwala wspinać się na wyższe poziomy abstrakcji, dzięki czemu jestem w stanie ogarnąć rosnące skomplikowanie programów, jakie piszę.
Przeczytawszy kiedyś "Beating the Averages" postanowiłem nigdy nie stać się "Programistą języka Blub" i zawsze być otwartym na lepsze języki.
Progresja wyglądała u mnie tak: BASIC (na C64!) -> Pascal -> C -> C++ (dużo) -> Python -> Scheme -> Common Lisp. Pomijam inne języki, którym się z zainteresowaniem przyglądałem, ale w praktyce nie używałem.
Common Lisp cenię sobie przede wszystkim za makra (Uwaga, jeśli ktoś w tym momencie myśli o #define w C albo makrach preprocesora m4, to mowa jest zupełnie o czym innym! Makra w Lispie są bliższe generatorom kodu niż prostym tekstowym podmianom) i za pragmatyczne podejście: można pisać funkcyjnie, można pisać proceduralnie, można pisać obiektowo. Dla fanów programowania obiektowego CLOS powinien być Świętym Graalem: jest to najbardziej rozbudowany i elastyczny system obiektowy, co więcej z możliwością metaprogramowania (refleksji).
CL ma jednak sporo wad. Przede wszystkim, jest niemodny, z przyczyn historycznych. Niegdyś przereklamowany jako język sztucznej inteligencji, zyskał sobie opinię starego (prawda), wolnego (nieprawda) i nienowoczesnego (nieprawda). Poza tym, ma niewielką społeczność, co oznacza niewiele bibliotek. Sporo trzeba napisać samemu. Wreszcie, co jest największym problemem, ma spory bagaż historyczny, który uniemożliwia unowocześnienie (np. pathnames lub brak sensownych i standardowych wątków).
Niedawno usłyszałem oClojure. Nieufnie obejrzałem wystąpienie jego twórcy (Rich Hickey) -- jednak im więcej słuchałem tym bardziej mi się podobało. Clojure zapowiada się niezmiernie obiecująco. Dlaczego?
- wykorzystuje JVM (Java Virtual Machine), co daje na starcie najbardziej rozbudowany i najlepszy runtime, jaki można sobie wyobrazić,
- łatwo integruje się z Javą, co oznacza natychmiastowe wykorzystanie bibliotek Javovych,
- wprowadza w świat realnego programowania leniwe struktury danych,
- ma fantastyczne podejście do równoległości i synchronizacji (STM: software transactional memory),
- bierze to, co najlepsze z języków takich jak Lisp i Haskell, równocześnie zachowując pragmatyczność (nadal można używać mutowalnych zmiennych), równocześnie śmiało wyrzucając różne "świętości" od lat uznawane za wymagane.
Nadal jestem sceptyczny co do pewnych aspektów Clojure -- brakuje mi np. systemu obiektowego i nie jestem do końca pewien czy da się bez niego obyć mając same multimetody. Nadal też będę sceptyczny -- zgodnie ze swoim postanowieniem, żeby nigdy nie założyć sobie klapek na oczy i zawsze poszukiwać czegoś lepszego. Na razie jednak kurs jest zdecydowanie na Clojure, bo niczego bardziej interesującego i nowoczesnego nie znam.
Zainteresowanym bardzo polecam doskonałe prezentacje Richa Hickeya, w zależności od tego co w tej chwili potrafią:
- Clojure for Java Programmers dla znających język Java,
- Clojure for Lisp Programmers dla znających bardziej zaawansowane koncepcje.