Understanding Computation From Simple Machines to Impossible Programs
This book is for programmers who are curious about programming languages and the theory of computation, especially those who don't have a formal background in mathematics or computer science. It's for those who are interested in the mind-expanding parts of computer science that deal with programs, languages, and machines, but are discouraged by the mathematical language that's often used to explain them. Instead of complex notation, the book uses working code to illustrate theoretical ideas and turn them into interactive experiments that readers can explore at their own pace.