Understanding Computation (From Simple Machines to Impossible Programs)