High-level programming languages require less knowledge about the hardware compared to low-level programming languages. This is because high-level programming languages abstract away the hardware the program is running on. Many high-level languages require an interpreter to run the source code on the hardware in real time. On the other hand, low-level languages usually convert the whole source code to machine code before running, because the source code is so close to the hardware that it is easy to do so.