Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/user/user.tex

    r5cefa43 rd4d4ac8  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Mon Feb 14 17:20:39 2022
    14 %% Update Count     : 5382
     13%% Last Modified On : Sun Oct 10 12:45:00 2021
     14%% Update Count     : 5095
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
    1717% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    1818
    19 \documentclass[twoside]{article}
     19\documentclass[twoside,11pt]{article}
    2020
    2121%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    4040% blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_
    4141% green highlighting ¢...¢ (cent symbol) emacs: C-q M-"
    42 % LaTex escape ...§ (section symbol) emacs: C-q M-'
     42% LaTex escape §...§ (section symbol) emacs: C-q M-'
    4343% keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^
    4444% math escape $...$ (dollar symbol)
     
    8585\newcommand{\B}[1]{{\Textbf[blue]{#1}}}
    8686\newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}
    87 \newcommand{\Sp}{\R{\textvisiblespace}}
    8887\newcommand{\KWC}{K-W C\xspace}
    8988
     
    157156One of the main design philosophies of \CFA is to ``\Index{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''.
    158157Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming.
    159 A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to their C counterpart.
    160 There is no notion or requirement for \emph{rewriting} a legacy C program to \CFA;
     158A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to there C counterpart.
     159There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA;
    161160instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features.
    162161As well, new programs can be written in \CFA using a combination of C and \CFA features.
     
    164163
    165164\Index*[C++]{\CC{}}~\cite{c++:v1} had a similar goal 30 years ago, allowing object-oriented programming to be incrementally added to C.
    166 However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that are difficult to update, and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project.
     165However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that cannot be updated, and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project.
    167166In contrast, \CFA has 30 years of hindsight and a clean starting point.
    168167
    169168Like \Index*[C++]{\CC{}}, there may be both old and new ways to achieve the same effect.
    170169For example, the following programs compare the C, \CFA, and \CC I/O mechanisms, where the programs output the same result.
    171 \begin{flushleft}
     170\begin{center}
    172171\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}}
    173 \multicolumn{1}{@{}c@{\hspace{1em}}}{\textbf{C}}        & \multicolumn{1}{c}{\textbf{\CFA}}     & \multicolumn{1}{c@{}}{\textbf{\CC}}   \\
    174 \begin{cfa}[tabsize=3]
     172\multicolumn{1}{c@{\hspace{1em}}}{\textbf{C}}   & \multicolumn{1}{c}{\textbf{\CFA}}     & \multicolumn{1}{c}{\textbf{\CC}}      \\
     173\begin{cfa}
    175174#include <stdio.h>$\indexc{stdio.h}$
    176175
     
    181180\end{cfa}
    182181&
    183 \begin{cfa}[tabsize=3]
     182\begin{cfa}
    184183#include <fstream>$\indexc{fstream}$
    185184
     
    190189\end{cfa}
    191190&
    192 \begin{cfa}[tabsize=3]
     191\begin{cfa}
    193192#include <iostream>$\indexc{iostream}$
    194193using namespace std;
    195194int main() {
    196195        int x = 0, y = 1, z = 2;
    197         ®cout << x << ' ' << y << ' ' << z << endl;®
     196        ®cout<<x<<" "<<y<<" "<<z<<endl;®
    198197}
    199198\end{cfa}
    200199\end{tabular}
    201 \end{flushleft}
     200\end{center}
    202201While \CFA I/O \see{\VRef{s:StreamIOLibrary}} looks similar to \Index*[C++]{\CC{}}, there are important differences, such as automatic spacing between variables and an implicit newline at the end of the expression list, similar to \Index*{Python}~\cite{Python}.
    203202
     
    239238however, it largely extended the C language, and did not address many of C's existing problems.\footnote{%
    240239Two 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.}
    241 \Index*{Fortran}~\cite{Fortran08}, \Index*{Cobol}~\cite{Cobol14}, and \Index*{Ada}~\cite{Ada12} are examples of programming languages that took an evolutionary approach, where modern language-features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
     240\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 (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
    242241\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.
    243242These languages have different syntax and semantics from C, do not interoperate directly with C, and are not systems languages because of restrictive memory-management or garbage collection.
     
    334333long double _Complex ®abs®( long double _Complex );
    335334\end{cfa}
    336 The problem is a \Index{name clash} between the C name ©abs© and the \CFA names ©abs©, resulting in two name linkages\index{C linkage}: ©extern "C"© and ©extern "Cforall"© (default).
     335The problem is \Index{name clash} between the C name ©abs© and the \CFA names ©abs©, resulting in two name linkages\index{C linkage}: ©extern "C"© and ©extern "Cforall"© (default).
    337336Overloaded names must use \newterm{name mangling}\index{mangling!name} to create unique names that are different from unmangled C names.
    338337Hence, 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.
     
    378377The program is linked with the debugging version of the runtime system.
    379378The debug version performs runtime checks to aid the debugging phase of a \CFA program, but can substantially slow program execution.
    380 The runtime checks should only be removed after a program is completely debugged.
     379The runtime checks should only be removed after the program is completely debugged.
    381380\textbf{This option is the default.}
    382381
     
    453452cfa $test$.cfa -XCFA -P -XCFA parse -XCFA -n # show program parse without prelude
    454453\end{lstlisting}
    455 Alternatively, multiple flages can be specified separated with commas and \emph{without} spaces.
    456 \begin{lstlisting}[language=sh,{moredelim=**[is][\protect\color{red}]{®}{®}}]
    457 cfa $test$.cfa -XCFA®,®-Pparse®,®-n # show program parse without prelude
    458 \end{lstlisting}
    459454\begin{description}[topsep=5pt,itemsep=0pt,parsep=0pt]
    460455\item
     
    538533double ®``®forall = 3.5;
    539534\end{cfa}
    540 Existing C programs with keyword clashes can be converted by prefixing the keyword identifiers with double backquotes, and eventually the identifier name can be changed to a non-keyword name.
     535
     536Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name.
    541537\VRef[Figure]{f:HeaderFileInterposition} shows how clashes in existing C header-files \see{\VRef{s:StandardHeaders}} can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©.
    542538Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience.
     
    631627\subsection{\texorpdfstring{\LstKeywordStyle{if} / \LstKeywordStyle{while} Statement}{if / while Statement}}
    632628
    633 The \Indexc{if}/\Indexc{while} expression allows declarations, similar to \Indexc{for} declaration expression.\footnote{
    634 Declarations in the \Indexc{do}-©while© condition are not useful because they appear after the loop body.}
     629The ©if©/©while© expression allows declarations, similar to ©for© declaration expression.\footnote{
     630Declarations in the ©do©-©while© condition are not useful because they appear after the loop body.}
    635631\begin{cfa}
    636632if ( ®int x = f()® ) ... $\C{// x != 0}$
     
    644640while ( ®struct S { int i; } x = { f() }; x.i < 4® ) ... $\C{// relational expression}$
    645641\end{cfa}
    646 Unless a relational expression is specified, each variable is compared not equal to 0, which is the standard semantics for the ©if©/©while© expression, and the results are combined using the logical \Indexc{&&} operator.
    647 The scope of the declaration(s) is local to the ©if©/©while© statement, \ie in both \emph{then} and \emph{else} clauses for ©if©, and loop body for ©while©.
     642Unless a relational expression is specified, each variable is compared not equal to 0, which is the standard semantics for the ©if©/©while© expression, and the results are combined using the logical ©&&© operator.
     643The scope of the declaration(s) is local to the ©if© statement but exist within both the \emph{then} and \emph{else} clauses.
    648644\CC only provides a single declaration always compared ©!=© to 0.
    649645
     
    653649\label{s:caseClause}
    654650
    655 C restricts the \Indexc{case} clause of a \Indexc{switch} statement to a single value.
     651C restricts the ©case© clause of a ©switch© statement to a single value.
    656652For multiple ©case© clauses associated with the same statement, it is necessary to have multiple ©case© clauses rather than multiple values.
    657 Requiring a ©case© clause for each value is not in the spirit of brevity normally associated with C.
    658 Therefore, the ©case© clause is extended with a list of values.
     653Requiring a ©case© clause for each value does not seem to be in the spirit of brevity normally associated with C.
     654Therefore, the ©case© clause is extended with a list of values, as in:
    659655\begin{cquote}
    660656\begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
     
    707703\subsection{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}}
    708704
    709 C allows a number of questionable forms for the \Indexc{switch} statement:
     705C allows a number of questionable forms for the ©switch© statement:
    710706\begin{enumerate}
    711707\item
    712 By default, the end of a \Indexc{case} clause\footnote{
     708By default, the end of a ©case© clause\footnote{
    713709In this section, the term \emph{case clause} refers to either a ©case© or ©default© clause.}
    714710\emph{falls through} to the next ©case© clause in the ©switch© statement;
    715 to exit a ©switch© statement from a ©case© clause requires explicitly terminating the clause with a transfer statement, most commonly \Indexc{break}:
     711to exit a ©switch© statement from a ©case© clause requires explicitly terminating the clause with a transfer statement, most commonly ©break©:
    716712\begin{cfa}
    717713switch ( i ) {
    718714  case 1:
    719715        ...
    720         $\R{\LstCommentStyle{// fall-through}}$
     716        // fall-through
    721717  case 2:
    722718        ...
    723         ®break;®        // exit switch statement
     719        break;  // exit switch statement
    724720}
    725721\end{cfa}
     
    767763}
    768764\end{cfa}
    769 This situation is better handled by a list of case values \see{\VRef{s:caseClause}}.
     765This situation better handled without fall-through by allowing a list of case values \see{\VRef{s:caseClause}}.
    770766While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is unintuitive to many programmers and is different from most programming languages with a ©switch© statement.
    771767Hence, default fall-through semantics results in a large number of programming errors as programmers often \emph{forget} the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
     
    781777                ...
    782778        } // if
     779  case 2:
     780        while ( j < 5 ) {
     781                ...
     782          ®case 3:®             // transfer into "while" statement
     783                ...
     784        } // while
     785} // switch
    783786\end{cfa}
    784787This usage branches into control structures, which is known to cause both comprehension and technical difficulties.
     
    786789The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning.
    787790There are few arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
    788 
    789 This C idiom is known as ``\Index*{Duff's device}''~\cite{Duff83}, from this example:
     791Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}:
    790792\begin{cfa}
    791793register int n = (count + 7) / 8;
     
    856858still works.
    857859Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments.
    858 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called \Indexc{choose}, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword \Indexc{fallthrough}/\Indexc{fallthru}, \eg:
     860Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, \eg:
    859861\begin{cfa}
    860862®choose® ( i ) {
     
    883885Therefore, no change is made for this issue.
    884886\item
    885 Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause\footnote{
     887Dealing with unreachable code in a ©switch©/©choose© body is solved by restricting declarations and associated initialization to the start of statement body, which is executed \emph{before} the transfer to the appropriate ©case© clause\footnote{
    886888Essentially, these declarations are hoisted before the ©switch©/©choose© statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause.
    887889Further declarations at the same nesting level as the statement body are disallowed to ensure every transfer into the body is sound.
     
    906908\subsection{Non-terminating and Labelled \texorpdfstring{\LstKeywordStyle{fallthrough}}{Non-terminating and Labelled fallthrough}}
    907909
    908 The \Indexc{fallthrough} clause may be non-terminating within a \Indexc{case} clause or have a target label to common code from multiple case clauses.
     910The ©fallthrough© clause may be non-terminating within a ©case© clause or have a target label to common code from multiple case clauses.
    909911\begin{center}
    910912\begin{tabular}{@{}lll@{}}
     
    958960\end{tabular}
    959961\end{center}
    960 The target label must be below the \Indexc{fallthrough} and may not be nested in a control structure, and
    961 the target label must be at the same or higher level as the containing \Indexc{case} clause and located at
    962 the same level as a ©case© clause; the target label may be case \Indexc{default}, but only associated
    963 with the current \Indexc{switch}/\Indexc{choose} statement.
     962The target label must be below the ©fallthrough© and may not be nested in a control structure, and
     963the target label must be at the same or higher level as the containing ©case© clause and located at
     964the same level as a ©case© clause; the target label may be case ©default©, but only associated
     965with the current ©switch©/©choose© statement.
    964966
    965967\begin{figure}
     
    10741076Looping a fixed number of times, possibly with a loop index, occurs frequently.
    10751077\CFA condenses simply looping to facilitate coding speed and safety.
    1076 The \Indexc{for}, \Indexc{while}, and \Indexc{do} loop-control is augmented as follows \see{examples in \VRef[Figure]{f:LoopControlExamples}}:
     1078The ©for©/©while©/©do-while© loop-control is augmented as follows \see{examples in \VRef[Figure]{f:LoopControlExamples}}:
    10771079\begin{itemize}[itemsep=0pt]
    10781080\item
     
    11431145\subsection{\texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break} Statement}{Labelled continue / break Statement}}
    11441146
    1145 C \Indexc{continue} and \Indexc{break} statements, for altering control flow, are restricted to one level of nesting for a particular control structure.
     1147C ©continue© and ©break© statements, for altering control flow, are restricted to one level of nesting for a particular control structure.
    11461148This restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting.
    11471149To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@©continue©!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@©break©!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85}, as in Java.
    1148 For both ©continue© and ©break©, the target label must be directly associated with a \Indexc{for}, \Indexc{while} or \Indexc{do} statement;
    1149 for ©break©, the target label can also be associated with a \Indexc{switch}, \Indexc{if} or compound (©{}©) statement.
     1150For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement;
     1151for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement.
    11501152\VRef[Figure]{f:MultiLevelExit} shows a comparison between labelled ©continue© and ©break© and the corresponding C equivalent using ©goto© and labels.
    11511153The innermost loop has 8 exit points, which cause continuation or termination of one or more of the 7 \Index{nested control-structure}s.
     
    12221224\end{figure}
    12231225
    1224 Both labelled \Indexc{continue} and \Indexc{break} are a \Indexc{goto}\index{goto@©goto©!restricted} restricted in the following ways:
     1226Both labelled ©continue© and ©break© are a ©goto©\index{goto@©goto©!restricted} restricted in the following ways:
    12251227\begin{itemize}
    12261228\item
     
    12381240
    12391241
    1240 \subsection{\texorpdfstring{Extended \LstKeywordStyle{else}}{Extended else}}
    1241 \label{s:ExtendedElse}
    1242 \index{extended ©else©}
    1243 
    1244 The ©if© statement has an optional ©else© clause executed if the conditional is false.
    1245 This concept is extended to the \Indexc{while}, \Indexc{for}, and \Indexc{do} looping constructs (like Python).
    1246 Hence, if the loop conditional becomes false, looping stops and the corresponding ©else© clause is executed, if present.
    1247 
    1248 The following example is a linear search for the key 3 in an array, where finding the key is handled with a ©break© and not finding with the ©else© clause on the loop construct.
    1249 \begin{cquote}
    1250 \begin{cfa}
    1251 int a[10];
    1252 \end{cfa}
    1253 \begin{tabular}{@{}lll@{}}
    1254 \begin{cfa}
    1255 
    1256 while ( int i = 0; i < 10 ) {
    1257   if ( a[i] == 3 ) break; // found
    1258         i += 1;
    1259 } ®else® { // i == 10
    1260         sout | "not found";
    1261 }
    1262 \end{cfa}
    1263 &
    1264 \begin{cfa}
    1265 
    1266 for ( i; 10 ) {
    1267   if ( a[i] == 3 ) break; // found
    1268 
    1269 } ®else® { // i == 10
    1270         sout | "not found";
    1271 }
    1272 \end{cfa}
    1273 &
    1274 \begin{cfa}
    1275 int i = 0;
    1276 do {
    1277   if ( a[i] == 3 ) break; // found
    1278         i += 1;
    1279 } while( i < 10 ) ®else® { // i == 10
    1280         sout | "not found";
    1281 }
    1282 \end{cfa}
    1283 \end{tabular}
    1284 \end{cquote}
    1285 Note, \Index{dangling else} now occurs with \Indexc{if}, \Indexc{while}, \Indexc{for}, \Indexc{do}, and \Indexc{waitfor}.
    1286 
    1287 
    12881242%\subsection{\texorpdfstring{\protect\lstinline{with} Statement}{with Statement}}
    12891243\subsection{\texorpdfstring{\LstKeywordStyle{with} Statement}{with Statement}}
     
    13121266Therefore, reducing aggregate qualification is a useful language design goal.
    13131267
    1314 C partially addresses the problem by eliminating qualification for enumerated types and unnamed \emph{nested} aggregates, which open their scope into the containing aggregate.
     1268C allows unnamed nested aggregates that open their scope into the containing aggregate.
    13151269This feature is used to group fields for attributes and/or with ©union© aggregates.
    13161270\begin{cfa}
    13171271struct S {
    1318         struct $\R{\LstCommentStyle{/* unnamed */}}$ { int g,  h; } __attribute__(( aligned(64) ));
     1272        struct { int g,  h; } __attribute__(( aligned(64) ));
    13191273        int tag;
    1320         union $\R{\LstCommentStyle{/* unnamed */}}$ {
     1274        union {
    13211275                struct { char c1,  c2; } __attribute__(( aligned(128) ));
    13221276                struct { int i1,  i2; };
    13231277                struct { double d1,  d2; };
    13241278        };
    1325 } s;
    1326 enum { R, G, B };
    1327 s.g; s.h;   s.tag = R;   s.c1; s.c2;   s.i1 = G; s.i2 = B;   s.d1; s.d2;
     1279};
     1280s.g; s.h; s.tag; s.c1; s.c2; s.i1; s.i2; s.d1; s.d2;
    13281281\end{cfa}
    13291282
     
    13701323\end{cfa}
    13711324where qualification is only necessary to disambiguate the shadowed variable ©i©.
    1372 In detail, the ©with© statement may form a function body or be nested within a function body.
    1373 
     1325
     1326In detail, the ©with© statement may appear as the body of a function or nested within a function body.
    13741327The ©with© clause takes a list of expressions, where each expression provides an aggregate type and object.
    13751328(Enumerations are already opened.)
     
    13801333\end{cfa}
    13811334The expression object is the implicit qualifier for the open structure-fields.
    1382 
    13831335\CFA's ability to overload variables \see{\VRef{s:VariableOverload}} and use the left-side of assignment in type resolution means most fields with the same name but different types are automatically disambiguated, eliminating qualification.
    13841336All expressions in the expression list are open in parallel within the compound statement.
     
    14101362\end{cfa}
    14111363A cast or qualification can be used to disambiguate variables within a ©with© \emph{statement}.
    1412 A cast can also be used to disambiguate among overload variables in a ©with© \emph{expression}:
     1364A cast can be used to disambiguate among overload variables in a ©with© \emph{expression}:
    14131365\begin{cfa}
    14141366with ( w ) { ... }                                                      $\C{// ambiguous, same name and no context}$
     
    14191371Finally, there is an interesting problem between parameters and the function-body ©with©, \eg:
    14201372\begin{cfa}
    1421 void f( S & s, char c ) with ( s ) {
    1422         ®s.c = c;®  i = 3;  d = 5.5;                    $\C{// initialize fields}$
    1423 }
    1424 \end{cfa}
    1425 Here, the assignment ©s.c = c© means ©s.c = s.c©, which is meaningless, and there is no mechanism to qualify the parameter ©c©, making the assignment impossible using the function-body ©with©.
    1426 To solve this problem, parameters \emph{not} explicitly opened are treated like an initialized aggregate:
    1427 \begin{cfa}
    1428 struct Params {                                                         $\C{// s explicitly opened so S \& s elided}$
    1429         char c;
     1373void ?{}( S & s, int i ) with ( s ) { $\C{// constructor}$
     1374        ®s.i = i;®  j = 3;  m = 5.5; $\C{// initialize fields}$
     1375}
     1376\end{cfa}
     1377Here, the assignment ©s.i = i© means ©s.i = s.i©, which is meaningless, and there is no mechanism to qualify the parameter ©i©, making the assignment impossible using the function-body ©with©.
     1378To solve this problem, parameters are treated like an initialized aggregate:
     1379\begin{cfa}
     1380struct Params {
     1381        S & s;
     1382        int i;
    14301383} params;
    14311384\end{cfa}
    14321385and implicitly opened \emph{after} a function-body open, to give them higher priority:
    14331386\begin{cfa}
    1434 void f( S & s, char ®c® ) with ( s ) ®with( $\emph{\R{params}}$ )® { // syntax not allowed, illustration only
    1435         s.c = ®c;®  i = 3;  d = 5.5;
     1387void ?{}( S & s, int ®i® ) with ( s ) ®with( $\emph{\R{params}}$ )® { // syntax not allowed, illustration only
     1388        s.i = ®i®; j = 3; m = 5.5;
    14361389}
    14371390\end{cfa}
    14381391This implicit semantic matches with programmer expectation.
     1392
    14391393
    14401394
     
    34433397This requirement is the same as for comma expressions in argument lists.
    34443398
    3445 Type qualifiers, \ie ©const© and ©volatile©, may modify a tuple type.
    3446 The meaning is to distribute the qualifier across all of the types in the tuple, \eg:
     3399Type qualifiers, \ie const and volatile, may modify a tuple type.
     3400The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], \ie the qualifier is distributed across all of the types in the tuple, \eg:
    34473401\begin{cfa}
    34483402const volatile [ int, float, const int ] x;
     
    36433597Stream ©exit© implicitly returns ©EXIT_FAILURE© to the shell.
    36443598\begin{cfa}
    3645 ®exit®   | "x (" | x | ") negative value.";   // terminate and return EXIT_FAILURE to shell
    3646 ®abort® | "x (" | x | ") negative value.";   // terminate and generate stack trace and core file
     3599®exit®   | "x (" | x | ") negative value."; // terminate and return EXIT_FAILURE to shell
     3600®abort® | "x (" | x | ") negative value."; // terminate and generate stack trace and core file
    36473601\end{cfa}
    36483602Note, \CFA stream variables ©stdin©, ©stdout©, ©stderr©, ©exit©, and ©abort© overload C variables ©stdin©, ©stdout©, ©stderr©, and functions ©exit© and ©abort©, respectively.
     
    43134267        sout | '1' | '2' | '3';
    43144268        sout | 1 | "" | 2 | "" | 3;
    4315         sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x =" | 4 | "x $" | 5 | "x £" | 6 | "x Â¥"
    4316                 | 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10;
     4269        sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x =" | 4 | "x $" | 5 | "x £" | 6 | "x ¥"
     4270                | 7 | "x ¡" | 8 | "x ¿" | 9 | "x «" | 10;
    43174271        sout | 1 | ", x" | 2 | ". x" | 3 | "; x" | 4 | "! x" | 5 | "? x" | 6 | "% x"
    4318                 | 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x";
     4272                | 7 | "¢ x" | 8 | "» x" | 9 | ") x" | 10 | "] x" | 11 | "} x";
    43194273        sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx";
    43204274        sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4;
     
    44924446The common usage is the short form of the mutex statement\index{ostream@©ostream©!mutex@©mutex©} to lock a stream during a single cascaded I/O expression, \eg:
    44934447\begin{cfa}
    4494 $\emph{thread\(_1\)}$ : ®mutex( sout )® sout | "abc " | "def ";
    4495 $\emph{thread\(_2\)}$ : ®mutex( sout )® sout | "uvw " | "xyz ";
     4448$\emph{thread\(_1\)}$ : ®mutex()® sout | "abc " | "def ";
     4449$\emph{thread\(_2\)}$ : ®mutex()® sout | "uvw " | "xyz ";
    44964450\end{cfa}
    44974451Now, the order of the thread execution is still non-deterministic, but the output is constrained to two possible lines in either order.
     
    45164470®mutex( sout )® {
    45174471        sout | 1;
    4518         ®mutex( sout ) sout® | 2 | 3;                           $\C{// unnecessary, but ok because of recursive lock}$
     4472        ®mutex() sout® | 2 | 3;                         $\C{// unnecessary, but ok because of recursive lock}$
    45194473        sout | 4;
    45204474} // implicitly release sout lock
     
    45284482        int x, y, z, w;
    45294483        sin | x;
    4530         ®mutex( sin )® sin | y | z;                                     $\C{// unnecessary, but ok because of recursive lock}$
     4484        ®mutex() sin® | y | z;                          $\C{// unnecessary, but ok because of recursive lock}$
    45314485        sin | w;
    45324486} // implicitly release sin lock
     
    45374491\Textbf{WARNING:} The general problem of \Index{nested locking} can occur if routines are called in an I/O sequence that block, \eg:
    45384492\begin{cfa}
    4539 ®mutex( sout )® sout | "data:" | rtn( mon );    $\C{// mutex call on monitor}$
     4493®mutex() sout® | "data:" | rtn( mon );  $\C{// mutex call on monitor}$
    45404494\end{cfa}
    45414495If the thread executing the I/O expression blocks in the monitor with the ©sout© lock, other threads writing to ©sout© also block until the thread holding the lock is unblocked and releases it.
     
    45444498\begin{cfa}
    45454499int ®data® = rtn( mon );
    4546 mutex( sout ) sout | "data:" | ®data®;
    4547 \end{cfa}
    4548 
    4549 
    4550 \subsection{Locale}
    4551 \index{stream!locale}
    4552 \index{locale!stream}
    4553 
    4554 Cultures use different syntax, called a \newterm{locale}, for printing numbers so they are easier to read, \eg:
    4555 \begin{cfa}
    4556 12®,®345®.®123          $\C[1.25in]{// comma separator, period decimal-point}$
    4557 12®.®345®,®123          $\C{// period separator, comma decimal-point}$
    4558 12$\Sp$345®,®123®.®     $\C{// space separator, comma decimal-point, period terminator}\CRT$
    4559 \end{cfa}
    4560 A locale is selected with function ©setlocale©, and the corresponding locale package \emph{must} be installed on the underlying system;
    4561 ©setlocale© returns ©0p© if the requested locale is unavailable.
    4562 Furthermore, a locale covers the syntax for many cultural items, \eg address, measurement, money, etc.
    4563 This discussion applies to item ©LC_NUMERIC© for formatting non-monetary integral and floating-point values.
    4564 \VRef[Figure]{f:StreamLocale} shows selecting different cultural syntax, which may be associated with one or more countries.
    4565 
    4566 \begin{figure}
    4567 \begin{cfa}
    4568 #include <fstream.hfa>
    4569 #include <locale.h>                                                     $\C{// setlocale}$
    4570 #include <stdlib.h>                                                     $\C{// getenv}$
    4571 
    4572 int main() {
    4573         void print() {
    4574                 sout | 12 | 123 | 1234 | 12345 | 123456 | 1234567;
    4575                 sout | 12. | 123.1 | 1234.12 | 12345.123 | 123456.1234 | 1234567.12345;
    4576                 sout | nl;
    4577         }
    4578         sout | "Default locale off";
    4579         print();
    4580         sout | "Locale on" | ®setlocale( LC_NUMERIC, getenv( "LANG" ) )®;  // enable local locale
    4581         print();
    4582         sout | "German" | ®setlocale( LC_NUMERIC, "de_DE.UTF-8" )®;  // enable German locale
    4583         print();
    4584         sout | "Ukraine" | ®setlocale( LC_NUMERIC, "uk_UA.utf8" )®;  // enable Ukraine locale
    4585         print();
    4586         sout | "Default locale off" | ®setlocale( LC_NUMERIC, "C" )®;  // disable locale
    4587         print();
    4588 }
    4589 
    4590 Default locale off
    4591 12 123 1234 12345 123456 1234567
    4592 12. 123.1 1234.12 12345.123 123456.1234 1234567.12345
    4593 
    4594 Locale on en_US.UTF-8
    4595 12 123 1®,®234 12®,®345 123®,®456 1®,®234®,®567
    4596 12®.® 123®.®1 1®,®234®.®12 12®,®345®.®123 123®,®456®.®1234 1®,®234®,®567®.®12345
    4597 
    4598 German de_DE.UTF-8
    4599 12 123 1®.®234 12®.®345 123®.®456 1®.®234®.®567
    4600 12®.® 123®,®1®.® 1®.®234®,®12 12®.®345®,®123 123®.®456®,®1234 1®.®234®.®567®,®12345
    4601 
    4602 Ukraine uk_UA.utf8
    4603 12 123 1 234 12 345 123 456 1 234 567
    4604 12®.® 123®,®1®.® 1$\Sp$234®,®12®.® 12$\Sp$ 345®,®123®.® 123$\Sp$ 456®,®1234®.® 1$\Sp$ 234$\Sp$567®,®12345®.®
    4605 
    4606 Default locale off C
    4607 12 123 1234 12345 123456 1234567
    4608 12. 123.1 1234.12 12345.123 123456.1234 1234567.12345
    4609 \end{cfa}
    4610 \caption{Stream Locale}
    4611 \label{f:StreamLocale}
    4612 \end{figure}
     4500mutex() sout | "data:" | ®data®;
     4501\end{cfa}
    46134502
    46144503
     
    46664555\end{figure}
    46674556
    4668 
    46694557\begin{comment}
    46704558\section{Types}
     
    47494637
    47504638
    4751 \section{Structures}
     4639\subsection{Structures}
    47524640
    47534641Structures in \CFA are basically the same as structures in C.
     
    53825270\subsection{Coroutine}
    53835271
    5384 \Index{Coroutines} are the precursor to threads.
     5272\Index{Coroutines} are the precursor to tasks.
    53855273\VRef[Figure]{f:FibonacciCoroutine} shows a coroutine that computes the \Index*{Fibonacci} numbers.
    53865274
     
    54845372
    54855373
    5486 \subsection{Threads}
     5374\subsection{Tasks}
    54875375
    54885376\CFA also provides a simple mechanism for creating and utilizing user level threads.
    5489 A thread provides mutual exclusion like a monitor, and also has its own execution state and a thread of control.
    5490 Similar to a monitor, a thread is defined like a structure:
     5377A task provides mutual exclusion like a monitor, and also has its own execution state and a thread of control.
     5378Similar to a monitor, a task is defined like a structure:
    54915379
    54925380\begin{figure}
     
    55325420}
    55335421\end{cfa}
    5534 \caption{Simple Threads}
    5535 \label{f:SimpleThreads}
     5422\caption{Simple Tasks}
     5423\label{f:SimpleTasks}
    55365424\end{figure}
    55375425
     
    69006788In \CFA, there are ambiguous cases with dereference and operator identifiers, \eg ©int *?*?()©, where the string ©*?*?© can be interpreted as:
    69016789\begin{cfa}
    6902 *?$\Sp$*? $\C{// dereference operator, dereference operator}$
    6903 *$\Sp$?*? $\C{// dereference, multiplication operator}$
     6790*?$\R{\textvisiblespace}$*? $\C{// dereference operator, dereference operator}$
     6791*$\R{\textvisiblespace}$?*? $\C{// dereference, multiplication operator}$
    69046792\end{cfa}
    69056793By default, the first interpretation is selected, which does not yield a meaningful parse.
     
    69256813Therefore, it is necessary to disambiguate these cases with a space:
    69266814\begin{cfa}
    6927 i++$\Sp$? i : 0;
    6928 i?$\Sp$++i : 0;
     6815i++$\R{\textvisiblespace}$? i : 0;
     6816i?$\R{\textvisiblespace}$++i : 0;
    69296817\end{cfa}
    69306818
     
    75427430char random( void );$\indexc{random}$
    75437431char random( char u ); $\C{// [0,u)}$
    7544 char random( char l, char u ); $\C{// [l,u]}$
     7432char random( char l, char u ); $\C{// [l,u)}$
    75457433int random( void );
    75467434int random( int u ); $\C{// [0,u)}$
    7547 int random( int l, int u ); $\C{// [l,u]}$
     7435int random( int l, int u ); $\C{// [l,u)}$
    75487436unsigned int random( void );
    75497437unsigned int random( unsigned int u ); $\C{// [0,u)}$
    7550 unsigned int random( unsigned int l, unsigned int u ); $\C{// [l,u]}$
     7438unsigned int random( unsigned int l, unsigned int u ); $\C{// [l,u)}$
    75517439long int random( void );
    75527440long int random( long int u ); $\C{// [0,u)}$
    7553 long int random( long int l, long int u ); $\C{// [l,u]}$
     7441long int random( long int l, long int u ); $\C{// [l,u)}$
    75547442unsigned long int random( void );
    75557443unsigned long int random( unsigned long int u ); $\C{// [0,u)}$
    7556 unsigned long int random( unsigned long int l, unsigned long int u ); $\C{// [l,u]}$
     7444unsigned long int random( unsigned long int l, unsigned long int u ); $\C{// [l,u)}$
    75577445float random( void );                                            $\C{// [0.0, 1.0)}$
    75587446double random( void );                                           $\C{// [0.0, 1.0)}$
     
    82188106
    82198107
    8220 \section{Pseudo Random Number Generator}
    8221 \label{s:PRNG}
    8222 
    8223 Random numbers are values generated independently, i.e., new values do not depend on previous values (independent trials), \eg lottery numbers, shuffled cards, dice roll, coin flip.
    8224 While a primary goal of programming is computing values that are \emph{not} random, random values are useful in simulation, cryptography, games, etc.
    8225 A random-number generator is an algorithm that computes independent values.
    8226 If the algorithm uses deterministic computation (a predictable sequence of values), it generates \emph{pseudo} random numbers versus \emph{true} random numbers.
    8227 
    8228 All \newterm{pseudo random-number generators} (\newterm{PRNG}) involve some technique to scramble bits of a value, \eg multiplicative recurrence:
    8229 \begin{cfa}
    8230 rand = 36973 * (rand & 65535) + (rand >> 16); // scramble bits
    8231 \end{cfa}
    8232 Multiplication of large values adds new least-significant bits and drops most-significant bits.
    8233 \begin{quote}
    8234 \begin{tabular}{@{}r|l@{}}
    8235 bits 63--32 (most)      & bits 31--0 (least)    \\
    8236 \hline
    8237 0x0                                     & 0x3e8e36                              \\
    8238 0x5f                            & 0x718c25e1                    \\
    8239 0xad3e                          & 0x7b5f1dbe                    \\
    8240 0xbc3b                          & 0xac69ff19                    \\
    8241 0x1070f                         & 0x2d258dc6                    \\
    8242 \end{tabular}
    8243 \end{quote}
    8244 By dropping bits 63--32, bits 31--0 become scrambled after each multiply.
    8245 The least-significant bits \emph{appear} random but the same bits are always generated given a fixed starting value, called the \newterm{seed} (value 0x3e8e36 above).
    8246 Hence, if a program uses the same seed, the same sequence of pseudo-random values is generated from the PRNG.
    8247 Often the seed is set to another random value like a program's process identifier (©getpid©\index{getpid@©getpid©}) or time when the program is run;
    8248 hence, one random value bootstraps another.
    8249 Finally, a PRNG usually generates a range of large values, \eg ©[0, UINT_MAX]©, which are scaled using the modulus operator, \eg ©prng() % 5© produces random values in the range 0--4.
    8250 
    8251 \CFA provides a sequential PRNG type only accessible by a single thread (not thread-safe) and a set of global and companion thread PRNG functions accessible by multiple threads without contention.
    8252 \begin{itemize}
    8253 \item
    8254 The ©PRNG© type is for sequential programs, like coroutining:
    8255 \begin{cfa}
    8256 struct PRNG { ... }; $\C[3.75in]{// opaque type}$
    8257 void ?{}( PRNG & prng ); $\C{// random seed}$
    8258 void ?{}( PRNG & prng, uint32_t seed ); $\C{// fixed seed}$
    8259 void set_seed( PRNG & prng, uint32_t seed ); $\C{// set seed}$
    8260 uint32_t get_seed( PRNG & prng ); $\C{// get seed}$
    8261 uint32_t prng( PRNG & prng ); $\C{// [0,UINT\_MAX]}$
    8262 uint32_t prng( PRNG & prng, uint32_t u ); $\C{// [0,u)}$
    8263 uint32_t prng( PRNG & prng, uint32_t l, uint32_t u ); $\C{// [l,u]}$
    8264 uint32_t calls( PRNG & prng ); $\C{// number of calls}\CRT$
    8265 \end{cfa}
    8266 A ©PRNG© object is used to randomize behaviour or values during execution, \eg in games, a character makes a random move or an object takes on a random value.
    8267 In this scenario, it is useful to have multiple ©PRNG© objects, \eg one per player or object.
    8268 However, sequential execution is still repeatable given the same starting seeds for all ©PRNG©s.
    8269 \VRef[Figure]{f:SequentialPRNG} shows an example that creates two sequential ©PRNG©s, sets both to the same seed (1009), and illustrates the three forms for generating random values, where both ©PRNG©s generate the same sequence of values.
    8270 
    8271 \begin{figure}
    8272 \begin{cfa}
    8273 PRNG prng1, prng2;
    8274 ®set_seed( prng1, 1009 )®;   ®set_seed( prng2, 1009 )®;
    8275 for ( 10 ) {
    8276         // Do not cascade prng calls because side-effect functions called in arbitrary order.
    8277         sout | nlOff | ®prng( prng1 )®;  sout | ®prng( prng1, 5 )®;  sout | ®prng( prng1, 0, 5 )® | '\t';
    8278         sout | ®prng( prng2 )®;  sout | ®prng( prng2, 5 )®;  sout | ®prng( prng2, 0, 5 )® | nlOn;
    8279 }
    8280 \end{cfa}
    8281 \begin{cquote}
    8282 \begin{tabular}{@{}ll@{}}
    8283 \begin{cfa}
    8284 37301721 2 2
    8285 1681308562 1 3
    8286 290112364 3 2
    8287 1852700364 4 3
    8288 733221210 1 3
    8289 1775396023 2 3
    8290 123981445 2 3
    8291 2062557687 2 0
    8292 283934808 1 0
    8293 672325890 1 3
    8294 \end{cfa}
    8295 &
    8296 \begin{cfa}
    8297 37301721 2 2
    8298 1681308562 1 3
    8299 290112364 3 2
    8300 1852700364 4 3
    8301 733221210 1 3
    8302 1775396023 2 3
    8303 123981445 2 3
    8304 2062557687 2 0
    8305 283934808 1 0
    8306 672325890 1 3
    8307 \end{cfa}
    8308 \end{tabular}
    8309 \end{cquote}
    8310 \caption{Sequential PRNG}
    8311 \label{f:SequentialPRNG}
    8312 \end{figure}
    8313 
    8314 \item
    8315 The PRNG global and companion thread functions are for concurrent programming, such as randomizing execution in short-running programs, \eg ©yield( prng() % 5 )©.
    8316 \begin{cfa}
    8317 void set_seed( uint32_t seed ); $\C[3.75in]{// set global seed}$
    8318 uint32_t get_seed(); $\C{// get global seed}$
    8319 // SLOWER
    8320 uint32_t prng(); $\C{// [0,UINT\_MAX]}$
    8321 uint32_t prng( uint32_t u ); $\C{// [0,u)}$
    8322 uint32_t prng( uint32_t l, uint32_t u ); $\C{// [l,u]}$
    8323 // FASTER
    8324 uint32_t prng( $thread\LstStringStyle{\textdollar}$ & th );     $\C{// [0,UINT\_MAX]}$
    8325 uint32_t prng( $thread\LstStringStyle{\textdollar}$ & th, uint32_t u ); $\C{// [0,u)}$
    8326 uint32_t prng( $thread\LstStringStyle{\textdollar}$ & th, uint32_t l, uint32_t u );     $\C{// [l,u]}\CRT$
    8327 \end{cfa}
    8328 The only difference between the two sets of ©prng© routines is performance.
    8329 
    8330 Because concurrent execution is non-deterministic, seeding the concurrent PRNG is less important, as repeatable execution is impossible.
    8331 Hence, there is one system-wide PRNG (global seed) but each \CFA thread has its own non-contended PRNG state.
    8332 If the global seed is set, threads start with this seed, until it is reset and then threads start with the reset seed.
    8333 Hence, these threads generate the same sequence of random numbers from their specific starting seed.
    8334 If the global seed is \emph{not} set, threads start with a random seed, until the global seed is set.
    8335 Hence, these threads generate different sequences of random numbers.
    8336 If each thread needs its own seed, use a sequential ©PRNG© in each thread.
    8337 The slower ©prng© functions \emph{without} a thread argument call ©active_thread© internally to indirectly access the current thread's PRNG state, while the faster ©prng© functions \emph{with} a thread argument directly access the thread through the thread parameter.
    8338 If a thread pointer is available, \eg in thread main, eliminating the call to ©active_thread© significantly reduces the cost of accessing the thread's PRNG state.
    8339 \VRef[Figure]{f:ConcurrentPRNG} shows an example using the slower/faster concurrent PRNG in the program main and a thread.
    8340 
    8341 \begin{figure}
    8342 \begin{cfa}
    8343 thread T {};
    8344 void main( ®T & th® ) {  // thread address
    8345         for ( i; 10 ) {
    8346                 sout | nlOff | ®prng()®;  sout | ®prng( 5 )®;  sout | ®prng( 0, 5 )® | '\t';  // SLOWER
    8347                 sout | nlOff | ®prng( th )®;  sout | ®prng( th, 5 )®;  sout | ®prng( th, 0, 5 )® | nlOn;  // FASTER
    8348         }
    8349 }
    8350 int main() {
    8351         set_seed( 1009 );
    8352         $\R{thread\LstStringStyle{\textdollar}}$ ®& th = *active_thread()®;  // program-main thread-address
    8353         for ( i; 10 ) {
    8354                 sout | nlOff | ®prng()®; sout | ®prng( 5 )®; sout | ®prng( 0, 5 )® | '\t';  // SLOWER
    8355                 sout | nlOff | ®prng( th )®; sout | ®prng( th, 5 )®; sout | ®prng( th, 0, 5 )® | nlOn;  // FASTER
    8356         }
    8357         sout | nl;
    8358         T t; // run thread
    8359 }
    8360 \end{cfa}
    8361 \begin{cquote}
    8362 \begin{tabular}{@{}ll@{}}
    8363 \begin{cfa}
    8364 37301721 2 2
    8365 290112364 3 2
    8366 733221210 1 3
    8367 123981445 2 3
    8368 283934808 1 0
    8369 1414344101 1 3
    8370 871831898 3 4
    8371 2142057611 4 4
    8372 802117363 0 4
    8373 2346353643 1 3
    8374 \end{cfa}
    8375 &
    8376 \begin{cfa}
    8377 1681308562 1 3
    8378 1852700364 4 3
    8379 1775396023 2 3
    8380 2062557687 2 0
    8381 672325890 1 3
    8382 873424536 3 4
    8383 866783532 0 1
    8384 17310256 2 5
    8385 492964499 0 0
    8386 2143013105 3 2
    8387 \end{cfa}
    8388 \end{tabular}
    8389 \begin{cfa}
    8390 // same output as above from thread t
    8391 \end{cfa}
    8392 \end{cquote}
    8393 \caption{Concurrent PRNG}
    8394 \label{f:ConcurrentPRNG}
    8395 \end{figure}
    8396 \end{itemize}
    8397 
    8398 
    83998108\section{Multi-precision Integers}
    84008109\label{s:MultiPrecisionIntegers}
     
    86018310\end{tabular}
    86028311\end{cquote}
    8603 
     8312\small
    86048313\begin{cfa}
    86058314Factorial Numbers
Note: See TracChangeset for help on using the changeset viewer.