Programski jezik je veštački jezik koji se koristi za pisanje programa da bi se kontrolisalo ponašanje mašine, a pre svega računara. Svaki programski jezik ima skup pravila kojima se definišu važeće jezičke konstrukcije i taj skup pravila se naziva sintaksa jezika. S druge strane, značenje ili dejstvo instrukcija čini semantiku jezika. Programski jezici se takođe koriste da bi se napisao program koji u potpunosti opisuje algoritam. Program mora biti napisan u formi koju računar "razume". Svaki algoritamski korak se zamenjuje nizom instrukcija, jer, kao što znamo, instrukcije čine računarski program. Svaka instrukcija mora biti napisana po određenim pravilima koje jezik poseduje.
Programski jezici se razlikuju od ostalih vidova komunikacije, zato što zahtevaju veći stepen preciznosti i kompletnosti. Kada se obraćaju drugim ljudima autori teksta ili govornici prave sitne greške ili su dvosmisleni, a ipak očekuju da budu shvaćeni. U prenesenom značenju, računari rade tačno ono što smo im napisali i ne mogu da razumeju šta smo hteli da napišemo, makar postojala greška i u jednom slovu. Programi se mogu izvršavati u nizu i bez intervencije ljudi. Na primer, korisnik može da unese komandu preko tastature i da ona pokrene niz komandi koje sačinjavaju neki veći program.
Mnogi jezici su napravljeni od nule, menjani da bi ispunili nova očekivanja, kombinovani su sa drugim jezicima ili su jednostavno prestali da se koriste. Iako su postojali pokušaji da se napravi univerzalni jezik, svi su pokušaji propali, jer nisu bili opšte prihvaćeni u ispunjavanju uloge univerzalnosti.
Površina jezika koju programer „vidi" je poznata kao jezička sintaksa. Većina programskih jezika je čisto tekstualnog oblika. Koriste nizove teksta koji sadrži reči, brojeve, znakove interpunkcije i liči na prirodne jezike. Međutim, postoje i jezici grafičke strukture koji koriste prostorne veze između simbola, da bi precizno odredile program. Sintaksa opisuje moguće kombinacije simbola koji mogu da se koriste kako bismo dobili sintaksno korektan program. Semantika je značenje koje se pridružuje datom nizu simbola. Ipak, nije svaki sintaksno ispravan program i semantički ispravan. Kada se semantički neisprevan program pokrene može da proizvede grešku ili da iskaže nedefinisano ponašanje. Moguće je da, iako je program dobro definisan u okvirima sintakse i semantike, program rezultuje na način koji programer nije hteo. Primer bi bio bilo koji prirodan jezik. Iako je sledeća rečenica sintaksno tačna, ona nema nikakvo značenje „danas zelena misao kilogram".
Grubo govoreći, delimo ih na mašinske jezike, više jezike i jezike visokog nivoa.
Mašinski jezik je jedini direktno razumljiv jezik računaru. Na ovom nivou programer mora da unosi svoj program u obliku niza nula i jedinica. Ovaj jezik je zbog tog razloga veoma teško razumljiv ljudima. Svaki računar ima svoj mašinski jezik koji zavisi direktno od hardvera računara, zato ih još zovemo nižim jezicima. Ovakve programe direktno koristi sam CPU. Njih pišu programeri koji rade za proizvođača procesora i ne mogu se prenositi sa jednog računara na drugi.
Sledeći nivo je asemblerski jezik, koji se takođe razvija sa hardverom samog računara. Međutim, kako se veliki broj hardvera koristi nad istom tehnologijom, programi koji se napišu na ovakvim jezicima mogu da se koriste i na drugim procesorima. Ovakvi jezici se koriste za pisanje raznih drajvera. Asemblerski jezici su se koristili skoro za svaki tip programa sve do 80 tih godina prošlog veka, ali kako je rasla potreba za programerskom produktivnošću tako su počeli da se razvijaju takozvani visoki jezici.
Visoki jezici imaju jako razvijenu apstrakciju detalja. Mogu da koriste elemente prirodnih jezika. Lakše se koriste i ne zavise od platformi na kojima se koriste. Pod platformom se podrazumeva operativni sistem jednog računara (primeri platformi su Windows, Linux, MacOS..). Takvi jezici sakrivaju operacije koje koristi CPU, kao što je pristup memoriji. Primeri takvih jezika su Java, C++, C#. Neki smatraju da je sam jezik C, jezik nižeg nivoa jer dozvoljava da se direktno pristupa memoriji bit po bit.
Kako je mašinski jezik jedini jezik koji računar razume, svi programi koji se pišu na nekim od prethodno spomenutih jezika moraju da se prevedu na jezik razumljiv računaru. Za to koristimo kompajlere ili prevodioce.
Kompajleri, dakle, prevode originalan kod (source code) na ciljni kod (target code). Ciljni kod je pogodan drugim računarima za dalju obradu, npr. veznim programima (linkeri). Najčešći razlog za prevođenjem izvornog koda je pravljenje izvršnog programa. To su programi koji imaju ekstenzije dll, com, exe. Izraz kompajler se koristi za programe koji prevode izvorni kod jezika visokog nivoa na mašinski ili asemblerski jezik. Kompajleri se uglavnom koriste za kontrolu leksičke ispravnosti, pretprocesiranje, parsiranje, generisanje koda i optimizaciju koda.
Jednom kada se program prevede, teško se menja njegov kod radi prepravljanja funkcionalnosti. Kako se razvija potreba za softverom, tako se okrećemo novim metodama programiranja. Ideja je da se formiraju neprevedene osnovne gradivne jedinice (veb servisi) budućeg programa koje bi se nalazile na nekom serveru na internetu. Takve gradivne jedinice bi mogle da se lako prepravljaju, tako da odgovaraju zahtevima programera. Ne bi bile vezane za platforme računara koje ih pozivaju direktno sa interneta u momentu kada su potrebne.