This introductory textbook teaches the principles of programming languages by using an experiential learning style, in which students learn about language features by realizing those features in a pedagogical compiler. Students use Java, the most commonly, used programming language in the first two years of the computer science curriculum, as the implementation language throughout. The book also discusses a range of emerging topics in programming languages missing from existing textbooks, including concurrency, Big Data, and event-driven programming. The goal is to prepare students to design, implement, analyze, and understand both domain-specific and general-purpose programming languages.