A programmer's guide to designing compilers, interpreters, and DSLs for solving modern computing problems