Processorer i computere modtager instruktioner og søger dernæst at udføre dem. En programmør, der skal løse et problem ved brug af en processor, kunne i princippet - og var på de ældste computere nødt til at - fremstille lange rækker af instruktioner og tilhørende adresser for at konstruere et program. Tal er gode for maskiner; ord og sætninger er gode for mennesker, så der gik ikke længe efter edb-maskinernes fremkomst, før programmeringssprog blev udbredte. Et program, skrevet i et sprog, der kan læses og forstås af mennesker, kaldes et kildeprogram. En sammenhængende følge af numeriske instruktioner (maskininstruktioner) kaldes maskinkode.
For at maskinen skal kunne forstå et kildeprogram kræves enten, at et særligt program oversætter alle ordene og sætningerne til maskininstruktioner (og at styresystemet eller et andet program bringer disse til udførelse), eller at et særligt program fortolker hver sætning i kildeprogrammet, idet det udfører de tilsvarende maskininstruktioner. De fleste programmeringssprog benytter den første teknik (oversættelse), og nogle få bruger den anden fremgangsmåde (fortolkere), eller stiller begge til rådighed.
Den simpleste form for en oversætter, en assembler, vil i sin reneste form forvente, at hver sætning i kildeprogrammet svarer til netop én instruktion. Et objektprogram, oversat med en assembler, kan derfor "oversættes" tilbage til kildeprogrammet (disassemblering).
De sprog, der ikke har én-til-én-sammenhæng mellem kilde- og objektprogram, kaldes højniveausprog. Eksempler er FORTRAN, Algol, COBOL, PL/I, APL, LISP, Pascal, BASIC, PROLOG, C, C++, Java, ML, Miranda, Haskell, Scheme, og Perl. Sproget C kaldes af og til et mellemniveausprog, da det oprindelig var tænkt som en erstatning for assemblerkode til særlig maskinnær programmering. C er også det sprog, styresystemer som UNIX er skrevet i, ligesom det sammen med C++ og Java i udstrakt grad benyttes til udvikling af opgaveprogrammel bl.a. til PC'er. FORTRAN, Pascal, C og C++ er eksempler på sprog, der oversættes. Eksempler på fortolkede sprog er APL, BASIC, Java og Perl.
Sammenlignet med assemblerprogrammering er programmering i højniveausprog som regel ikke blot lettere, men giver også et program, der er nemmere at forstå, vedligeholde, modificere og dokumentere.
Pånær PROLOG er de nævnte sprog procedurale sprog, hvilket vil sige, at programmer i sproget angiver en bestemt rækkefølge, hvori de indgående sætninger udføres. Almindeligvis opdeles de procedurale sprog i to klasser, henholdsvis de applikative eller funktionsorienterede (se funktionsprogrammeringssprog) (som f.eks. LISP og ML) og de tilstandsorienterede eller imperative (som f.eks. Pascal, C, Java og Perl). I procedurale sprog udtrykkes, hvordan et problem skal løses; i logiksprog beskrives, hvad problemet er, og brugeren af programmet får som svar, at problemet enten ikke kan løses, eller at det har en eller flere løsninger, som så præsenteres. Logikprogrammering ledsages ofte af opbygning af regler og relationer mellem data, der kan samles i en videnbase. Logiksprog er derfor velegnede til udvikling af ekspertsystemer og anvendes hyppigt inden for kunstig intelligens.
Assemblerprogrammer refererer direkte til det fysiske lager og bruger derfor ikke variable i generel forstand. I modsætning hertil er et væsentligt element i egentlige programmeringssprog netop datastrukturer, formuleret som simple eller sammensatte variable. Variable tillægges eksplicit eller underforstået en type (se datatype), der afgrænser manipulationsmulighederne. Eksempler på simple typer er heltal, flydende tal, den boolske type (sand eller falsk), tegn tilhørende en bestemt tegnsætstandard, og pointere i betydningen adresser på variable. Eksempler på sammensatte typer er arrays, poster, mængder (samlinger af simple typer, hvis rækkefølge er uvæsentlig) og i visse sprog: filer (opfattet som filkontrolblokke, der af programmøren kan opfattes som en helhed).
De traditionelle programmeringssprog er på en række områder ved at blive afløst af objektorienterede programmeringssprog, visuelle programmeringssprog og fjerdegenerationsværktøjer (4GL), og med en efterrationalisering kaldes de gamle højniveausprog for tredjegenerationssprog (3GL). (2GL er i øvrigt assemblerkode, og 1GL er selve maskinkoden).
Se også imperativt sprog og systemprogrammeringssprog.








