The general objectives for Com S 342 are divided into two parts: a
set of essential objectives, and a set of enrichment objectives.
The essential objectives will be helpful
for your career as a computer scientist; hence we want to
help you to master them. You are
encouraged to explore the enrichment objectives both for their own
sake and because learning more about those will help deepen your
understanding of the essential objectives.
Essential Objectives
In one sentence, the main objective is that you will have a deep,
working knowledge of the functional paradigm and
the key ideas used in modern programming languages.
In more detail the essential objectives for Com S 342 are that you
will be able to:
-
Write and modify programs using a mostly-functional style.
This means programming that makes effective use of the abstraction
mechanisms of functional languages, such as higher-order functions
(functions that take
functions as arguments and return functions as results) to achieve
generality and abstraction.
-
Write and modify programs that make effective use of data abstraction.
-
Modify interpreters to change or enhance their behavior so as to
implement various features of programming languages such as: control
flow, variables, recursion, scoping, syntactic sugars,
arrays, parameter passing mechanisms, objects, and inheritance.
-
Write programs using such features,
and explain (using appropriate terminology) and answer questions about
the user-visible behavior of such programs.
-
Explain (using appropriate terminology) and answer questions about
the data structures and algorithms used in interpreters to
implement such features.
-
Compare alternatives in the design and implementation of such features.
You will be permitted to use the textbook and course notes
for tasks involving programming, but not during tests. On tests you
may be permitted a small amount of reference material.
The functional style is one answer to the question:
``What are good ways to program?'' It also represents one major way
to organize a programming language for parallel processing.
Even if you do not become a programmer, the ideas of functional
programming (function abstraction, referential transparency, etc.)
have important applications in all areas of Computer Science
(such as software specification, algorithm design, and of course
in manipulation and specification of programming languages).
These ideas also have application in many other contexts such as
mathematics and engineering.
Data abstraction is a key idea for allowing programs to be easily modifiable.
It forms the basis for the object-oriented style of programming.
One specific benefit of achieving these objectives is that your
understanding will help you learn new languages quickly, by mapping
key ideas and concepts from this class into the new language's syntax and
semantics.
For example, Java and other object-oriented languages (such as Smalltalk-80)
use the ``indirect model'' of storage, which will be unfamiliar to you
if you've programmed only in C++, C, Pascal, or Ada (all of which use the
``direct model''). We will study this model in detail,
and you will gain practical programming experience with it, using Scheme.
Learning this and other key ideas
will also help you read (and write) a new language's
reference manual.
More importantly, understanding of fundamental concepts and run time
implementation ideas will help you to better understand whatever
language you program in; this will help you program more effectively.
Being able to program better will also give you increased job satisfaction.
Enrichment Objectives
Enrichment objectives could be multiplied without limit, but the
following seem most important or most easily taught using the course
text. Following each of the enrichment objectives is a brief
justification.
-
Design or critically evaluate design alternatives
for languages and language features
by careful consideration of their semantics.
In designing software you will often be confronted with decisions
about features that resemble those found in programming languages.
This is particularly true for the design of user-interfaces and
abstract data types. For example, a database management system
has to deal with names for (say) relations, and thus must have scope rules;
it will also have (difficult) type-checking problems, its query language
will have control-flow issues, there will be demands for sweeter syntax,
etc.
The basic principles taught in this course
can help with such design decisions,
and can provide guidance for overall designs.
Such skills are also important in judging whole languages,
for example if you wish to buy a compiler for your PC,
or if you become a manager of a group of programmers.
-
Be able to write the types of functions and use them in writing software.
Types are an important way to summarize the behavior of functions,
and a key way to check the basic sanity of software.
Although types are best checked automatically by software tools,
an understanding of them is important for writing such tools,
and for aiding the quick construction of correct software.
-
Use algebraic techniques to modify, derive, and prove programs
correct.
Such techniques are a powerful aid in writing sophisticated
programs and in reasoning about them.
-
Explain and answer questions about the features found in widely-used
programming languages, such as Pascal, C, C++, Ada, Java, BASIC, etc.
This is a good way to deepen your understanding of such features.
It also helps in informal or technical discussions.
-
Explain and answer questions about design principles such as
regularity, the zero-one-many principle, orthogonality, etc.
These principles form good rules-of-thumb that you can use in
designing programs or languages.
Last update $Date: 1998/08/20 19:57:39 $
Gary T. Leavens