source: doc/theses/jiada_liang_MMath/intro.tex @ ec20ab9

Last change on this file since ec20ab9 was ec20ab9, checked in by Peter A. Buhr <pabuhr@…>, 4 months ago

small updates, and more proofreading of the related-works chapter

  • Property mode set to 100644
File size: 14.1 KB
Line 
1\chapter{Introduction}
2
3All types in a programming language must have a set of constants, and these constants have \newterm{primary names}, \eg integral types have constants @-1@, @17@, @0xff@, floating-point types have constants @5.3@, @2.3E-5@, @0xff.ffp0@, character types have constants @'a'@, @"abc\n"@, \mbox{\lstinline{u8"}\texttt{\guillemotleft{na\"{i}ve}\guillemotright}\lstinline{"}}, \etc.
4Con\-stants can be overloaded among types, \eg @0@ is a null pointer for all pointer types, and the value zero for integral and floating-point types.
5(In \CFA, the primary constants @0@ and @1@ can be overloaded for any type.)
6Hence, each primary constant has a symbolic name referring to its internal representation, and these names are dictated by language syntax related to types.
7In theory, there are an infinite set of primary constant names per type.
8
9\newterm{Secondary naming} is a common practice in mathematics, engineering and computer science, \eg $\pi$, $\tau$ (2$\pi$), $\phi$ (golden ratio), MB (megabyte, 1E6), and in general situations, \eg specific times (noon, New Years), cities (Big Apple), flowers (Lily), \etc.
10Many programming languages capture this important software-engineering capability through a mechanism called \newterm{constant} or \newterm{literal} naming, where a secondary name is aliased to a primary name.
11Its purpose is for readability and to eliminate duplication of the primary constant throughout a program.
12For example, a meaningful secondary name replaces a primary name throughout a program;
13thereafter, changing the binding of the secondary to primary name automatically distributes the rebinding, preventing errors.
14In some cases, secondary naming is \newterm{opaque}, where the matching internal representation can be chosen arbitrarily, and only equality operations are available, \eg @O_RDONLY@, @O_WRONLY@, @O_CREAT@, @O_TRUNC@, @O_APPEND@.
15Because a secondary name is a constant, it cannot appear in a mutable context, \eg \mbox{$\pi$ \lstinline{= 42}} is meaningless, and a constant has no address, \ie it is an \newterm{rvalue}\footnote{
16The term rvalue defines an expression that can only appear on the right-hand side of an assignment expression.}.
17
18Secondary names can form an (ordered) set, \eg days of a week, months of a year, floors of a building (basement, ground, 1st), colours in a rainbow, \etc.
19Many programming languages capture these groupings through a mechanism called an \newterm{enumeration}.
20\begin{quote}
21enumerate (verb, transitive).
22To count, ascertain the number of;
23more usually, to mention (a number of things or persons) separately, as if for the purpose of counting;
24to specify as in a list or catalogue.~\cite{OEDenumerate}
25\end{quote}
26Within an enumeration set, the enumeration names must be unique, and instances of an enumerated type are \emph{often} restricted to hold only the secondary names.
27It is possible to enumerate among set names without having an ordering among the set elements.
28For example, the week, the weekdays, the weekend, and every second day of the week.
29\begin{cfa}[morekeywords={in}]
30for ( cursor in Mon, Tue, Wed, Thu, Fri, Sat, Sun } ... $\C[3.75in]{// week}$
31for ( cursor in Mon, Tue, Wed, Thu, Fri } ...   $\C{// weekday}$
32for ( cursor in Sat, Sun } ...                                  $\C{// weekend}$
33for ( cursor in Mon, Wed, Fri, Sun } ...                $\C{// every second day of week}\CRT$
34\end{cfa}
35This independence from internal representation allows multiple names to have the same representation (eighth note, quaver), giving synonyms.
36A set can have a partial or total ordering, making it possible to compare set elements, \eg Monday is before Friday and Friday is after.
37Ordering allows iterating among the enumeration set using relational operators and advancement, \eg:
38\begin{cfa}
39for ( cursor = Monday; cursor @<=@ Friday; cursor = @succ@( cursor ) ) ...
40\end{cfa}
41Here the internal representation for the secondary names are logically \emph{generated} rather than listing a subset of names.
42
43Hence, the fundamental aspects of an enumeration are:
44\begin{enumerate}
45\item
46\begin{sloppypar}
47It provides a finite set of secondary names, which become its primary constants.
48This differentiates an enumeration from general types with an infinite set
49of primary constants.
50\end{sloppypar}
51\item
52The secondary names are constants, which follows transitively from their binding (aliasing) to primary names, which are constants.
53\item
54Defines a type for generating instants (variables).
55\item
56For safety, an enumeration instance should be restricted to hold only its type's secondary names.
57\item
58There is a mechanism for \emph{enumerating} over the secondary names, where the ordering can be implicit from the type, explicitly listed, or generated arithmetically.
59\end{enumerate}
60
61
62\section{Terminology}
63\label{s:Terminology}
64
65The term \newterm{enumeration} defines a type with a set of secondary names, and the term \newterm{enumerator} represents an arbitrary secondary name \see{\VRef{s:CEnumeration} for the name derivation}.
66As well, an enumerated type can have three fundamental properties, \newterm{label}, \newterm{order}, and \newterm{value}.
67\begin{cquote}
68\sf\setlength{\tabcolsep}{3pt}
69\begin{tabular}{rcccccccr}
70\it\color{red}enumeration       & \multicolumn{8}{c}{\it\color{red}enumerators} \\
71$\downarrow$\hspace*{15pt}      & \multicolumn{8}{c}{$\downarrow$}                              \\
72@enum@ Week \{                          & Mon,  & Tue,  & Wed,  & Thu,  & Fri,  & Sat,  & Sun {\color{red}= 42} & \};   \\
73\it\color{red}label                     & Mon   & Tue   & Wed   & Thu   & Fri   & Sat   & Sun           &               \\
74\it\color{red}order                     & 0             & 1             & 2             & 3             & 4             & 5             & 6                     &               \\
75\it\color{red}value                     & 0             & 1             & 2             & 3             & 4             & 5             & {\color{red}42}               &
76\end{tabular}
77\end{cquote}
78Here, the enumeration @Week@ defines the enumerator labels @Mon@, @Tue@, @Wed@, @Thu@, @Fri@, @Sat@ and @Sun@.
79The implicit ordering implies the successor of @Tue@ is @Mon@ and the predecessor of @Tue@ is @Wed@, independent of any associated enumerator values.
80The value is the constant represented by the secondary name, which can be implicitly or explicitly set.
81
82Specifying complex ordering is possible:
83\begin{cfa}
84enum E1 { $\color{red}[\(_1\)$ {A, B}, $\color{blue}[\(_2\)$ C $\color{red}]\(_1\)$, {D, E} $\color{blue}]\(_2\)$ }; $\C{// overlapping square brackets}$
85enum E2 { {A, {B, C} }, { {D, E}, F };  $\C{// nesting}$
86\end{cfa}
87For @E1@, there is the partial ordering among @A@, @B@ and @C@, and @C@, @D@ and @E@, but not among @A@, @B@ and @D@, @E@.
88For @E2@, there is the total ordering @A@ $<$ @{B, C}@ $<$ @{D, E}@ $<$ @F@.
89Only flat total-ordering among enumerators is considered in this work.
90
91
92\section{Motivation}
93
94Many programming languages provide an enumeration-like mechanism, which may or may not cover the previous five fundamental enumeration aspects.
95Hence, the term \emph{enumeration} can be confusing and misunderstood.
96Furthermore, some languages conjoin the enumeration with other type features, making it difficult to tease apart which featuring is being used.
97This section discusses some language features that are sometimes called an enumeration but do not provide all enumeration aspects.
98
99
100\subsection{Aliasing}
101\label{s:Aliasing}
102
103Some languages provide simple secondary aliasing (renaming), \eg:
104\begin{cfa}
105const Size = 20, Pi = 3.14159, Name = "Jane";
106\end{cfa}
107The secondary name is logically replaced in the program text by its corresponding primary name.
108Therefore, it is possible to compare the secondary names, \eg @Size < Pi@, only because the primary constants allow it, whereas \eg @Pi < Name@ might be disallowed depending on the language.
109
110Aliasing is not macro substitution, \eg @#define Size 20@, where a name is replaced by its value \emph{before} compilation, so the name is invisible to the programming language.
111With aliasing, each secondary name is part of the language, and hence, participates fully, such as name overloading in the type system.
112Aliasing is not an immutable variable, \eg:
113\begin{cfa}
114extern @const@ int Size = 20;
115extern void foo( @const@ int @&@ size );
116foo( Size ); // take the address of (reference) Size
117\end{cfa}
118Taking the address of an immutable variable makes it an \newterm{lvalue}, which implies it has storage.
119With separate compilation, it is necessary to choose one translation unit to perform the initialization.
120If aliasing does require storage, its address and initialization are opaque (compiler only), similar to \CC rvalue reference @&&@.
121
122Aliasing does provide readability and automatic resubstitution.
123It also provides simple enumeration properties, but with extra effort.
124\begin{cfa}
125const Mon = 1, Tue = 2, Wed = 3, Thu = 4, Fri = 5, Sat = 6, Sun = 7;
126\end{cfa}
127Any reordering of the enumerators requires manual renumbering.
128\begin{cfa}
129const Sun = 1, Mon = 2, Tue = 3, Wed = 4, Thu = 5, Fri = 6, Sat = 7;
130\end{cfa}
131For these reasons, aliasing is sometimes called an enumeration.
132However, there is no type to create a type-checked instance or iterator cursor, so there is no ability for enumerating.
133Hence, there are multiple enumeration aspects not provided by aliasing, justifying a separate enumeration type in a programming language.
134
135
136\subsection{Algebraic Data Type}
137\label{s:AlgebraicDataType}
138
139An algebraic data type (ADT)\footnote{ADT is overloaded with abstract data type.} is another language feature often linked with enumeration, where an ADT conjoins an arbitrary type, possibly a \lstinline[language=C++]{class} or @union@, and a named constructor.
140For example, in Haskell:
141\begin{haskell}
142data S = S { i::Int, d::Double }                $\C{// structure}$
143data @Foo@ = A Int | B Double | C S             $\C{// ADT, composed of three types}$
144foo = A 3;                                                              $\C{// type Foo is inferred}$
145bar = B 3.5
146baz = C S{ i = 7, d = 7.5 }
147\end{haskell}
148the ADT has three variants (constructors), @A@, @B@, @C@ with associated types @Int@, @Double@, and @S@.
149The constructors create an initialized value of the specific type that is bound to the immutable variables @foo@, @bar@, and @baz@.
150Hence, the ADT @Foo@ is like a union containing values of the associated types, and a constructor name is used to access the value using dynamic pattern-matching.
151\begin{cquote}
152\setlength{\tabcolsep}{15pt}
153\begin{tabular}{@{}ll@{}}
154\begin{haskell}
155prtfoo val = -- function
156    -- pattern match on constructor
157    case val of
158      @A@ a -> print a
159      @B@ b -> print b
160      @C@ (S i d) -> do
161          print i
162          print d
163\end{haskell}
164&
165\begin{haskell}
166main = do
167    prtfoo foo
168    prtfoo bar
169    prtfoo baz
1703
1713.5
1727
1737.5
174\end{haskell}
175\end{tabular}
176\end{cquote}
177For safety, most languages require all assocaited types to be listed or a default case with no field accesses.
178
179A less frequent case is multiple constructors with the same type.
180\begin{haskell}
181data Bar = X Int | Y Int | Z Int;
182foo = X 3;
183bar = Y 3;
184baz = Z 5;
185\end{haskell}
186Here, the constructor name gives different meaning to the values in the common \lstinline[language=Haskell]{Int} type, \eg the value @3@ has different interpretations depending on the constructor name in the pattern matching.
187
188Note, the term \newterm{variant} is often associated with ADTs.
189However, there are multiple languages with a @variant@ type that is not an ADT \see{Algol68~\cite{Algol68} or \CC \lstinline{variant}}.
190In these languages, the variant is often a union using RTTI tags, which cannot be used to simulate an enumeration.
191Hence, in this work the term variant is not a synonym for ADT.
192
193% https://downloads.haskell.org/ghc/latest/docs/libraries/base-4.19.1.0-179c/GHC-Enum.html
194% https://hackage.haskell.org/package/base-4.19.1.0/docs/GHC-Enum.html
195
196The association between ADT and enumeration occurs if all the constructors have a unit (empty) type, \eg @struct unit {}@.
197Note, the unit type is not the same as \lstinline{void}, \eg:
198\begin{cfa}
199void foo( void );
200struct unit {} u;  // empty type
201unit bar( unit );
202foo( foo() );        // void argument does not match with void parameter
203bar( bar( u ) );   // unit argument does match with unit parameter
204\end{cfa}
205
206For example, in the Haskell ADT:
207\begin{haskell}
208data Week = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving(Enum, Eq, Show)
209\end{haskell}
210the default type for each constructor is the unit type, and deriving from @Enum@ enforces no other type, @Eq@ allows equality comparison, and @Show@ is for printing.
211The nullary constructors for the unit types are numbered left-to-right from $0$ to @maxBound@$- 1$, and provides enumerating operations @succ@, @pred@, @enumFrom@ @enumFromTo@.
212\VRef[Figure]{f:HaskellEnumeration} shows enumeration comparison and iterating (enumerating).
213
214\begin{figure}
215\begin{cquote}
216\setlength{\tabcolsep}{15pt}
217\begin{tabular}{@{}ll@{}}
218\begin{haskell}
219day = Tue
220main = do
221    if day == Tue then
222        print day
223    else
224        putStr "not Tue"
225    print (enumFrom Mon)            -- week
226    print (enumFromTo Mon Fri)   -- weekday
227    print (enumFromTo Sat Sun)  -- weekend
228\end{haskell}
229&
230\begin{haskell}
231Tue
232[Mon,Tue,Wed,Thu,Fri,Sat,Sun]
233[Mon,Tue,Wed,Thu,Fri]
234[Sat,Sun]
235
236
237
238
239
240\end{haskell}
241\end{tabular}
242\end{cquote}
243\caption{Haskell Enumeration}
244\label{f:HaskellEnumeration}
245\end{figure}
246
247The key observation is the dichotomy between an ADT and enumeration: the ADT uses the associated type resulting in a union-like data structure, and the enumeration does not use the associated type, and hence, is not a union.
248While the enumeration is constructed using the ADT mechanism, it is so restricted it is not really an ADT.
249Furthermore, a general ADT cannot be an enumeration because the constructors generate different values making enumerating meaningless.
250While functional programming languages regularly repurpose the ADT type into an enumeration type, this process seems contrived and confusing.
251Hence, there is only a weak equivalence between an enumeration and ADT, justifying a separate enumeration type in a programming language.
252
253
254\section{Contributions}
255
256The goal of this work is to to extend the simple and unsafe enumeration type in the C programming-language into a complex and safe enumeration type in the \CFA programming-language, while maintaining backwards compatibility with C.
257On the surface, enumerations seem like a simple type.
258However, when extended with advanced features, enumerations become complex for both the type system and the runtime implementation.
259
260The contribution of this work are:
261\begin{enumerate}
262\item
263overloading
264\item
265scoping
266\item
267typing
268\item
269subseting
270\item
271inheritance
272\end{enumerate}
Note: See TracBrowser for help on using the repository browser.