Programi za prve računare pisani su u mašinskom jeziku. Naredbe ovog jezika sastojale suse od nizova jedinica i nula koje su označavale stanja bitova u memorijiračunara. Ovakve naredbe najčešće su bile logički podeljene u dva dela. Prvi deoje predstavljao kod operacije (naredbakoju računar treba da izvrši), a drugi deo adresuregistra u memoriji računara u kome je uskladišten podatak.
Pisanje ovakvih programa bilo je veoma težak posao, podložan greškama. To je navelo tadašnjeprogramere da izmisle simboličkijezik, u kome je operacija koju računar trebada izvrši dobila svoje ime, a i adresa memorijske lokacije je dobila nekosimboličko ime. Programi napisani u ovakvom simboličkom jeziku prevodili su sekasnije u mašinski jezik tako što je programer zamenjivao naziv operacije njenim kodom, a simboličku adresustvarnom adresom. U ovakvom postupku svaka naredba simboličkog jezika prevodilase neposredno u odgovarajuću naredbu mašinskog jezika. Kasnije je ovaj postupakprevodjenje automatizovan tako što je napravljen program koji je kaoulazne podatke učitavao program napisan u simboličkom jeziku i zamenjivao ihnaredbama mašinskog jezika, tako da je rezultatrada ovog programa bio program u mašinskom jeziku. Ovaj program za prevodjenje nazvan je ASEMBLER.
U to vreme su arhitekture računara bile različite i za svaki računar postojao je poseban simbolički jezik koji jezavisio od njegove arhitekture. Da bi se olakšalo pisanje programa, a i njihovaprenosivost s jednog računara na drugi, razvijeni su programski jezici koji subili bliži korisnicima u odredjenim oblastima. Ovi jezici su se sastojali oddvadesetak reči engleskog jezika, skupa svih pravila za dodeljivanje imenamemorijskim lokacijama sa podacima i skupa pravila za formiranje ispravnihnaredba u programskom jeziku. Pomoću rečnika i ovih pravila pisan je program uovom jeziku,koji je gotovo bio nezavisan od arhitekture računara. Ovakav programzove se izvorni (source) program.
Medjutim, da bi program napisan u nekom odovih jezika mogao da se izvšava, trebalo ga je prevesti u mašinski jezik. Za ovoprevodjenje korišćen je program nazvan KOMPAJLER (compiler). Kompajler je program prevodilac koji učitava celokupan program uizvornomjeziku kao ulazne podatke, a kao rezultat dajeprogram u mašinskomkodu, pri čemu je jedna naredba izvornogjezika prevođena u više naredbi mašinskog jezika.
I dalje je za svaku arhitekturu računara morao postojati odgovarajući program prevodilac tj. za svaki programski jezikkoji je korisnik želeo da koristi na tom računaru.Postoje i programski jezici kod kojih sunaredbe nezavisne jedna od druge i moguda se izvršavaju odmah. Za takve programskejezike (BASIC, na primer) u početku nisu bili pisani prevodioci nego INTERPRETERi, koji su prepoznavali naredbu i odmah jeizvršavali. Medjutim, ovakva praksa je gotovo napuštena i sada se u skoro svimjezicima radi izvršavanja programi prevode u mašinski kod. Da bi se izvršioprogram napisan u nekom izvornom jeziku, treba ga prvo uneti u računar. Ovounošenje programa (i podataka) u računar izvodi se pomoću posebnog programa kojise zove editor. Zatim se ovako unet izvorni programprevodi pomoću programa prevodioca da bi se dobio mašinski kod. Posle togakorišćenjem programaza povezivanje (linker) prevedeniprogram se spaja sa drugim programima i sistemskim softverom da bi se dobio izvršniprogram. Takav program se korišćenjem programaza punjenje (loader)unosi u memoriju računara i izvršava. Za traženje grešaka koristi se posebanprogram, koji u tome pomaže i naziva se u računarskom žargonu dibager (debugger). Ranije su kod personalnih računara oveoperacije izvođene u posebnim programima i odvojeno. U poslednje vreme, programiprevodioci za personalne računare ne razvijaju se odvojeno, nego su sve komponente sastavni delovi jednog razvojnog okruženja. Arhitekture personalnihračunara su jednake, pa se prema tome, program prevodilac koji radi na jednomračunaru može koristiti na svim personalnim računarima.