Let's set the stage with a cliché: software development is constantly evolving towards ever higher levels of abstraction. We have object-oriented and functional programming built on top of imperative programming on top of assembler on top of machine code.
