- Having an accumulator (abacus)
- Accumulator with operations (calculator)
- Multiple registers with more complex operations (early computers with plugboards)
- Stored program computer (abstraction over the plugboards)
- Imperative programming (simple abstraction over operations + registers)
- Procedures, Functions, Structures
- OOP, functional programming, and beyond.
Why do we keep making layers of abstraction? reusability.
We want abstractions that reduce effort by making code reusable.
But abstractions are only a tool, using the tool correctly is on the programmer.
Code is written once, read many times. Languages that focus on "easy to write" are a trap. Languages that focus on "easy to reuse" are what you want.