[1b34b87] | 1 | \chapter{\CFA} \label{CFA}
|
---|
| 2 |
|
---|
| 3 | \section{Introduction}
|
---|
| 4 | Similar to \CC, C is a popular programming language especially in systems
|
---|
| 5 | programming. For example, the Windows NT and Linux kernel are written in C, and they are the foundation of many higher level
|
---|
| 6 | and popular projects. Therefore, it is unlikely that the programming language C is
|
---|
| 7 | going to disappear any time soon.
|
---|
| 8 |
|
---|
| 9 | However, C has inherent problems in syntax, semantics and many
|
---|
| 10 | more \cite{Reference2}. Even though \CC is meant to fix these problems, \CC has many
|
---|
| 11 | irreversible legacy design choices, and newer versions of \CC require significantly more effort to convert C-based projects into \CC.
|
---|
| 12 |
|
---|
| 13 | To solve this problem, the programming language \CFA is being created at the University of Waterloo. The goal
|
---|
| 14 | of the language is to extend C with modern language features that many new
|
---|
| 15 | languages have, such as Rust and Go. Hence, the \CFA extension provides a
|
---|
| 16 | backward-compatible version of C, while fixing existing problems known in C and
|
---|
| 17 | modernizing the language at the same time.
|
---|
| 18 |
|
---|
| 19 | \section{Overloading}
|
---|
| 20 | Overloading is when a compiler permits a name to have multiple meanings. All
|
---|
| 21 | programming languages allow simple overloading of operators on basic types such
|
---|
| 22 | as the \verb|+| operator (add) on integer and floating-point types. Most programming languages extend
|
---|
| 23 | overloading of operators to user-defined types and/or general function
|
---|
| 24 | overloading. \CFA also supports overloading of variables and the literals \verb|0/1|.
|
---|
| 25 |
|
---|
| 26 | \subsection{Variable}
|
---|
| 27 | Variables in the same block are allowed to have the same name but different
|
---|
| 28 | types. An assignment to a new variable uses that variable's type to infer the
|
---|
| 29 | required type, and that type is used to select a variable containing the appropriate type.
|
---|
| 30 |
|
---|
| 31 | \begin{lstlisting}[numbers=left, xleftmargin=3.0ex, style=C++nokeyword, caption={Overloading variables in \CFA}, label={CFA-overload-var}]
|
---|
| 32 | short int MAX = SHRT_MAX;
|
---|
| 33 | int MAX = INT_MAX;
|
---|
| 34 | double MAX = DBL_MAX;
|
---|
| 35 |
|
---|
| 36 | // select variable MAX based on its left-hand type
|
---|
| 37 | short int s = MAX; // s = SHRT_MAX
|
---|
| 38 | int s = MAX; // s = INT_MAX
|
---|
| 39 | double s = MAX; // s = DBL_MAX
|
---|
| 40 | \end{lstlisting}
|
---|
| 41 |
|
---|
| 42 | The listing \ref{CFA-overload-var} shows that when variable overloading exists
|
---|
| 43 | in the same scope, the variable is selected based on the left side of
|
---|
| 44 | initialization/assignment and operands of the right side of the expression. For
|
---|
| 45 | instance, the first assignment to variable \verb|s| at line 6, which is type short int,
|
---|
| 46 | selects the MAX with the same type.
|
---|
| 47 |
|
---|
| 48 | \subsection{Function}
|
---|
| 49 | Functions in the same block can be overloaded depending on the number and type of
|
---|
| 50 | parameters and returns.
|
---|
| 51 |
|
---|
| 52 | \begin{lstlisting}[numbers=left, xleftmargin=3.0ex, style=C++nokeyword, caption={Overloading routines in \CFA},
|
---|
| 53 | label={CFA-overload-func}]
|
---|
| 54 | void f(<@\textcolor{red}{void}@>); // (1)
|
---|
| 55 | void f(<@\textcolor{red}{char}@>); // (2)
|
---|
| 56 | <@\textcolor{red}{char}@> f(void); // (3)
|
---|
| 57 | <@\textcolor{red}{[int,double]}@> f(); // (4)
|
---|
| 58 |
|
---|
| 59 | f(); // pick (1)
|
---|
| 60 | f('a'); // pick (2)
|
---|
| 61 | char s = f('a'); // pick (3)
|
---|
| 62 | [int, double] s = f(); // pick (4)
|
---|
| 63 | \end{lstlisting}
|
---|
| 64 |
|
---|
| 65 | The listing \ref{CFA-overload-func} shows that when many functions are overloaded in
|
---|
| 66 | the same scope, a function is selected based on the combination of its return type and its
|
---|
| 67 | arguments. For instance, from line 1-4, four different types of a function called
|
---|
| 68 | \verb|f| are declared. For the call \verb|f('a')|, the function selected is the
|
---|
| 69 | one on line 2, if the call voids the result. However, if the call assigns to a
|
---|
| 70 | char, then the routine on line 3 is selected. This example can be seen on lines
|
---|
| 71 | 7-8.
|
---|
| 72 |
|
---|
| 73 | \subsection{Operator}
|
---|
| 74 | An operator name is denoted with \verb|?| for the operand and any standard C
|
---|
| 75 | operator. Operator names within the same block can be overloaded depending on
|
---|
| 76 | the number and type of parameters and returns. However, operators \verb|&&|,
|
---|
| 77 | \verb-||-, \verb|?:| cannot be overloaded because short-circuit semantics
|
---|
| 78 | cannot be preserved.
|
---|
| 79 |
|
---|
| 80 |
|
---|
| 81 | \begin{lstlisting}[style=C++nokeyword, caption={Overloading operators in \CFA},
|
---|
| 82 | label={CFA-overload-ops}]
|
---|
| 83 | int <@\textcolor{red}{++?}@>(int op); // unary prefix increment
|
---|
| 84 | int <@\textcolor{red}{?++}@>(int op); // unary postfix increment
|
---|
| 85 | int <@\textcolor{red}{?+?}@>(int op1, int op2); // unary postfix increment
|
---|
| 86 |
|
---|
| 87 | struct S { double x, double y }
|
---|
| 88 |
|
---|
| 89 | // overload operator plus-assignment
|
---|
| 90 | S <@\textcolor{red}{?+?}@>(S a, S b) {
|
---|
| 91 | return (S) {a.x + b.x, a.y + b.y};
|
---|
| 92 | }
|
---|
| 93 |
|
---|
| 94 | S a, b, c;
|
---|
| 95 | a + b + c;
|
---|
| 96 | \end{lstlisting}
|
---|
| 97 |
|
---|
| 98 | The listing \ref{CFA-overload-ops} shows that operator overloading is permitted
|
---|
| 99 | similar to \CC. However, the difference is that the operator name is
|
---|
| 100 | denoted with \verb|?| instead, and operator selection uses the return type.
|
---|