Projects
Fall 2017 Older Courses Spring 2017 Fall 2016 Spring 2016 Fall 2015 Spring 2015 Fall 2014 Spring 2014 Fall 2013 Spring 2013 Fall 2012 Spring 2012 Fall 2011 Spring 2011 Fall 2010 Spring 2010 Fall 2009 Spring 2009
Fall 2008
Spring 2008
Fall 2007 HOWTOs |
OrganizationProgrammingLanguagesFall2008Home Assignments Lecture Blog Resources Project 91.301 Organization of Programming Languages, Fall 2008 Quick Links to Student Final Projects!
We will be using the following books:
RationaleBasically all departments that award bachelor's degrees in Computer Science have a course like OPL. Such a class is also required by CSAB, the professional organization that accredits CS degrees. So, everyone's got onewhy? In my opinion, this course exists to give you a different way of thinking about computing. A way that is really quite apart from the professional programming languages like C, C++, and Java, all of which are based on an edit/compile/debug/deploy model of computation. There are basically two variants of the OPL-type course at CS departments. One variant is a survey of the ideas in many languages that have been created and implemented. The other variant is a deep-dive into a language favored by language researchers, often Scheme or CAML. Both of these languages are meta-languagesthey are languages for making languages. At UMass Lowell, we take the 2nd approach (deep dive) in our undergrad course, and the survey approach in our grad class. For many years here, 91.301 has been a close implementation of the famous 6.001 course at MIT, Structure and Interpretation of Computer Programs. This course was created in the 1970s and has been hugely influential. Now, it so happens that MIT has just implemented a major overhaul of their undergrad EECS curriculum, and as of Fall 2008, the 6.001 course is no longer being offered. Given that, why are we still teaching it, you might ask? What Is The Big Idea?There are actually several big ideas in SICP (as it is commonly known) that we will bring out in OPL:
But in Scheme, the fundamental notation for describing code and data (known as the S-expression) is the same thing. Data structures and executable procedures are both nested lists. Furthermore, it is commonplace for code to produce data that is executed as code.
This leads to the next point...
This idea, which is of course the basis of object-oriented programming, is so well-established that it may now seem obvious. But this was hardly the case in the 1960s and 1970s when SICP was developed. Scheme has a somewhat different way of bundling together data representations and the procedures (methods) for manipulating them, which allows a high degree of flexibility.
Scheme handles things totally differently. Once you create an object, it's just thereexisting in the environment in which it was created. As long has you have a handle to it (i.e., you've named it, or it's part of another object that you have access to), the object will persist. When you quit Scheme, the entire environment including all objects gets saved to disk. Next time you relaunch, you reload the environment file and everything is exactly as you left it. (There once were Lisp Machines, and the concept of quitting Scheme didn't exist.)
As part of the implementation of the environment, garbage collection was introduced. Objects that had no way of being accessed (i.e., they had no names, no pointers to them) could be removed from memory, and the space they took up could then be freed for other purposes. Once controversial because of its complexity, automatic garbage collection is now considered an obvious part of a modern language design.
Because of the Listener, developing Scheme programs feels quite different than working in a typical edit-compile-test language. After a single procedure is defined, you can try it out interactively, giving it inputs and examining its outputs. Combined with the concept of the environment, you end up iteratively and alternately developing data structures and the code for operating on them.
When you become accustomed to the Listener, you feel stymied without it. It becomes annoying to write main functions simply for the purpose of exercising your routineswhy can't you just talk to them directly? Similarly, the environment is a powerful constructyou build up a library of objects that are part of your project, and once created, they are part of your software system.
Indeed the whole experience of computing becomes one of building objects that of course persist and seem alive. Rather than writing recipes that only temporarily instantiate objects, you create them directly, knowing that they will be there for you later.
Course Structure and GradingThe class will have regular weekly assignments, which will be graded and returned. Cumulatively these assignments are worth 25% of your overall grade. Assignments will be accepted up to 1 week late with a 50% reduction in that assignment's value. At least 2/3s of all weekly assignments must be completed satisfactorily or your overall assignment score will be demoted to 0. (Translation: please take the homework seriously; this is where you will do most of your learning.) There will be two in-class quizzes during the semester. Each is worth 10% of your overall grade. There will be a cumulative final, worth 20% of your overall grade. Classroom attendance and participation is worth 10% of your overall grade. In practice, if your other grades put you on a marking boundary, this will push it one way or the other. You may notice that this leaves 25% remaining. I am introducing a final project into the course, which will be conducted in the last three weeks of the semester. We will start talking about it before then, though, so you can start preparing for it. In the final project, you will apply the ideas developed in the class in an original software implementation. You may thus connect the ideas of the class with your own interestsmusic, robotics, art, databases, the web, networking, gaming, etc. The learning goal of the project is to have you find some real-world relevance of the ideas in the class. To summarize: 25% Weekly homeworks Discussion Group / E-Mail ListWe will use Google Groups for class conversation and announcements. Please join this group. I'd advise setting your preferences to immediate, individual delivery of messagesclick the Edit my membership tab. The group address is 91301-f08@googlegroups.com. You have to be a member to send to the list. Collaboration PolicyYou are welcome to discuss ideas in the class with your peers. However, pair programming or other sharing of code is not allowed. By turning in an assignment, you attest that you have written the code that it includes. Please be familiar with the university's academic integrity policy. Honors SectionStudents who are registered for the honors section of the class are expected to have exemplary work, including classroom participation, written work, and the course project. Additional and more difficult problems will be assigned in most of the weekly problem sets. AcknowledgmentI am inheriting this course from UML Prof. Holly Yanco, who has taught it in exemplary form for a number of years. Much of the course materials will be based on her work. |