It is possible in standard cryptographic assumptions (like, existence of cryptographic hash functions), and proofs can be made non-interactive in a random oracle model.
Modern zero knowledge proofs are also asymptotically shorter than the computation itself, so you could publish a short argument (relative to the computation time) that the execution of the program gave the result O.
Techniques to read about are ZK-Starks (weakest cryptographic assumptions) and various ZK-Snarks, which typically leverage at least hardness of discrete logarithm (Bulletproofs, Halo) or stronger assumptions about elliptic curves with pairings (Pinoccio).
I will very briefly explain the basic idea behind ZK-Starks. First of all, we could use a Merkle tree to make prover commit on a trace of computation, and then probabilistically check in ~N queries that, say, 1-const/N of gates were executed correctly. However, flipping even one bit in a computation might make it go completely wrong, so we are in a very strange model of error-resistant computation: normally, error-resistance is against random errors, but here errors are malicious, prover can force specific gates to misbehave.
So, the trace of computation is transformed into some polynomial, and the predicate of being correct on each gate is transformed into some property on these polynomials.
(I'd like to warn you that in practice there are a lot of technical details, for instance because nobody likes working with Turing machines, but you can imagine that you have some polynomial P(x), and its values in points $x \in \{1...m; m+1, ... 2m; ..., (n-1)m+1 ... nm\}$ encode the state of the tape of length m in time n.
Then, encoding states of the cells of the tape by values of the polynomial, you can devise polynomial condition $Q$
$Q(P(x+n), P(x), P(x+1), P(x+2), x) = 0$ in every point of the set $\{1...mn\}$, which holds iff the state of your Turing machine at the moment t+1 is a correct evolution of its state in the moment t). The variable x is added explicitly to control overflow.
Then, you can reformulate it as a condition on polynomials which holds everywhere. Indeed, you can just demand that $Q(P(x+n), P(x), P(x+1), P(x+2), x) = IH$, where I is an indicator polynomial $(x-1)...(x-mn)$, and $H$ is some polynomial. It is equivalent to the previous condition.
Now, good thing about polynomials is that if you check the condition in a random point, and size of your field is big (think ~2^256) relative to the degree of a polynomial, then with overwhelming probability condition holding in a random point holds everywhere.
The rest is error-correcting codes: you need to somehow check that the commited function is a polynomial of bounded degree, or at least $\varepsilon$-close to it (in Hamming distance). For this, you repeatedly engage in Fourier-transform-like activity, breaking the polynomial into odd and even part and proving it for its random linear combination.
Good classical results to read and understand where these techniques come from:
Matiyasevich's classical theorem on non-solvability of diophantine equations is, I believe, one of the first examples of arithmetization. It is over $\mathbb{Z}$ and encoding is not by polynomials, but by numbers, but it is the predecessor of the whole story.
IP=PSPACE is a celebrated result that any PSPACE problem can be verified by an interactive probabilistic protocol of polynomial time. In this result prover is computationally unbounded, but ideas of encoding your boolean formula as an arithmetic circuit over bigger finite field $\mathbb{F}_q$ and then using random linear combinations to convince polynomially bounded verifier are all there.