Programske jezike možemo klasifikovati na više načina.

Klasifikovano po usmerenosti možemo izdvojiti tri grupe:

  • mašinski jezik
  • jezici orijentisani ka mašini
  • jezici orijentisani ka problemu

Mašinski jezik je skup instrukcija koje procesor (tačnije, onaj deo koji bira komponentu koja će biti aktivna, multiplekser) može da izvrši. Mašinske instrukcije su nizovi bitova, gde svaka kombinacija bitova odgovara određenoj naredbi, tj. komponenti procesora.

Jezici orijentisani ka mašini su asembleri. Ovo su simbolički jezici nižeg nivoa apstrakcije. Simbolički u smislu da koriste simbole i nazive instrukcija i podataka koji su čoveku lakši za čitanje od čistog binarnog koda. Nižeg nivoa apstrakcije u smislu da su ovo praktično samo nešto lepši i čitljiviji oblik mašinskog jezika. Instrukcije se i dalje pišu gotovo 1-na-1 i potrebno je imati u vidu strukturu i mogućnosti procesora koji će izvršavati program.

Jezici orijentisani ka problemu su viši programski jezici. Viši u smislu - na višem nivou apstrakcije predstavljanja ideja. Ovi jezici se prevode na mašinski jezik. Sintaksa i semantika su im takve da su bitno bliži prirodnom jeziku. Međutim, i ovde možemo da razlikujemo jezike koji su manje ili više apstraktni, tj. manje ili više oslikavaju prirodu i način rada procesora.

Programski jezik C je takav da prilično blisko oslikava strukturu i način rada računara, jer npr. kontrolu memorije i pokazivače prebacuje na odgovornost programeru čime od programera zahteva da u svom procesu rešavanja problema razmišlja i o problemu i o računaru dok taj problem izvršava. Ovo se može posmatrati i kao dobro i kao loše, zavisno od primene jezika i namere. Kod programiranja hardvera ili jako efikasnih algoritama ovo je poželjno, dok je kod programiranja npr. poslovnih aplikacija ili baza podataka ovo suvišno i predstavlja nešto čime programer ne bi trebalo da se bavi, ako ne mora (a ne mora, kompajler može da preuzme na sebe odgovornost da se bavi memorijom i pokazivačima).

       Cvor c = malloc( sizeof(Cvor) );
       (*c).next = null;

Programski jezik SQL je, sa druge strane, takav da omogućava izražavanje promene koju treba uraditi nad podacima ili osobine podataka koje treba pročitati iz baze podataka, ali ne i konkretan postupak kako se to radi. Tako je programer fokusiran na to šta hoće da radi sa podacima, i ne razmišlja o konkretnim koracima te obrade. Ovde brzina programa može da pati, jer programer ne može da utiče na način izvršavanja naredbi, ali sa druge strane postoji benefit brzine i pouzdanosti razvoja aplikacije. Ako je program prihvatljivo spor (a jeste, za te primene ovo je zanemarljivo usporenje) prednosti ovakvog jezika su očigledne.

SELECT ime, prezime FROM ucenici WHERE razred=3;

Odavde sledi nešto preciznija podela - po generaciji. Razlikujemo 5 generacija programskih jezika. Ovo nema veze sa trenutkom nastanka jezika, već sa nivoom apstrakcije koji jezik podržava.

1GL

Mašinski kod, jezik koji je projektovan po procesoru/uređaju na kome će se izvršavati. Apstrakcija problema je direktno povezana sa poznavanjem rada procesora na kome će se rešenje izvršavati.

2GL

Asemblerski jezici. Ovde se uvodi apstrakcija instrukcija - instrukcije imaju simbolička imena (čitljive-smislene nazive). Instrukcije su i dalje blisko vezane za instrukcije procesora. Jezik je takav da je donekle nezavisan od konkretne verzije procesora. Kompajler će prevesti nazive instrukcija u konkretne op-kodove procesora za koji se kompajlira. Asemblerski jezici uvode i pojam promenljive i labele, kao imenovane oznake memorijskih blokova i instrukcija.

3GL

Programski jezici na koje smo navikli - C, Java, Pascal, JavaScript... Ovi jezici su tipski strogi (postoji int, bool, float...) i sadrže strukture-blokove kao što su if, for, function. Zavisno od jezika podržan je i spektar tipova podataka, od jednostavnih kao što je niz, string, slog do složenijih kao što su klase, objekti, prototipi i dr.

Ovi programski jezici su i dalje usmereni ka "naređivanju" procesoru šta da radi, ali se naredbe pišu dosta apstraktnije i bliže govornom jeziku, manje je očigledno da se izvršava na procesoru i manje smo opterećeni načinom razmišljanja "kao procesor".

4GL

Programski jezici koje smo sreli - PHP, Python, Ruby, Perl. Ovo su zapravo uglavnom "tri i po GL" jezici, koji imaju dovoljno dobru podršku 4GL koncepata da se mogu smatrati 4GL.

Ovi programski jezici se dodatno trude da uklone potrebu za razmišljanjem o memoriji, tipovima i uopšte svim ograničenjima koja proizilaze iz konstrukcije procesora. Tipično su to interpretirani jezici, koji se ne kompajliraju, već se izvršavaju u izvršnom okruženju "u hodu". Ovi jezici nisu strogo tipizirani, ne zahtevaju eksplicitno deklarisanje promenljivih, sadrže strukture podataka koje su prilično fleksibilne (kada pravimo niz i dodajemo element ne moramo da razmišljamo da li je niz dostigao svoj limit, već će se po potrebi automatski povećati da prihvati novi element) itd.

5GL

Programski jezici kod kojih je apstrakcija takva da se više ne primećuje na čemu se program izvršava. Ovo su tipično deklarativni jezici, gde opisujemo šta je/kakvo je rešenje i problem, umesto da dajemo konkretne korake kako da se do rešenja dođe. Upoznaćemo dva takva jezika u nastavku: Prolog i Haskell.

https://en.wikipedia.org/wiki/Fifth-generation_programming_language