Using virtual addresses in this way involves translating a virtual address to a physical address on every processor instruction and data operand fetch.
In order for this to be viable, this translation can't be done soley in software, which would require additional processor instructions which would also require translation.
Processors have a memory management unit (MMU) that translates virtual addresses to the physical address.
So the processor effectively executes machine programs that are compiled into instructions and data at virtual addresses.