See slides for the first part.

A note on our mission

At this point, we have discussed some high-level ideas about what a programming language is, why new programming languages are created, why so many have been created, and what goes into the design of a programming language.

What we have not addressed is why we should study programming languages. Hopefully the ideas we discussed seem worthy of further study on their own, but we should also consider the outward-facing, indirect benefits of such study as well. We will give a brief motivation now and return to this question after our first case study, when we will share more vocabulary and a deeper appreciation for what it can mean to study a programming language. So here’s the short story.

As the interfaces between human, algorithm, and machine, programming languages guard the crossroads of computer science. They must balance ease of expression, clarity of intent, flexibility of programming style, control over low-level execution detail, modularity, portability among systems, extensibility, resistance to errors, analyzeability, cleanliness of abstraction, precision of meaning, and countless other concerns.

Studying programming language semantics gives you invaluable experience with precise reasoning and careful abstraction-building. Studying PL design tensions prepares you to make informed big-picture design decisions and to pick the right tools for the job at hand. Learning to think about software and computation in a “PL” mindset makes you a better programmer regardless of what language you use. It also prepares you with the mental tools to pick up new programming languages and computational ideas quickly and effectively in the future.