It started many years ago with a dream β a dream about a universal automaton. Many people were involved in its invention: Ada Lovelace , Charles Babbage , Alan Turing , Conrad Zuse , and many more. John von Neumann came relatively late to the party, but he described a hardware design in 1945 that became famous as the βVon Neumann architectureβ . Even if the technology evolved a lot and computers became much more powerful since 1945, more than 80 years later, the design of most modern computers is still a refined version of the original Von Neumann architecture.
But this is not where the dream stopped. We now had this wonderful general-purpose automaton, a computer that was able to execute arbitrary tasks. As long as a task could be represented by a series of operations reading and manipulating data, a computer based on a Von Neumann architecture was able to execute it. New dreams emerged. Many, many ideas that people would love to let such a computer execute.
The only problem was to make a computer execute an idea. This was a tedious task. While a computer was able to execute the task time and again once it had understood it, it was everything but easy to make a computer understand the task. In the beginning, it was necessary to translate the idea directly into digital machine code. Machine code was just a series of numbers, using numbering systems that most people were not used to like binary, octal or hexadecimal numbers. Writing machine code basically required to think like a computer.
As it was very slow, tedious and error-prone work to translate an idea into machine code, assembler language was developed. Assembler language is an abstraction on top of machine code, replacing the series of numbers with mnemonics that are easier to read and grasp for a human. Assembler language usually additionally provided some extra convenience for its users, like using labels for subroutine calls or jump targets instead of memory addresses, which improved the understandability of the code even more β at least compared to raw machine code.
Translating an idea into assembler language was still a tedious and comparatively slow task. In the end, assembler language was just a relatively small abstraction on top of machine code. While it made things better to grasp for the programmers, it still required thinking like a computer. This led to the invention of 3GL β 3rd Generation Languages like Fortran, ALGOL, COBOL or Lisp in the late 1950s. A 3GL was an abstraction that helped people to describe their intention in a way that was closer to humans.
Instead of having to describe the solution in terms of machine instructions (or mnemonics for them), it was now possible to describe it in ways that were a lot easier to comprehend for a human. Instead of having to write something like