High-level programming language
A high-level programming language is a programming language that is more abstract, generally considered easier to use, and/or more portable across platforms when compared to low-level programming languages. These languages typically alleviate the programmer from working with specific CPU operations and memory access.
Third-generation programming languages, or 3GL, fall into the category of high-level languages. While the first two generations of programming languages were close to the metal, the 3rd generation became "high-level" with it's layers of abstraction.
 Features of High-Level Languages
The term "high-level" is not a reference to superiority or suitability over "lower-level" languages. The "levels" in programming languages refer to the amount of abstraction from the hardware and other languages. While using a low-level language requires thinking about registers, memory addresses and call stacks, high-level languages involve working with variables, arrays, complex arithmetic, and boolean expressions. Higher level languages also don't compile directly into machine language. Other features can include object-oriented programming, string manipulation, and file input/output.
Typically, high-level languages make complex programming simpler, while low-level languages tend to produce more efficient code. High-level languages rely on interpreters and compilers to make optimization choices, rather than the programmer. Therefore code which needs to run especially quickly and efficiently may be written in a lower-level language, sometimes at the expense of development speed. Modern compilers and interpreters are getting so good at producing efficient code that this is becoming less the case over time.
 Execution Models
There are three models of execution for modern high-level languages:
- Interpreted languages are read and then executed directly, with no compilation stage.
- Compiled languages are transformed into an executable form before running.
- When a language is compiled to an intermediate representation, that representation can be optimized or saved for later execution without the need to re-read the source file. When the intermediate representation is saved it is often represented as bytecode.
- Some languages compile directly into machine code. Virtual machines that execute bytecode directly or transform it further into machine code have blurred the distinction between intermediate representations and truly compiled languages.
- A language may be translated into a low-level programming language for which native code compilers are already widely available. The C programming language is a common target for such translators.
 High-level programming languages
High-level, or third-generation, programming languages include