Programistyczna wojna
25.04.2015 23:52
Jeden z praktykantów w moim zespole podjął dyskusję na temat doboru języków programowania zależnie od projektu. Dla mnie jako programisty z trzyletnim stażem taka rozmowa wydała mi się bez sensu, gdyż wybór wydaje mi się oczywisty. Jednak wspominając studia okazuje się, że początkujący programista nie ma łatwego życia. Na studiach nie ma czasu, żeby nauczyć wszystkiego, a fora są przepełnione krucjatami zwolenników różnych języków. Czyżby aż tak trudno było odpowiedzieć na pytanie jaki język jest najlepszy do nauki jako pierwszy?
Moje jest mojsze
Jednym z powodów, dla którego forumowicze są w stanie niemal umrzeć za język programowania jest to że w ich karierze jakiś język sprawdził się najlepiej. Niestety nie wszyscy mogą i chcą robić to samo, dlatego powstało tyle języków ile mamy. Rzetelnych porównań jak nie było, tak nadal nie ma. Nie chodzi do końca o same zestawienie gramatyki języków, ale też o sposób myślenia w każdym z nich, żeby osiągnąć dany cel. Na przykład wikipedia w opisach języków często ma akapity dotyczące zalet i wad, jednak te można mnożyć na potęgę, zależnie od kontekstu, np. że asembler nie ma odśmiecacza pamięci jak Java (poważnie, słyszałem taki tekst).
Jak szukać?
Nic nowego nie wymyślę ani nie zbawię świata tym, co napiszę poniżej, ale może komuś rzucę inne światło na ten problem. Na pewno nie da się odpowiedzieć na pytanie jaki język jest najlepszy, bo o tym decyduje się planując realizację projektu - ważniejsza jest w nim technologia. Tak samo nie można komuś doradzić czego najpierw się uczyć, bo wtedy najważniejsze jest zrozumienie zasad działania komputera i danego systemu. Dopiero potem dopracowuje się szczegóły. Tak jak mechanik musi wiedzieć czym jest silnik czy tłok zanim dotknie się do jakiegokolwiek samochodu. Modeli silników jest sporo, odpowiednie narzędzia dobiera się zależnie od modelu samochodu i silnika. Moim skromnym zdaniem przy dobieraniu technologii do projektu powinno się patrzeć na:
- wielkość projektu
- docelowa architektura
- wygoda i szybkość pisania projektu
- wygoda używania i użyteczność programu
Wielkość projektu
Czy ktoś chciałby pisać Facebooka albo Windowsa w całości w asemblerze? Chyba nikt. Facebook ma do tego HipHop: wygoda PHP i wydajność trochę mniejsza od C++. Czy ktoś będzie pisać okienkową aplikację w Javie, która kasuje pliki tekstowe starsze, niż rok? Można, ale to strzelanie z armaty do muchy. Lepiej napisać parę linijek w bashu czy Perlu.
Docelowa architektura
Czasami zdarza się pisać coś na telefon komórkowy, tablet czy serwer. Nie każdy system ma ekran, nie każdy obsługuje się dotykiem czy myszą. Na PC nie trzeba liczyć taktów procesora, a dodatkowe 4 MB RAM to żadem koszmar. Nie wszędzie uruchomienie Javy ma sens.
Wygoda i szybkość pisania projektu
Pisząc dla siebie, od razu wiemy, że jeśli szybciej odpalimy Netbeans, zrobimy okienko w Javie i mamy gotowy program, to wybieramy Javę. W Perlu za to możemy zmienić nazwę tysiąca plików za pomocą paru linijek. Mając firmę, musimy też wiedzieć ilu mieć ludzi i do czego ich wykorzystać.
Wygoda używania i użyteczność programu
Użytkownik też jest ważny. Jeśli do kalkulatora każemy mu instalować nową wersję .NET albo Javy, to może się trochę zdenerwować. To tak, jakbyśmy powiedzieli: "Zrób to, bo ja tak chcę!". No cóż, my jako programiści niby wiemy więcej, ale "klient nasz pan".
Jaki mamy wybór?
Teraz małe zestawienie. Nie ma sensu porównywać wszystkich cech, dlatego wybrałem moim zdaniem ważne wyróżniki.
C++
Standard 2011 wniósł sporo zmian w STL jak i w samym języku. C++ w końcu umie domyślić się typu po tym, co jest przypisywane do zmiennej. Obsługa wątków na poziomie standardu może bardzo odciążyć projektantów wieloplatformowych programów. Wyrażenia lambda są jednym z elementów pozwalających zaliczyć C++ do grona nowoczesnych. Tak więc w C++ mamy:
- wybór kompilatorów
- generyczną bibliotekę STL
- kod tłumaczony na instrukcje asemblera
- wybór paradygmatu programowania
- kontrolę nad działaniem systemu
Java
Wersja 1.8 w porównaniu do pierwszych wersji jest demonem wydajności. Ma dobrze opisaną bibliotekę standardową i scentralizowaną bazę wiedzy. Nawet, jeśli zachwalana przez zwolenników przenośność nie działa, to możemy nadrobić używając JNI i refleksję. Używając Javy:
- nie musimy martwić się o rzeczy specyficzne dla systemu, np. rozmiar zmiennych, zarządzanie pamięcią
- mamy silną kontrolę typów (Java bardzo czepia się rzutowania itp.)
- mamy mechanizm refleksji
- mamy przykłady użycia bezpośrednio od producenta
Perl
Domyślnie instalowany z wieloma dystrybucjami Linuksa. Często jest używany do tworzenia prostych narzędzi systemowych i użytkowych. Bardzo długo był bazą do tworzenia stron internetowych. A zatem Perl:
- jest całkiem zwięzły
- nie wymusza deklaracji typu zmiennych
- nie wymaga kompilacji
- nie narzuca paradygmatu programowania
- ma bogate archiwum CPAN
Python
Szczególnie użyteczny jako język do tworzenia wtyczek do programów. Projekty typu Django i Mercurial są przykładem na to, że w języku skryptowym można tworzyć potężne narzędzia. Python (cechy skryptowe jak Perl):
- ma wbudowaną w składnię arytmetykę liczb zespolonych
- dobre zaplecze w tworzeniu aplikacji internetowych
- wymusza czytelną składnię
Podsumowanie
Pominąłem wiele innych języków, gdyż nie byłem wstanie znaleźć odpowiedniej ilości różnic. C# ma dużo wspólnego z C++ i Javą, a Ruby z Pythonem. Myślę, że mój pierwszy wpis tutaj będzie innym spojrzeniem na programowanie, aniżeli powodem do kolejnej świętej wojny. Jeśli oczekiwaliście, że znajdziecie tu odpowiedź jaki język wybrać, to jej tu nie ma, jest to tylko wskazówka :‑) . Zamierzam dodać kolejny wpis na temat wydajności C, C++ i innych języków, ale najpierw muszę zebrać jakieś fajne dane do tabelek.