1. Field of the Invention
The present invention relates to a theoretical model or framework for representing a unification of the semantics of sequential programming languages, i.e., sequential procedural and sequential object oriented programming languages (OOPL), independent of their syntax.
2. Description of Related Art
Type Theory of Programming Languages has been the target of focus as the basis for unification of programming languages. Based on this Type Theory, Microsoft has developed an intermediate language called Typed Intermediate Language (TIL) for their net framework. TIL is a stack-based assembly language and a wrapper for Intel's assembly. It is based on a stack execution model and looks alien to a high-level language programmer. The purpose of TIL is to create a common execution model capable of supporting language interoperability. It has Classes directly built in (thus support for OO) at the Assembly Level. It is desirable, however, to unify programming languages at the level of their Definition and Semantics rather than being tied to the memory execution model of any particular platform. This offers the advantage to customers of converting their applications of any particular platform. This offers the advantage to customers of converting their applications from legacy programming languages to contemporary ones independent of the platform of execution.
The same inventors and assignee of the present invention developed an earlier or predecessor to the present inventive framework referred to as Typed DGC Classes based on: (i) the Theory of Computability; (ii) Axiomatic Semantics of Programming Languages; and (iii) Type Theory of Programming Languages. The Typed DGC Classes were designed to unify programming languages at the level of their Source Language Definition and Semantics however, this framework was only suitable for imperative procedural languages, e.g., C, Pascal and Cobol, and did not have the capability of handling Pointers, Modules, Structures, Classes, and Objects.
It is therefore desirable to develop an improved model or framework to capture the semantics of programming languages that is independent of the syntax of any programming language, independent of the execution platform, and suitable for sequential programming languages (both sequential procedural and sequential object oriented programming languages).
All computer programming languages fall within the limits defined by the Theory of Computability developed by Turing or equivalent approaches such as Lambda Calculus, Theory of Recursive Functions, or Markov Algorithms. It is desirable to develop a unifying programming language that adheres to these central and underlying concepts.
The present invention is a system and method for universal programming language conversion using a model representing a unification of the semantics of sequential programming languages and is hereinafter referred to as Generic Typed DGC Classes Framework. Development of this Generic Typed DGC Classes Framework was based on the following mathematical principles:
Specifically, an embodiment of the present invention is directed to a method for universal programming language conversion between two different sequential programming languages. In particular, conversion is between a source program in a first programming language and a target program in a second programming language. Initially, the source program in the first programming language is parsed using a parsing interface specific to the first programming language. All syntax from the parsed source program is then stripped or removed. Classes in a framework are instantiated to capture semantics of the parsed source program independent of syntax and execution model of the sequential programming languages. The classes are C++ classes representing fundamental core constructs of all sequential programming languages. A semantic representation of the parsed source program without any syntax is produced. The semantic representation is received at a printer interface specific to the second programming language and syntax of the target program in the second programming language is added. This process can be used for any type of language conversion, e.g., high level translation or compilation depending on whether the target programming language is high level or low level programming language, respectively.
Another embodiment of the present invention is directed to an apparatus for universal programming language conversion using the method described above. The apparatus comprises a parsing interface specific to the first programming language for parsing the source program in the first programming language and stripping all syntax from the parsed source program. Classes in a framework are instantiated to a produce a semantic representation of the parsed source program independent of syntax and execution model of the sequential programming languages. A printer interface specific to the second programming language is plugged into the back end. The printer interface receives the semantic representation and adds the syntax of the target program in the second programming language.
Still another embodiment of the invention relates to an apparatus for universal programming language conversion between two different sequential programming languages including a source program in a first programming language and a target program in a second programming language, wherein the apparatus comprises a processor for instantiating classes in a framework representing a unification of semantics of the sequential programming languages (e.g., sequential procedural and sequential object oriented programming languages) independent of syntax and execution model.
The foregoing and other features of the present invention will be more readily apparent from the following detailed description and drawings of illustrative embodiments of the invention wherein like reference numbers refer to similar elements throughout the similar views and in which:
The present inventive Generic Typed DGC Classes Framework generically represents the semantics of building blocks of any sequential programming language (both sequential procedural and sequential object-oriented programming languages), independent of its syntax and the execution model for the language on any chip (register-based or stack-based). A computer programming language generally comprises fundamental core constructs (which make the language Turing-complete) and advanced constructs. An advanced construct is simply a shorthand way to express a combination of one or more fundamental core constructs thereby offering convenience and expressiveness to the programmer. Advanced constructs never add to or enhance the Turing-completeness of any such programming language. Thus, an advanced construct of any programming language can always be constructed from its fundamental core constructs. All programming languages are Turing-complete, but they differ in their syntax of offering the fundamental core constructs required for Turing-completeness. Additionally, some languages offer advanced constructs, which do not enhance the underlying semantical properties of Turing-completeness, but instead are merely composites of its fundamental core constructs.
The present inventive Generic Typed DGC Classes Framework has been developed as a minimal and simple set of C++ Classes that capture the semantics of the constructs in any sequential programming language independent of the syntax of any programming language and the execution model on any chip (e.g., stack based or register based). The Generic Typed DGC Classes Framework is therefore universal in that it is capable of being instantiated for any construct of any sequential programming language, albeit procedural or object-oriented.
The Generic Typed DGC Classes Framework is based on the same theoretical foundations expressed above with respect to its predecessor the Typed DGC Classes and further in consideration of aspects from the Theory of Objects, as written by Cardelli, Luca and Abadi, Martin, in the book under the same name published in 1996. The theories mentioned serve as the basis of universality by which the present inventive Generic Typed DGC Classes Framework may be applied to any sequential programming language. Accordingly, the present inventive Generic Typed DGC Classes Framework is an improvement in that it is suitable for use with a wider range of applications than that of its Typed DGC Classes predecessor.
Any sequential programming language can be broken down into fundamental core constructs that are hereinafter referred to as Types (denoted by bold italics with the first letter capitalized). These constructs serve as the building blocks for different constructs in different programming languages. Thus, all programming language constructs are combinations of these underlying fundamental core constructs (Types). For example, a program is a set of DECLARATIONS followed by a sequence of COMMANDS; an ASSIGNMENT STATEMENT comprises a VARIABLE on the left hand side and an EXPRESSION on the right hand side; and an ITERATION is a repetitive execution of a sequence of COMMANDS. All sequential programming languages differ only with respect to the complexity of compositions of these fundamental core constructs (Types).
Each Type is defined in terms of its algebraic specification, i.e., as an Abstract Data Type (ADT). This algebraic specification translates into a C++ Class (corresponding to the Type under discussion) and its associated members (referring to the operations on that Type) that have been already implemented as a minimal and simple set of C++ Classes which can be instantiated for any construct of any sequential programming language. Thus, the Generic Typed DGC Classes Framework is a C++ Class Library wherein the classes (Types) are instantiated to model the constructs of any sequential programming language.
Every computer programming language has two parts, i.e., states and commands. A variable and its associated value define the state of a system at a given point in time, while a command represents the operation on the state to query or change its associated value. In all programming languages the concept of commands and its representations remain the same, however, the concept of variables and their representation differ in different programming languages.
A Type may be broadly defined as a set of elements that share at least one common property or characteristic. Each programming language offers multiple varieties of Type. Each Type has a TypeName associated with it (as denoted by all capital letters). The TypeName is a unique name or label used to identify each Type. This TypeName corresponds to our intuitive notion of Types.
The interrelation of Types is defined by Typing Rules associated with a particular programming language.
Of these base Types, Descriptor and Environment are special categories. Descriptor is used to specify (describe) properties of certain other Types and is used as the basis from which these other Types are constructed. Environment is used for creating and storing other Types (including instances of Descriptor and Environment), that is, Environment is the container for all Types. The Environment recognizes the Types and associated Typing Rules supported by the particular programming language.
An Environment comprises the Language Context (which defines the programming language based on its recognized Types and associated Typing Rules supported by the particular programming language), and the Program State (i.e., the set of Variables and their associated Values declared for a given program). Thus, the Environment is the substrate Type on which a programming language is defined, constructed, and executed.
Data Types may also be classified as a Basic Computable Type or a Composite Type specified (described) by their corresponding Descriptors and the Environment that recognizes or supports them. The term Basic Computable Type is defined as those Types which (i) are not composed from any other Type and (ii) for whom direct computations are possible on their Values.
Some exemplary Basic Computable Types (with their associated conventional TYPENAME identified within [] brackets in all capital letters) include:
String has been identified as a Basic Computable Type in the present inventive Generic Typed DGC Classes Framework, for matters of practical convenience. However, the present inventive framework could be modified so that only Character is classified as a Basic Computable Typ, while Sting is a Composite Typ as constructed from Character.
The TYPENAME associated with each Type may be selected, as desired, without having any impact on the invention. In the present inventive framework, the Types of INT, REAL, STRING and CHAR have each been assigned a unique Type Name. It is, however, recognized, for example, that ARITHMETIC may be the Type Name used to generically refer to either Integer or Real, while STRING may be used to refer to either Character or String.
Composite Types represent compositions of one or more Basic Computable Types and/or Composite Types. Some exemplary Composite Types may include:
Pointer, which “points to” or “refers to” an element of any Type or a Type that has not yet been specified;
Array, which represents a finite and indexed set of elements of the same Type; and
Record, which represents a finite set of elements that may belong to different Types.
As noted above, each kind of Basic Computable Type and Composite Type is instantiated only through the different kinds of Variables by specifying their corresponding Descriptors and associated Environment that supports or recognizes these Types, as described further below.
The present inventive Generic Typed DGC Classes Framework is explained by first describing the Types and associated Typing Rules and thereafter defining their interconnection within the Environment.
Each Type is axiomatized based on an algebraic specification (an Abstract Data Type (ADT)) as prescribed by Meyer, Bertrand, in the publication entitled “Object-Oriented Software Construction”, (1977)(2nd Ed.), which in turn is based on the theory of Many-Sorted Algebras. This algebraic specification comprises a Signature representing the set {S, Ω}, where S represents the Sort(Type) under construction and Ω is its associated set of operators. This specification directly translates into a Class (i.e., Type) and its associated members (i.e., operations on that Type). Three distinct categories of Operators are defined viz: Creators, Modifiers, and Queries. Creators create Types, Modifiers modify or change Types, while Queries return information about Types (without changing them). Properties associated with each Type are represented as Axioms and Preconditions. Axioms describe properties to be adhered to for any instance of a particular Type that is the target or subject of any operator; while Preconditions represent the properties to be satisfied for any instance of a particular Typ prior to being the target of any Operator.
Instantiation of this algebraic specification for a fundamental or base Abstract Data Type (ADT) generic to all Types is represented as follows:
ADT for base Type
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
In the generic algebraic specification for base Type above, no Creator is specified. Instead, the Creator for each kind of Type will be specified in its corresponding algebraic specification. Each kind of Type always has at least two associated Type Names, which are built-into each instance at the time of their creation into the Environment. Some Types may have more than two TYPENAMEs. One of these TYPENAMEs referred to as “Typenam” represents that name of the particular Type (e.g., Descriptor, Variable or Command), whereas the other Type Name referred to as “InnerTypeNam” represents the kind of the particular Type, that is, the kind of Basic Computable Type (e.g., Integer, Boolean, Real, Character, Address, String, Void) or the kind of Composite Type (e.g., Array, Record, Pointer, Function).
This ADT for base Type represents the parent or base Sort(Type) from which all other Types are derived. In accordance with accepted inheritance principles associated with object oriented programming languages, a more enhanced or specific derived Sort(Type) may be created from this more generic parent or base Sort(Type). All derived Sort(Type) will always inherit all Operators and Properties (e.g., Axioms and Preconditions) associated with the parent or base Sort(Type). These inherited Operators and their associated Properties cannot be eliminated but may be appended or enhanced with additional Operators, additional Properties, inherited Operators and/or inherited Properties may be strengthened (e.g., via additional Operators and/or Properties). For ease of convenience in the descriptions provided below the Operators associated with the base Sort(Type) will not necessarily be restated with respect to the particular ADT for a specific kind of derived Sort(Type). Nevertheless, based on the well-established principle of inheritance associated with conventional object oriented programming languages, all Operators and associated Properties associated with the parent or base Sort(Type) will implicitly be included in the derived Sort(Type), regardless of whether they are explicitly mentioned in their respective ADTs.
Creators for all Types (as specified in their respective ADTs described fully below) are actually targeted on the Environment, such that each Creator has Environment as an argument (which is not explicitly mentioned in the ADTs described further below). However, the properties of Data Types (i.e., Basic Computable Types and Composite Types) are captured in appropriate Descriptors, hence these Descriptors are used to instantiate Types.
For each of the Basic Computable Types and Composite Types an appropriate Descriptor specifies its properties. Instantiation of a specific kind of Type is realized using Creator for Variable with respect to each particular Basic Computable Type or Composit Typ. Some exemplary instantiation Creators for Variables include:
A Variable needs an instantiation of a Data Type (i.e., Basic Computable Type or a Composite Type). A Type, however, cannot be instantiated within the Environment and then be given to any Variable asking for it—as that implies having an “orphan” Type (i.e., a Type that is instantiated but not associated with any Variable) in the Environment. Hence, the instantiation of Type needs to be done from within the Creator for Variable.
In order to instantiate a specific kind of Data Type, its complete algebraic specification in the form of a Descriptor is passed to the Creator for Variable. Initially, an appropriate Descriptor is obtained from Environment in which the Variable is to be created. This Descriptor may initially be plain (i.e., without any specific content)—e.g., for a Record Variable, a Record Descriptor without any elements). Construction of the Descriptor is completed by using the corresponding defined Operators. Once a Variable has been instantiated by using a Descriptor, thereafter the associated properties of the Descriptor are prevented from being altered.
Descriptors may either be referred to by a Name represented by String that is queried by “GetName” on the Descriptor or alternatively no name may be assigned whereby the String is empty, Thus, two Creators exist for each Descriptor—one with a Name, and the other without a Name. Naming the Descriptor is advantageous in that it allows User-defined Data Types (UDT) and Inheritance from other Named Descriptors. For the purposes of describing the present inventive framework, the possibility of Inheritance from Descriptors has been limited to Record only. However, it is contemplated and within the intended scope of the present invention to alternatively, or in addition thereto, extend Inheritance to other Descriptors.
The ADT for base Descriptor is provided below:
Base ADT for Descriptor
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
Now the ADT for each kind of Descriptor (e.g., Basic Computable Type Descriptor, Array Descriptor, Function Descriptor, Pointer Descriptor and Record Descriptor) identified in
The following base or generic Descriptor is provided for all Basic Computable Types:
ADT for Basic Computable Types Descriptor
Creators:
BasicCompTypeDesc
BasicCompTypeDesc
used in these Creators and other ADTs below represent a
Modifiers:
Queries:
Axioms:
Preconditions:
Additional properties may be specified for each kind of BasicCompTypeDesc for TypeName t, where tε{BOOL, INT, REAL, CRAR, STRING, ADDRESS, VOID}. Instantiations of BasicCompTypeDesc are precisely the corresponding Basic Computable Types, as shown in
The properties associated with each kind of BasicCompTypeDesc for TypeName t, where tε{BOOL, INT, REAP, CHAR, STRING, ADDRESS, VOID} will now be addressed.
ADT for the Basic Computable Type Descriptor - Boolean
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor - Integer
Creators:
Modifiers:
Queries:
Int
) because the divisor (second
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor - Real
Creators:
Modifiers:
Queries:
Real
) because the divisor (2nd Real)
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor - Character
Creators:
Modifiers:
Queries:
Char (Predecessor function)
Char (Successor function)
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor—String
A String need not be considered a Basic Computable Type in that it can easily be constructed from Char. That is, an instance of Char can also be viewed as an instance of String (of a single character). Nevertheless, for convenience a separate algebraic specification and associated Creator is preferably specified for String to justify its construction and the rules to be applied to concatenation and substring operations on Strings.
Creators:
Modifiers:
Queries:
String
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor—Address
Address may not be supported by some programming languages as a usable concept by programmers. Nevertheless, Address is classified as a Basic Computable Type in the present inventive Generic Typed DGC Classes Framework. The reasoning behind classifying Address in the present inventive framework as a Basic Computable Type is that it maps onto the concept of Memory Address in the Virtual (or Real) Address Space, however primitive, that is provided by all Operating Systems.
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for the Basic Computable Type Descriptor—Void
Like Address, Void is also classified in the present inventive framework as a Basic Computable Type despite the fact that it is supported explicitly only by a few programming languages. The reason for Void being classified, as a Basic Computable Type, is that it allows us to:
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
Next the properties associated with each of the Descriptors for the Composite Types, i.e., Pointer {PointerDesc}, Array {ArrayDesc}, Record {RecordDesc}, Function {FunctionDesc}, will be addressed, as shown in
ADT for the Descriptor for Pointer
A Pointer is a Composite Type that “points to” or “refers to” an element of any Type. The Descriptor for Pointer {PointerDesc} is specified by the following properties:
Creators:
PointerDesc
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for the Descriptor for Array
An Array is described by a combination of all of the following properties and the invariant relations between them:
The properties for the Descriptor for Array are as follows:
Creators:
ArrayDesc
ArrayDesc
Modifiers:
Queries:
Size
Axioms:
Preconditions:
ADT for the Descriptor for Record
A Record is defined as a collection of (zero or more) Elements (each having a Descriptor), wherein each Element has a Position (represented by an int) and a Name (represented by a String). The Descriptor for Record {RecordDesc} does not impose any ordering on its Elements nor is any ordering implied by the Position of a particular Element in the Record. Position is merely used for convenience to identify and retrieve a particular Element in the Record.
Creators:
RecordDesc
RecordDesc
Modifiers:
RecordDesc
Queries:
String
Desc
InheritStatus
StaticStatus
TypeName
String
Desc
Queries for Inheritance:
RecordDesc
InheritanceMethod
Axioms:
Axioms for Inheritance:
The following table contains InheritanceMethod of the base RecordDesc against the InheritStatus of the individual elements of that RecordDesc. According to this table, only those Elements having (InheritStatus=Public) and (InheritanceMethod=Public) of the Descriptor are accessible.
Let s be the names of all SelfElements in r and the entire base Record Descriptors of r.
Preconditions:
Preconditions for Inheritance:
ADT for the Descriptor for Function
Creators:
FunctionDesc
FunctionDesc
Modifiers:
Queries:
String
Desc
ComputableExpr
Axioms:
Preconditions:
The next classes (Types) to be discussed together as a group includes Values, Constants, Locations and Variables. The reason being that these classes are connected intimately, with the binding factors being the Types. As previously noted above, for Basic Computable Types, a Value is constructed from a TypeName and a MetaValue, which can be interpreted by corresponding Types of the Meta Language. For all practical purposes, Value and MetaValue are the same. However, from a theoretical perspective, once a Value is constructed from MetaValue, it is used as a basic Value of the Target Language in the present inventive framework. MetaValue hierarchy of the Meta Language reflects the Value hierarchy of the Target Language.
ADT for Value
Value represents the Runtime Value (RValue). This is in contrast to the Static Value (SValue) that is more applicable to program text of a Type referred to as Command, discussed in detail further below. The Environment knows Values as instances of Basic Computable Types. This set of Values is further classified into Value Integer {ValueInt}, Value Real {ValueReal}, Value Boolean {ValueBool}, Value Character {ValueChar}, Value String {ValueString}, Value Address {ValueAddress}, and Value Void {ValueVoid}, as shown in
The specific algebraic specification for the base Value is defined as follows:
Creators: None.
Modifiers:
Queries:
Bool
Axioms:
Preconditions:
Now the properties associated with each individual kind of Value will be addressed.
ADT for Value Boolean
Creators:
ValueBool
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Integer Value
Creators:
ValueInt
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value Real
Creators:
ValueReal
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value Character
Creators:
ValueChar
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value String
Creators:
ValueString
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value Address
This definition of ValueAddress fits the notion of Addresses connected with Pointers in the sense that ValueAddress is the Value of TypePointer (apart from being the Value of Address which is a Basic Computable Type).
Creators:
ValueAddress
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value Void
Creators:
ValueVoid
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Constant
Next, the algebraic specification for the base Constant and its associated individual kinds of Constants (e.g., IntConst, RealConst, BoolConst, CharConst, AddressConst, StringConst, VoidConst) are discussed. A Constant is a binding of a Name (represented by a String) to a Value without any change possible to the Value. In other words, a Constant is a Named Value. In addition, since Value is indicative of Type, Constant is defined as a Named Value of a given Type.
The properties specified for the base Constant are as follows:
Creators:
Modifiers:
Queries:
Bool
Axioms:
Preconditions:
ADT for Locations
Locations are places in the Environment where the Values are stored. In other words, Locations are containers in the Environment that can contain one of the following:
The specific algebraic specification for the base Location is as follows:
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Value Location
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Environment Location
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Block Location
Creators:
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Base Variable
Like Constant, Variable also has a Name-Value binding but, in addition, has a Name-Location binding as well. The binding between Type and Location is achieved through Variable. Unlike that of Constant, the Value of a Variable may be changed. Variables are only applicable for those Types that have a Descriptor, e.g., all Basic Computable Types and the Composite Types (e.g., Pointer, Array, Function, & Record). A hierarchy of the kinds of Variables is shown in
Creators: None
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Basic Variable
Creators:
BasicVar
Modifiers:
BasicVar
Queries:
Axioms:
Preconditions:
ADT for Pointer Variable
A Pointer “points to” or “refers to” an element of any Type. The Address of the “pointed to” Variable is stored as a Value of the Pointer Variable. Thus, a Pointer Variable has ValueAddress as its Value. The fundamental difference between Address (a Basic Computable Type) and the constructed TypePointer is that TypePointer has a “pointed to” Type that refers to the Type of the element being pointed to.
Assigning an Address to a Variable of TypePointer will be described next. Let p be an instance of a Variable of TypePointer (which is “pointing to” an Int), and let k be an instance of a Variable of Type Int. Now consider the assignment “p=&k”. This assignment indicates that the Address contained in the Location of Variable k is stored as the Value of Variable p.
The algebraic specification of the properties associated with the Pointer Variable are defined as follows:
Creators:
PointerVar
Modifiers:
PointerVar
Queries:
Axioms:
Preconditions:
ADT for Array Variable
Creators:
ArrayVar
Modifiers: None
Queries:
Axioms:
Preconditions:
ADT for Record Variable
Creators:
RecordVar
Modifiers: None
Queries:
TypeName
Axioms:
Preconditions:
ADT for Function
Functions are Variables that have Parameters and Blocks, which can be invoked directly (or as Computable Expressions), as described in detail further below.
ADT for the Base Accessors
Accessors are used to reach (or access) any Variable and/or L cad ns—either via its parent Variables, or indirectly via Locations. Computable Expressions, defined further below, are required to be of any of the Basic Computable Types (or Pointer). However, one may not be able to create Computable Expressions directly from Variables or Functions, because Variables may be of Composite Types, e.g., Arrays or Records, whereas Functions may return Composite Types, e.g., Arrays or Records. Hence, a lookup or conversion table for these composite Variables is required to get to the elementary Variable that can be used to build Computable Expressions. The Accessors (whose Components are Variables) help us perform this lookup. Accessors belong to one of the following classifications or types:
The base Accessor hierarchy is shown in
Creators: None
Modifiers: None
Queries:
Variable
Axioms:
PreConditions:
ADT for Variable Accessor
Creators:
VariableAccessor
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Function Accessor
The Creator uses an Accessor and a ParameterList as one of its arguments. Each parameter of the ParameterList is either a CoinputableExpr or an Accessor. (ParameterList is a standard List and thus will not be axiomatized further).
Creators:
FunctionAccessor
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Record Element Accessor
Creators:
RecordElementAccessor
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Array Element Accessor
Creators:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Dereferencing Accessor
Creators:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for the Base Computable Expressions
Computable Expressions are Expressions that compute Values of Basic Computable Types.
Creators: None.
Modifiers: None
Queries:
Axioms:
Preconditions:
ADT for Arithmetic Expression
Creators:
Arithmetic Operator Expressions:
Modifiers: None
Queries:
Axioms:
PreConditions:
ADT for Boolean Expression
Creators:
Boolean Operator Expressions:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Character Expression
Operator Expressions:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for String Expression
Creators:
Operator Expressions:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Pointer Expression
Creators:
Operator Expressions:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Void Expression
Since Void is also a BasicCompType, the Getesc( ) query on VoidExpression will return a BasicCompTypeDesc, with CompTypeName as VOID. VoidExpressions are required to incorporate Dynamic Typing capabilities in the Generic Typed DGC Classes Framework, as well as to create meaningful expressions of Procedure Calls, which do not have a return Value.
Creators:
VoidExpr
Operator Expressions:
Modifiers:
Queries:
Axioms:
PreConditions:
ADT for Base Left Hand Side Identifier
The Left-Hand-Side-identifier (LhsId), found only on the Left-Hand-Side of an Assignment statement, is the only thing that performs a SetValue on Variable or Location thereby causing a change of State. LhsId uses the Accessor to get to a Variable/Location. The LhsId hierarchy is found in
LhsId is used for the following purposes:
ADT for base LhsId
Creators: None
Modifiers:
LhsId
Queries:
Axioms:
PreConditions:
ADT for LhsId for an Elementary Variable
Creators:
LhsElementary
Modifiers:
LhsId
Queries:
Axioms:
PreConditions:
ADT for LhsId for Composite Variable
Creators:
LhsComposite
Modifiers:
Lhsld
Queries:
Axioms:
PreConditions:
ADT for LhsId for a Function
Creators:
LhsFunction
Modifiers:
Lhsld
Queries:
Axioms:
PreConditions:
ADT for Command
As previously noted, every programming language consists of States and Commands. Thus far the description of the present invention has focused on axiomatizing the State part of programming languages, now the Command part of programming languages will be axiomatized.
The hierarchy of base Commands is provided in
The particular view of a program depends on the type of programming language. For Functional Programming Languages, the program returns a Value that results from Evaluation of the Computable Expressions within it. A different view of a program as a State Transformer holds for Imperative Programming Languages wherein Evaluation of the program results in a State change, i.e., a change in Values of one or more Variables. One of the semantics of a program (either Functional or Imperative) is its Evaluation. Evaluation of a program, as defined above, is compositional, i.e., it may be defined recursively as the resultant Evaluation of the constituents of the program. For example, consider the following statements:
LoopWhile
Its evaluation is the resultant evaluation of its constituent Commands.
If-Else
Its evaluation is the resultant evaluation of its constituent Commands.
Computable Expression
Its evaluation is the resultant evaluation of its constituent Computable Expressions.
Only the Assignment Command causes a State change (in an Imperative Programming Language), whereas ComputableExpr always Evaluates to a Value in Functional as well as Imperative Programming Languages.
Command is the evaluation of a ComputableExpr that may be followed by a change of State. The following is a listing of exemplary Commands:
The properties specified for the base Command are set forth in the following algebraic specification:
Command
Assignment
Axioms:
Preconditions:
ADT for Block
A Block is represented as a “D in C” wherein, the D (Declarations) part of the Block is the Environment and the C (Commands) part of the Block is the Command (Statement) List. On creation, a Block has an empty Command List as well as an empty Environment. Creation of Block is done either in the parser (when an unnamed Block is required as a Command), or from within CreateFunction.
Block
State
Bool
Axioms:
PreConditions:
ADT for GOTO (Branch)
A GOTO (Branch) requires a Label to branch to. However, when a GOTO is encountered, the corresponding Label need not have been encountered or declared (e.g., if the Label is in the text subsequent to the occurrence of the GOTO). In anticipation of such cases, Block needs to maintain a list of undeclared Labels. As and when a Label declaration is encountered, Block will take that Label off the list of undeclared Labels.
Hence, the following enhancements of properties for GOTO must be added in addition to those found in the ADT for Block (as specified above):
Modifiers:
Queries:
Axioms:
Preconditions:
ADT for Function
Function is representative of a named Block. The creation of a Function also requires a Descriptor, like that for Variable. This Descriptor has the specifications for the Types of Arguments to the Function, and its return Type.
Function
Value (Evaluates RValue)
Axioms:
Preconditions:
ADT for Environment
Programs in a Programming Language are defined and executed in the context of an Environment. This Environment has the knowledge of the Types supported by the Programming Language and its Typing Rules. The Environment is the substrate Type on which a Programming Language is defined, constructed, and executed.
The Environment consists of:
Chaining of Environments & Scope Rules
The Environment is responsible for creating other Environments that are internal to it. Such chaining of Environments occurs at the time of creating Variables of Record/Array, and Functions and Blocks. Whenever an Environment creates an inner Environment, it passes itself as the parent for the inner Environment. This chaining is required for defining scope rules.
Any Get query on Environment begins from the current Environment and expands its search by going upwards to its parent (and continuing upwards to the outermost Environment) until such time the Get succeeds or fails (as is the case where there are no more Environments available for search).
Environment
Environment
Variable
Function
Constant
Location
Bool
Bool
Axioms:
Preconditions:
Simulating Modules
Thus, each kind of Type and their respective properties has been specified by an appropriate ADT above. Having described the Classes for each Type in the Generic Typed DGC Classes Framework in accordance with the present invention some exemplary applications of this framework will now be addressed. The present inventive Generic Typed DGC Classes Framework is suitable for a wide variety of language tools such as, but not limited to, high-level programming language translation, compilation or static analysis.
Language Conversion
Because of the independence of the Generic Typed DGC Classes Framework to syntax of any programming language, it is particularly well suited for high-level language translation of a source high-level language computer program to an equivalent computer program in a target high-level language different from that of the source language. Alternatively, as discussed in detail further below, the present inventive framework may be used as a compiler when the target language is a low level language.
For example, in a Source Program written in Pascal when the parsing interface comes across the Variable Declaration:
Var a: Array [5] of integer;
The Generic Typed DGC Classes Framework instantiates the Class ArrayVariable that is added to the already instantiated Class Environment Similarly, for the Assignment Statement of a Source Program written in Pascal as:
a[2:=20;
The Generic Typed DGC Classes Framework instantiates the Class Assignment that is added to the already instantiated Class Block.
On the other end, a printer interface 1530 is plugged in to receive the semantic representation produced by the Generic Typed DGC Classes Framework 1520 that is combined with the syntax of the Target Language. The combination produces code in the Target Language 1540. The Printer Interface is language specific, thus a different printer interface will be plugged in for each Target Language.
For instance, the above Variable Declaration (which is now in memory in the form of the object of the Class ArrayVariable is printed in the Target Language C as:
int a[5];
While the object of the Class Assignment is printed in the Target Language C as:
a[1]=20;
It is to be noted in the example provided above that the indexing of the second array element has been changed. Array indexing in Pascal starts from “1” whereas indexing in C begins from “0”. Accordingly, the second array element in Pascal is represented by “a[2]”, but in C is represented as “a[1”.
These same principles may be adapted for conversion of an entire program module. By way of example, language conversion using the Generic Typed DGC Classes Framework will now be described for an example source program module referred to as “Unit4.PAS”, written in the Delphi programming language and converted to its corresponding C++ code.
The example Unit4.PAS Source Program module (in Delphi programming language) is reproduced below with line numbers provided for convenience:
Following the conversion process shown in
Line 1:
The Parser instantiates a Block for unit4. This Block contains an empty Environment, and an empty Command list.
Line 2:
Ignored by the parser (as the keyword interface denotes the beginning of the Interface Section).
Line 3:
Ignored by the parser (as the keyword const denotes the beginning of the Constant Section).
Line 4:
Ignored by the parser (as the keyword type denotes the beginning of the Type Section).
Line 6:
The parser instantiates a BasicCompTypeDesc with InnerTypeName Int for the newly defined type unit4_Int. This Descriptor is named, and gets the name unit4_Int. It is then added to the Environment of the Block for unit4.
Line 7:
Ignored for the purposes of this exemplary description (as it is a Comment, though there is a Command called Comment in the Generic Typed DGC Classes Framework).
Line 8:
The parser now instantiates a PointerDesc for the newly defined type unit4_IntPtr. This Descriptor is named, and gets the name unit4_IntPtr. Since this is a Descriptor of Type Pointer, it is given a “PointedToTypeDesc” —i.e. the Descriptor of the Type pointed to by this Pointer. In this case the “PointedToType” given is unit4_Int. This PointerDesc is then added to the Environment of the Block for unit4.
Line 9:
Ignored by the parser (as the keyword var denotes the beginning of the Variable Section).
Line 10:
The parser now instantiates a BasicVariable for each of the Variables with the names unit4_IntVar1, unit4_IntVar2 respectively. Both have as their Type Descriptor the Descriptor created in Line 6 (i.e. unit4_Int), and both have their Values equated to the Value of the Constant defined in Line 4. These Variables are then added to the Environment of the Block for unit4.
Line 11:
The parser now instantiates a PointerVariable for the Variable with the name unit4_IntPtrVar. It has as its Type Descriptor the Descriptor created in Line 8. This Variable is then added to the Environment of the Block for unit4.
Line 12:
The parser now instantiates a FunctionVariable for the Procedure with the name unit4_AddProc. This FunctionVariable has a list of Arguments, and a return Type. Since unit4_AddProc is a Procedure, the return Type of this FunctionVariable is set to VOID. The Arguments of the FunctionVariable are set according to the list given in the function/procedure declaration. Therefore, for unit4_AddProc, the argument list contains one argument, which is a Variable of Type unit4_IntPtr. This FunctionVariable is then added to the Environment of the Block for unit4.
Line 13:
The parser now instantiates another FunctionVariable for the Function with the name unit4_Mult. Its return Type is set to unit4_Int, and its list of arguments is set according to the list here (i.e., the first argument of name unit4_IntVar1 and type unit4_Int, and the second argument of name unit4_IntVar2 and type unit4_IntPtr). This FunctionVariable is then added to the Environment of the Block for unit4.
Line 14:
The keyword implementation denotes the beginning of the Implementation Section. Therefore, no further Variables/Types/Constants are to be added to this Block.
Line 15:
The parser now comes across the body or definition of the Procedure unit4_AddProc. This marks the beginning of the inner (local) Environment of this Procedure.
In the building of the memory representation, there is an important change that happens at this point. So far, all Variables, Type declarations, Constants etc. were being added to the environment of Block for unit4. However, now, with the start of the Function definition, the current Environment (which was thus far of the Block for unit4) now changes.
The FunctionVariable contains within it a Block to which the parser will add the code and the local Environment for that Function. Therefore, the current Environment now becomes the Environment of the FunctionVariable.
Line 16:
Ignored by the parser (as the keyword var denotes the beginning of the Variable Section).
Line 17:
The parser now instantiates a BasicVariable for the Variable with name Local_Var. It has as its Type Descriptor the Descriptor created for Line 6. This Variable is now added to the current Environment, which is the Environment of the FunctonVariable unit4_AddProc.
Line 18:
Ignored for the purposes of this exemplary description (as it is a Comment, though there is a Command called Comment in the Generic Typed DGC Classes Framework).
Line 19:
Now the parser instantiates a FunctionVari ble for the Functi n with the name unit4_Add. Its return Type is set to Integer (which is available as a Basic Computable Type in the Language Context), and its list of arguments is set according to the list here (i.e., both arguments are of type integ r, with names a and b respectively.). This FunctionVariable is then added to the Environment of the current Block (i.e., that of the FunctionVariable named unit4_AddProc).
Line 20:
The keyword begin is the beginning of the Commands section of a Block.
Since the body or definition of the Function named unit4_Add starts immediately, the changing of the “current Environment” happens here as described in the explanation of Line 15. The current Block & Environment are now the Block & Environment of the FunctionVariable named unit4_Add.
Line 21:
The parser now instantiates an Assignment Command for the Assignment statement unit4_Add:=a+b.
The things that happen before this are:
These are the two inputs required in the construction of the Assignment, which is now added to the Commands of the Block for unit4_Add.
Line 22:
The keyword end marks the ending of the Commands section of the current Block. Another important change happens here. The inner Block (of the Function named unit4_Add) has been completed. This Block is not the current Block anymore. The curent Block now happens to be the Block of the Procedure named unit4_AddProc).
Lines 23-26:
The parser now constructs and instantiates (in a manner similar to that done earlier for Line 21) the two Assignments and adds them to the Commands section of the Block for unit4_AddProc. The building of the memory representation like that explained earlier for Lines 19-22.
Lines 27-30:
The parser now comes across the body or definition of the Procedure named unit4_Mult. The building of the memory representation is similar to that explained earlier for Lines 19-22.
Line 31:
The keyword end marks the ending of the Commands section of the current Block. Since this is the last (or the outermost) Block, this is the end of the entire unit (i.e., end of unit4).
On the back end, a printing interface is plugged to generate Code in the Target Language, which in this example is C++. The printing interface, performs the following:
For the above module “Unit4.PAS”, the C++ Printing Interface generates the following two files in C++ viz: “unit4.h” and “unit4.cpp”. The code for both these files is given here. The generated C++ code is semantically equivalent to that of the input Delphi code.
I - Code for unit4.h
II - Code for unit4.cpp
The printing interface starts with the outermost Block. The Environment of the Block is printed first, and then its list of Commands. Each construct is printed recursively—till the basic construct is reached. Printing of the major constructs is explained below:
Block:
For printing a Block (which may or may not belong to a Function)—the printing interface first prints the opening brace (as per the C++ syntax), then recursively asks the Environment and the Commands of the block to print themselves, and then prints the closing brace (again as per the C++ syntax).
Each of the ADTs of the Generic Typed DGC Classes Framework has the built-in capability of printing itself in a generic manner. For printing specific syntax of programming, these capabilities are enhanced with the syntactical elements of the specific languages (C++ in this example).
Environment:
Printing of the Environment involves printing of the User Defined Types, Constants and Variables, in that order. Each User Defined Type is printed as per the C++ ‘typedef’ syntax.
Variable:
Printing of a Variable involves printing of its Type, followed by its Name, and followed by its default Value (if any).
Assignment:
Printing of an Assignment involves printing of the LhsId (which is usually the Name of the Lhs Variable), followed by the C++ assignment operator ‘=’, followed by the printing of the Rhs Expression.
As is evidenced by the example described above, the Generic Typed DGC Classes Framework in accordance with the present invention may be readily used for high level language translation. Use of the Generic Typed DGC Classes Framework in connection with high-level language translation is beneficial over conventional language converters in several respects. The language and syntax independence of the present inventive Generic Typed DGC Classes Framework eliminates all possibility of syntax-related conversion errors. Along these lines, since the Generic Typed DGC Classes Framework is based entirely on semantics, rather than syntax, the original computer program written in the source language and the translated computer program written in the target language will always be semantically equivalent. That is, the translated computer program written in the target language when executed in the same environment is guaranteed to produce the same results as those produced by the original computer program written in the source language.
Yet another benefit associated with using the present inventive Generic Typed DGC Classes Framework for high level language translation is that since different constructs in programming languages are nothing but compositions of the core concepts present in the intermediate Generic Typed DGC Classes Framework, even those features present in the Source Language yet not available in the Target Language can still be converted.
Several illustrative examples of application of the Generic Typed DGC Classes Framework for programming language conversion are discussed below:
1. Conversion of Nested Functions from Pascal to C:
Pascal supports nested Functions (one function block within another), but C does not. The semantics behind nested Functions in Pascal is that the Environment of the outer Function is available to the inner Function. Generally, the nesting Function is broken down into its components, namely, capturing the Environment of the outer Function, and making this Environment available to the inner Function. This same functional result is realized in C by storing the Environment as a data structure, and passing the data structure as an additional parameter to the inner function. The converted inner function in C behaves exactly in the same manner as the original Pascal nesting function.
2. Conversion of with-do Statement from Pascal to C:
Pascal has a construct “with<Variable> do <statements>” used for record type variables, wherein, “With” simply provides an abbreviated notation for referring the fields of a record or structure. C does not include this construct, but the same functionality may be realized. When converting a “with . . . do . . . ” construct, all variable references in the statements occurring in the <statements> part are appended by the name of the record variable. The converted C code performs exactly in the same manner as the original Pascal statement.
In a similar exemplary application, the present inventive Generic Typed DGC Classes Framework may be used to develop the first phase of a compiler, i.e., to generate assembly or object code. Compilers can also be classified as Language Converters, albeit, conversion of a high-level language to a lower level machine language.
To build a retargetable compiler, based on the Generic Typed DGC Classes Framework, and which is independent of the particular programming language requires:
This uses the same system and method shown in
Both conventional compilers and those based on the Generic Typed DGC Classes Framework preserve semantics, however, only the Generic Typed DGC Classes Framework based compilers (in accordance with the present invention) provide semantics explicitly and compositionally.
Numerous advantages are provided by using the Generic Typed DGC Classes Framework based compiler instead of a conventional compiler. Heretofore, compilers typically used Composable Attribute Grammar (CAG) as a parsing technique. A CAG is represented as a composite of several smaller component Attribute Grammars (AGs), each designed to solve a particular sub-problem such as scope resolution, expression or evaluation. Thus, large problems are decomposed into smaller component sub-problems each handled by a component Attribute Grammar. In addition to the component Attribute Grammars (AGs), the CAG also consists of glue Attribute Grammar and an interface, which defines the correspondence between the glue and the component AGs. The glue AG is an AG with underlying context-free grammar specifying the phase-structure of the source language.
Each component AG is based on a simplified phrase-structure that reflects the properties of its sub-problem rather than the phrase-structure of the source language. This decomposition principle associated with component AGs is similar in nature to the core concepts or building blocks that form the very basis for the present inventive Generic Typed DGC Classes Framework. Instead of providing different component AGs it is simpler to add different interfaces for different Generic Typed DGC Classes Framework constructs in accordance with the present inventive framework. The present inventive Generic Typed DGC Classes Framework, being generic, can capture the semantics of any language. Hence, the use of CAGs is limited to defining the phase structure of the source language at hand, i.e., for writing the language specific parser.
Another advantage associated with the present inventive Generic Typed DGC Classes Framework based retargettable complier is that it has no language dependency or execution model dependency typical of intermediate code forms (e.g., Postfix Notation, Parse Trees (Abstract Syntax Trees), Three-Address codes (triplet/quadruple)) used in code generation with conventional compilers. Each of these conventional intermediate code forms has some form of language or execution model dependency. Postfix Notation is only suitable with functional languages in which the source program is mostly expressions. Parse Trees are extremely dependent on the source language syntax. Three-Address codes are preferred in many optimizing compilers since it permits rearrangement of intermediate code in a convenient manner. However, every triplet/quadruple entry requires the storage of pointer to Symbol Table entries of the respective symbols involved in their formation. In addition, every triplet/quadruple entry increases the number of temporaries required for code evaluation. Accordingly, Three-Address codes are mostly suitable for registered-based machines.
The Generic Typed DGC Classes Framework based compiler in accordance with the present invention overcomes all these language and execution model restrictions in that it is universally suitable for use with any sequential programming language and completely syntax independent (or source language independent).
Furthermore, any imperative programming language can be represented using the present inventive Generic Typed DGC Classes Framework. Unlike the Three-Address codes that are suited for register based machines or chips, the present inventive Generic Typed DGC Classes Framework based compiler is retargetable in that it provides a generic representation of the source language and is independent of the target processor. Thus, the Generic Typed DGC Classes Framework can accommodate different interfaces to generate code for different machines and/or chips thereby being capable of compiling source code into machine code for different target processors using the same framework. The retargetable compiler is target independent and uses a description of the target architecture as input in order to generate code for a certain algorithm.
Yet another advantage of the present inventive Generic Typed DGC Classes Framework based compiler over conventional compilers is with respect to code generation. Determining which machine code sequence is best for a given Three Address code construct may require extensive knowledge about the context in which that construct appears. Being compositional, every Generic Typed DGC Classes Framework construct has knowledge of the context required, whereas for Three Address code additional efforts are required to ascertain such information.
Still another advantage of using the Generic Typed DGC Classes Framework based compiler is that the compositional separateness eliminates the need for separate Symbol Tables for tracking all the symbol names used in the program and the essential information, associated with conventional compilers.
Interpreter
As previously discussed, a compiler translates the entire source program in advance to produce a separate file of executable machine code, which is then executed directly. In contrast, an interpreter is a computer program that executes the source code of another program by translating its statements one at a time into machine code instructions and executing them immediately. Interpreters are particularly useful in statically evaluating programs in the source language without a compiler. Since the Generic Typed DGC Classes Framework is language independent, a single universal Generic Typed DGC Classes Framework based interpreter can be used for any source language once the source language has been parsed and its semantics have been captured correctly into the Generic Typed DGC Classes Framework.
Static Analyzer
On a related note, the same Generic Typed DGC Classes Framework interpreter, when combined with the axiomatization of Execution Semantics based on Theory of Abstract Interpretation may serve as a Static Analyzer. A Static Program Analyzer (Abstract Interpreter) is a program written in a programming language (Meta Language, that is, a programming language used to manipulate logical proofs such as LISP or PROLOG) which receives as input the source code of a Source Program written in a programming language, analyzes the Source Program, and predicts the behavior of the Source Program without executing it. A static analyzer based on the Generic Typed DGC Classes Framework requires a parser interface and an analysis interface. Thus, the Generic Typed DGC Classes Framework based static analyzer can be used to predict approximate run-time program properties without executing the program as well as being used as a criteria-based optimizer for compilers.
These are but a few illustrative examples of the use of the present inventive Generic Typed DGC Classes Framework in accordance with the present invention. The universality and decompositional nature of the inventive framework makes it ideal for a wide variety of applications beyond those mentioned by way of example herein. Furthermore, the present inventive framework has unlimited future use because the fundamental core constructs therein can be extended for use with all future programming constructs without compromising on any thing that has been developed and is offered with the Generic Typed DGC Classes Framework.
Thus, while there have been shown, described, and pointed out fundamental novel features of the invention as applied to a preferred embodiment thereof, it will be understood that various omissions, substitutions, and changes in the form and details of the devices illustrated, and in their operation, may be made by those skilled in the art without departing from the spirit and scope of the invention. For example, it is expressly intended that all combinations of those elements and/or steps which perform substantially the same function, in substantially the same way, to achieve the same results are within the scope of the invention. Substitutions of elements from one described embodiment to another are also fully intended and contemplated. It is also to be understood that the drawings are not necessarily drawn to scale, but that they are merely conceptual in nature. It is the intention, therefore, to be limited only as indicated by the scope of the claims appended hereto.
All of the references, publications and patents referred to herein are each incorporated by reference in their entirety. Any names or labels provided, for example, labels assigned to the different Types, are for illustrative purposes only and are not intended to limit the scope of the invention.
| Number | Name | Date | Kind |
|---|---|---|---|
| 4667290 | Goss et al. | May 1987 | A |
| 5842204 | Andrews et al. | Nov 1998 | A |
| 6002874 | Bahrs et al. | Dec 1999 | A |
| 6028960 | Graf et al. | Feb 2000 | A |
| 6031993 | Andrews et al. | Feb 2000 | A |
| 6049822 | Mittal | Apr 2000 | A |
| 6138169 | Freund et al. | Oct 2000 | A |
| 6219831 | Ono | Apr 2001 | B1 |
| 6314429 | Simser | Nov 2001 | B1 |
| 6317871 | Andrews et al. | Nov 2001 | B1 |
| 6343372 | Felty et al. | Jan 2002 | B1 |
| 6389385 | King | May 2002 | B1 |
| 6400688 | Lau et al. | Jun 2002 | B1 |
| 6453464 | Sullivan | Sep 2002 | B1 |
| 6523171 | Dupuy et al. | Feb 2003 | B1 |
| 6523172 | Martinez-Guerra et al. | Feb 2003 | B1 |
| 6526569 | Obin et al. | Feb 2003 | B1 |
| 20020026632 | Fuchs et al. | Feb 2002 | A1 |
| 20020040359 | Green et al. | Apr 2002 | A1 |
| 20020046393 | Leino et al. | Apr 2002 | A1 |
| 20020062476 | Saxe et al. | May 2002 | A1 |
| 20020112201 | Flanagan et al. | Aug 2002 | A1 |
| 20030226132 | Tondreau et al. | Dec 2003 | A1 |
| 20060277029 | Green et al. | Dec 2006 | A1 |
| Number | Date | Country |
|---|---|---|
| 19617719 | Nov 1997 | DE |
| 402240729 | Sep 1990 | JP |
| Number | Date | Country | |
|---|---|---|---|
| 20050050525 A1 | Mar 2005 | US |