La programación de alto nivel implica escribir un programa de computadora en un lenguaje que evita que el programador tenga que lidiar directamente con el hardware de la computadora específica que se está programando. Esta abstracción permite que el programador se concentre más en el diseño, el flujo y la funcionalidad del programa y menos en ordenar los recursos básicos del sistema para lograr esos objetivos. Un lenguaje de programación de alto nivel puede manejar la administración de memoria o la entrada y salida de una manera que el programador solo necesita comprender el concepto y no las especificaciones de hardware de un sistema dado. En contraste con la programación de alto nivel, existe la programación de bajo nivel, en la que hay poca o ninguna separación entre el código de computadora escrito y las acciones que realiza la computadora.
El desarrollo de lenguajes de programación de alto nivel fue en respuesta a la necesidad de archivos de código fuente legibles por humanos que pudieran ser fácilmente entendidos y modificados. Al utilizar soluciones de lenguaje natural, el código fuente de alto nivel se vuelve mucho más legible que el lenguaje ensamblador u otros lenguajes de máquina. A medida que avanzaba el tamaño de los programas de computadora, la practicidad de escribir programas completos en lenguajes de bajo nivel se volvió menos factible.
A cambio de programar en un lenguaje legible por humanos y que no requiere conocimientos de hardware de bajo nivel, existe un concepto conocido como penalización por abstracción. Esto describe los mayores requisitos en potencia de procesamiento, uso de memoria y otros tipos de gastos generales necesarios para ejecutar el programa final. Esto es especialmente cierto en los lenguajes interpretados que deben ejecutar un intérprete para ejecutar el programa, lo que esencialmente requiere que dos aplicaciones se ejecuten al mismo tiempo.
Los lenguajes compilados son lenguajes de programación de alto nivel en los que los archivos fuente legibles se convierten en código de máquina que la computadora puede leer. Si bien un lenguaje compilado sufre menos de una penalización de abstracción que un lenguaje interpretado, todavía se basa en bibliotecas precompiladas y funciones de compilación automatizadas. Estos elementos pueden perjudicar la optimización de un programa complejo en el que el rendimiento es vital.
El uso de lenguajes de programación de alto nivel también ha facilitado la programación fácil de usar. Esto se ve facilitado por la facilidad de agregar elementos estandarizados a una interfaz de usuario que proporcionan la mayoría de los lenguajes de alto nivel. En lugar de desarrollar un código personalizado para un sistema de ventanas o un botón de interfaz cada vez que se necesita uno, los elementos familiares se pueden colocar fácilmente en una interfaz con solo unas pocas líneas de código. Esto permite programas con los que los usuarios finales pueden aprender más fácilmente o con los que pueden familiarizarse de inmediato.
El uso del término «programación de alto nivel» es relativo a la experiencia del programador. Hay algunos lenguajes intermediarios que alguna vez se consideraron de bajo nivel, pero ahora no lo son. Asimismo, algunos lenguajes de alto nivel comparten aspectos con lenguajes de bajo nivel, difuminando la línea entre ellos.