The formal prerequisites in the Iowa State catalog are successful completion of Com S 321, either Com S 309 or Com S 361, and credit or enrollment in Com S 331.
Com S 331 is a course in theory of computing. The main skill you need from Com S 331 is the ability to manipulate and work from context free grammars. For example, you should be able to write programs without parse errors using a context free (BNF) grammar for a programming language. In 342 we will extend and deepen your ability and familiarity with grammars.
In language design, questions also arise as to what kinds of mistakes a language can check for; since many such questions are unsolvable, you will sometimes need to apply your knowledge of impossibility results (e.g., the halting problem).
Computer Science 330 (discrete math) is a prerequisite to Com S 331. Several skills taught in Com S 330 are relevant to problem solving in general and to the kind of programming we will do in Com S 342. Familiarity with set theory, and recursive definitions is essential for various manipulations of syntax trees. Also needed are the concepts of the domain and range of a function, the ability to translate English into first-order predicate calculus (and set theory) and vice versa, and the ability to perform simple operations on logical expressions such as negation and simplification. These skills will help in type checking, in algebraic manipulation of programs, and in understanding formalized semantic ideas.
Com S 321 is an introductory course in computer architecture. The knowledge you need from Com S 321 includes an understanding of how data is represented in a computer, and assembly language programming. We will tap this knowledge in Com S 342 and expand on it to paint a more vivid picture of what happens in various programming languages at run time.
Com S 361 is a course in file organization and processing. Com S 309 is a course in software development practices.
From these courses you should have an appreciation for the problems of writing and maintaining medium-sized to large programs. You should also know how to design, modularize, and document a program. You should be thoroughly familiar with imperative programming techniques (assignment, looping, etc. as in C++, C, or Pascal). We will be studying imperative language features in 342.
Com S 228 or a similar course is a prerequisite of these courses. From Com S 228 you should have a knowledge of the basics of object-based programming: abstract data types, classes, data and function members of classes. You should also have a working grasp of fundamental data structures: arrays, lists, stacks, queues, hashing, etc. We will draw on your grasp of fundamental data structures in building interpreters, and on your knowledge of object-based programming in studying object-oriented languages. We will expand on and deepen your knowledge of object-oriented concepts such as inheritance.