High level languages abstract machine-specific details from the programmer. The more abstractions implemented, the higher-level the language. Examples of abstractions:
- Variables and types (sure beats manually specifying memory addresses and tying them together when needed)
- Dynamic memory management and other system calls (sure beats int 0x80 or DOS function calls!)
- Mathematical operations (abstracted to more natural notation instead of a serialized list of primitive operations)
- Control flow statements (don't have to remember address of each statement when needed to jump there, constructs such as if, switch)
- Function calls (because manually constructing function calls in RISC architectures SUCKS ASS)
- Comments (you need them!)