# Courses in the PL/FM/SE area at the University of Illinois

**Regular**

This course will provide the basic matemathical concepts and models which form part of the core of computer science. The objective of this course is to gain experience in abstract mathematical reasoning and writing of mathematical proofs. Course Topics: Finite automata and regular languages; pushdown automata and context-free languages; Turing machines and recursively enumerable sets; computability and the halting problem; undecidable problems.

This course will be about fundamental issues in design and development of parallel programs for various types of parallel computers. Course Topics: various programming models according to both machine type and application area. Cost models, debugging, and performance evaluation of parallel programs with actual application examples.

This course will provide an understanding of the major classes of high-level programming languages, languages features, and programming styles, with an emphasys on applying concepts from programming language theory. Course Topics: Structure of programming languages and their implementation. Basic language design principles; abstract data types; functional languages; type systems; object-oriented languages. Basics of lexing, parsing, syntax-directed translation, semantic analysis, and code generation.

This course is an advanced course on principles of programming language design. Major semantic approaches to programming languages will be discussed, such as structural operational semantics (various kinds), denotational semantics, and rewriting logic semantics. Programming language paradigms will be investigated and rigorously defined, including: imperative, functional, object-oriented, and logic programming languages; parameter binding and evaluation strategies; type checking and type inference; concurrency. Since the definitional framework used in this class will be executable, interpreters for the designed languages will be obtained for free. Software analysis tools reasoning about programs in these languages will also arise naturally.

This course will provide an understanding of the Compilers structure. Course topics: syntax analysis, syntax-directed translation, automatically constructed recognizers, semantic analysis, code generation, intermediate language, optimization techniques.

This course will provide the fundamentals of Software Engineering. Course topics: Software process, analysis and design. Software development paradigms, system engineering, function-based analysis and design, and object-oriented analysis and design. Course will use team-projects for hands-on exercises.

Continuation of CS 427. Course topics: Software development, management, and maintenance. Project and configuration management, collaborative development models, software quality assurance, interoperability domain engineering and software reuse, and software re-engineering.

This Course will examine formal methods for demonstrating correctness and other properties of programs; includes an overview of predicate calculus. Course topics: Invariant assertions; Hoare axiomatics; well-founded orderings for proving termination; structural induction; computational induction; data structures; parallel programs.

This course is a general introduction to the field of formal verification. Course topics: Mathematical models, languages, and methods for software specification, development, and verification.

CS522 is an advanced course on semantics of programming languages. Various semantic approaches and related aspects will be defined and investigated. Executable semantics of various programming languages and paradigms will be discussed, together with major theoretical models. Course topics: Theory of programming languages including functional programming, meta-circular interpreters, typed, untyped and polymorphic lambda-calculi, and denotational semantics.

Theory of concurrency and concurrent programming languages. Courses topics: Formal models of concurrent computation such as process algebras, nets, and actors; high level concurrent programming languages and their operational semantics; methods for reasoning about correctness and complexity of concurrent programs.

Continuation of CS 426. Course topics: Incremental and interactive compiling, error correction, code optimization, models of code generators.

CS527 (Topics in Software Engineering) is a topics course whose content varies from one offering to another.

Advanced topics in computer-aided methods for formal deduction, selected from areas of current research. Course topics: resolution theorem proving strategies, special relations, equational reasoning, unification theory, rewrite systems, mathematical induction, program derivation, hybrid inference systems, and programming with logic.

**Special**

This course will provide an introduction to systematic and organized approaches to software testing. A 2002 NIST report estimates that software errors cost the U.S. economy $59.5 billion annually and that improving testing infrastructure could save $22.2 billion. Various studies show that testing can account for over 50% of software development costs. Students in this course will learn techniques and tools that could significantly improve their testing (and development) skills. Course topics: testing process, coverage criteria, automatic and manual generation of test inputs, execution of test cases, and validation of test outputs.

This course is a new practical course on multicore parallel programming. It emphasizes converting existing sequential code for parallelism. This course complements all our existing courses, and it can be seen as a capstone course on parallel programming for shared memory, desktop computers. We will use Java and its parallel libraries and tools, but many of the concepts are very similar to C# and C++ parallel libraries. The class project will require students to introduce parallelism into an existing open-source project that students are familiar with. We plan to include some of the research outcomes of Intel-Illinois parallel centers (UPCRC/I2PC) into the curriculum. Students are expected to have significant experience with programming in the sequential domain. They will finish the course equipped to convert today's sequential programs for parallelism, an invaluable skill set appreciated by software companies.

Intro to Parallel Programming for Computer Scientists and Computer Engineers. Parallel programming notations for shared and distributed memory machines, memory models, atomic operations, race conditions, synchronous and asynchronous computations, performance evaluation, parallel algorithms including graph algorithms, sorting, numerical linear algebra, and FFT.

This course will provide an introduction to mathematical logic from the perspective of computer science, emphasizing decidable fragments of logic and decision algorithms. The topics covered will be motivated by applications in artificial intelligence, databases, formal methods and theoretical computer science. The goal of the course is to prepare students for using logic as a formal tool in computer science. Course topics: syntax, semantics and proof theory of propositional logic, sat-solvers, syntax of first-order, the resolution proof system, syntax of second-order logic, connections between monadic second order logic and regular languages (word and tree, finite and infinite), tree-width and Courcelle's theorem with applications to parametric complexity, finite model theory and descriptive complexity, games and inexpressiveness.

A new generation of applications is changing the nature of programming with the need for scalability, parallelism, distribution, and mobility. Moreover, web applications require context awareness; cloud computing requires balancing availability, consistency and reliability; sensor networks use broadcast messages and have limited computational resources; and cyberphysical systems must also specify real-time control. Course topics: actor languages and related programming paradigms to address these challenges.

**Offering:**Regular

**Frequency:**Every Semester

**Offering:**Regular

**Frequency:**Once per year (usually Fall)

**Offering:**Regular

**Frequency:**Every Semester

**Offering:**Regular

**Frequency:**Once per year (usually Fall)

**Offering:**Regular

**Frequency:**Once per year (usually Fall)

**Offering:**Regular

**Frequency:**Once per year (usually Fall)

**Offering:**Regular

**Frequency:**Once per year (usually Spring)

**Offering:**Regular

**Frequency:**Twice per year (Fall/Spring)

**Offering:**Regular

**Frequency:**Once per year (Usually Spring)

**Offering:**Special

**Offering:**Special

**Offering:**Special

**Offering:**Special

**Offering:**Regular

**Frequency:**Once per year (Usually Spring)

**Offering:**Regular

**Frequency:**Once per year (Usually Spring)

**Offering:**Regular

**Frequency:**Once per year (Usually Spring)

**Offering:**Regular

**Frequency:**Once per year (Usually Fall)

**Offering:**Regular

**Frequency:**Once per year (Usually Spring)

**Offering:**Special