CSCI.4430/6969 Programming Languages Spring 2005
Programming Assignment #2
This assignment is to be done either individually or in groups of
two or three students. Do not show your code to any other group and do
not look at any other group's code. Do not put your code in a public
directory or otherwise make it public. However, you may get all the
help you need from the TAs or the instructor. You are encouraged to
use the WebCT Discussions page to post problems so that other students
can also answer/see the answers.
MIJava: Multiple inheritance extension to Java.
The
goal of this assignment is to implement a limited multiple inheritance
extension to a subset of Java (see VRH sections 7.4.4 and 7.4.5 and
also see FWH exercises 5.31 and 5.32) using
OpenJava.
Following is an example skeleton of a program TA.oj
in MIJava:
public class TA instantiates MIJava multiextends
Student, Staff {
...
}
This TA class extends both the Student and Staff classes. The
code for a sub-class should be able to access information in any of its
super-classes. For example, the Student class may have a getGPA() method
which does not apply to Staff objects, and the Staff class may have a getSalary() method
which does not apply to Student objects. However, getGPA() and
getSalary() are both valid
methods for an instance of the TA class.
Part 1. Simulate multiple inheritance using single inheritance.
In this part of the assignment, you are to write Java code that simulates
the MIJava code for a given example (e.g., TA code above).
Since Java does not directly support multiple class inheritance, you
are to come up with a strategy to simulate multiple inheritance using single
class inheritance. You may for example use Java's support for multiple
interface inheritance.
You need to decide what to do with duplicate method and field names.
Specify your language extension restrictions clearly: what is allowed
and what is not, and what is your conflict resolution methodology.
Part 2. Automatically generate Java code for MIJava.
In this part of the assignment, you are to write OpenJava code that automates
the translation of MIJava programs into Java programs. Your OpenJava
meta-class should take MIJava code such as TA.oj
and produce the corresponding Java code implementing your multiple inheritance
semantics. The generated code should generally resemble the code
you produced in Part 1. Specify any restrictions and assumptions
you make in the process.
Examples
Example files can downloaded here.
They demonstrate what your strategy for multiple inheritance must handle. These examples will be
used to grade your assignment, so if your strategy requires changes to these files due to new syntax,
please modify the files as required and upload them along with your project.
There are eight different example folders, each containing a set of classes. What
they test is as follows (for more detail read comments in the files). A rundown of
what the different examples are is as follows:
-
example1: trivial tests to make sure your strategy works with single
inheritance and no inheritance.
-
example2: tests conflicts between inherited fields and methods.
-
example3: tests correctly inheriting fields and methods.
-
example4: a more complex test of inheriting fields and methods. fields and
methods are inherited not only from inherited classes, but their superclasses as well.
-
example5: a more complex test of conflicts between fields and methods. fields
and methods not only conflict with inherited classes, but their superclasses as well.
-
example6: tests overriding methods.
-
example7: tests passing classes with multiple inheritance as arguments to methods.
-
example8 (bonus): tests modifying access control of inherited methods and fields.
Hints
-
Feel free to limit Java's syntax and semantics, so that you need not worry
about arbitrary MIJava programs. These assumptions may facilitate
your translation process, so that you can concentrate on the issues that
arise implementing multiple inheritance. For example, it is
reasonable to assume that the MIJava code:
-
Provides no access control. This is to say, every declared class,
field, and method is public.
-
Does not use traditional Java interfaces, only classes. For example,
to avoid collisions with generated code.
-
Does not use both extends and multiextends clauses.
-
Provides a constructor with no arguments, if you need one and do not want
to generate it.
-
See the Java
Language Specification for learning how to access super-class fields
and methods. In particular, see:
-
To use OpenJava on the computer science machines, first log in then use your favorite editor to open a
file called ".bashrc" (it is hidden). Then add "/projects/proglang/OpenJava_1.1/src" to the CLASSPATH
variable in this file, and add the line "alias ojc="/projects/proglang/OpenJava_1.1/bin/ojc.ksh". Log out
and log back in and you should be able to use the open java compiler with "ojc".
Due Date:
Received Time |
Grade Modification |
before Monday, April 4th, 11:59PM |
+10% |
Tuesday, April 5th, from 12:00AM to 11:59PM |
no modification (on time) |
Wednesday, April 6th, from 12:00AM to 11:59PM |
-10% |
from Thursday, April 7th, 12:00AM to
Friday, April 8th, 11:55PM |
-25% |
after Saturday, April 8th, 12:00AM |
not accepted |
Grading: The programs will be tested on the CS network
versions of Java/OpenJava. The assignment will be graded mostly on
correctness, but code clarity / readability will also be a factor
(comment, comment, comment!). In particular, make sure you state
up front in the README file, the restrictions and assumptions you
are making on your input MIJava programs. See the professor or
TAs, if you have ideas for other extensions for this assignment and
would like extra credit for implementing them.
Since there have been many questions about the grading,
here are more specific criteria about what is expected and how your assignment
will be graded.
Part 1:
-
Example Code (25%) Include example hand-written java code which which
corresponds to OpenJava code using the multiextends keyword. For example,
take example2, example3, example6 and example7 and write java code which
will run with the desired behavior.
-
Write-up (25%) Provide a writeup illustrating a general strategy for converting
OpenJava code with the multiextends keyword into java code (what you did for
the example code). Explain the benefits and limitations of your strategy. More
points will be awarded to strategies with limitations that are described in the
writeup, than those that don't mention the limitations at all.
Part 2:
-
Readme (10%) Provide a readme file that details how your OpenJava code works, how
to use it, what machine/OS you used it on. Also list the examples your code
works with, and the ones it has trouble with.
-
Automated Code Generation (40%) Your OpenJava code converts the example code to
java code that runs with the desired behavior. If you've added new syntax to
handle conflicts or other things, you can modify the example code appropriately
and submit the modified code along with the rest of your assignment.
Submission Requirements: Please submit a ZIP file with your
code, including a README file with testing instructions and your working examples. In the README file, place the names of each group
member (up to three), and the version(s) of Java that you have tested it under. Your code will be tested in the CS machines, so make
sure it works there. Your README file should also have a list of specific features / bugs in your solution. Your ZIP file should be
named with your WebCT user name(s) as the filename, either userid1.zip or userid1_userid2.zip, or userid1_userid2_userid3.zip. Only submit
one assignment per group via WebCT.