Course no. | Title | Credit Hours |
Reqd (R)/ Elective (E) |
---|---|---|---|
CSE459.XX | Programming Languages for Programmers |
1 | R * |
CSE655 | Intro. to Principles of Programming Languages |
4 | R |
CSE755 | Programming Languages | 3 | E |
CSE756 | Compiler Design & Implementation |
4 | E |
* : Students are required to take at least one 459.XX |
As explained in detail in section 2.3, courses in this group help us meet a number of EC 2000 Criterion 3 and CSE outcomes. Briefly, the variety of programs that students are required to design and implement to solve problems of varying difficulty, using ideas from discrete mathematics, formal languages, etc., ensures that these courses contribute toward meeting CSE program objectives 1a, 1b, and 1c and ABET criteria 3a, 3b, 3c, and 3e; the documentation that these systems require as well as the active class discussions that are a common feature of especially CSE655, enables these courses to contribute toward meeting CSE objectives 3a and 2b, as well as ABET 3d and 3g; the range of modern languages and tools that the students work with in these courses help these courses contribute toward meeting CSE objective 4a, and ABET criteria 3i and 3k; and the focus on ensuring that the students' programs are well designed and function correctly as well as discussions about common causes (such as memory leaks) for failures in real systems, help these courses contribute toward meeting CSE objectives 3c and 4a, as well as ABET criteria 3f, 3i, and 3k.
Students and faculty are generally satisfied with the courses in this group. For BS-CSE and BS-CIS majors, the most important course in the group is CSE 655; it is a required course for students in both programs. CSE655 brings together ideas from a number of earlier courses in the program such as Math366, CSE321, CSE560, and CSE625, and often addresses issues in a way that is directly related to actual practice in industry. As explained later in the report, there are also some problems with courses in the group that we are currently addressing. These problems, such as our inability to offer CSE 756 (Compiler design and implementation) have to do with lack of faculty in the area; the problem has been further exacerbated with the recent departure of Baumgartner from the department.
CSE655: This is the main course on programming languages. It is not a survey of languages; rather, the course is intended to ensure that the students gain a thorough understanding of the major concepts underlying different languages; use standard ways of describing programming language features; and gain an appreciation of alternate programming paradigms such as functional programming and logic programming. Students also gain a good understanding of ways of implementing languages such as compilers and interpreters, as well as run-time questions such as memory management. A common student project in this course is to implement a simple programming language; this allows students to gain a first-hand appreciation for problems ranging from parsing the input program, to detecting errors (both compile-time and run-time) in the program, to managing memory. Another common programming task is to have students design and implement a program in a language like SCHEME to acquire some facility for functional programming.
Students take this course in their senior year or late junior year. By that time many of them have had some industrial experience, either as interns or as part-time employees in local software companies. Naturally they bring to CSE655 their experiences with various languages, often leading to illuminating class discussions relating the CSE655 topics to actual industrial practice.
CSE755: This is a continuation of CSE655. It focuses on the theoretical foundations underlying programming languages, in particular on questions having to do with such topics as program verification and denotational semantics of programming languages. CSE755 is geared toward graduate students but some undergraduates with a strong interest in foundational questions, especially those considering graduate studies, take this course as an elective.
CSE756: This is also a continuation of CSE655. Students in this course study, in depth, the various problems in implementing compilers for programming languages and study various possible solutions. They put these solutions into practice by designing and implementing a compiler for a standard imperative programming language. This is a fairly demanding and extensive programming task and brings together ideas that students have seen in a variety of courses, from CSE560, CSE625, and CSE655. This course usually sees a mixture of undergraduate and graduate students.
CSE459, usually 459.21 or 459.22, is a pre-requisite for a number of courses such as CSE662, CSE677, etc. that have programming labs that use C or C++. Again, given the students' software development experience from CSE321, 459.21 or 459.22 provides the students with the appropriate programming skills needed to complete these labs.
CSE655: The pre-requisites for CSE655 are CSE560 and 625 (which in turn has Math366 as a pre-requisite). CSE625 provides students with the formal machinery (such as context free grammars) needed to gain a thorough understanding of the concepts underlying various languages, and to serve as a basis for suitable implementations of the languages. And the discussion of functional programming in 655, given the essential and natural role that recursive thinking plays in this discussion, builds on the exposure that students have had to recursion in earlier courses, including Math366 and 625.
CSE560 provides students with a conceptual model of the underlying hardware including the memory, so that students can appreciate the constraints that language implementations have to work with. Too, the solid software development experience of CSE560, including the need for proper documentation, serves the students well in their 655 project. Thus the pre-reqs are preparing students well for CSE655.
CSE655 serves as a pre-requisite for CSE721, CSE755, and CSE756. CSE721 is a course on Parallel computing (which relatively few undergraduates take); CSE655 prepares students for this course by ensuring that they have a thorough understanding of sequential programming languages and implementation questions concerning them. CSE755 as described earlier in this report builds on CSE655; it focuses on the formal foundations of programming languages; CSE756, also as described earlier, continues the 655-discussion of implementation of languages. CSE655 is serving the needs of these courses well.
CSE755: The pre-requisite for CSE755 is CSE655. CSE655 provides students with both the formal machinery concerning context-free grammars of languages, as well as the maturity in terms of having a good grasp of general language concepts including run-time issues. The understanding of automata theoretic ideas that students gain in CSE625 (which is a pre-req for CSE655) also helps students in CSE755 since this course builds on those ideas. Finally, students get to see, in CSE755, the precise basis for ideas such as pre- and post-conditions, as well as loop invariants, that they have been exposed to since CSE221.
CSE755 is a pre-requisite only for research seminars (CSE788.XX and CSE888.XX); these are primarily geared towards PhD students, so almost no undergraduates take these courses.
CSE756: The pre-requisites for CSE756 are CSE625, CSE655, and CSE680. CSE756 builds on the material in both CSE625 and CSE655. Parsing techniques etc. used in CSE756 are heavily dependent on finite state automata and other mechanisms that form the main topic of CSE625; the interpreter project in CSE655 also requires students to do parsing but the grammar of the underlying language is sufficiently simplified that students do not need to see many of the complexities that they see in CSE756 and that are unavoidable in a real compiler. CSE756 also, of course, builds on the 655 material, in particular run-time mechanisms appropriate for static scope languages since students implement in such mechanisms in their 756 compiler project. CSE680 is less directly connected with 756; nevertheless, many of the data structure and algorithms that students study in 680 have important connections to the kinds of structures and algorithms they use in 756.
CSE756 is not a pre-requisite for any other course.
In summary, the pre-requisites for the courses in the group are satisfactory. And the few courses that have courses in the group as pre-reqs are satisfied with the courses.
By allowing students to apply, in a new programming language, the skills they have gained in CSE321, CSE459 contributes toward meeting CSE objectives 1a and 1c. In CSE655 students gain a thorough understanding of important concepts underlying programming languages and how they are implemented; thus it contributes very strongly towards meeting objective 1a. Objective 1b is also met strongly since students rely heavily on ideas from discrete mathematics from Math366 and CSE625. And since the students practice what they learn on the programming projects and other homework assignments, 1c is also strongly met. CSE755 also contributes toward 1a and 1b, by providing students with a thorough understanding of the mathematically sound foundations underlying key programming language constructs. And CSE756, because of its extensive use of formal, mathematical ideas underlying programming languages and algorithms built on these ideas, contributes toward CSE 1a, 1b, and 1c.
By providing coverage of languages that students are likely to use in their future employment, CSE459 contributes strongly towards meeting CSE objective 4a. Much of the material in CSE655, dealing with implementation problems of realistic languages is directly related to actual practice in the software industry, so CSE655 also strongly contributes toward meeting 4a. CSE756 also contributes substantially toward meeting 4a since the techniques employed as well as the tools used (such as lex and yacc) in this course are frequently used in industry.
The documentation that is required to accompany the various programming tasks in these courses, from the relatively simple ones in CSE459 through the much more involved programs in CSE655 to the compiler project in CSE756 all allow us students to improve their (written) communication skills. The frequently interactive nature of the CSE655 lectures helps willing students to participate in expressing ideas in a group setting, and thus improve their oral communication abilities. Thus these courses help us meet objective 3a to a moderate extent.
The attention paid in CSE655 to such problems as memory leaks that may occur unless appropriate steps are taken in language implementation, as well as usability problems resulting from poorly designed syntax or user interfaces, and the professional responsibility of software engineers to pay attention to such problems, helps this course contribute toward meeting objective 3c. In addition, and indeed even more important, is the concern for ensuring that the software they design, such as the interpreter that students build in CSE655, functions correctly. All of these concerns also form an important part of the compiler project in CSE756, so that course too contributes toward this objective.
The focus, in CSE755, on foundational issues underlying programming languages, as well as the facility that students gain in CSE655 and CSE756 in using mathematical tools such as regular and context free grammars helps these courses prepare interested students for advanced studies in good graduate programs, thereby contributing toward meeting objective 4b.
The frequent classroom discussions in CSE655 involving students with a range of backgrounds (including some with several years of industrial experience) improves the ability of students to work with people with different backgrounds. Further, in both CSE655 and CSE756, students are encouraged to (and do) carry on extensive on-line discussions (on dedicated newsgroups) about problems they encounter in their projects. Thus these courses help us meet objective 2b to a limited extent.
The contribution that these courses make toward meeting various CSE objectives is summarized in the following table:
CSE 1a |
CSE 1b |
CSE 1c |
CSE 2a |
CSE 2b |
CSE 3a |
CSE 3b |
CSE 3c |
CSE 4a |
CSE 4b |
---|---|---|---|---|---|---|---|---|---|
XXX | XXX | XXX | X | XX | XX | XXX | XX |
The variety of programs that students design and implement to solve problems of varying difficulty in CSE459, CSE655, and CSE755, contribute strongly toward meeting criterion 3c. Further, the range of languages and tools that the students not only use in these courses but also analyze (in CSE655 and CSE756), strongly contributes toward meeting criterion 3k.
The use of precisely mathematical concepts such as regular expressions and context free grammars in CSE655 and CSE756, and the even more detailed mathematical basis that CSE755 builds on, help these courses contribute toward meeting criterion 3a. The need for debugging and correcting problems in the systems that the students design and implement in these courses contributes toward meeting criterion 3b. The focus on building correctly functioning software, as well as the attention paid in CSE655 to common sources (such as memory leaks) of problems in software systems and ways of avoiding these problems, help the students understand the professional responsibilities of software engineers, contributing toward 3f. The documentation that students are expected to provide for the systems they design in these courses, as well as the frequent class discussions in CSE655 help these courses contribute toward meeting 3g. Further, the range of (to them) new languages and tools that students in these courses have to explore and use, makes a contribution towards stressing the importance of life-long learning, criterion 3i.
The problems that students design programs for in these courses tend to be fairly precisely defined, with the students only working on designing appropriate solutions. But in CSE655, especially when working on their functional programming project, students have to formulate the problem in a rather different form than they are used to since the basic primitives of functional programming are quite different from the ones the students have been used since their beginning courses. This helps contribute toward meeting criterion 3e. Similarly in CSE755, students have to reformulate the question of correct behavior of programs into a very precise and formal characterization before they can attack the problem; this again contributes toward 3e.
The courses, with the exception of CSE755 which is geared toward foundational issues, seem to be meeting the needs of industry; regular campus-recruiters have commented that they are generally happy with the preparation our students have in this important area by the time they graduate. One comment that we have often heard from these industry people is that we should make sure that courses like the 459 course on COBOL continues to be offered since large parts of industry have a heavy investment in it. We should also continue to be aware of the possibility of offering new 459's in new languages and other software tools as appropriate. Possible examples are Tcl/Tk, Perl, Python etc.
Students have often complained about the textbooks for some of the courses in the group, especially for CSE655 and 755. While many books are available, they tend to be either superficial surveys, or deeply theoretical discussions of mathematical models of languages. Most instructors have been supplementing the current CSE655 text (by Sebesta) with their own notes. We will continue looking for alternatives. The textbook problem is particularly serious for CSE755; our ideal book for this course would build the theoretical concepts but at the same time draw the connections to practice. CSE459 and 756 have suitable textbooks available.
CSE756 is in good shape. Since there is a substantial programming project in this course we have briefly talked about making this a capstone design course. One difficulty here is that CSE756 introduces a number of new ideas that are used in the student project, the design and implementation of a compiler. This goes against our capstone design course guidelines (of not covering too much new material but rather focusing on the design). One possibility would be to move some portion of the current CSE756 to CSE655 so that 756 can devote more time to design issues.
CSE459 is working well. We need to be on the lookout for possible topics for new 459's.
Course | Coordinator | Recent Instructors |
---|---|---|
459.XX | Sinha? (459.11) Sinha? (459.21) Rountev? (459.22) Rountev? (459.23) Davis (459.31) Reeves? (459.41) Shen? (459.51) |
Curtin, Joseph, Parent(?), Wei Du, Yingjie Li |
655 | Soundarajan | Baumgartner, Soundarajan, Mathis |
755 | Rountev | Rountev, Soundarajan |
756 | Rountev | ?? |
People involved in preparing report: Neelam Soundarajan, Nasko Rountev, Bob Mathis.
Date of report: December 2004
Neelam Soundarajan