UW Cecil Project group memos

01: K: A High-Level Systems Programming Language
Craig Chambers
January 6, 1993 (Revised April 6, 1993)
02: The Design and Implementation of the Cecil Interpreter
Cecilia Chiang
March 19, 1993
03: Static Type Checking for Cecil
Stuart Williams
March 19, 1993
04: Bootstrap Cecil Compiler: Some Design Issues
Jeff Dean
April 5, 1993
05: Precedence and Associativity Declarations in Cecil
Craig Chambers
April 17, 1993
06: Formal Specification of the Dynamic and Static Semantics of Cecil
Craig Chambers
March 17, 1993
07: The Design and Implementation of the Cecil User Interface
Jean Kaiser
June 10, 1993
08: Near-Term Research Plan for the Cecil Project
Craig Chambers
August 26, 1993
09: Proposed Syntactic Sugar
Jeff Dean
July 1, 1994
10: Improved Object Constructor Expressions
Jeff Dean
September 6, 1993
11: Proposed Language Changes
Craig Chambers
October 12, 1993
12: Additions to the Cecil Language Specification
Jeff Dean
October 21, 1993
13: Issues in Dependency Implementation for Cecil
Jeff Dean
October 26, 1993
14: Intraprocedual Type Analysis and Splitting for Cecil
Dave Grove
November 21, 1993
15: A Textual Representation of the RTL
Dave Grove
November 10, 1993 (Revised Feb. 24, 1994; July 9, 1994; Dec. 15, 1994)
16: Dynamic Type Prediction Research Proposal
Charlie Garrett
November 11, 1993
17: Approved Language Changes
Craig Chambers
November 16, 1993
18: Results from Iowa
Craig Chambers
November 23, 1993
19: Procedure Specialization Research Proposal
Jeff Dean
November 28, 1993
20: Typechecking multimethods in Cecil
Piaw Na
December 5, 1993
21: An Analysis of Calling Sequence Inefficiencies
Jeff Dean
December 10, 1993
22: Combining Static and Dynamic Information for Inlining
Charlie Garrett
December 14, 1993
23: Christmas Vacation
Charlie Garrett
January 6, 1993
24: Predicate Objects
Piaw Na
April 2, 1994
25: Interprocedural Concrete Type Analysis
Dave Grove
April 8, 1994 (Reviesd May 8, 1994)

Determining the concrete type of expressions enables us to perform critical optimizations such as static binding and inlining. We are currently using a basic intraprocedural dataflow algorithm to statically determine the concrete type of expressions. One of the major weaknesses of this algorithm is that the result type of a send expression can not be determined unless the send can be statically bound and inlined. This hurts us in several ways. Firstly, there is a huge incentive to inline. This often forces us into over inlining which is expensive both in terms of compiled code space and compile time. Secondly, if we are unable to statically bind the send, we can not do anything. There are many cases in which the invoked method can not be uniquely determined, however the set of possibly invoked methods may return values of similar types. One obvious example of this is the print_string method.

The goal of this research is to explore algorithms for interprocedural concrete type analysis. One of the major difficulties in interprocedural concrete type analysis for object oriented languages is the mutual dependence between the call graph and concrete type information. This memo presents a simple, work-list based algorithm that simultaneously performs interprocedural concrete type analysis and constructs the call graph. Its also briefly discusses some of the issues not fully addressed by the algorithm, proposes a schedule for performing the research and discusses the related work.

26: Fast Calling Convention for Native Code
Jeff Dean
July 10, 1994
27: The Impact of Interprocedural Class Inference on Optimization
David Grove
???
28: Implementing Modules
Dave Grove
November 14, 1994
28B: Implementing Modules
Dave Grove and Craig Chambers, with marks by Gary Leavens
November 18, 1994
29: Using Static Types to Guide Splitting Decisions During Interprocedural Class Analysis
Dave Grove
January 1, 1995
30: Senior Thesis
Tina Wong
June 19, 1995

A pure object model provides the power of object-oriented programming for all data and all parts of the program. It allows easy development, modification, maintenance and reusability of software. This programming style has runtime performance disadvantages though, due to the creation of intermediate objects. The expense of intermediate objects comes from the space allocation and memory references to these objects. A standard optimizing compiler takes a conservative approach in optimizing intermediate objects. Often, unnecessary intermediate objects remain in the code after optimizations are performed.

In this thesis, a framework to optimize intermediate object structures is developed. The framework replaces unnecessary loads and stores with reads and writes to variables, and it deletes unused object creations. The framework is implemented on top of the Cecil language [Chambers 93] and the Vortex compiler. Cecil is a purely object-oriented language and Vortex is an optimizing compiler for the Cecil language written entirely in Cecil. The Vortex compiler provides a general framework to do dataflow analysis which allows optimizations to be added easily.

This paper is organized as follows. The next section provides an example to motivate why intermediate objects are expensive and how they can be optimized. In section 3 we describe the details of the optimizing framework. In section 4 we evaluate the performance of our framework and discuss the results of the study. Section 5 talks about related work and section 6 about future research directions.

31: Combining Class Hierarchy Analysis With Exhaustive Class Testing to Statically-Bind Message Sends
Jeff Dean
July 5, 1995
32: Goals and Ideas for Libraries in Cecil
???
???
33: Melvin: Modula-3 front-end to the VORTEX optimizing compiler
???
November 1, 1995?
34: Elimination of Redundant Comparison Statements
Mary Ann Joy
???
35: Issues in Typechecking of Cecil Programs
Craig Chambers
December 30, 1995
36: Javelin
Leo Shum
???

Recently, Java has gain much attentions. It is a simple, robust, object-oriented, general-purpose programming language. Currently, Java is designed as a platform-independent language. A Java program is compiled into binary files called class files. Those files contain instructions of the Java Virtual Machine called bytecodes. To execute a Java program, one has to have a Java interpreter on the computer and invoke the interpreter. The interpreter will emulate the Java Virtual Machine which in turn executes the bytecodes in the class files.

Because of its platform-independency, normally interpreter is needed to run every Java program. Interpreter execution is known to be slow. One method of increasing performance is to generate, instead of machine-independent class files, real native platform-specific binaries. This will eliminate the need of the interpreter and the computer can execute the program directly.

In this thesis, I developed a program called Javelin. This program translates the Java Virtual Machine bytecode into the Vortetx Compiler s register transfer language (RTL). The RTL program is then compiled with the Vortex compiler to generate native machine code. Much of the implementation of Javelin is based on Javap, an existing Java disassembler from Sun Microsystems Inc. distributed with the Java Developer s Kit (JDK), version 1.0.

37: A Survey of State-of-the-Art Lambda and Object Calculi with Type Systems Providing Subtype-Bounded Type Abstraction
Vassily Litvinov
June 1998
38: Exceptions for Cecil
Keunwoo Lee
August 16, 2000

Cecil/Vortex Project, cecil@cs.washington.edu