This course covers an introduction to the design and implementation of programming languages. From the design point of view, we will study language features as tools for expressing algorithms. From the implementation point of view, we will study compilers, interpreters, and virtual machines as tools to map those features efficiently onto modern computer hardware. The course will touch on a wide variety of languages, both past and present, with an emphasis on modern imperative languages, such as C, C++, Java and .net and scripting languages.