Changes in doc/user/user.tex [5cefa43:d4d4ac8]
- File:
-
- 1 edited
-
doc/user/user.tex (modified) (50 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r5cefa43 rd4d4ac8 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Mon Feb 14 17:20:39 202214 %% Update Count : 5 38213 %% Last Modified On : Sun Oct 10 12:45:00 2021 14 %% Update Count : 5095 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 17 17 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 18 19 \documentclass[twoside ]{article}19 \documentclass[twoside,11pt]{article} 20 20 21 21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 40 40 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_ 41 41 % 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-' 43 43 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 44 44 % math escape $...$ (dollar symbol) … … 85 85 \newcommand{\B}[1]{{\Textbf[blue]{#1}}} 86 86 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}} 87 \newcommand{\Sp}{\R{\textvisiblespace}}88 87 \newcommand{\KWC}{K-W C\xspace} 89 88 … … 157 156 One 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''. 158 157 Programmers 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 the irC counterpart.160 There is no notion or requirement for \emph{rewriting} a legacy C program to\CFA;158 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 there C counterpart. 159 There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA; 161 160 instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features. 162 161 As well, new programs can be written in \CFA using a combination of C and \CFA features. … … 164 163 165 164 \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.165 However, \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. 167 166 In contrast, \CFA has 30 years of hindsight and a clean starting point. 168 167 169 168 Like \Index*[C++]{\CC{}}, there may be both old and new ways to achieve the same effect. 170 169 For 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} 172 171 \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} 175 174 #include <stdio.h>$\indexc{stdio.h}$ 176 175 … … 181 180 \end{cfa} 182 181 & 183 \begin{cfa} [tabsize=3]182 \begin{cfa} 184 183 #include <fstream>$\indexc{fstream}$ 185 184 … … 190 189 \end{cfa} 191 190 & 192 \begin{cfa} [tabsize=3]191 \begin{cfa} 193 192 #include <iostream>$\indexc{iostream}$ 194 193 using namespace std; 195 194 int main() { 196 195 int x = 0, y = 1, z = 2; 197 ®cout << x << ' ' << y << ' ' << z <<endl;®196 ®cout<<x<<" "<<y<<" "<<z<<endl;® 198 197 } 199 198 \end{cfa} 200 199 \end{tabular} 201 \end{ flushleft}200 \end{center} 202 201 While \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}. 203 202 … … 239 238 however, it largely extended the C language, and did not address many of C's existing problems.\footnote{% 240 239 Two 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. 242 241 \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. 243 242 These 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. … … 334 333 long double _Complex ®abs®( long double _Complex ); 335 334 \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).335 The 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). 337 336 Overloaded names must use \newterm{name mangling}\index{mangling!name} to create unique names that are different from unmangled C names. 338 337 Hence, 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. … … 378 377 The program is linked with the debugging version of the runtime system. 379 378 The 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 aprogram is completely debugged.379 The runtime checks should only be removed after the program is completely debugged. 381 380 \textbf{This option is the default.} 382 381 … … 453 452 cfa $test$.cfa -XCFA -P -XCFA parse -XCFA -n # show program parse without prelude 454 453 \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 prelude458 \end{lstlisting}459 454 \begin{description}[topsep=5pt,itemsep=0pt,parsep=0pt] 460 455 \item … … 538 533 double ®``®forall = 3.5; 539 534 \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 536 Existing 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. 541 537 \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©. 542 538 Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience. … … 631 627 \subsection{\texorpdfstring{\LstKeywordStyle{if} / \LstKeywordStyle{while} Statement}{if / while Statement}} 632 628 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.}629 The ©if©/©while© expression allows declarations, similar to ©for© declaration expression.\footnote{ 630 Declarations in the ©do©-©while© condition are not useful because they appear after the loop body.} 635 631 \begin{cfa} 636 632 if ( ®int x = f()® ) ... $\C{// x != 0}$ … … 644 640 while ( ®struct S { int i; } x = { f() }; x.i < 4® ) ... $\C{// relational expression}$ 645 641 \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©.642 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 ©&&© operator. 643 The scope of the declaration(s) is local to the ©if© statement but exist within both the \emph{then} and \emph{else} clauses. 648 644 \CC only provides a single declaration always compared ©!=© to 0. 649 645 … … 653 649 \label{s:caseClause} 654 650 655 C restricts the \Indexc{case} clause of a \Indexc{switch}statement to a single value.651 C restricts the ©case© clause of a ©switch© statement to a single value. 656 652 For 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 notin the spirit of brevity normally associated with C.658 Therefore, the ©case© clause is extended with a list of values .653 Requiring a ©case© clause for each value does not seem to be in the spirit of brevity normally associated with C. 654 Therefore, the ©case© clause is extended with a list of values, as in: 659 655 \begin{cquote} 660 656 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}} … … 707 703 \subsection{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}} 708 704 709 C allows a number of questionable forms for the \Indexc{switch}statement:705 C allows a number of questionable forms for the ©switch© statement: 710 706 \begin{enumerate} 711 707 \item 712 By default, the end of a \Indexc{case}clause\footnote{708 By default, the end of a ©case© clause\footnote{ 713 709 In this section, the term \emph{case clause} refers to either a ©case© or ©default© clause.} 714 710 \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}:711 to exit a ©switch© statement from a ©case© clause requires explicitly terminating the clause with a transfer statement, most commonly ©break©: 716 712 \begin{cfa} 717 713 switch ( i ) { 718 714 case 1: 719 715 ... 720 $\R{\LstCommentStyle{// fall-through}}$716 // fall-through 721 717 case 2: 722 718 ... 723 ®break;®// exit switch statement719 break; // exit switch statement 724 720 } 725 721 \end{cfa} … … 767 763 } 768 764 \end{cfa} 769 This situation is better handled bya list of case values \see{\VRef{s:caseClause}}.765 This situation better handled without fall-through by allowing a list of case values \see{\VRef{s:caseClause}}. 770 766 While 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. 771 767 Hence, 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. … … 781 777 ... 782 778 } // if 779 case 2: 780 while ( j < 5 ) { 781 ... 782 ®case 3:® // transfer into "while" statement 783 ... 784 } // while 785 } // switch 783 786 \end{cfa} 784 787 This usage branches into control structures, which is known to cause both comprehension and technical difficulties. … … 786 789 The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning. 787 790 There 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: 791 Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}: 790 792 \begin{cfa} 791 793 register int n = (count + 7) / 8; … … 856 858 still works. 857 859 Nevertheless, 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:860 Therefore, 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: 859 861 \begin{cfa} 860 862 ®choose® ( i ) { … … 883 885 Therefore, no change is made for this issue. 884 886 \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{887 Dealing 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{ 886 888 Essentially, 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. 887 889 Further declarations at the same nesting level as the statement body are disallowed to ensure every transfer into the body is sound. … … 906 908 \subsection{Non-terminating and Labelled \texorpdfstring{\LstKeywordStyle{fallthrough}}{Non-terminating and Labelled fallthrough}} 907 909 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.910 The ©fallthrough© clause may be non-terminating within a ©case© clause or have a target label to common code from multiple case clauses. 909 911 \begin{center} 910 912 \begin{tabular}{@{}lll@{}} … … 958 960 \end{tabular} 959 961 \end{center} 960 The target label must be below the \Indexc{fallthrough}and may not be nested in a control structure, and961 the target label must be at the same or higher level as the containing \Indexc{case}clause and located at962 the same level as a ©case© clause; the target label may be case \Indexc{default}, but only associated963 with the current \Indexc{switch}/\Indexc{choose}statement.962 The target label must be below the ©fallthrough© and may not be nested in a control structure, and 963 the target label must be at the same or higher level as the containing ©case© clause and located at 964 the same level as a ©case© clause; the target label may be case ©default©, but only associated 965 with the current ©switch©/©choose© statement. 964 966 965 967 \begin{figure} … … 1074 1076 Looping a fixed number of times, possibly with a loop index, occurs frequently. 1075 1077 \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}}:1078 The ©for©/©while©/©do-while© loop-control is augmented as follows \see{examples in \VRef[Figure]{f:LoopControlExamples}}: 1077 1079 \begin{itemize}[itemsep=0pt] 1078 1080 \item … … 1143 1145 \subsection{\texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break} Statement}{Labelled continue / break Statement}} 1144 1146 1145 C \Indexc{continue} and \Indexc{break}statements, for altering control flow, are restricted to one level of nesting for a particular control structure.1147 C ©continue© and ©break© statements, for altering control flow, are restricted to one level of nesting for a particular control structure. 1146 1148 This restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting. 1147 1149 To 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.1150 For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement; 1151 for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement. 1150 1152 \VRef[Figure]{f:MultiLevelExit} shows a comparison between labelled ©continue© and ©break© and the corresponding C equivalent using ©goto© and labels. 1151 1153 The innermost loop has 8 exit points, which cause continuation or termination of one or more of the 7 \Index{nested control-structure}s. … … 1222 1224 \end{figure} 1223 1225 1224 Both labelled \Indexc{continue} and \Indexc{break} are a \Indexc{goto}\index{goto@©goto©!restricted} restricted in the following ways:1226 Both labelled ©continue© and ©break© are a ©goto©\index{goto@©goto©!restricted} restricted in the following ways: 1225 1227 \begin{itemize} 1226 1228 \item … … 1238 1240 1239 1241 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; // found1258 i += 1;1259 } ®else® { // i == 101260 sout | "not found";1261 }1262 \end{cfa}1263 &1264 \begin{cfa}1265 1266 for ( i; 10 ) {1267 if ( a[i] == 3 ) break; // found1268 1269 } ®else® { // i == 101270 sout | "not found";1271 }1272 \end{cfa}1273 &1274 \begin{cfa}1275 int i = 0;1276 do {1277 if ( a[i] == 3 ) break; // found1278 i += 1;1279 } while( i < 10 ) ®else® { // i == 101280 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 1288 1242 %\subsection{\texorpdfstring{\protect\lstinline{with} Statement}{with Statement}} 1289 1243 \subsection{\texorpdfstring{\LstKeywordStyle{with} Statement}{with Statement}} … … 1312 1266 Therefore, reducing aggregate qualification is a useful language design goal. 1313 1267 1314 C partially addresses the problem by eliminating qualification for enumerated types and unnamed \emph{nested} aggregates, whichopen their scope into the containing aggregate.1268 C allows unnamed nested aggregates that open their scope into the containing aggregate. 1315 1269 This feature is used to group fields for attributes and/or with ©union© aggregates. 1316 1270 \begin{cfa} 1317 1271 struct S { 1318 struct $\R{\LstCommentStyle{/* unnamed */}}${ int g, h; } __attribute__(( aligned(64) ));1272 struct { int g, h; } __attribute__(( aligned(64) )); 1319 1273 int tag; 1320 union $\R{\LstCommentStyle{/* unnamed */}}${1274 union { 1321 1275 struct { char c1, c2; } __attribute__(( aligned(128) )); 1322 1276 struct { int i1, i2; }; 1323 1277 struct { double d1, d2; }; 1324 1278 }; 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 }; 1280 s.g; s.h; s.tag; s.c1; s.c2; s.i1; s.i2; s.d1; s.d2; 1328 1281 \end{cfa} 1329 1282 … … 1370 1323 \end{cfa} 1371 1324 where 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 1326 In detail, the ©with© statement may appear as the body of a function or nested within a function body. 1374 1327 The ©with© clause takes a list of expressions, where each expression provides an aggregate type and object. 1375 1328 (Enumerations are already opened.) … … 1380 1333 \end{cfa} 1381 1334 The expression object is the implicit qualifier for the open structure-fields. 1382 1383 1335 \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. 1384 1336 All expressions in the expression list are open in parallel within the compound statement. … … 1410 1362 \end{cfa} 1411 1363 A cast or qualification can be used to disambiguate variables within a ©with© \emph{statement}. 1412 A cast can alsobe used to disambiguate among overload variables in a ©with© \emph{expression}:1364 A cast can be used to disambiguate among overload variables in a ©with© \emph{expression}: 1413 1365 \begin{cfa} 1414 1366 with ( w ) { ... } $\C{// ambiguous, same name and no context}$ … … 1419 1371 Finally, there is an interesting problem between parameters and the function-body ©with©, \eg: 1420 1372 \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; 1373 void ?{}( S & s, int i ) with ( s ) { $\C{// constructor}$ 1374 ®s.i = i;® j = 3; m = 5.5; $\C{// initialize fields}$ 1375 } 1376 \end{cfa} 1377 Here, 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©. 1378 To solve this problem, parameters are treated like an initialized aggregate: 1379 \begin{cfa} 1380 struct Params { 1381 S & s; 1382 int i; 1430 1383 } params; 1431 1384 \end{cfa} 1432 1385 and implicitly opened \emph{after} a function-body open, to give them higher priority: 1433 1386 \begin{cfa} 1434 void f( S & s, char ®c® ) with ( s ) ®with( $\emph{\R{params}}$ )® { // syntax not allowed, illustration only1435 s. c = ®c;® i = 3; d= 5.5;1387 void ?{}( S & s, int ®i® ) with ( s ) ®with( $\emph{\R{params}}$ )® { // syntax not allowed, illustration only 1388 s.i = ®i®; j = 3; m = 5.5; 1436 1389 } 1437 1390 \end{cfa} 1438 1391 This implicit semantic matches with programmer expectation. 1392 1439 1393 1440 1394 … … 3443 3397 This requirement is the same as for comma expressions in argument lists. 3444 3398 3445 Type qualifiers, \ie ©const© and ©volatile©, may modify a tuple type.3446 The meaning is t o distribute the qualifieracross all of the types in the tuple, \eg:3399 Type qualifiers, \ie const and volatile, may modify a tuple type. 3400 The 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: 3447 3401 \begin{cfa} 3448 3402 const volatile [ int, float, const int ] x; … … 3643 3597 Stream ©exit© implicitly returns ©EXIT_FAILURE© to the shell. 3644 3598 \begin{cfa} 3645 ®exit® | "x (" | x | ") negative value."; // terminate and return EXIT_FAILURE to shell3646 ®abort® | "x (" | x | ") negative value."; // terminate and generate stack trace and core file3599 ®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 3647 3601 \end{cfa} 3648 3602 Note, \CFA stream variables ©stdin©, ©stdout©, ©stderr©, ©exit©, and ©abort© overload C variables ©stdin©, ©stdout©, ©stderr©, and functions ©exit© and ©abort©, respectively. … … 4313 4267 sout | '1' | '2' | '3'; 4314 4268 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; 4317 4271 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"; 4319 4273 sout | "x`" | 1 | "`x'" | 2 | "'x\"" | 3 | "\"x:" | 4 | ":x " | 5 | " x\t" | 6 | "\tx"; 4320 4274 sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4; … … 4492 4446 The 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: 4493 4447 \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 "; 4496 4450 \end{cfa} 4497 4451 Now, the order of the thread execution is still non-deterministic, but the output is constrained to two possible lines in either order. … … 4516 4470 ®mutex( sout )® { 4517 4471 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}$ 4519 4473 sout | 4; 4520 4474 } // implicitly release sout lock … … 4528 4482 int x, y, z, w; 4529 4483 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}$ 4531 4485 sin | w; 4532 4486 } // implicitly release sin lock … … 4537 4491 \Textbf{WARNING:} The general problem of \Index{nested locking} can occur if routines are called in an I/O sequence that block, \eg: 4538 4492 \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}$ 4540 4494 \end{cfa} 4541 4495 If 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. … … 4544 4498 \begin{cfa} 4545 4499 int ®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} 4500 mutex() sout | "data:" | ®data®; 4501 \end{cfa} 4613 4502 4614 4503 … … 4666 4555 \end{figure} 4667 4556 4668 4669 4557 \begin{comment} 4670 4558 \section{Types} … … 4749 4637 4750 4638 4751 \s ection{Structures}4639 \subsection{Structures} 4752 4640 4753 4641 Structures in \CFA are basically the same as structures in C. … … 5382 5270 \subsection{Coroutine} 5383 5271 5384 \Index{Coroutines} are the precursor to t hreads.5272 \Index{Coroutines} are the precursor to tasks. 5385 5273 \VRef[Figure]{f:FibonacciCoroutine} shows a coroutine that computes the \Index*{Fibonacci} numbers. 5386 5274 … … 5484 5372 5485 5373 5486 \subsection{T hreads}5374 \subsection{Tasks} 5487 5375 5488 5376 \CFA also provides a simple mechanism for creating and utilizing user level threads. 5489 A t hreadprovides mutual exclusion like a monitor, and also has its own execution state and a thread of control.5490 Similar to a monitor, a t hreadis defined like a structure:5377 A task provides mutual exclusion like a monitor, and also has its own execution state and a thread of control. 5378 Similar to a monitor, a task is defined like a structure: 5491 5379 5492 5380 \begin{figure} … … 5532 5420 } 5533 5421 \end{cfa} 5534 \caption{Simple T hreads}5535 \label{f:SimpleT hreads}5422 \caption{Simple Tasks} 5423 \label{f:SimpleTasks} 5536 5424 \end{figure} 5537 5425 … … 6900 6788 In \CFA, there are ambiguous cases with dereference and operator identifiers, \eg ©int *?*?()©, where the string ©*?*?© can be interpreted as: 6901 6789 \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}$ 6904 6792 \end{cfa} 6905 6793 By default, the first interpretation is selected, which does not yield a meaningful parse. … … 6925 6813 Therefore, it is necessary to disambiguate these cases with a space: 6926 6814 \begin{cfa} 6927 i++$\ Sp$? i : 0;6928 i?$\ Sp$++i : 0;6815 i++$\R{\textvisiblespace}$? i : 0; 6816 i?$\R{\textvisiblespace}$++i : 0; 6929 6817 \end{cfa} 6930 6818 … … 7542 7430 char random( void );$\indexc{random}$ 7543 7431 char random( char u ); $\C{// [0,u)}$ 7544 char random( char l, char u ); $\C{// [l,u ]}$7432 char random( char l, char u ); $\C{// [l,u)}$ 7545 7433 int random( void ); 7546 7434 int random( int u ); $\C{// [0,u)}$ 7547 int random( int l, int u ); $\C{// [l,u ]}$7435 int random( int l, int u ); $\C{// [l,u)}$ 7548 7436 unsigned int random( void ); 7549 7437 unsigned int random( unsigned int u ); $\C{// [0,u)}$ 7550 unsigned int random( unsigned int l, unsigned int u ); $\C{// [l,u ]}$7438 unsigned int random( unsigned int l, unsigned int u ); $\C{// [l,u)}$ 7551 7439 long int random( void ); 7552 7440 long int random( long int u ); $\C{// [0,u)}$ 7553 long int random( long int l, long int u ); $\C{// [l,u ]}$7441 long int random( long int l, long int u ); $\C{// [l,u)}$ 7554 7442 unsigned long int random( void ); 7555 7443 unsigned 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 ]}$7444 unsigned long int random( unsigned long int l, unsigned long int u ); $\C{// [l,u)}$ 7557 7445 float random( void ); $\C{// [0.0, 1.0)}$ 7558 7446 double random( void ); $\C{// [0.0, 1.0)}$ … … 8218 8106 8219 8107 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 bits8231 \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 \hline8237 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 \item8254 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 28285 1681308562 1 38286 290112364 3 28287 1852700364 4 38288 733221210 1 38289 1775396023 2 38290 123981445 2 38291 2062557687 2 08292 283934808 1 08293 672325890 1 38294 \end{cfa}8295 &8296 \begin{cfa}8297 37301721 2 28298 1681308562 1 38299 290112364 3 28300 1852700364 4 38301 733221210 1 38302 1775396023 2 38303 123981445 2 38304 2062557687 2 08305 283934808 1 08306 672325890 1 38307 \end{cfa}8308 \end{tabular}8309 \end{cquote}8310 \caption{Sequential PRNG}8311 \label{f:SequentialPRNG}8312 \end{figure}8313 8314 \item8315 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 // SLOWER8320 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 // FASTER8324 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 address8345 for ( i; 10 ) {8346 sout | nlOff | ®prng()®; sout | ®prng( 5 )®; sout | ®prng( 0, 5 )® | '\t'; // SLOWER8347 sout | nlOff | ®prng( th )®; sout | ®prng( th, 5 )®; sout | ®prng( th, 0, 5 )® | nlOn; // FASTER8348 }8349 }8350 int main() {8351 set_seed( 1009 );8352 $\R{thread\LstStringStyle{\textdollar}}$ ®& th = *active_thread()®; // program-main thread-address8353 for ( i; 10 ) {8354 sout | nlOff | ®prng()®; sout | ®prng( 5 )®; sout | ®prng( 0, 5 )® | '\t'; // SLOWER8355 sout | nlOff | ®prng( th )®; sout | ®prng( th, 5 )®; sout | ®prng( th, 0, 5 )® | nlOn; // FASTER8356 }8357 sout | nl;8358 T t; // run thread8359 }8360 \end{cfa}8361 \begin{cquote}8362 \begin{tabular}{@{}ll@{}}8363 \begin{cfa}8364 37301721 2 28365 290112364 3 28366 733221210 1 38367 123981445 2 38368 283934808 1 08369 1414344101 1 38370 871831898 3 48371 2142057611 4 48372 802117363 0 48373 2346353643 1 38374 \end{cfa}8375 &8376 \begin{cfa}8377 1681308562 1 38378 1852700364 4 38379 1775396023 2 38380 2062557687 2 08381 672325890 1 38382 873424536 3 48383 866783532 0 18384 17310256 2 58385 492964499 0 08386 2143013105 3 28387 \end{cfa}8388 \end{tabular}8389 \begin{cfa}8390 // same output as above from thread t8391 \end{cfa}8392 \end{cquote}8393 \caption{Concurrent PRNG}8394 \label{f:ConcurrentPRNG}8395 \end{figure}8396 \end{itemize}8397 8398 8399 8108 \section{Multi-precision Integers} 8400 8109 \label{s:MultiPrecisionIntegers} … … 8601 8310 \end{tabular} 8602 8311 \end{cquote} 8603 8312 \small 8604 8313 \begin{cfa} 8605 8314 Factorial Numbers
Note:
See TracChangeset
for help on using the changeset viewer.