Programmers spend a lot of time understanding and improving their tools: editors, profilers, debuggers, and so forth. Technical magazines sometimes call to mind stores that sell outdoor gear: It's a rough world out there, you need all the equipment and gadgetry you can get. You, too, may have stared in admiration and longing at a particularly powerful syntax highlighter at some point in time.
Often lost in this analysis is a proper understanding of what tools and technologies can have the greatest impact. Irrespective of how you choose to write code and where you might run it, perhaps the single most important technology is the programming language itself. Languages both enable solutions and inhibit them; they save time and waste it; and most importantly, they either expand or contract our imagination. Yet how much have you thought about this, and how well do you understand the issues?
Whereas prior courses may have taught you how to program, this course teaches you how to analyze programming languages. What are the questions one asks when confronting a new language? What intellectual tools do we have for studying languages? What does a language designer need to know? How can we implement new languages? You should have much better answers to these questions when we're done than I expect you have now.
This semester, the course will significantly change the coverage of the core material on control. This material has traditionally been presented in a very abstract manner, which not only hurts bottom-up learners, but also fails to justify why this actually matters. In fact, the Web is teeming with all sorts of interesting forms of control. We'll pick our way through this menagerie to suggest solutions to practical and tangible problems.
Welcome to cs173. We hope you learn a lot in return for the hard work you're going to invest.
Your Course Staff