IronPython – czyli dynamiczne języki programowania w świecie .NET

Udostępnij na: Facebook

Autor: Bartosz Kierun

Opublikowano: 2010-11-03

Od czasu  premiery w 2000 roku platforma .NET była wiele razy usprawniana, a jej możliwości stawały się coraz większe. Główna część platformy, czyli środowisko uruchomieniowe (Common Language Runtime – CLR), dostarcza mechanizmów takich jak automatyczne zarządzanie pamięcią, silnik bezpieczeństwa dbający o to, by aplikacje wykonywały się z odpowiednim zestawem uprawnień, czy wreszcie kompilator JIT (just-in-time compiler). Oprócz mechanizmu wykonawczego platforma .NET dostarcza również olbrzymią ilość bibliotek, dzięki którym jesteśmy w stanie tworzyć nawet najbardziej wyrafinowane aplikacje i systemy. Biblioteki te obejmują zarówno tak podstawowe komponenty, jak klasy do manipulacji łańcuchami znaków, jak i całe technologie do tworzenia nowoczesnych interfejsów użytkownika (Windows Presentation Foundation czy Windows Forms), programowania rozproszonego (Windows Communication Foundation) czy tworzenia aplikacji internetowych (ASP.NET, ASP.NET MVC).

Wśród wielu cech platformy programistycznej .NET warto wspomnieć jeszcze jedną – neutralność językową. Podstawowymi językami dostarczanymi wraz z platformą są C# oraz Visual Basic .NET, ale dzięki otwartym zestawom specyfikacji (takich jak Common Type System, Common Language Specification czy Virtual Execution System) otworzona została furtka, pozwalająca tworzyć pod tę platformę implementacje różnych języków programowania. Z żalem trzeba przyznać, że znacząca ich większość nie zdobyła większej popularności i uznania programistów. Przyczyn takiego stanu rzeczy należy upatrywać przede wszystkim w tym, że z reguły nie oferowały one znacząco odmiennych możliwości w stosunku do flagowych języków dostępnych na platformę (casus języka J#) oraz tego, że bardzo często były one mocno „okrajane” tak, aby możliwe było ich wykonanie w środowisku uruchomieniowym CLR (np. Eiffel#). Dla doświadczonych programistów decyzja, czy rozdzielamy bloki kodu nawiasami „{ }”, czy słowami „BEGIN” oraz „END”, to zbyt mało, żeby zainteresować się „nowym” językiem.

Dzisiaj jednak sytuacja jest zupełnie odmienna od tej, z jaką mieliśmy do czynienia jeszcze kilka lat temu. Dzięki wsparciu dla typów ogólnych (generic types), szybkich delegatów czy tzw. expression trees, możliwe było stworzenie pełnych implementacji różnych języków programowania o doskonałej wydajności. Najlepszym tego przykładem jest IronPython, będący implementacją bardzo popularnego języka Python na platformę .NET.

Dlaczego warto zająć się bliżej implementacją właśnie tego języka programowania? Powody są co najmniej dwa:

  • IronPython to Python, czyli pełna implementacja tego języka w stu procentach zgodna ze swoim odpowiednikiem stworzonym w języku C. Jest też co najmniej tak samo jak ona wydajna, co potwierdzają różne testy. Sam język Python, w odróżnieniu od tradycyjnych statycznych języków programowania takich jak C++, Java czy C#, jest przede wszystkim dynamicznym językiem programowania umożllwiającym łatwe i naturalne wykorzystywanie takich mechanizmów, jak:
    • dynamiczne typowanie,
    • funkcje wyższego rzędu (zdolność do wykonywania instrukcji umieszczonych w łańcuchach znakowych),
    • możliwość modyfikacji obiektów w czasie działania programu,
    • domknięcia (closures) i kontynuacje (continuations). Dodatkowo język Python ma wsparcie dla programowania funkcyjnego, jest jednocześnie pełnoprawnym językiem obiektowym, ale można w nim programować również proceduralnie. Python wspiera również takie techniki, jak np. metaprogramowanie, czyli zdolność do generowania lub modyfikacji własnego kodu lub kodu innych programów.
  • Prace nad rozwojem IronPythona przyczyniły się do powstania DLR (Dynamic Language Runtime), czyli części środowiska uruchomieniowego odpowiedzialnego za wydajne wykonywanie dynamicznych języków programowania. DLR jest zarówno częścią platformy .NET w wersji 4.0, jak i modułem, którego kod źródłowy dostępny jest na licencji open source, dzięki czemu ma szansę przyczynić się do rozwoju platformy wykonawczej dla różnych dynamicznych języków programowania, w tym flagowego języka C#. Innymi słowy – to między innymi IronPython przyczynił się do rozwoju cech dynamicznych języków programowania w języku C# (typ danych dynamic).

Na wielu forach dyskusyjnych i blogach tematycznych bardzo często można znaleźć ostre polemiki pomiędzy światem open source a rozwiązaniami komercyjnymi, pomiędzy zwolennikami statycznie typowanych języków programowania – jak Java czy C# – a programistami Pythona czy Ruby, czyli przedstawicielami języków dynamicznie typowanych. Choć argumenty przedstawiane przez obie strony są zazwyczaj bardzo racjonalne, to prawda zazwyczaj leży pośrodku i dopiero dobra znajomość obu tych „światów” pozwoli nam racjonalnie dobrać technologię lub język programowania do danego zadania lub problemu. Na przykład programy napisane w dynamicznych językach programowania są zazwyczaj krótsze, a więc łatwiejsze do utrzymania czy modyfikacji, od swych odpowiedników tworzonych w językach silnie typowanych, z drugiej zaś strony to te drugie mają zazwyczaj lepsze wsparcie w narzędziach (refactoring), a kontrola typów w czasie kompilacji też ma swoje zalety.

Pragmatyczni programiści wiedzą, że różnorodność języków programowania jest spowodowana nie tylko istnieniem wielu rozmaitych zagadnień, do których chcemy ich użyć (programowanie niskopoziomowe, aplikacje biznesowe czy systemy sztucznej inteligencji), ale przede wszystkim tym, że nie ma jedynego dobrego sposobu na rozwiązanie większości tych zadań.

Dzięki językowi IronPython programiści .NET mają teraz okazję poznać wiele nowych koncepcji programistycznych, mogących w znaczący sposób poprawić ich „warsztat” programisty lub przyczynić się do sprawniejszej realizacji wybranych zagadnień podczas tworzenia oprogramowania.

Korzyści wynikające ze stosowania dynamicznych języków programowania, na przykładzie implementacji języka Python na platformę .NET, będę starał się przybliżyć czytelnikom w cyklu kilku artykułów:

  • IronPython – jak zacząć. Omówione tu zostaną komponenty pozwalające rozpocząć naszą przygodę z językiem Python na platformie .NET. Dowiesz się, jak stworzyć swój pierwszy program, co to jest interaktywna konsola oraz jak tworzyć programy w języku Python przy użyciu Visual Studio.
  • Wstęp do języka Python. Dzięki temu artykułowi dowiesz się o podstawowych mechanizmach wykorzystywanych podczas programowania w języku Python. Omówione zostaną główne typy danych, kolekcje, sposoby tworzenia własnych funkcji i klas, sposoby obsługi błędów oraz podstawowe zagadnienia programistyczne stosowane podczas programowania w tym języku. Wskazane zostaną również najciekawsze biblioteki standardowe dostarczane z językiem IronPython.
  • IronPython i platforma .NET – integracja. Z opisu integracji języka IronPython z platformą .NET dowiesz się, jak tworzyć różnego rodzaju aplikacje (WPF, ASP.NET) przy użyciu dynamicznych języków programowania czy wykorzystywać typowe technologie i komponenty. Opiszę również sposoby wykorzystania tego języka do zadań takich, jak tworzenie skryptów administracyjnych, wykorzystanie WMI czy integracja z Powershell.
  • Dynamiczne języki programowania w Silverlight. Tu omówiony zostanie sposób wykorzystania języka IronPython do tworzenia aplikacji internetowych RIA (Rich Internet Applications) w technologii Silverlight. Przeanalizujemy, czy połączenie dynamicznych języków programowania z językiem XAML i możliwością wykonywania programów po stronie klienta ma jakiekolwiek zalety. 
  • Programowanie z wykorzystaniem możliwości dynamicznych języków programowania. Tu skupimy się na typowych konstrukcjach wykorzystywanych podczas programowania w dynamicznych językach programowania. Na konkretnych przykładach, obejmujących takie zagadnienia, jak dostęp do baz danych, manipulacja plikami XML czy wykorzystanie wzorców projektowych, pokazane zostaną typowe przypadki użycia różnych cech języka Python, takich jak „duck typing” czy metody first-class. Pokazany zostanie również sposób wykorzystania technik typu „unit testing” i „mock” przy użyciu tego właśnie języka.
  • Wsparcie dla dynamicznych języków programowania w języku C#. Artykuł  będzie zawierał opis możliwości DLR (Dynamic Language Runtime) w kontekście wsparcia najnowszej, czwartej wersji języka C#, dla różnych cech dynamicznych języków programowania. Omówione zostaną również sposoby rozszerzania języka IronPython przy użyciu platformy.NET i języka C#, wykorzystanie silnika języka IronPython we własnych aplikacjach oraz koegzystencji i sposobów wykorzystania obiektów DLR z poziomu języka C#.