To master some of the fundamental concepts that underlie programming language syntax and semantics through a comparative study of several languages and their features; to learn several new programming language features and paradigms; to gain the ability to study conceptual linguistic issues without being confused or blinded by a particular language's implementation; to gain insight into the problem of designing new languages.
Programming proficiency in one but preferably two high-level languages such as Java, C#, or Perl. A previous course in Data Structures and Algorithms.
The primary textbook for this class is:
You'll probably do very well to pick up texts covering some of the main languages we'll be covering in this class:
You may also wish to buy some books (or consult online sources) that cover specific programming languages. The languages we will be covering most heavily in this course will be Java, Ruby, C, ML, and JavaScript. Moderate attention will be focused on Ada, C++, C#, Python, and Perl. A smaller amount of attention will be spent on Fortran, Lisp, Scheme, SQL, Smalltalk, Scala, Groovy, D, ActionScript, and Prolog, as well as a few others. Note that this list includes old as well as modern languages in order to cover the evolution of ideas in the field of programming languages.
Additional papers and readings will be assigned throughout the course (inlcuding my own course notes, practice problems, and sample code). If you have projects or papers to work on you'll have to find some additional readings on your own. Use judgement when researching on the web; a fair amount of information is often wrong, and much of the so-called sample code is especially atrocious. Still, please take the time for self-study and practice, practice, practice writing code.
You'll have several homework sets containing in-depth theoretical questions and non-trivial programming problems, and quizzes and a final exam with less difficult material. Graduate students will write a short paper on a modern, experimental, or esoteric language of their choice. To help prepare you to meet industry expectations for college graduates, most assignments will take the form of open source software products. Unless otherwise specified, you are required to keep all work in your CVS repository and prepare all homework solutions with LaTeX document preparation system. Exams will cover material from lectures not previously assigned for homework: don't whine about this.
Generally, coursework may be done in groups of no more than two students; however, while only one solution set is turned in per group, both students are responsible for understanding all of its content and may be asked at any time for an oral explanation of any solution. Collaboration with other groups is fine but must be limited: you may share ideas and approaches but nothing resembling a solution (not even pseudocode). You must also acknowledge any help received.
Your final grade will be weighted as follows:
Letter grades are figured according to the usual scale: 90% or more of the total points gets you an A, 80% a B, 70% a C, and so on. These are minimal requirements; for example, if you get 82 points you are guaranteed a B- or better, though you might still get an A since 82 may be the top score.
Homework
is due at the beginning of class; late assignments are docked
30% per class. Missing class just to get an assignment done on time
will not be tolerated; the only good excuses for missing class are
excellent surf conditions, family problems, sickness, and personal
emergencies. Skipping class just puts your fellow students
at an advantage: we often spend class
time going over things that will be "on the exam".
Your programming style will play a huge part in determining your score on the programming assignments. I will not hesitate to assign D's or F's to working programs which are poorly structured, under-commented, have poor identifier names and abbreviations, contain inappropriate hard-coded values, or are not easily maintainable. Appearance of the grading policy in this syllabus constitutes fair warning of the consequences of poorly written code.
We'll be covering Scott's textbook rather closely because the book is actually great. The chapters we will cover are: 1, 2.1, 3, 6-9, parts of 10, 12, and 13. However, we will differ a little from Scott's presentation by making heavy use of ML and Ruby throughout the main part of the course.