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.
|
---|