Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/user/user.tex

    r07bc165 ra17e7b8  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sun Jul 10 12:52:09 2016
    14 %% Update Count     : 1200
     13%% Last Modified On : Thu Jul  7 08:25:37 2016
     14%% Update Count     : 1099
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    127127\section{Introduction}
    128128
    129 \CFA\footnote{Pronounced ``C-for-all'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed as an evolutionary step forward from the C programming language.
    130 The syntax of the \CFA language builds from C, and should look immediately familiar to C/\Index*[C++]{\CC} programmers.
     129\CFA\footnote{Pronounced ``C-for-all'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed an as evolutionary step forward from the C programming language.
     130The syntax of the \CFA language builds from C, and should look immediately familiar to C/\CC programmers.
    131131% Any language feature that is not described here can be assumed to be using the standard C11 syntax.
    132132\CFA adds many modern programming-language features that directly lead to increased \emph{safety} and \emph{productivity}, while maintaining interoperability with existing C programs and achieving C performance.
    133133Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global garbage-collection.
    134 The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules.
     134The primary new features include parametric-polymorphism routines and types, exceptions, concurrency, and modules.
    135135
    136136One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
     
    140140instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features.
    141141New programs can be written in \CFA using a combination of C and \CFA features.
    142 \Index*[C++]{\CC} had a similar goal 30 years ago, but has struggled over the intervening time to incorporate modern programming-language features because of early design choices.
     142\CC had a similar goal 30 years ago, but has struggled over the intervening time to incorporate modern programming-language features because of early design choices.
    143143\CFA has 30 years of hindsight and a clean starting point.
    144144
    145 Like \Index*[C++]{\CC}, there may be both an old and new ways to achieve the same effect.
     145Like \CC, there may be both an old and new ways to achieve the same effect.
    146146For example, the following programs compare the \CFA and C I/O mechanisms.
    147147\begin{quote2}
     
    166166\end{quote2}
    167167Both programs output the same result.
    168 While the \CFA I/O looks similar to the \Index*[C++]{\CC} output style, there are important differences, such as automatic spacing between variables as in \Index*{Python} (see also~\VRef{s:IOLibrary}).
     168While the \CFA I/O looks similar to the \CC output style, there are important differences, such as automatic spacing between variables as in Python (see also~\VRef{s:IOLibrary}).
    169169
    170170This document is a user manual for the \CFA programming language, targeted at \CFA programmers.
     
    178178
    179179The \CFA project started with K-W C~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples.
    180 (See~\cite{Werther96} for some similar work, but for \Index*[C++]{\CC}.)
    181 The original \CFA project~\cite{Ditchfield92} extended the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC} approach of object-oriented extensions to the C type-system.
     180(See~\cite{Werther96} for some similar work, but for \CC.)
     181The original \CFA project~\cite{Ditchfield92} extended the C type system with parametric polymorphism and overloading, as opposed to the \CC approach of object-oriented extensions to the C type-system.
    182182A first implementation of the core Cforall language was created~\cite{Bilson03,Esteves04}, but at the time there was little interesting in extending C, so work did not continue.
    183183As the saying goes, ``What goes around, comes around.'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.
     
    189189For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.
    190190As well, there are millions of lines of C legacy code, forming the base for many software development projects (especially on UNIX systems).
    191 The TIOBE index (\url{http://www.tiobe.com/tiobe_index}) for March 2016 shows programming-language popularity, with \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC} 6.7\%, \CS 4.3\%, \Index*{Python} 4.3\%, and all other programming languages below 3\%.
     191The TIOBE index (\url{http://www.tiobe.com/tiobe_index}) for March 2016 shows programming-language popularity, with Java 20.5\%, C 14.5\%, \CC 6.7\%, \CS 4.3\%, Python 4.3\%, and all other programming languages below 3\%.
    192192As well, for 30 years, C has been the number 1 and 2 most popular programming language:
    193193\begin{center}
     
    203203\end{tabular}
    204204\end{center}
    205 Hence, C is still an extremely important programming language, with double the usage of \Index*[C++]{\CC}, where \CC itself is largely C code.
     205Hence, C is still an extremely important programming language, with double the usage of \CC, where \CC itself is largely C code.
    206206Finally, love it or hate it, C has been an important and influential part of computer science for 40 years and it appears it will continue to be for many more years.
    207207Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs.
     
    211211however, it largely extended the language, and did not address many existing problems.\footnote{%
    212212Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.}
    213 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (e.g., objects, concurrency) are added and problems fixed within the framework of the existing language.
    214 \Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
     213Fortran~\cite{Fortran08}, Ada~\cite{Ada12}, and Cobol~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (e.g., objects, concurrency) are added and problems fixed within the framework of the existing language.
     214Java~\cite{Java8}, Go~\cite{Go}, Rust~\cite{Rust} and D~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
    215215These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
    216216As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten.
     
    232232In fact, one of the biggest issues for any new programming language is establishing a minimum level of library code to support a large body of activities.
    233233Language developers often state that adequate library support takes more work than designing and implementing the language itself.
    234 Like \Index*[C++]{\CC}, \CFA starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
     234Like \CC, \CFA starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
    235235Hence, \CFA begins by leveraging the large repository of C libraries with little cost.
    236236
     
    241241char abs( char );
    242242extern "C" {
    243 int abs( int );                                 §\C{// use default C routine for int}§
     243int abs( int );                                 // use default C routine for int
    244244} // extern "C"
    245245long int abs( long int );
     
    253253\end{lstlisting}
    254254The problem is the name clash between the library routine ©abs© and the \CFA names ©abs©.
    255 Hence, names appearing in an ©extern "C"© block have \newterm*{C linkage}.
    256 Then overloading polymorphism uses a mechanism called \newterm{name mangling}\index{mangling!name} to create unique names that are different from C names, which are not mangled.
     255Hence, names appearing in an ©extern "C"© block have \newterm{C linkage}.
     256Then overloading polymorphism uses a mechanism called \newterm{name mangling} to create unique names that are different from C names, which are not mangled.
    257257Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed.
    258258There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
     
    265265\section[Compiling CFA Program]{Compiling \CFA Program}
    266266
    267 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, e.g.:
     267The command ©cfa© is used to compile \CFA program(s), and is based on the GNU ©gcc©\index{gcc} command, e.g.:
    268268\begin{lstlisting}
    269269cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
    270270\end{lstlisting}
    271 \CFA programs having the following ©gcc© flags turned on:
     271By default, \CFA programs having the following ©gcc© flags turned on:
    272272\begin{description}
    273 \item
    274 \Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}}
     273\item\hspace*{-0.6ex}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}}
    275274The 1999 C standard plus GNU extensions.
    276 \item
    277 \Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}}
     275\item\hspace*{-0.6ex}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{©-fgnu89-¶inline¶©}}
    278276Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files.
    279277\end{description}
    280 The following new \CFA options are available:
     278The following new \CFA option is available:
    281279\begin{description}
    282 \item
    283 \Indexc{-CFA}\index{compilation option!-CFA@©-CFA©}
     280\item\hspace*{-0.6ex}\Indexc{-CFA}\index{compilation option!-CFA@{©-CFA©}}
    284281Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
    285 The generated code started with the standard \CFA prelude.
    286 
    287 \item
    288 \Indexc{-debug}\index{compilation option!-debug@©-debug©}
    289 The program is linked with the debugging version of the runtime system.
    290 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program.
    291 The runtime checks should only be removed after the program is completely debugged.
    292 \textbf{This option is the default.}
    293 
    294 \item
    295 \Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}
    296 The program is linked with the non-debugging version of the unikernel or multikernel, so the execution of the program is faster.
    297 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}
    298 
    299 \item
    300 \Indexc{-help}\index{compilation option!-help@©-help©}
    301 Information about the set of \CFA compilation flags is printed.
    302 
    303 \item
    304 \Indexc{-nohelp}\index{compilation option!-nohelp@©-nohelp©}
    305 Information about the set of \CFA compilation flags is not printed.
    306 \textbf{This option is the default.}
    307 
    308 \item
    309 \Indexc{-quiet}\index{compilation option!-quiet@©-quiet©}
    310 The \CFA compilation message is not printed at the beginning of a compilation.
    311 
    312 \item
    313 \Indexc{-noquiet}\index{compilation option!-noquiet@©-noquiet©}
    314 The \CFA compilation message is printed at the beginning of a compilation.
    315 \textbf{This option is the default.}
    316282\end{description}
    317283
    318284The following preprocessor variables are available:
    319285\begin{description}
    320 \item
    321 \Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}}
     286\item\hspace*{-0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}}
    322287is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{
    323288The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed.
    324289Hence, the need to have three variables for the major, minor and patch version number.}
    325290
    326 \item
    327 \Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}}
     291\item\hspace*{-0.6ex}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}}
    328292is always available during preprocessing and its value is the current minor \Index{version number} of \CFA.
    329293
    330 \item
    331 \Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©}
     294\item\hspace*{-0.6ex}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©}
    332295is always available during preprocessing and its value is the current patch \Index{version number} of \CFA.
    333296
    334 \item
    335 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}
    336 is always available during preprocessing and has no value.
     297\item\hspace*{-0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©} and \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}
     298are always available during preprocessing and have no value.
    337299\end{description}
     300
    338301These preprocessor variables allow conditional compilation of programs that must work differently in these situations.
    339302For example, to toggle between C and \CFA extensions, using the following:
     
    345308#endif
    346309\end{lstlisting}
    347 which conditionally includes the correct header file, if the program is compiled using \Indexc{gcc} or \Indexc{cfa}.
     310which conditionally includes the correct header file, if the program is compiled using ©gcc© or ©cfa©.
    348311
    349312
     
    379342\end{enumerate}
    380343It is significantly easier to read and enter long constants when they are broken up into smaller groupings (most cultures use comma or period among digits for the same purpose).
    381 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in \Index*{Ada} and \Index*{Java} 8.
     344This extension is backwards compatible, matches with the use of underscore in variable names, and appears in Ada and Java 8.
    382345
    383346
     
    396359\end{tabular}
    397360\end{quote2}
    398 Is this an array of 5 pointers to integers or a \Index{pointer} to an array of 5 integers?
     361Is this an array of 5 pointers to integers or a pointer to an array of 5 integers?
    399362The fact this declaration is unclear to many C programmers means there are \Index{productivity} and \Index{safety} issues even for basic programs.
    400363Another example of confusion results from the fact that a routine name and its parameters are embedded within the return type, mimicking the way the return value is used at the routine's call site.
    401 For example, a routine returning a \Index{pointer} to an array of integers is defined and used in the following way:
     364For example, a routine returning a pointer to an array of integers is defined and used in the following way:
    402365\begin{lstlisting}
    403366int (*f())[5] {...};                    §\C{}§
     
    410373The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type.
    411374In the following example, \R{red} is for the base type and \B{blue} is for the qualifiers.
    412 The \CFA declarations move the qualifiers to the left of the base type, i.e., move the blue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type.
     375The \CFA declarations move the qualifiers to the left of the base type, i.e., blue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type.
    413376\begin{quote2}
    414377\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     
    430393% Specifically, the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array or function return value, and parentheses ©()© are used to indicate a routine parameter.
    431394However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list.
    432 For instance, variables ©x© and ©y© of type \Index{pointer} to integer are defined in \CFA as follows:
     395For instance, variables ©x© and ©y© of type pointer to integer are defined in \CFA as follows:
    433396\begin{quote2}
    434397\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     
    443406\end{tabular}
    444407\end{quote2}
    445 The downside of this semantics is the need to separate regular and \Index{pointer} declarations:
     408The downside of this semantics is the need to separate regular and pointer declarations:
    446409\begin{quote2}
    447410\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     
    586549\end{tabular}
    587550\end{quote2}
    588 where the right example is how the compiler logically interprets the variables in the left example.
    589 Since a variable name only points to one location during its lifetime, it is an \Index{immutable} \Index{pointer};
     551where the right example is how the compiler logically interpreters the variables in the left example.
     552Since a variable name only points to one location during its lifetime, it is an \Index{immutable} pointer;
    590553hence, variables ©x© and ©y© are constant pointers in the compiler interpretation.
    591554In general, variable addresses are stored in instructions instead of loaded independently, so an instruction fetch implicitly loads a variable's address.
     
    607570\end{tabular}
    608571\end{quote2}
    609 Finally, the immutable nature of a variable's address and the fact that there is no storage for a variable address means pointer assignment\index{pointer!assignment}\index{assignment!pointer} is impossible.
     572Finally, the immutable nature of a variable's address and the fact that there is no storage for a variable address means pointer assignment is impossible.
    610573Therefore, the expression ©x = y© only has one meaning, ©*x = *y©, i.e., manipulate values, which is why explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of instruction decoding.
    611574
    612 A \Index{pointer}/\Index{reference} is a generalization of a variable name, i.e., a mutable address that can point to more than one memory location during its lifetime.
     575A pointer/reference is a generalization of a variable name, i.e., a mutable address that can point to more than one memory location during its lifetime.
    613576(Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime and may not occupy storage as the literal is embedded directly into instructions.)
    614577Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.:
     
    618581int x, y, ®*® p1, ®*® p2, ®**® p3;
    619582p1 = ®&®x;               // p1 points to x
    620 p2 = p1;                 // p2 points to x
     583p2 = p1;                 // p2 also points to x
    621584p1 = ®&®y;               // p1 points to y
     585p1 = p2 + 1;    // p1 points to y, pointer arithmetic
    622586p3 = &p2;               // p3 points to p2
    623587\end{lstlisting}
     
    628592
    629593Notice, an address has a duality\index{address!duality}: a location in memory or the value at that location.
    630 In many cases, a compiler might be able to infer the meaning:
     594In many cases, the compiler can infer the meaning:
    631595\begin{lstlisting}
    632596p2 = p1 + x;                                    §\C{// compiler infers *p2 = *p1 + x;}§
    633597\end{lstlisting}
    634598because adding the arbitrary integer value in ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation.
    635 \Index*{Algol68}~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage.
    636 However, in C, the following cases are ambiguous, especially with pointer arithmetic:
     599Algol68~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage.
     600However, there are ambiguous cases, especially when \Index{pointer arithmetic} is possible, as in C:
    637601\begin{lstlisting}
    638602p1 = p2;                                                §\C{// p1 = p2\ \ or\ \ *p1 = *p2}§
     
    640604\end{lstlisting}
    641605
    642 Most languages pick one meaning as the default and the programmer explicitly indicates the other meaning to resolve the address-duality ambiguity\index{address! ambiguity}.
     606Most languages pick one meaning as the default and the programmer explicitly indicates the other meaning to resolve the address-duality ambiguity\index{address!duality ambiguity}.
    643607In C, the default meaning for pointers is to manipulate the pointer's address and the pointed-to value is explicitly accessed by the dereference operator ©*©.
    644608\begin{lstlisting}
     
    646610*p1 = *p1 + 1;                                  §\C{// pointed-to value assignment / operation}§
    647611\end{lstlisting}
    648 which works well for situations where manipulation of addresses is the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).
     612which works well for situations where manipulation of addresses in the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).
    649613
    650614However, in most other situations, the pointed-to value is requested more often than the pointer address.
     
    662626int x, y, ®&® r1, ®&® r2, ®&&® r3;
    663627®&®r1 = &x;                                             §\C{// r1 points to x}§
    664 ®&®r2 = &r1;                                    §\C{// r2 points to x}§
    665 ®&®r1 = &y;                                             §\C{// r1 points to y}§
    666 ®&&®r3 = ®&®&r2;                                §\C{// r3 points to r2}§
     628®&®r2 = &r1;                                    §\C{// r2 also points to x}§
     629®&®r1 = &y;                                             §\C{// r2 also points to x}§
     630®&®r1 = &r2 + 1;                                §\C{// r1 points to y, pointer arithmetic}§
     631®&®r3 = ®&®&r2;                                 §\C{// r3 points to r2}§
    667632r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); §\C{// implicit dereferencing}§
    668633\end{lstlisting}
     
    683648Hence, assigning to a reference requires the address of the reference variable (\Index{lvalue}):
    684649\begin{lstlisting}
    685 (&®*®)r1 = &x;                                  §\C{// (\&*) cancel giving variable r1 not variable pointed-to by r1}§
     650(&®*®)r1 = &x;                                  §\C{// (\&*) cancel out giving variable r1 not the variable pointed-to by r1}§
    686651\end{lstlisting}
    687652Similarly, the address of a reference can be obtained for assignment or computation (\Index{rvalue}):
    688653\begin{lstlisting}
    689 (&(&®*®)®*®)r3 = &(&®*®)r2;             §\C{// (\&*) cancel giving address of r2, (\&(\&*)*) cancel giving variable r3
    690 \end{lstlisting}
    691 Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth, and pointer and reference values are interchangeable because both contain addresses.
     654(&®*®)r3 = &(&®*®)r2;                   §\C{// (\&*) cancel out giving the address of variable r2
     655\end{lstlisting}
     656\Index{Cancellation}\index{pointer!cancellation rule} works to arbitrary depth, and pointer and reference values are interchangeable because both contain addresses.
    692657\begin{lstlisting}
    693658int x, *p1 = &x, **p2 = &p1, ***p3 = &p2,
    694                  &r1 = x,    &&r2 = r1,   &&&r3 = r2;
     659                 &r1 = &x, &&r2 = &&r1, &&&r3 = &&r2;
    695660***p3 = 3;                                              §\C{// change x}§
    696661r3 = 3;                                                 §\C{// change x, ***r3}§
     
    703668Finally, implicit dereferencing and cancellation are a static (compilation) phenomenon not a dynamic one.
    704669That is, all implicit dereferencing and any cancellation is carried out prior to the start of the program, so reference performance is equivalent to pointer performance.
    705 A programmer selects a pointer or reference type solely on whether the address is dereferenced frequently or infrequently, which dictates the amount of direct aid from the compiler;
     670A programmer selects a pointer or reference type solely on whether the address is dereferences frequently or infrequently, which dictates the amount of direct aid from the compiler;
    706671otherwise, everything else is equal.
    707672
    708 Interestingly, \Index*[C++]{\CC} deals with the address duality by making the pointed-to value the default, and prevent\-ing changes to the reference address, which eliminates half of the duality.
    709 \Index*{Java} deals with the address duality by making address assignment the default and requiring field assignment (direct or indirect via methods), i.e., there is no builtin bit-wise or method-wise assignment, which eliminates half of the duality.
     673Interestingly, \CC deals with the address duality by making the pointed-to value the default, and prevent\-ing changes to the reference address, which eliminates half of the duality.
     674Java deals with the address duality by making address assignment the default and providing a \Index{clone} mechanism to change the pointed-to value.
    710675
    711676As for a pointer, a reference may have qualifiers:
    712677\begin{lstlisting}
    713678const int cx = 5;                               §\C{// cannot change cx;}§
    714 const int & cr = cx;                    §\C{// cannot change what cr points to}§
    715 ®&®cr = &cx;                                    §\C{// can change cr
    716 cr = 7;                                                 §\C{// error, cannot change cx}§
    717 int & const rc = x;                             §\C{// must be initialized, \CC reference}§
    718 ®&®rc = &x;                                             §\C{// error, cannot change rc
    719 const int & const crc = cx;             §\C{// must be initialized, \CC reference}§
    720 crc = 7;                                                §\C{// error, cannot change cx}§
    721 ®&®crc = &cx;                                   §\C{// error, cannot change crc
    722 \end{lstlisting}
    723 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}.
    724 In effect, the compiler is managing the addresses for type ©& const© not the programmer, and by a programming discipline of only using references with references, address errors can be prevented.
    725 
    726 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object.
     679const int & r3 = &cx;                   §\C{// cannot change what r3 is pointing to}§
     680®&®r3 = &cx;                                    §\C{// can change r3
     681r3 = 7;                                                 §\C{// error, cannot change cx}§
     682int & const r4 = &x;                    §\C{// must be initialized, \CC reference}§
     683®&®r4 = &x;                                             §\C{// error, cannot change r4
     684const int & const r5 = &cx;             §\C{// must be initialized, \CC reference}§
     685r5 = 7;                                                 §\C{// error, cannot change cx}§
     686®&®r5 = &cx;                                    §\C{// error, cannot change r5
     687\end{lstlisting}
     688Hence, for type ©& const©, there is no pointer assignment, so ©&r4 = &x© is disallowed, and \emph{the address value cannot be ©0©}.
     689In effect, the compiler is managing the addresses fpr type ©& const© not the programmer.
     690
     691\Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage for an object.
    727692There are three initialization contexts in \CFA: declaration initialization, argument/parameter binding, return/temporary binding.
    728 For reference initialization (like pointer), the initializing value must be an address (\Index{lvalue}) not a value (\Index{rvalue}).
     693For reference initialization (like pointer), the initializing value must be an address (lvalue) not a value (rvalue).
    729694\begin{lstlisting}
    730695int * p = &x;                                   §\C{// both \&x and x are possible interpretations}§
    731696int & r = x;                                    §\C{// x unlikely interpretation, because of auto-dereferencing}§
    732697\end{lstlisting}
    733 Hence, the compiler implicitly inserts a reference operator, ©&©, before the initialization expression.
     698Hence, the compiler implicitly inserts a reference operator, ©&©, before the initialization expression:
    734699Similarly, when a reference is used for a parameter/return type, the call-site argument does not require a reference operator.
    735700\begin{lstlisting}
    736 int & f( int & rp );                    §\C{// reference parameter and return}§
    737 z = f( x ) + f( y );                    §\C{// reference operator added
    738 \end{lstlisting}
    739 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©rp© can be locally reassigned within ©f©.
     701int & f( int & ri );                    §\C{// reference parameter and return}§
     702z = f( x ) + f( y );                    §\C{// reference operator added not required
     703\end{lstlisting}
     704Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©ri© can be locally reassigned within ©f©.
    740705The return reference from ©f© is copied into a compiler generated temporary, which is treated as an initialization.
    741706
    742707When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions.
    743708\begin{lstlisting}
    744 void f( ®const® int & crp );
    745 void g( ®const® int * cpp );
     709void f( ®const® int & cri );
     710void g( ®const® int * cri );
    746711f( 3 );                   g( &3 );
    747712f( x + y );             g( &(x + y) );
    748713\end{lstlisting}
    749714Here, the compiler passes the address to the literal 3 or the temporary for the expression ©x + y©, knowing the argument cannot be changed through the parameter.
    750 (The ©&© is necessary for the pointer parameter to make the types match, and is a common requirement for a C programmer.)
    751 \CFA \emph{extends} this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed-to by the reference parameter and can be changed.
    752 \begin{lstlisting}
    753 void f( int & rp );
    754 void g( int * pp );
     715(The ©&© is necessary for the pointer parameter to make the types match, and is common requirement for a C programmer.)
     716\CFA extends this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed to by the reference parameter and can be changed.
     717\begin{lstlisting}
     718void f( int & cri );
     719void g( int * cri );
    755720f( 3 );                   g( &3 );              §\C{// compiler implicit generates temporaries}§
    756721f( x + y );             g( &(x + y) );  §\C{// compiler implicit generates temporaries}§
    757722\end{lstlisting}
    758 Essentially, there is an implicit \Index{rvalue} to \Index{lvalue} conversion in this case.\footnote{
    759 This conversion attempts to address the \newterm{const hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.}
    760 The implicit conversion allows seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call.
    761 
    762 While \CFA attempts to handle pointers and references in a uniform, symmetric manner, C handles routine variables in an inconsistent way: a routine variable is both a pointer and a reference (particle and wave).
     723Essentially, there is an implicit rvalue to lvalue conversion in this case.\footnote{
     724This conversion attempts to address the \newterm{const Hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.}
     725The implicit conversion allows seamless calls to any routine without having to explicit name/copy the literal/expression to allow the call.
     726
     727While \CFA attempts to handle pointers and references in a uniform, symmetric manner, C handles routine pointers in an inconsistent way: a routine pointer is both a reference and a pointer (particle and wave).
    763728\begin{lstlisting}
    764729void f( int p ) {...}
     
    772737const void (&fp)( int ) = f;
    773738fp( 3 );
    774 fp = ...                                                §\C{// error, cannot change code
    775 &fp = ...;                                              §\C{// changing routine reference}§
     739fp = ...                                                §\C{// change code not allowed
     740&fp = ...;                                              §\C{// change routine reference}§
    776741\end{lstlisting}
    777742because the value of the routine variable is a routine literal, i.e., the routine code is normally immutable during execution.\footnote{
    778743Dynamic code rewriting is possible but only in special circumstances.}
    779 \CFA allows this additional use of references for routine variables in an attempt to give a more consistent meaning for them.
     744\CFA allows this additional use of references for routine variables in an attempt to give a more consistent meaning for routine variables.
    780745
    781746
     
    812777
    813778In detail, the brackets, ©[]©, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{
    814 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}
     779Michael Tiemann, with help from Doug Lea, provided named return values in g++, circa 1989.}
    815780The value of each local return variable is automatically returned at routine termination.
    816781Declaration qualifiers can only appear at the start of a routine definition, e.g.:
     
    10911056
    10921057Given the \CFA restrictions above, both named and default arguments are backwards compatible.
    1093 \Index*[C++]{\CC} only supports default arguments;
    1094 \Index*{Ada} supports both named and default arguments.
     1058\CC only supports default arguments;
     1059Ada supports both named and default arguments.
    10951060
    10961061
     
    11681133\end{figure}
    11691134In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope.
    1170 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does \Index*{Java}, rather than the \CC type-selection operator ``©::©''.
     1135In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does Java, rather than the \CC type-selection operator ``©::©''.
    11711136
    11721137
     
    11931158Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks;
    11941159the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program.
    1195 The following program in undefined in \CFA (and Indexc{gcc})
     1160The following program in undefined in \CFA (and ©gcc©\index{gcc})
    11961161\begin{lstlisting}
    11971162[* [int]( int )] foo() {                §\C{// int (*foo())( int )}§
     
    13721337[ §\emph{lvalue}§, ..., §\emph{lvalue}§ ] = §\emph{expr}§;
    13731338\end{lstlisting}
    1374 \index{lvalue}
    13751339The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement.
    13761340©$\emph{expr}$© is any standard arithmetic expression.
     
    14121376[ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ];
    14131377\end{lstlisting}
    1414 \index{lvalue}
    14151378The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s.
    14161379Each \emph{expr} appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment.
     
    17021665Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors.
    17031666There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
    1704 Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}:
     1667Nevertheless, C does have an idiom where this capability is used, known as ``Duff's device''~\cite{Duff83}:
    17051668\begin{lstlisting}
    17061669register int n = (count + 7) / 8;
     
    17511714the number of ©switch© statements is small,
    17521715\item
    1753 most ©switch© statements are well formed (i.e., no \Index*{Duff's device}),
     1716most ©switch© statements are well formed (i.e., no Duff's device),
    17541717\item
    17551718the ©default© clause is usually written as the last case-clause,
     
    17861749The ability to fall-through is retained because it is a sufficient C-idiom that most C programmers simply expect it, and its absence might discourage these programmers from using the ©choose© statement.
    17871750\item
    1788 Eliminating \Index*{Duff's device} is straightforward and only invalidates a small amount of very questionable code.
     1751Eliminating Duff's device is straightforward and only invalidates a small amount of very questionable code.
    17891752The solution is to allow ©case© clauses to only appear at the same nesting level as the ©switch© body, as is done in most other programming languages with ©switch© statements.
    17901753\item
     
    20281991\CFA supports C initialization of structures, but it also adds constructors for more advanced initialization.
    20291992Additionally, \CFA adds destructors that are called when a variable is de-allocated (variable goes out of scope or object is deleted).
    2030 These functions take a reference to the structure as a parameter (see References for more information).
     1993These functions take a reference to the structure as a parameter (see
     1994References for more information).
    20311995
    20321996\begin{figure}
     
    20812045\section{References}
    20822046
    2083 
     2047\CFA supports reference types similar to rvalue references in \CC.
     2048A reference is essentially an alias for a variable, allowing multiple names to refer to the same object.
     2049A reference can be used as a safer alternative to a pointer, because it can be used to pass a variable by reference, but it must always reference an object.
     2050It cannot be NULL, it must be assigned a value at initialization, and the object it references cannot change once it is set.
    20842051By introducing references in parameter types, users are given an easy way to pass a value by reference, without the need for NULL pointer checks.
    20852052In structures, a reference can replace a pointer to an object that should always have a valid value.
     
    20902057When initializing a reference, \CFA uses a different syntax which differentiates reference initialization from assignment to a reference.
    20912058The ©&© is used on both sides of the expression to clarify that the address of the reference is being set to the address of the variable to which it refers.
     2059
     2060\begin{figure}
     2061\begin{lstlisting}
     2062// parameter p is a reference to a Point
     2063void movePointUp(Point &p) {
     2064        p.y += 1.0; // Uses dot-notation to access fields
     2065}
     2066
     2067Point p1 = ...;
     2068ColoredPoint cp1 = ...;
     2069movePoint(p1); // reference to p1 passed to movePoint
     2070movePoint(cp1); // reference to cp1 passed to movePoint
     2071
     2072// a ListElement cannot be created without a valid list
     2073
     2074struct ListElement {
     2075        int element;
     2076        List &list; // a list element has a reference to the list
     2077}
     2078
     2079// The constructor must initialize the reference
     2080void ?{}(ListElement &le, int e, List &l) {
     2081        le.element = e;
     2082        &le.list = &l; // initialize the reference
     2083}
     2084
     2085ListElement e1{88, numberList}; // uses constructor
     2086ListElement e2; // compiler error: uninitialized reference
     2087Listing 10: References
     2088\end{lstlisting}
     2089\end{figure}
    20922090\end{comment}
    20932091
     
    21332131The operations ©&&©, ©||©, and ©!© can be applied to any scalar arguments and are defined in terms of comparison against 0 (ex. ©(a && b)© becomes ©(a != 0 && b != 0)©).
    21342132
    2135 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case.
    2136 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value.
    2137 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©.
     2133In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any
     2134arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a
     2135special case.
     2136However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their
     2137functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their
     2138polymorphic parameters, and user-defined pointer-like types may need a null value.
     2139Defining special
     2140constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©.
    21382141
    21392142Why just 0 and 1? Why not other integers? No other integers have special status in C.
     
    23132316\begin{quote2}
    23142317\begin{tabular}{@{}l@{\hspace{3em}}ll@{}}
    2315 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CC}} & \multicolumn{1}{c}{Indexc{gcc}} \\
     2318\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CC}} & \multicolumn{1}{c}{©gcc©}\index{gcc} \\
    23162319\begin{lstlisting}
    23172320
     
    23452348
    23462349In \CFA, ©typedef© provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name.
    2347 \Indexc{gcc} provides ©typeof© to declare a secondary variable from a primary variable.
     2350©gcc© provides ©typeof© to declare a secondary variable from a primary variable.
    23482351\CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression.
    23492352Only for overloaded routines with the same return type is variable type-inferencing possible.
     
    23752378Generics allow programmers to use type variables in place of concrete types so that the code can be reused with multiple types.
    23762379The type parameters can be restricted to satisfy a set of constraints.
    2377 This enables \CFA to build fully compiled generic functions and types, unlike other languages like \Index*[C++]{\CC} where templates are expanded or must be explicitly instantiated.
     2380This enables \CFA to build fully compiled generic functions and types, unlike other languages like \CC where templates are expanded or must be explicitly instantiated.
    23782381
    23792382
    23802383\subsection{Generic Functions}
    23812384
    2382 Generic functions in \CFA are similar to template functions in \Index*[C++]{\CC}, and will sometimes be expanded into specialized versions, just like in \CC.
     2385Generic functions in \CFA are similar to template functions in \CC, and will sometimes be expanded into specialized versions, just like in \CC.
    23832386The difference, however, is that generic functions in \CFA can also be separately compiled, using function pointers for callers to pass in all needed functionality for the given type.
    23842387This means that compiled libraries can contain generic functions that can be used by programs linked with them (statically or dynamically).
     
    24992502
    25002503Generic types are defined using the same mechanisms as those described above for generic functions.
    2501 This feature allows users to create types that have one or more fields that use generic parameters as types, similar to a template classes in \Index*[C++]{\CC}.
     2504This feature allows users to create types that have one or more fields that use generic parameters as types, similar to a template classes in \CC.
    25022505For example, to make a generic linked list, a placeholder is created for the type of the elements, so that the specific type of the elements in the list need not be specified when defining the list.
    25032506In C, something like this would have to be done using void pointers and unsafe casting.
     
    25512554Throwing an exception terminates execution of the current block, invokes the destructors of variables that are local to the block, and propagates the exception to the parent block.
    25522555The exception is immediately re-thrown from the parent block unless it is caught as described below.
    2553 \CFA uses keywords similar to \Index*[C++]{\CC} for exception handling.
     2556\CFA uses keywords similar to \CC for exception handling.
    25542557An exception is thrown using a throw statement, which accepts one argument.
    25552558
     
    26792682\end{lstlisting}
    26802683While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
    2681 Like the \Index*[C++]{\CC} lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser.
     2684Like the \CC lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser.
    26822685
    26832686There are several ambiguous cases with operator identifiers, e.g., ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©.
     
    27162719This enables a very familiar interface to all programmers, even those with no parallel programming experience.
    27172720It also allows the compiler to do static type checking of all communication, a very important safety feature.
    2718 This controlled communication with type safety has some similarities with channels in \Index*{Go}, and can actually implement
     2721This controlled communication with type safety has some similarities with channels in Go, and can actually implement
    27192722channels exactly, as well as create additional communication patterns that channels cannot.
    27202723Mutex objects, monitors, are used to contain mutual exclusion within an object and synchronization across concurrent threads.
     
    29692972
    29702973There are two levels of encapsulation in \CFA, module and package.
    2971 A module is a logical grouping of functionality that can be easily pulled into another project, much like a module in \Index*{Python} or a package in \Index*{Go}.
     2974A module is a logical grouping of functionality that can be easily pulled into another project, much like a module in Python or a package in Go.
    29722975A module forms a namespace to limit the visibility and prevent naming conflicts of variables.
    29732976Furthermore, a module is an independent translation unit, which can be compiled separately to accelerate the compilation speed.
     
    29752978A package is a physical grouping of one or more modules that is used for code distribution and version management.
    29762979Package is also the level of granularity at which dependences are managed.
    2977 A package is similar to the Crate in \Index*{Rust}.
     2980A package is similar to the Crate in Rust.
    29782981
    29792982
    29802983\subsection{No Declarations, No Header Files}
    29812984
    2982 In C and \Index*[C++]{\CC}, it is necessary to declare or define every global variable, global function, and type before it is used in each file.
     2985In C and \CC, it is necessary to declare or define every global variable, global function, and type before it is used in each file.
    29832986Header files and a preprocessor are normally used to avoid repeating code.
    29842987Thus, many variables, functions, and types are described twice, which exposes an opportunity for errors and causes additional maintenance work.
     
    29862989This information is then stored in the object files for each module, in a format that can quickly be read by the compiler, and stored at the top of the file, for quick access.
    29872990In addition to the user productivity improvements, this simple change also improves compile time, by saving the information in a simple machine readable format, instead of making the compiler parse the same information over and over from a header file.
    2988 This seems like a minor change, but according to (Pike, \Index*{Go} at Google: Language Design in the Service of Software Engineering), this simple change can cause massive reductions in compile time.
     2991This seems like a minor change, but according to (Pike, Go at Google: Language Design in the Service of Software Engineering), this simple change can cause massive reductions in compile time.
    29892992
    29902993In \CFA, multiple definitions are not necessary.
     
    36253628In developing \CFA, many other languages were consulted for ideas, constructs, and syntax.
    36263629Therefore, it is important to show how these languages each compare with Do.
    3627 In this section, \CFA is compared with what the writers of this document consider to be the closest competitors of Do: \Index*[C++]{\CC}, \Index*{Go}, \Index*{Rust}, and \Index*{D}.
     3630In this section, \CFA is compared with what the writers of this document consider to be the closest competitors of Do: \CC, Go, Rust, and D.
    36283631
    36293632
     
    36313634
    36323635
    3633 {% local change to lstlising to reduce font size
    3634 
    3635 
    3636 \lstset{basicstyle=\linespread{0.9}\sf\relsize{-2}}
    3637 
    3638 
    36393636\subsubsection{Constructors and Destructors}
     3637
     3638\lstset{basicstyle=\sf\relsize{-2}}
    36403639
    36413640\begin{flushleft}
     
    42424241\end{flushleft}
    42434242
    4244 }% local change to lstlising to reduce font size
     4243\lstset{basicstyle=\sf\relsize{-1}}
    42454244
    42464245
     
    42504249\subsubsection[C++]{\CC}
    42514250
    4252 \Index*[C++]{\CC} is a general-purpose programming language.
     4251\CC is a general-purpose programming language.
    42534252It has imperative, object-oriented and generic programming features, while also providing facilities for low-level memory manipulation. (Wikipedia)
    42544253
     
    42584257Classes in \CC also enable inheritance among types.
    42594258Instead of inheritance, \CFA embraces composition and interfaces to achieve the same goals with more flexibility.
    4260 There are many studies and articles comparing inheritance and composition (or is-a versus has-a relationships), so we will not go into more detail here (Venners, 1998) (Pike, \Index*{Go} at Google: Language Design in the Service of Software Engineering , 2012).
     4259There are many studies and articles comparing inheritance and composition (or is-a versus has-a relationships), so we will not go into more detail here (Venners, 1998) (Pike, Go at Google: Language Design in the Service of Software Engineering , 2012).
    42614260
    42624261Overloading in \CFA is very similar to overloading in \CC, with the exception of the additional use, in \CFA, of the return type to differentiate between overloaded functions.
     
    42714270\subsubsection{Go}
    42724271
    4273 \Index*{Go}, also commonly referred to as golang, is a programming language developed at Google in 2007 [.].
     4272Go, also commonly referred to as golang, is a programming language developed at Google in 2007 [.].
    42744273It is a statically typed language with syntax loosely derived from that of C, adding garbage collection, type
    42754274safety, some structural typing capabilities, additional built-in types such as variable-length arrays and key-value maps, and a large standard library. (Wikipedia)
     
    42874286\subsubsection{Rust}
    42884287
    4289 \Index*{Rust} is a general-purpose, multi-paradigm, compiled programming language developed by Mozilla Research.
     4288Rust is a general-purpose, multi-paradigm, compiled programming language developed by Mozilla Research.
    42904289It is designed to be a "safe, concurrent, practical language", supporting pure-functional, concurrent-actor[dubious . discuss][citation needed], imperative-procedural, and object-oriented styles.
    42914290
     
    43014300\subsubsection{D}
    43024301
    4303 The \Index*{D} programming language is an object-oriented, imperative, multi-paradigm system programming
     4302The D programming language is an object-oriented, imperative, multi-paradigm system programming
    43044303language created by Walter Bright of Digital Mars and released in 2001. [.]
    4305 Though it originated as a re-engineering of \CC, D is a distinct language, having redesigned some core \CC features while also taking inspiration from other languages, notably \Index*{Java}, \Index*{Python}, Ruby, C\#, and Eiffel.
     4304Though it originated as a re-engineering of \CC, D is a distinct language, having redesigned some core \CC features while also taking inspiration from other languages, notably Java, Python, Ruby, C\#, and Eiffel.
    43064305
    43074306D and \CFA both start with C and add productivity features.
     
    44434442\item[How widely used:] C programs rarely have nest types because they are equivalent to the hoisted version.
    44444443
    4445 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}.
     4444\CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC.
    44464445Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''.
    44474446Given that nested types in C are equivalent to not using them, i.e., they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.
     
    44794478\index{input/output library}
    44804479
    4481 The goal for the \CFA I/O is to make I/O as simple as possible in the common cases, while fully supporting polmorphism and user defined types in a consistent way.
    4482 The common case is printing out a sequence of variables separated by whitespace.
     4480The goal for \CFA I/O is to make I/O as simple as possible for the general case, while fully supporting polmorphism and user defined types in a consistent way.
     4481The general case is printing out a sequence of variables separated by whitespace.
    44834482\begin{quote2}
    44844483\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     
    44954494\end{tabular}
    44964495\end{quote2}
    4497 The \CFA form has half as many characters as the \CC form, and is similar to \Index*{Python} I/O with respect to implicit separators.
     4496The \CFA form is half as many characters, and is similar to \Index{Python} I/O with respect to implicit separators.
    44984497
    44994498The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment.
     
    46474646\subsection{malloc}
    46484647
    4649 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4648\begin{lstlisting}
    46504649forall( otype T ) T * malloc( void );§\indexc{malloc}§
    46514650forall( otype T ) T * malloc( char fill );
     
    46634662forall( otype T ) T * memset( T * ptr );                                // remove when default value available
    46644663\end{lstlisting}
    4665 \
     4664
    46664665
    46674666\subsection{ato / strto}
    46684667
    4669 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4668\begin{lstlisting}
    46704669int ato( const char * ptr );§\indexc{ato}§
    46714670unsigned int ato( const char * ptr );
     
    46944693long double _Complex strto( const char * sptr, char ** eptr );
    46954694\end{lstlisting}
    4696 \
    46974695
    46984696
    46994697\subsection{bsearch / qsort}
    47004698
    4701 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4699\begin{lstlisting}
    47024700forall( otype T | { int ?<?( T, T ); } )
    47034701T * bsearch( const T key, const T * arr, size_t dimension );§\indexc{bsearch}§
     
    47064704void qsort( const T * arr, size_t dimension );§\indexc{qsort}§
    47074705\end{lstlisting}
    4708 \
    47094706
    47104707
    47114708\subsection{abs}
    47124709
    4713 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4710\begin{lstlisting}
    47144711char abs( char );§\indexc{abs}§
    47154712int abs( int );
     
    47234720long double abs( long double _Complex );
    47244721\end{lstlisting}
    4725 \
    47264722
    47274723
    47284724\subsection{random}
    47294725
    4730 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4726\begin{lstlisting}
    47314727void rand48seed( long int s );§\indexc{rand48seed}§
    47324728char rand48();§\indexc{rand48}§
     
    47414737long double _Complex rand48();
    47424738\end{lstlisting}
    4743 \
    47444739
    47454740
    47464741\subsection{min / max / swap}
    47474742
    4748 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4743\begin{lstlisting}
    47494744forall( otype T | { int ?<?( T, T ); } )
    47504745T min( const T t1, const T t2 );§\indexc{min}§
     
    47564751void swap( T * t1, T * t2 );§\indexc{swap}§
    47574752\end{lstlisting}
    4758 \
    47594753
    47604754
     
    47674761\subsection{General}
    47684762
    4769 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4763\begin{lstlisting}
    47704764float fabs( float );§\indexc{fabs}§
    47714765double fabs( double );
     
    48124806long double nan( const char * );
    48134807\end{lstlisting}
    4814 \
    48154808
    48164809
    48174810\subsection{Exponential}
    48184811
    4819 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4812\begin{lstlisting}
    48204813float exp( float );§\indexc{exp}§
    48214814double exp( double );
     
    48694862long double logb( long double );
    48704863\end{lstlisting}
    4871 \
    48724864
    48734865
    48744866\subsection{Power}
    48754867
    4876 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4868\begin{lstlisting}
    48774869float sqrt( float );§\indexc{sqrt}§
    48784870double sqrt( double );
     
    48974889long double _Complex pow( long double _Complex, long double _Complex );
    48984890\end{lstlisting}
    4899 \
    49004891
    49014892
    49024893\subsection{Trigonometric}
    49034894
    4904 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4895\begin{lstlisting}
    49054896float sin( float );§\indexc{sin}§
    49064897double sin( double );
     
    49534944long double atan( long double, long double );
    49544945\end{lstlisting}
    4955 \
    49564946
    49574947
    49584948\subsection{Hyperbolic}
    49594949
    4960 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4950\begin{lstlisting}
    49614951float sinh( float );§\indexc{sinh}§
    49624952double sinh( double );
     
    50014991long double _Complex atanh( long double _Complex );
    50024992\end{lstlisting}
    5003 \
    50044993
    50054994
    50064995\subsection{Error / Gamma}
    50074996
    5008 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     4997\begin{lstlisting}
    50094998float erf( float );§\indexc{erf}§
    50104999double erf( double );
     
    50325021long double tgamma( long double );
    50335022\end{lstlisting}
    5034 \
    50355023
    50365024
    50375025\subsection{Nearest Integer}
    50385026
    5039 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     5027\begin{lstlisting}
    50405028float floor( float );§\indexc{floor}§
    50415029double floor( double );
     
    50865074long long int llround( long double );
    50875075\end{lstlisting}
    5088 \
    50895076
    50905077
    50915078\subsection{Manipulation}
    50925079
    5093 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     5080\begin{lstlisting}
    50945081float copysign( float, float );§\indexc{copysign}§
    50955082double copysign( double, double );
     
    51275114long double scalbln( long double, long int );
    51285115\end{lstlisting}
    5129 \
    51305116
    51315117
     
    51365122When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible.
    51375123
    5138 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     5124\begin{lstlisting}
    51395125// implementation
    51405126struct Rational {§\indexc{Rational}§
Note: See TracChangeset for help on using the changeset viewer.