Tekst jest oparty na mojej prezentacji z konferencji Kariera IT. Poprzednia część wpisu jest dostępna tutaj.
To ostatnia (po 1 i 2) część mojego krótkiego przewodnika po językach programowania. Zaczynam ją dwoma dość ekstrawaganckimi przykładami, by wreszcie przejść do podsumowań: który język do czego się nadaje i który może uczynić z Ciebie milionera! Na samym końcu znajdziesz quiz 🙂 – a także listę lektur, na wypadek, gdybyś chciał dalej zgłębiać wiedzę na ten temat.
Języki wyspecjalizowane – R
Do tej pory – w poprzednich dwóch wpisach – koncentrowałam się na językach ogólnego przeznaczenia. Dla równowagi chcę pokazać przynajmniej jeden język programowania z innej, bardziej specjalistycznej grupy.
R to język programowania i środowisko przeznaczone do obliczeń statystycznych i wizualizacji wyników. Oferuje zaawansowane wsparcie w dziedzinach takich jak analiza danych i uczenie maszynowe. R jest interpretowanym językiem proceduralnym. Ma pewne ograniczenia wydajnościowe (np. wszystkie dane przetwarzane przez program są w całości ładowane do pamięci podręcznej komputera). Kod R można łączyć z kodem napisanym w innych językach, takich jak C++.
Skoro zadania wykonywane w R można wykonać w C++, do tego kod w innym języku może działać szybciej, po co w ogóle dotykać R? W poprzednim wpisie z tej serii pojawił się punkt „Wydajność języka a wydajność programisty”. W R implementacja zadań związanych ze statystyką i analizą danych jest nieporównywalnie szybsza niż w językach ogólnego przeznaczenia. Programista nie musi pisać wielu linii, a wszystkie tradycyjnie używane w tej dziedzinie algorytmy (np. regresja liniowa) są od ręki dostępne w postaci funkcji.
Poniższy fragment kodu pochodzi z artykułu Producing Simple Graphs with R. Zobacz, jak łatwo można wyświetlić dane i ocenić, czy zachodzi między nimi korelacja.
1 2 3 4 5 6 7 8 9 10 11 12 |
# Zdefiniuj dwa wektory samochody <- c(1, 3, 6, 4, 9) ciezarowki <- c(2, 5, 4, 5, 12) # Wyświetl samochody na osi y o zakresie 0-12 plot(samochody, type="o", col="blue", ylim=c(0,12)) # Wyświetl ciężarówki, używając czerwonej przerywanej linii i kwadratów lines(ciezarowki, type="o", pch=22, lty=2, col="red") # Dodaj tytuł (czcionka: czerwona, pogrubiona, kursywą) title(main="Auta", col.main="red", font.main=4) |
Co dostaniemy po uruchomieniu programu (np. w środowisku R Studio)? Jeśli nie podoba Ci się myląca etykietac „samochody” przy osi y, na stronie z oryginalnym przykładem dowiesz się, jak go zmienić.
Nie tylko dla dzieci – programowanie graficzne
Istnieją języki programowania, które bardziej niż tekst w obcym języku przypominają… hieroglify. Programowanie polega nie na wpisywaniu poleceń, ale na przeciąganiu i upuszczaniu na planszy bloków symbolizujących poszczególne instrukcje.
Naturalnym odbiorcą tego typu przyjaznych środowisk są dzieci, co jakiś czas jednak powraca temat „rewolucji” w tworzeniu aplikacji przez (pół)profesjonalnych programistów – ostatnio za sprawą projektu Eve.
Przykład tego typu programu pojawił się w opublikowanym przeze mnie w międzyczasie (pomiędzy kolejnymi częściami serii o językach programowania) wpisie Kup swojemu dziecku sobie robota Lego Mindstorms. Znajdziesz tam kompletny opis „najtańszego programowalnego robota”, którego możesz zbudować z klocków Lego.
Poniżej „fragment kodu” dla takiego robota, którego w akcji możesz zobaczyć tutaj:
Co widać na rysunku? Nieskończoną pętlę, w której raz po raz odczytujemy kolor przesyłany przez czujnik światła (bądź koloru). W zależności od tego, czy robot znajduje się na linii (odczyt czarny) czy nie (odczyt biały) albo jedziemy prosto (obrót obu kół o tyle samo stopni), albo skręcamy w prawo.
Wydaje się to banalne, ale w taki sposób można tworzyć zaskakująco złożone programy, o czym przekonałam się kiedyś podczas zawodów programistycznych dla gimnazjalistów.
Który do czego?
Poniższa tabela zawiera wpisy dla tylko kilku spośród najpopularniejszych języków. Zdecydowanie nie wyczerpuje tematu – spójrz, ile pozycji ma lista języków programowania w Wikipedii.
Język | Przeznaczenie (najsilniejsze strony) | Paradygmat |
---|---|---|
C | System Operacje niskopoziomowe |
Imperatywny |
C++ | System | Imperatywny Obiektowy Funkcyjny |
C# | Szybkie tworzenie aplikacji okienkowych Aplikacje klient-serwer Aplikacje internetowe |
Imperatywny Obiektowy Funkcyjny |
Erlang | Aplikacje rozproszone Telekomunikacja |
Funkcyjny |
Haskell | Aplikacje desktopowe i internetowe | Funkcyjny |
Java | Aplikacje serwerowe Aplikacje mobilne (w tym Android) |
Imperatywny Obiektowy Funkcyjny |
JavaScript | Aplikacje internetowe w przeglądarce, po stronie klienta | Imperatywny Obiektowy (prototypy!) Funkcyjny |
Perl | Skrypty Przetwarzanie tekstu i dokumentów |
Imperatywny Obiektowy Funkcyjny |
PHP | Aplikacje internetowe | Imperatywny Obiektowy Proceduralny |
Prolog | Sztuczna inteligencja | Logiczny |
Python | Aplikacje internetowe Skrypty |
Imperatywny Obiektowy Funkcyjny |
R | Statystyka | Imperatywny Obiektowy Funkcyjny Proceduralny |
Który da mi pracę?
Jeśli dopiero zaczynasz programować, jeśli myślisz o przekwalifikowaniu się, jeśli nudzi Cię Twoja obecna (może nawet informatyczna) praca, to pewnie zastanawiasz się, który z języków wybrać. O tym, który język najlepiej nadaje się jak pierwszy dla osoby, która nigdy wcześniej nie programowała, pisałam tutaj (tl;dr: Python).
Co z ofertami pracy? Gdybym miała odpowiedzieć bez namysłu, obserwując ruch na rynku pracy i wśród moich znajomych, powiedziałabym, że w Polsce dominują oferty dla programistów Javy (głównie serwerowej, czyli JEE) i, od niedawna, Pythona.
Na wszelki wypadek sprawdźmy też kilka poważnych źródeł.
A. Ranking RedMonk, oparty na popularności poszczególnych języków w repozytorium GitHub oraz na społecznościowej stronie z pomocą techniczną Stack Overflow (uwaga – prawdopodobnie zaniżona popularność języków używanych w firmach z zamkniętą bazą kodu).
Ranking RedMonk, oparty na danych z GitHub i Stack Overflow
1. JavaScript
2. Java
3. PHP
4. Python
5. C#
5. C++
5. Ruby
8. CSS
9. C
10. Objective-C
11. Perl
11. Shell
13. R
14. Scala
15. Haskell
B. Ranking zarobków programistów poszczególnych języków według Business Insider:
- Ruby on Rails
- Objective C
- Python
- JAVA
- C++
- JavaScript
- C
- R
- C#
- Visual Basic
- SQL
- PERL
C. Ranking na rok 2015 ze strony z konkursami programistycznymi CodeEval, oparty w dużej mierze na informacjach od pracodawców:
- Python
- Java
- C++
- C#
- Ruby
- JavaScript
- C
- PHP
- Go
- Perl
Bonus: Quiz!
Dla każdego z poniższych czterech fragmentów kodu spróbuj odpowiedzieć na następujące dwa pytania:
- Jaki to język?
- Co robi kod?
1. Na rozgrzewkę:
1 2 3 4 5 |
class HelloWorldApp { public static void main(String[] args) { System.out.println("dzień dobry"); } } |
2. Dla spostrzegawczych:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
char _3141592654[3141 ],__3141[3141];_314159[31415],_3141[31415];main(){register char* _3_141,*_3_1415, *_3__1415; register int _314,_31415,__31415,*_31, _3_14159,__3_1415;*_3141592654=__31415=2,_3141592654[0][_3141592654 -1]=1[__3141]=5;__3_1415=1;do{_3_14159=_314=0,__31415++;for( _31415 =0;_31415<(3,14-4)*__31415;_31415++)_31415[_3141]=_314159[_31415]= - 1;_3141[*_314159=_3_14159]=_314;_3_141=_3141592654+__3_1415;_3_1415= __3_1415 +__3141;for (_31415 = 3141- __3_1415 ; _31415;_31415-- ,_3_141 ++, _3_1415++){_314 +=_314<<2 ; _314<<=1;_314+= *_3_1415;_31 =_314159+_314; if(!(*_31+1) )* _31 =_314 / __31415,_314 [_3141]=_314 % __31415 ;* ( _3__1415=_3_141 )+= *_3_1415 = *_31;while(* _3__1415 >= 31415/3141 ) * _3__1415+= - 10,(*--_3__1415 )++;_314=_314 [_3141]; if ( ! _3_14159 && * _3_1415)_3_14159 =1,__3_1415 = 3141-_31415;}if( _314+(__31415 >>1)>=__31415 ) while ( ++ * _3_141==3141/314 )*_3_141--=0 ;}while(_3_14159 ) ; { char * __3_14= "3.1415"; write((3,1), (--*__3_14,__3_14 ),(_3_14159 ++,++_3_14159))+ 3.1415926; } for ( _31415 = 1; _31415<3141- 1;_31415++)write( 31415% 314-( 3,14),_3141592654[ _31415 ] + "0123456789","314" [ 3]+1)-_314; puts((*_3141592654=0 ,_3141592654)) ;_314= *"3.141592";} |
3. Na logikę:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
:- use_module(library(clpfd)). sudoku(Rows) :- append(Rows, Vs), Vs ins 1..9, maplist(all_distinct, Rows), transpose(Rows, Columns), maplist(all_distinct, Columns), Rows = [A,B,C,D,E,F,G,H,I], blocks(A, B, C), blocks(D, E, F), blocks(G, H, I), maplist(label, Rows). blocks([], [], []). blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :- all_distinct([A,B,C,D,E,F,G,H,I]), blocks(Bs1, Bs2, Bs3) |
4. Przypadek beznadziejny:
1 |
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++. |
Poprawne odpowiedzi znajdziesz na dole strony.
PS.
Wróciłam ostatnio do grania na gitarze i doznałam nieoczekiwanego olśnienia informatycznego. C Sharp (zgodnie z zapisem C#) to po angielsku cis, czyli dźwięk o pół tonu wyższy od c 🙂
Polecane lektury
- Siedem języków w siedem tygodni. Praktyczny przewodnik nauki języków programowania (polskie wydanie Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages, polecam z całego serca!)
- Seven More Languages in Seven Weeks: Languages That Are Shaping the Future (kontynuacja poprzedniej pozycji, niestety na razie niedostępna w języku polskim)
- Programming Languages (kurs w portalu Coursera)
- Practical Foundations for Programming Languages (dla zaawansowanych)
Odpowiedzi do quizu
- Java, wypisze „dzień dobry”.
- C, wypisze liczbę Eulera (e), źródło: International Obfuscated C Code Contest.
- Prolog, rozwiązuje Sudoku, źródło: Programmable Life.
- Brainfuck, wypisze „Hello World”, źródło: Wikipedia.