The formal prerequisites in the Iowa State catalog are successful completion of Com S 321, either Com S 330 or Cpr E 310, and either Com S 309 or Com S 361.
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 330 and Cpr E 310 are courses in discrete mathematics. Several skills taught in these courses 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 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.