Source: https://web.stanford.edu/class/archive/cs/cs106b/cs106b.1178/lectures/28-DifferentLanguages/28-DifferentLanguages.pdf