Keel on vahend informatsiooni edastamiseks, kommunikatsiooniks. Inimeste vahel toimuvas kommunikatsioonis kasutatavaid keeli (eesti, inglise jne) nimetatakse loomulikeks keelteks (natural languages). Märgi (käsu) süsteeme, mida kasutatakse mitemesuguste aparaatide ja seadmete juhtimiseks, nimetatakse formaalseteks keelteks.
Kaasajal on selliseks formaalse märgisüsteemiga juhitavaks seadmeks kõige sagedamini arvuti. Arvuti ja arvuti juhtimiseks loodud programmeerimiskeelte loomine möödunud sajandi viiekümnendate aastate algul tekitaski vajaduse arvuti juhtimiseks (programeerimiseks) kasutatavate märgisüsteemide uurimiseks. Umbes samal ajal hakkas tekkima ka arusaamine, et bioloogilisi süsteeme juhivad samuti formaalselt kirjeldatavad reeglid - geenides salvestatud algoritmid. Nende uurimuste tulemusena tekkiski nii arvutisüsteemides kui ka bioloogilistes süsteemides liikuva informatsioooni kirjeldamiseks ja selle struktuuri uurimiseks formaalsete keelte teooria.
Arvuti (täpsemini, arvuti protsessor) "saab aru" ainult väga lihtsatest märgijadadest, tavaliselt vaid binaarsümbolite 0,1 jadadest. "Arusaamine" tähendab, et kui protsessori sisenditele on antud programmikäsuga määratud väärtused (nullid või ühed), muudab protsessor mõningaid arvuti mälus (RAM) olevaid väärtusi, s.t. arvutab midagi.
Sellist programmeerimissüsteemi nimetatakse masinkoodiks ja see oli ainuke esimeste arvutite programmeerimiskeel.
Masinkood on protsessori programmeerimiskeel. Kaasajal on masinkood kas binaar, oktaal- või heksadetsimaalsüsteemis kirjutatud arvude jada. Näiteks arvuti mälupesades 0010 ja 0011 olevate arvude liitmise ( kui liitmine määratakse koodiga 1100) ja tulemuse pesase 0100 kirjutamise käsk võib välja näha selline:
1100 0010 0011 0100
Masinkood on inimeste jaoks väga ebamugav programeerimiskeel. Masinkoodis programmeerimine on aeglane ja tekib palju vigu, sest programmeerija peab meeles pidama palju detaile, on vajalikud vaid arvuti tööks: operatsioonide koodid, lähteandmete ja vahetulemuste salvestamiseks kasutatud mälupesade aadressid jne.
Programeerimise arengu järgmine samm oli muutujate ja operatsioonide (lühikeste) nimede kasutuselevõtt - assemblerkood. Kui eelmise näite argumendid (pesades 0010, 0011 olevad arvud) tähistada A1 ja A2 ja tulemus - A3, siis näeks eelmine näide assemblerkoodis kirjutatud programmis välja nii:
ADD A1 A2 A3.
Protsessori jaoks tuleb see märgijada teisendada masinkoodiks . Seda teeb spetsiaalne programm, assembler. Teisendus on siin väga lihtne: tähed (märgijada programmi tekstis) "ADD" tuleb asendada numbritega "1100" (liitmise koodiga), esimene muutuja "A1" tema salvestamiseks kasutatud mäluaadressiga "0010" jne:
1100 0010 0011 0100
ADD A1 A2 A3
Sellise teisenduse sooritamiseks on siiski juba tarvis üht kõigi kaasaegsete translaatorite osa: nn nimede tabelit (nametable), kus on salvestatud muutujatele A1, A2, A3 vastavate mälupesesade aadressid. Kuid kogu teisendus on teostatav lähterea ühekordse vasakult-paremale läbivaatusega ja selle programmeerimiseks ei ole vaja erilist teooriat.
Assemblerid muudavad programmikäsu inimese jaoks märksa loetavamaks ja nende kasutamisel teevad programmeerijad märksa vähem vigu. Kuid nad on võimaldavad (nagu masinkoodki) ühe käsuga kirjeldada vaid üht elementaaroperatsiooni, nende kasutamisel ei või programmikäsuga kirjeldada mitut operatsiooni sisaldavat matemaatilist valemit.
Programeerimise arengu järgmine samm oligi FORTRAN (1957) (FORmula TRANslator), mis võimaldas kirjeldada ühe käsuga juba mitmeid operatsioone sisaldavaid matemaatilisi valemeid. Ülalesitatud näide oleks Fortranis kirjutatuna
A3 = A1 + A2
Sellise käsu teisendamine masinkoodi on juba märksa keerulisem, sest käsureas paremal pool võib olla üksainus arv, mingi varem avutatud suurus (muutuja) või mitut operatsiooni sisaldav matemaatiline avaldis, kuid need kõik tuleb mingil viisil masinkoodi käskudeks teisendada.
Vastava programmi (Fortrani translaatori) loomisel käesoleva sajandi 50-ndate aastate algul tekkis palju (teoreetilisi) probleeme. Fortrani translaator oli esimene programm, mille loomine ei õnnestunud enam senikasutatud "hakkame aga kirjutama" meetodiga; osutus, et translaatori loomiseks on enne tarvis kogu translaator ja selle töö formaalselt kirjeldada, s.t. on tarvis teooriat. Esimese Fortran-translaatori loomisega koos loodi ka formalismid Fortran-programmi kuju (süntaksi) kirjeldamiseks, nn Bacus-Nauri valemid. Näiteks ülalvaadeldud käsurida kirjeldab programmeerimiskeelte üht põhimõistet: omistamiskäsku. Omistamiskäsu üldkuju (süntaks) Bacus-Nauri valemite abil kirjeldatuna oleks:
Omistamine ::= Muutuja Omistamismärk Avaldis
Umbes samal ajal (möödunud sajandi viiekümnendatel aastatel) esitas filoloog, matemaatik (ja praegu filosoof) Noam Chomsky formalismi lause struktuuri kirjeldamiseks loomulikes keeltes (inglise, eesti jne). Selle idee sarnanes grammatikale, kuid oli märksa üldisem ja formaalsem, sest see kirjeldas lause struktuuri ükskõik millises (eesti, inglise jne) keeles. Chomsky jagas oma formaalsed grammatikad nelja klassi: regulaarsed, kontekstivabad, kontekstitundlikud ja rekursiivselt loenduvad; tema formalismi ja programeerimiskeelte süntaksi kirjeldamiseks loodud Bacus-Nauri valemite võrdlemisel osutus, et Bacus-Nauri valemid vastavad (täpselt) Chomsky kontekstivabadele grammatikatele. Chomsky, Bacuse, Nauri, Kleene ja teiste uurimused viiekümnendatel aastatel panidki aluse nii formaalsete keelte teooriale, kuid ühe selle teooria rakendusena ka translaatorite koostamise teooriale.Formaalsete keelte tähistusviisi (produktsioone) kasutatakse väga sageli mitmesuguste süsteemide kirjeldamisel. Formaalsete keelte teooria olulisemaks rakenduseks on seniajani translaatorite teooria. Translaator on niivõrd keeruline programm, et seda on peaaegu võimatu teha ilma vastavat teooriat tundmata. Nii lähtekeele kui ka objektkeele süntaksid kirjeldatakse formaalsete grammatikaga, grammatilised teisendused kirjeldavad ka transleerimise eri etappe: leksika analüüsi ja lekseemide genereerimist, süntaksi analüüsi, semantilist analüüsi ja objektkoodi genereerimist. Kuid formaalseid grammatikaid on väga edukalt kasutatud ka näiteks elusorganismide kirjeldamisel, nn Lindenmayeri grammatikate abil on kirjeldatud paljude taimede struktuuri ja arengu (kasvu) seaduspärasusi.