Programarea la nivel înalt implică scrierea unui program de calculator într-un limbaj care împiedică programatorul să aibă de-a face direct cu hardware-ul computerului specific care este programat. Această abstractizare permite programatorului să se concentreze mai mult pe proiectarea programului, fluxul și funcționalitatea și mai puțin pe gruparea resurselor de bază ale sistemului pentru a atinge aceste obiective. Un limbaj de programare de nivel înalt poate gestiona gestionarea memoriei sau intrarea și ieșirea într-un mod în care programatorul trebuie doar să înțeleagă conceptul și nu specificul hardware al unui sistem dat. Spre deosebire de programarea de nivel înalt este programarea de nivel scăzut, în care există puțină, dacă este deloc, separare între codul scris de computer și acțiunile pe care computerul le efectuează.
Dezvoltarea limbajelor de programare de nivel înalt a fost ca răspuns la nevoia de fișiere de cod sursă care să poată fi ușor de înțeles și modificat. Prin utilizarea soluțiilor în limbaj natural, codul sursă de nivel înalt devine mult mai ușor de citit decât limbajul de asamblare sau alte limbaje de mașină. Pe măsură ce dimensiunea programelor de calculator a progresat, caracterul practic al scrierii de programe întregi în limbaje de nivel scăzut a devenit mai puțin fezabil.
În schimbul programării într-un limbaj care poate fi citit de om și nu necesită cunoștințe hardware de nivel scăzut, există un concept cunoscut sub numele de penalizare de abstracție. Acesta descrie cerințele crescute în ceea ce privește puterea de procesare, utilizarea memoriei și alte tipuri de supraîncărcare necesare pentru a rula programul final. Acest lucru este valabil mai ales pentru limbajele interpretate care trebuie să ruleze un interpret pentru a executa programul, necesitând în esență ca două aplicații să ruleze în același timp.
Limbile compilate sunt limbaje de programare de nivel înalt în care fișierele sursă care pot fi citite sunt transformate în cod de mașină pe care computerul îl poate citi. În timp ce un limbaj compilat suferă o penalizare de abstracție mai mică decât un limbaj interpretat, se bazează în continuare pe biblioteci pre-compilate și pe funcții de compilare automate. Aceste elemente pot dăuna optimizării unui program complex în care performanța este vitală.
Utilizarea limbajelor de programare de nivel înalt a făcut, de asemenea, o programare ușor de utilizat. Acest lucru este facilitat de ușurința de a adăuga elemente standardizate la o interfață cu utilizatorul oferită de majoritatea limbilor de nivel înalt. În loc să dezvolte cod personalizat pentru un sistem de ferestre sau un buton de interfață de fiecare dată când este nevoie de unul, elementele familiare pot fi plasate cu ușurință într-o interfață cu doar câteva linii de cod. Acest lucru permite programe pe care utilizatorii finali le pot învăța mai ușor sau cu care se pot familiariza imediat.
Utilizarea termenului „programare la nivel înalt” este relativă la experiența programatorului. Există câteva limbi intermediare care odată erau considerate de nivel scăzut, dar acum nu sunt. De asemenea, unele limbi de nivel înalt împărtășesc aspecte cu limbile de nivel scăzut, estompând granița dintre ele.