En dator är fylld med elektronik och "förstår" bara "ström på"/"ström av" i de olika elektroniska komponenterna. Detta var det ursprungliga sättet att programmera datorer, dvs att ändra en mängd omkopplare. En sekvens av PÅ-AV-AV-PÅ-AV-PÅ-PÅ-PÅ, kan ges en symbolisk presentation där 1 betyder "på" och 0 betyder "av". Den symboliska presentationen 10010111 kan då även tolkas som ett binärt tal vilket gör det hela mer "greppbart" för programmeraren. Att skriva mängder med 1:or och 0:or möjliggör knappast några mer avancerade program, men håller programmeringen på en nivå som datorn lätt förstår. För att skapa större och mer avancerade program blev man tvungen att utveckla programmeringsspråk som låg längre från dators begreppsvärld (1:or och 0:or) och närmare människan. Detta medförde att de programmeringsspråk vi använder idag inte är instruktioner som datorn förstår, utan ett sätt att uttrycka instruktioner så att de kan "översättas" till något som datorn begriper. Alla instruktioner till datorn som du skriver (kallas för källkod) måste därför "bearbetas" av olika program och omvandlas till maskinkod.