Once upon a time, computer programming was done in “machine language;” the low-level instructions that told the computer’s processor exactly what to do. At a somewhat higher level was assembly language, which hid much of the processor-level instructions but was still painstaking, easy to mess up, and hard to debug. Both levels were also specific to a type of processor; programming a computer with a different manufacturer’s processor meant learning a whole new language.