O Nemerle mówi Kamil Skalski, współtwórca Nemerle i autor systemu makr dla tego języka.

W jaki sposób powstał język Nemerle?

W jaki sposób powstał język Nemerle?

Pomysł stworzenia nowego języka dla platformy .Net pochodzi od Michała Moskala. Zaw-sze był bardzo zainteresowany konstrukcją kompilatorów i języków . Jeszcze na drugim roku studiów pomagałem mu w projekcie języka Gont, który był tym dla C, czym Nemerle jest dla C#, czyli - upraszczając - rozszerzał możliwości języka o funkcyjny aspekt programowania. W poprzednim semestrze udało mu się doprowadzić do stworzenia na naszej uczelni przedmiotu dotyczącego rozwoju dużych kompilatorów. Choć zapisałem się na niego z lekkimi wątpliwościami, szybko wciągnąłem się w cały pomysł. Później przyszło kilka miesięcy ciężkiego, choć bardzo ciekawego kodowania, które cały czas kontynuujemy.

Jak doszło do przyznania przez Microsoft grantu projektowi open source? Jaki jest jego wpływ na rozwój projektu?

Pomysł szukania sponsorów pojawił się już bardzo dawno. Wspieranie projektów open source przez firmy tworzące zamknięte oprogramowanie jest zjawiskiem dość powszechnym. Ponieważ Nemerle w dużym stopniu korzysta z idei wielojęzykowości platformy .Net, wybór Microsoftu był dość oczywisty. Pierwsze podanie o grant zostało jednak odrzucone - złożyliśmy je w kategorii programów edukacyjnych, należało natomiast od razu zgłosić je w kategorii badań naukowych. Myślę, że to nie przypadek, że Microsoft przyznał grant projektowi open source, firmie tej zależy bowiem zarówno na promocji platformy .Net, jak i poprawie wizerunku.

Jakie cechy języka Nemerle czynią go atrakcyjnym wyborem dla nowych projektów, zwłaszcza w stosunku do C#?

W niektórych miejscach Nemerle zrywa z tradycjami pochodzącymi z C/C++ i obecnymi jeszcze w C# i Javie. W stosunku do nich Nemerle plasuje się na nieco wyższym poziomie abstrakcji i stanowi naturalną kontynuację linii rozwoju: asembler - C - C#. Dowodem tego jest fakt, że wiele aspektów języka, takie jak polimorfizm czy funkcje lokalne, pojawi się wkrótce - choć jeszcze w ograniczonej formie - w C# 2.0 i Javie 1.5.

Jak w przystępny sposób można wyjaś-nić zaawansowane cechy Nemerle, takie jak dopasowanie wzorca, inferencja typów, wartości funkcyjne?

Dopasowanie wzorca to w zasadzie bardzo rozbudowana instrukcja switch, w której możemy nie tylko korzystać ze stałych, lecz przemieszczać się po całej strukturze obiektów - wystarczy w opcji instrukcji wyboru podać postać obiektu (np. typ czy jego wartości w określonych polach). Dzięki temu można w elegancki sposób tworzyć struktury danych i z nich korzystać.

Rekonstrukcja typów to w skrócie możliwość "odgadywania" przez kompilator typu definiowanych zmiennych. Można dzięki temu pisać krótsze programy, nie tracąc bezpieczeństwa tworzonego kodu, ponieważ to kompilator zajmuje się statycznym sprawdzaniem zgodności typów.

Wartości funkcyjne, które można uważać za bardziej zaawansowaną wersję wskaźników do funkcji lub delegatów w C#, pozwalają korzystać z funkcji tak, jak ze zwykłych obiektów. Można np. do procedury przechodzącej listę lub drzewo przekazać funkcję, która będzie wykonana dla każdego elementu tej struktury danych.

Jedną z najciekawszych cech Nemerle jest niezwykle rozbudowana obsługa makr. Skąd bierze się stosunkowo niska popularność makr w popularnych językach programowania? Jakie są zalety makr Nemerle z punktu widzenia menedżera projektu informatycznego?

Makra to ogólnie rzecz biorąc programy generujące programy. Można je wykorzystywać jako proste funkcje umieszczające fragmenty kodu w miejscu użycia, ale i do algorytmicznego przetwarzania całych programów. Funkcjonalność, nad którą właśnie pracujemy, to możliwość oznaczania klas, metod itd. atrybutami wyglądającymi identycznie jak te w C#, które powodują uruchomienie makra na definicji danej klasy czy jej części. Pozwala to np. na automatyczne dodanie metody serializującej do wszystkich klas w projekcie albo do wszystkich metod w danym module kodu wypisującego ich nazwę przy każdym wejściu do niej i jej opuszczeniu. Zastosowania są praktycznie nieograniczone - możemy nawet zamiast pisać program, stworzyć inny program, który sam go wygeneruje.

Makra mają swoje miejsce głównie w językach akademickich, takich jak Lisp. Ich mniej rozbudowane wersje pojawiają się w C i C++. Ich brak w popularnych językach prawdopodobnie jest spowodowany trudnościami z ich implementacją w kompilatorze, a także brakiem śmiałości u samych twórców języków. James Goslings, twórca Javy, miał nawet powiedzieć, że w języku tym nie ma makr "bo są za trudne do zrozumienia dla przeciętnego programisty".

Takie podejście wydaje mi się błędne, ponieważ makra nie są czymś bardziej złożonym niż funkcje. Dzięki makrom programista może być znacznie bardziej kreatywny. Choć nie każdy będzie pisać makra, to ich używanie może w istotny sposób wpłynąć na szybkość powstawania projektu i weryfikację poprawności jego kodu.

Możemy np. przed metodami lub ich parametrami wstawić atrybut [NotNull] i odpowiednie makro wygeneruje kod sprawdzający ten warunek. Pozwala to pisać dużo czystszy kod, stąd mowa o makrach "higienicznych". Poza tym czasami pojawia się potrzeba dodania tej samej metody do wielu klas, co makro może zrobić w bardzo naturalny sposób.

Nemerle działa zarówno w środowisku Microsoft .Net, jak i Mono. Jak z punktu widzenia osób pracujących na co dzień w obu środowiskach przedstawiają się różnice między nimi?

Największą wadą Mono jest brak dobrej implementacji Windows.Forms. Biblioteka Gtk# to świetny pomysł, lecz dopóki nie osiągnie się pełnej kompatybilności na poziomie bibliotek GUI, dopóty trudno będzie mówić o wielkim sukcesie. Jeśli natomiast chodzi o pozostałe narzędzia i biblioteki, to ich wzajemna współpraca i przezroczystość są wręcz zaskakujące. Te same pliki wykonywalne kompilatora Nemerle działają bez jakichkolwiek modyfikacji na Debianie, Mandrake, PLD, Windows 98, XP i 2003 Server. Nie da się natomiast ukryć mniej więcej 50-proc. spadku w szybkości działania Mono w porównaniu z microsoftową implementacją .Net. Mono rozwija się jednak niezwykle szybko, sądzę więc, że prędzej czy później różnica ta zostanie zniwelowana.

Rozmawiał Artur Skura