Source: https://web.stanford.edu/class/cs106e/lectureNotes/L14NProgrammingLanguages.pdf