High-level programming involves writing a computer program in a language that keeps the programmer from having to deal directly with the hardware of the specific computer being programmed. This abstraction allows the programmer to focus more on program design, flow and functionality and less on marshalling basic system resources to accomplish those goals. A high-level programming language can handle memory management or input and output in a way that the programmer needs only to understand the concept and not the hardware specifics of a given system. In contrast to high-level programming is low-level programming, in which there is little, if any, separation between the computer code written and the actions the computer performs.
The development of high-level programming languages was in response to a need for human readable source code files that could be easily understood and modified. By using natural language solutions, high-level source code becomes far more readable than assembly language or other machine languages. As the size of computer programs progressed, the practicality of writing entire programs in low-level languages became less feasible.
In exchange for programming in a language that is human readable and does not require low-level hardware knowledge, there is a concept known as an abstraction penalty. This describes the increased requirements in processing power, memory use and other types of overhead needed to run the final program. This is especially true of interpreted languages that must run an interpreter to execute the program, essentially requiring that two applications have to run at the same time.
Compiled languages are high-level programming languages in which the readable source files are turned into machine code that the computer can read. While a compiled language suffers less of an abstraction penalty than an interpreted language, it still relies on pre-compiled libraries and automated compiler functions. These elements can harm the optimization of a complex program in which performance is vital.
The use of high-level programming languages also has made user-friendly programming easier. This is facilitated by the ease of adding standardized elements to a user interface that most high-level languages provide. Instead of developing custom code for a windowing system or interface button every time one is needed, familiar elements can easily be placed in an interface with only a few lines of code. This allows for programs that end users can learn more easily or can immediately be familiar with.
The use of the term "high-level programming" is relative to the experience of the programmer. There are some intermediary languages that were once considered low-level but now are not. Likewise, some high-level languages share aspects with low-level languages, blurring the line between them.