Под третьим поколением (3GL) первоначально понимались все языки более
высокого уровня, чем ассемблер. Главной отличительной чертой языков
третьего поколения стала независимость от аппаратного обеспечения,
то есть выражение алгоритма в форме, не зависящей от конкретных
характеристик машины, на которой он будет исполняться. Код, написанный
на языке третьего поколения, перед исполнением транслируется либо
непосредственно в машинные команды, либо в код на ассемблере и затем уже
ассемблируется. При компиляции, в отличие от предыдущих поколений, уже
нет соответствия один-к-одному между инструкциями программы и
генерируемым кодом.
Стала широко использоваться интерпретация
программ — при этом инструкции программы не преобразуются в машинный
код, а исполняются непосредственно одна за другой. Независимость от
«железа» достигается за счёт использования интерпретатора,
скомпилированного под конкретную аппаратную платформу. Одним из ранних
интерпретируемых языков стал Лисп.