Porównanie języków programowania
Wszystkie opisywane w tym zestawieniu języki są kompletne w sensie Turinga, co oznacza, że w każdym z nich można wyrazić dowolny algorytm określany mianem zupełnego. Języki są równoważne, jeśli bierzemy pod uwagę to, co w ogóle może być w nich napisane. Każda aplikacja napisana w języku A, mogłaby być równie dobrze napisana w języku B – bez najmniejszych różnic w funkcjonalności. Dlaczego zatem wybór języka programowania budzi tyle kontrowersji?
Z dwóch powodów. Po pierwsze kompletność Turinga nie mówi nic o wydajności, efektywności i prostocie rozwiązania. Program napisany w C będzie działał szybciej, niż równoważny program napisany w PHP.
Po drugie, język jest czymś więcej niż suchą notacją w której programiści wyrażają swoje myśli. Nie bez powodu, jedna z najbardziej znanych książek poświęconych programowaniu nosi tytuł “Thinking in Java”. Prawdziwa znajomość języka programowania, to nie tylko opanowanie składni oraz bibliotek ale przede wszystkim umiejętność myślenia w danym języku.
Warto w tym momencie wspomnieć o hipotezie Whorfa. Hipoteza ta w swojej silnej formie stanowi: “to język determinuje myślenie”. Whorf na potwierdzenie tej hipotezy podał przykład plemienia Hopi, którego członkowie w zależności od rodzaju ruchu używają różnych sufiksów czasownikowych, dokładnie tak jak my używamy rodzajów. Język uwydatnia to, co jest ważne w ich środowisku. Podobnie języki programowania, mogą bardzo dobrze sprawdzać się w jednym środowisku, a w innym być – jakby to ujął Whorf – tępym i nieużytecznym narzędziem.Wprawdzie hipoteza ta sformułowana została dla języków naturalnych, ale nic nie stoi na przeszkodzie aby rozszerzyć ją na języki programowania.
Zatem jaki język najlepiej pasuje do dynamicznego środowiska aplikacji internetowych? Spróbujmy porównać sześć języków programowania pod kątem budowania aplikacji WWW. Najważniejszymi kryteriami będą:
- Wydajność
- Społeczność programistów
Wydajność
Niemal każde zestawienie języków programowania zawiera porównanie szybkości ich działania. Badania wydajności języków programowania polegają najczęściej na implementacji określonego algorytmu w porównywanych językach i zmierzeniu czasu jego wykonywania. Erik Wrenhod w swoim teście napisał program generujący fraktale w kilkunastu językach programowania. Poniżej znajdują się wyniki jego eksperymentu.
Jak widać języki kompilowane działają o niebo szybciej niż języki interpretowane. Najszybszym językiem jest C, najwolniejszym Ruby w wersji 1.8.4. Najlepiej z języków interpretowanych wypadł Python, najprawdopodobniej dzięki wykorzystywaniu bajtkodu. Po szczegółowe informacje (kod programów użytych w eksperymencie) odsyłam na stronę Erika Wrenholta.
Kolejny ciekawy benchmark został przygotowany przez Dhananjay Nene. Autor doświadczenia zaimplementował znane zadanie algorytmiczne – problem Józefa Flawiusza w kilku językach programowania. Poniżej wyniki jego doświadczenia.
Jak widać na powyższym wykresie języki dynamiczne i interpretowane umożliwiają pisanie zwięzłego kodu, jednak ceną za taką wygodę jest wolniejsze działanie. Języki programowania przypominają szczelny system hydrodynamiczny. Możemy zmniejszyć ilość kodu do napisania, ale spowoduje to wydłużenie czasu działania programu. Jak widać w języku Ruby 1.9.0 znacznie poprawiono wydajność w stosunku do starszej wersji 1.8.6. Ruby może działać jeszcze szybciej, jeżeli zdecydujemy się go uruchamiać na maszynie wirtualnej Javy (JRuby). Najlepiej w teście wypadł Python w tandemie z psyco, dla którego stosunek czasu wykonywania programu do ilości linii kodu jest najlepszy. Najdłużej problem rozwiązywał program napisany w PHP.
Jeżeli chcemy wyciągnąć wnioski z tego typu porównań musimy zachować ostrożność. Takie eksperymenty mogą mierzyć wydajność języka dla konkretnego algorytmu. Dla innego algorytmu wyniki mogą być całkowicie inne. Widzimy, że w pierwszym benchmarku PHP jest szybszy niż Ruby ale w drugim jest na odwrót, to Ruby pokonuje PHP. Tym niemniej takie doświadczenia mogą nam sporo powiedzieć o językach progamowania:
- Języki kompilowane są znacznie szybsze od interpretowanych.
- Możemy przyśpieszyć języki interpretowane kilkakrotnie za pomocą takich rozwiązań jak Psyco dla Pythona czy akceleratory dla PHP.
- Rozwiązania w stylu JRuby czy JPython pozwalają pisać zwięzły kod w językach dynamicznych, który wykonuje się szybcieji dzięki uruchamianiu go na maszynie wirtualnej.
Wydaję się, że sprawa szybkości języka programowania w aplikacjach internetowych nie ma pierwszorzędnego znaczenia. PHP, Python i Ruby to wciąż najpopularniejsze języki programowania WWW, mimo że, wcale nie są najwydajniejsze. Sytuację tę można tłumaczyć na dwa sposoby:
- Problemy z wydajnością zazwyczaj nie dotyczą samego jezyka programowania. Najczęściej pojawiają się na styku aplikacja – baza danych.
- Sprzęt jest dużo tańszy niż czas programisty.
Społeczność
Duża społeczność programistów jest społecznym dowodem słuszności wyboru danego języka programowania. Skoro tak wielu programistów programuje w PHP musi to być naprawdę dobry język. Oczywiście takie myślenie jest naiwne. Duża społeczność gwarantuje jedynie sporą liczbę gotowych rozwiązań i brak kłopotów ze skompletowaniem zespołu programistów.
Jak zbadać popularność danego języka? Możemy posłużyć się serwisami które monitorują ruch w Internecie związany z jezykami programowania. Przykładem takiego serwisu jest TIOBE Programming Community Index. Innym rozwiązaniem jest analiza wykresów bardziej ogólnych serwisów takich jak Google Trends.
Ranking TIOBE pokazuje procentową popularność danego języka. Jak widać na poniższej tabeli najpopularniejszym językiem programowania ciągle jest C oraz Java, a także inne języki wywodzące się z C (C++, C#, Objective-C). Szóste miejsce zajmuje PHP a siódme Python. Jest to bardzo dobry wynik biorąc pod uwagę to, że języki te są wykorzystywane niemal wyłącznie do programowania dynamicznych stron WWW.
2013 | 2014 | Język | % | |
---|---|---|---|---|
1 | 1 | C | 17% | |
2 | 2 | Java | 14% | |
3 | 3 | Objective-C | 9% | |
4 | 4 | C++ | 6% | |
5 | 5 | C# | 4% | |
6 | 6 | PHP | 3% | |
7 | 7 | Python | 2% |
Dla porównania, poniżej znajduje się wykres Google Trends na którym możemy zaobserwować jak zmieniała się popularność języków na przestrzeni lat 2005 – 2013.
Bardzo ciekawy sposób na zbadanie popularności języków znaleźli autorzy serwisu RedMonk. Uznali oni, że popularność danego języka wyznaczją dwie rzeczy: liczba programistów i liczba projektów. Aby zmierzyć popularność języków zdecydowali się na policzenie ilości pytań związanych z danym językiem na popularnym serwisie StackOverflow oraz ilości projektów realizowanych na nie mniej popularnym GitHubie. Poniżej wyniki ich eksperymentu:
Jak widać dane ze StackOverflow i Githuba korelują ze sobą. Im bliżej przękątnej wykresu tym silniejsza korelacja. Dla przykładu JavaScript, Python, Java i C++ są językami popularnymi zarówno na GitHubie jaki i na StackOverflow.
Rynek pracy programistów
Społeczność związaną z danym językiem programowania tworzą głównie programiści. Postarajmy się scharakteryzować rynek pracy programistów. Poniżej znajduje się wykres średnich rocznych zarobków programistów (ITJobsWatch)
Jak pokazuje powyższy wykres, najlepiej wynagradzani są programiści Javy, Ruby i Pythona, najgorzej programiści PHP.
Na brak pracy nie powinni narzekać programiści Javy, PHP oraz C#. Znacznie mniej ofert jest dla programistów Ruby oraz Pythona -zaledwie kilkadziesiąt. Powyższe dwa wykresy pokazują, że najlepiej opłacani i najbardziej pożądani są programiści Java.
Inne
Skalowalność, ilość narzędzi programistycznych, łatwość pielęgnacji (rozwoju i utrzymania) kodu to inne ważne kryteria, według których możemy porównywać języki programowania. Poniższy wykres stworzony przez Tima Braya ilustruje charakterystykę PHP, Ruby i Java.
Php – bardzo dobrze się skaluje, mała ilość narzędzi programistycznych.
Ruby/Rails – problemy ze skalowaniem, szybki proces tworzenie oprogramowania, brak problemów z pielęgnacją oprogramowania, mała liczba środowisk programistycznych.
Java – Pisanie kodu zajmuje dużo czasu, duży wybór narzędzi programistycznych.
Wnioski
Najpopularniejszy obecnie językiem programowania do budowania aplikacji WWW jest PHP, pomimo tego, że jest jeden z najwolniejszych języków przedstawianych w tym porównaniu. Python okazał się być najszybszym językiem interpretowanym. Wybierając język programowania pamiętajmy o tym, że najtrudniej jest pozyskać programistów języka Java.