Assume I have a programming language $L$ with well-defined semantics. Showing Turing-completeness is straightforward: if I write a program using $L$ simulating the universal TM, I'm done. What I'm concerned about is another direction. How do we show that a program in $L$ can be simulated by TM when $L$ supports things like:
- File I/O (I guess this can be handled by considering the entire filesystem as the part of the tape?).
- Interactive user input (I guess we can treat it as non-interactive?).
- Interaction with external devices, e.g. display, network, etc. (I guess it can be handled by the file interface?).
- Assume that the semantics is non-deterministic (e.g. $L$ allows parallel execution). How to fit it into TM settings?
- Probably many other things I didn't think of...
I'm fine with a reference that covers this question. Note that I'm talking about the language itself, not about its implementations, and hence the Church-Turing thesis is not applicable: e.g. a Turing complete language which also has access to the Halting oracle is not Turing equivalent.