Earlier quoted context omitted.
> Computers are 100% deterministic, from top to bottom. Not in every respect. Concurrency and C's undefined behaviour spring to mind.
It's still deterministic. It doesn't randomly do something different with the exact same IO. Just because it's hard to recreate the exact same state with concurrent processes on a modern CPU doesn't change it's determinism. Also, undefined behavior in C only means a compiler can do what ever it likes. It doesn't make it random. People need to stop pretending UB in C is magic. It's not going to delete your hard disk,…
Formally verified C code is guaranteed to be free of UB, as this is necessary in order for there to be guarantees about the behaviour of a program written in standard C. The underlying compiler and hardware are still deterministic.
A similar thing happens with concurrency.
> People need to stop pretending UB in C is magic. It's not going to delete your hard disk, or make you a pizza unless that's already part of your program.
It probably won't delete your hard-disk, but complacency with UB is still a bad idea. C is a strange language. UB is permitted to travel back in time. [0] Even in the absence of UB, the optimiser is permitted (but not obligated) to eliminate empty infinite loops, so even a basic property like whether your program will ever terminate, may be up to the whims of the optimiser. [1]
Anyway that was a long way of saying I agree, computers are deterministic, but something akin to nondeterminism can happen in the abstractions we use.