CS152 answers one basic question – how a program gets understood by a machine? This course goes through the major phases in code compilation, including 1) lexical analysis; 2) syntactical analysis; 3) semantic analysis; 4) intermediate code generation; 5) code optimizations; and 6) target code generation.
CS160 covers the basic concepts and algorithms behind parallel computing and the major parallel programming techniques, demonstrated in real-world applications.
CS180 is an evolving course with a goal to cover more practical aspects of software engineering with hands-on experiences. The contents are driven by a team-based course project that develops a modern web or mobile app with advanced features. Major topics of this course include software process (agile methods, Scrum, and XP), software design (design patterns, UML, DFD, and FSM) and architecture (Layered and MVC), software implementation (web technologies and Android), software testing (white-box and black box) and verification (Hoare logic), software delivery (continuous integration and delivery), and software maintenance (bug reporting and code refactoring).
CS201 is an advanced compiler course. It starts with the internal code representations - intermediate representations (IR), such as control-flow graph (CFG) and static-single assignment (SSA), followed by a series of program optimizations internally performed by compilers, such as value numbering, common subexpression elimination, strength reduction, partial redundancy elimination, dead code elimination, and etc. The course has an emphasis on data-flow analysis, which has found many applications not only in compilers for code optimizations, but also in software engineering for program understanding and in computer security for vulnerability checking.