I mean, the early machine code (4040 / 8080) was a pattern of switches that turned functional units in the CPU on and off. The second generation of CPUs (8086) used a demultiplexer first. So, there was a clear relation between the machine code and the functions performed.
The third generation (80286) used indexes instead of demultiplexers, and microcode for the complex instructions. Here, the instructions that are actually executed start to diverge from the binary ones.
The fourth (Pentium) translated it into micro-ops that ran on two RISC CPUs. There are multiple execution units (instruction decode, load / store, integer, floating point, SIMD). All those execution units have their own instruction set and there is a task manager.
The fifth (Pentium Pro / M) introduced Out-Of-Order execution, shadow registers and an instruction code optimizer. Or in other words: they virtualized the CPU.
The sixth (current) adds more and more cores and execution units on a single die, and it adds a complex memory manager for the cache memory.
The next generation is in 3D modules and package stacking. And hopefully better multi-task support. One of the main bottlenecks for Intel is memory consistency. If they think they can get rid of that between tasks, they will. That requires more virtualization and support for messaging.