Javascript je jezik weba, C/C++ su jezici za pisanje sistemskog softvera (kernel, biblioteke, drajveri) i softvera koji je veoma performantan, Python pokriva web i aplikacije, Java je jezik koji je opste prihvacen u firmama, C# je isto sto i Java samo Microsoft stoji iza njega (.NET platforma), Objective C je jezik koji promovise Apple i koristi se za razvoj aplikacija na Apple plaformim, funkcionalni jezici (takozvani ML tip jezika) se koriste na fakultetima, istrazivackim labaratorijama itd. Tu su neki novi jezici koji resavaju neke od problema koje su imali stari. Swift je zamena za Objective C, Rust je zamena za C/C++, Nim/Nimrod je miks izmedju Java i Javascripta, Scala je miks izmedju ML jezika i Java, Vala je isto sto i Swift samo namenjeno razvoju Gnome aplikacija (Linux). Zajednicko za nove jezike je slaba podrska, posto ih mali broj ljudi koristi podrska u vidu IDE alata, biblioteka, debuggera, kompajlera je tanka.
Programski jezici se dele na jezike nizeg nivoa i viseg nivoa. Nizi nivo su masinski jezik ili kod (sekvence nula i jedinica) i prvi nivo apstrakcije iznad masinskog koda, takozvani assembly iliti asembler. Sintaksa asemblera su malo ulepsane operacije koje vrsi centralni procesor nad glavnom memorijom. Znaci tu je kod koji oznacava operaciju kao i memorijske adrese nad kojima se vrsi manipulacija.
Programski jezici viseg nivoa prevode komande u ljudima koliko toliko razumljivu sintaksu. Jos jedan nivo apstrakcije u odnosu na asembler. To su vec pravi jezici, koji lice onim govornim. Najpoznatiji je C. Osobina C programskog jezika je sto nudi potpunu kontrolu nad memorijom, sto znaci da je rad sa memorijom manualnog tipa. C je proceduralni jezik, kao i Pascal i prethodnici sto znaci da se kod izvrsava onim redom kojim je napisan.
Odredjeni segment u memoriji (hardveru) se naziva objekat. Svaki taj segment ima adresu. Pisanje koda se svodi na manipulaciju objektima. Svako kreiranje nekog patterna je kreiranje objekta. Pattern moze biti mnogo toga, od deklaracije varijable (deklaracija varijable je proces stvaranja i dodeljivanja vrednosti nekoj promenljivoj) do nekakvog skupa od dve ili vise promenljivih, do citavih funkcija. Manipulisati sa objektima u C-u mozes po imenu ili po referenci (adresi). Tu dolazimo do problema programskog jezika C, jer sa jednim objektom moze manipulisati vise puta u istom programu. Ako ti napises kod tako da se dati objekat obrise pre nego sto je on potreban negde drugo tu nastaje problem. Sto bi se reklo, upucao si se u nogu. To se resava na vise nacina, a jedini nacin kojim je moguce pisati slozene programe je brojanje referenci, cime se koliko toliko automatizuje manipulacija memorijom (drugi pristupi su iskljucivo manuelni i jako zamorni za odrzavanje slozene kod baze). Medjutim ti posto neces uciti C tebe to ne zanima a iskreno, ta oblast prevazilazi moju strucnost. Znam par nacina ali tu se pravi razlika izmedju eksperta C jezika i onog sto ga kao poznaje.
Da bi se to resilo smisljen je novi pristup, takozvana objektno orijentisana paradigma u programiranju. Da bi se lakse manipulisalo sa objektima uvedeni su novi koncepti. Medju njima je najbitniji koncept klase. Sta je klasa? Klasa je potpuna definicija objekta. Sta to znaci? Zamisli jabuku. Ti o jabuci sve znas. Znas kog je oblika, koje je boje, kakvog je ukusa, kada raste, koliko joj treba da sazre itd. To tvoje znanje je potpuna definicija jabuke. Objekat je ona jabuka koja se nalazi ispred tebe, koju mozes pojesti. Ona moze biti neke boje, nekog oblika, odredjenog ukusa ali potpada pod ono sto znas da je jabuka. Zato se u OOP jezicima ne kreira svaki objekat redom kada je potreban vec postoji odredjena organizacija tih objekata. Prvo treba unapred da znas sa kojim tipom objekata tvoj program manipulisati. Onda napises klase tih objekata zasebno a kreiras ih u okviru metoda (zasebno izdvojeni deo programa gde se pise ono sto program treba zapravo da radi) tako sto pozoves klasu objekat i kreiras novu instancu tj. dati objekat koji ti treba.
Zasto je ovo korisno? Mnogo je lakse baratati sa velikom kod bazom koja sadrzi ogroman broj objekata i pokazivaca na njih u memoriji jer su organizovani. Nisu razbacani svuda po programu i ne moramo ih juriti kroz neretko slabo citljivi kod koji je neko aljkav pisao. Samim tim se sansa za bagove smanjuje. Medjutim bitno je i zbog manipulacije sa memorijom. Java kao jedan od najpoznatijih predstavnika OOP jezika ima nesto sto se zove Garbage kolektor a to je rutina koja automatizuje upravljanje memorijom, da se ne bi morao programer bakcati time. Garbage kolektor radi isto sto radi programer u C-u, vodi racuna o objektima, njihovom trajanju i refencama. Koliko je meni poznato Java koristi dva nivoa apstrakcije objekata tj. pokazivac na pokazivac u memoriji cime se minimizuje sansa da se objekat obrise pre nego sto je neophodan u drugom delu programa. Jer se brise samo prvi pokazivac a drugi ostaje tj. objekat je i dalje tu. Iako je ovo jako bezbedan pristup on uvodi poprilican overhead tj. ima veliki udarac na performanse izvrsavanja programa. Zato Java programi jedu memoriju u odnosu na C programe.
Ono sto je jos bitno da znas da se jezici dele na: statically typed i dinamically typed. Sta to znaci? Statically typed znaci da se varijable deklarisu pri kompajliranju dok dinamically typed znaci da se deklarisu pri runtime-u (izvrsavanju). Sta sam ja sad rekao?
Postoji nekoliko nacina koji se sintaksa programskog jezika prevodi u jezik razumljiv kompjuteru (masinski kod). Prvi je kompajliranje tj. prevodjenje sintakse u procesorske komande sto dalje kompjuter prevodi u nule i jedinice. To radi program koji se zove parser, on parsira liniju po liniju koda i tumaci sintaksu. Kompajliranjem se dobijaju odredjeni fajlovi koji se posle pokrecu ili se koriste za dalje pakovanje. Kompajliranje trosi vreme programera dok onaj koji izvrsava kod dobija gotov proizvod koji radi najbrze moguce.
Drugi nacin je interpretiranje koda tokom izvrsavanja. To radi program koji se zove interpreter. To je mnogo sporiji nacin izvrsavanja koda jer u realnom vremenu prevodimo sintaksu u komande i masinski kod.
Java koristi just-in-time pristup. To znaci da se interpretiranje koda i kompajliranje desava tokom izvrsavanja. Nekada je cini mi se Java samo interpretirala kod sto je bilo jako sporo. Posto se sada on kompajlira pri pokretanju to radi puno brze. Medjutim jos to nije kao prekompajlirani kod.
JavaScript je dinamically typed jezik. To obicno znaci da kompajlera nema nego pri interpretiranju neka rutina programskog jezika pogadja koji si tip varijable koristio. Zasto ne bi deklarisali mi sami varijable? Zato sto je kodiranje brze kada samo pisemo a = 10 nego const a = 10. Glupost ali primila se.
Medjutim, JavaScript je vremenom napredovao od skripting jezika koji se interpetira i kao takav je nepogodan za bilo koju ozbiljniju primenu do jezika kojim se pisu slozene web aplikacije danasnjice. Kako to? Pa neko je napisao ono sto ima java, runtime. To omogucuje just-in-time izvrsavanje JavaScript koda. Taj alat tj. runtime se zove Node.js i to je deo JavaScript frejmvorka koji se koristi da bi se standardizovalo i doneklo olaksalo pisanje aplikacija.
Sve ovo imas na netu, u knjigama, tutorijalima, lekcijama, kursevima itd. Ja sam to napisao na srpskom da znas u sta se upustas. Deluje strasno ali nije, bitno je da naucis osnove da ne bi kasnije dolazio u situaciju da nesto ne razumes jer ne znas kako to radi. Najgore je nauciti neki frejmvork a ne programiranje i sam jezik kao sto ljudi uce Angular. Pa onda oni promene u verziji 2 sve zivo jer verzija jedan nije valjala a ti moras da ucis ponovo. Eto u toj verziji dva su ubacili nesto sto se zove TypeScript, sto je pogadjas, statically typed verzija JavaScripta.
Edit: Windows je najbolja platforma za razvoj .NET aplikacija i C/C++ aplikacija. Za sve ostalo ili Mac ili Linux, zavisno sta radis.
Edit2: @n1tro je oboleo od teskog oblika Apple fanbojitisa i on ce ti reci da ucis Swift. Sto mozda i nije toliko lose resenje posto korisnika ima puno sto garantuje ubrzani razvoj alata. Ali to nije to. Za sada je JavaScript jos uvek defakto jezik weba.