Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/user/user.tex

    r5479e63 r07bc165  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Wed Jul 13 08:14:39 2016
    14 %% Update Count     : 1247
     13%% Last Modified On : Sun Jul 10 12:52:09 2016
     14%% Update Count     : 1200
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    294294\item
    295295\Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}
    296 The program is linked with the non-debugging version of the runtime system, so the execution of the program is faster.
     296The program is linked with the non-debugging version of the unikernel or multikernel, so the execution of the program is faster.
    297297\Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}
    298298
     
    721721®&®crc = &cx;                                   §\C{// error, cannot change crc}§
    722722\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}, e.g.:
    724 \begin{lstlisting}
    725 int & const r = *0;                             §\C{// where 0 is the int * zero}§
    726 \end{lstlisting}
    727 Otherwise, 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.
     723Hence, 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}.
     724In 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.
    728725
    729726\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.
     
    738735\begin{lstlisting}
    739736int & f( int & rp );                    §\C{// reference parameter and return}§
    740 z = f( x ) + f( y );                    §\C{// reference operator added, temporaries needed for call results
     737z = f( x ) + f( y );                    §\C{// reference operator added
    741738\end{lstlisting}
    742739Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©rp© can be locally reassigned within ©f©.
    743 Since ©?+?© takes its arguments by value, the references returned from ©f© are used to initialize compiler generated temporaries with value semantics that copy from the references.
     740The return reference from ©f© is copied into a compiler generated temporary, which is treated as an initialization.
    744741
    745742When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions.
     
    16491646\end{lstlisting}
    16501647The ability to fall-through to the next clause \emph{is} a useful form of control flow, specifically when a sequence of case actions compound:
    1651 \begin{quote2}
    1652 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    16531648\begin{lstlisting}
    16541649switch ( argc ) {
     
    16631658}
    16641659\end{lstlisting}
    1665 &
    1666 \begin{lstlisting}
    1667 
    1668 if ( argc == 3 ) {
    1669         // open output file
    1670         ®// open input file
    1671 ®} else if ( argc == 2 ) {
    1672         ®// open input file
    1673 
    1674 ®} else {
    1675         // usage message
    1676 }
    1677 \end{lstlisting}
    1678 \end{tabular}
    1679 \end{quote2}
    16801660In this example, case 2 is always done if case 3 is done.
    16811661This control flow is difficult to simulate with if statements or a ©switch© statement without fall-through as code must be duplicated or placed in a separate routine.
     
    16921672\end{lstlisting}
    16931673However, this situation is handled in other languages without fall-through by allowing a list of case values.
    1694 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 virtually all other programming languages with a ©switch© statement.
     1674While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is not intuitive to most programmers and is different from virtually all other programming languages with a ©switch© statement.
    16951675Hence, default fall-through semantics results in a large number of programming errors as programmers often forget the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
    16961676
     
    17021682        if ( j < k ) {
    17031683                ...
    1704           ®case 1:®             // transfer into "if" statement
    1705                 ...
    1706         } // if
    1707   case 2:
     1684          case 1:               // transfer into "if" statement
     1685                if ( j < m ) {
     1686                        ...
     1687                  case 2:       // transfer into "if" statement
     1688                        ...
     1689                }
     1690        }
     1691  case 3:
    17081692        while ( j < 5 ) {
    17091693                ...
    1710           ®case 3:®             // transfer into "while" statement
     1694          case 4:               // transfer into "while" statement
    17111695                ...
    1712         } // while
    1713 } // switch
     1696        }
     1697}
    17141698\end{lstlisting}
    17151699The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties.
     
    17501734\begin{lstlisting}
    17511735switch ( x ) {
    1752         ®int y = 1;®                            §\C{// unreachable initialization}§
    1753         ®x = 7;®                                        §\C{// unreachable code without label/branch
     1736        int y = 1;                      §\C{// unreachable initialization}§
     1737        x = 7;                          §\C{// unreachable code
    17541738  case 3: ...
     1739        y = 3;
    17551740        ...
    1756         ®int z = 0;®                            §\C{// unreachable initialization, cannot appear after case}§
    1757         z = 2;
    1758   case 3:
    1759         ®x = z;®                                        §\C{// without fall through, z is uninitialized}§
    17601741}
    17611742\end{lstlisting}
    17621743While the declaration of the local variable ©y© is useful and its scope is across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it.
    1763 Furthermore, any statements before the first ©case© clause can only be executed if labelled and transferred to using a ©goto©, either from outside or inside of the ©switch©.
    1764 As mentioned, transfer into control structures should be forbidden;
    1765 transfers from within the ©switch© body using a ©goto© are equally unpalatable.
    1766 As well, the declaration of ©z© is cannot occur after the ©case© because a label can only be attached to a statement, and without a fall through to case 3, ©z© is uninitialized.
     1744Furthermore, any statements before the first ©case© clause can only be executed if labelled and transfered to using a ©goto©, either from outside or inside of the ©switch©.
     1745As mentioned, transfer into control structures should be forbidden.
     1746Transfers from within the ©switch© body using a ©goto© are equally unpalatable.
    17671747\end{enumerate}
    1768 
    17691748Before discussing potential language changes to deal with these problems, it is worth observing that in a typical C program:
    17701749\begin{itemize}
     
    17781757and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
    17791758\end{itemize}
    1780 These observations help to put the suggested changes to the ©switch© into perspective.
     1759These observations help to put the effects of suggested changes into perspective.
    17811760\begin{enumerate}
    17821761\item
     
    17881767still work.
    17891768Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments.
    1790 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 ©fallthru©, e.g.:
     1769Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no fall-through semantics.
     1770The ©choose© statement is identical to the new ©switch© statement, except there is no implicit fall-through between case-clauses and the ©break© statement applies to the enclosing loop construct (as for the ©continue© statement in a ©switch© statement).
     1771It is still possible to fall-through if a case-clause ends with the new keyword ©fallthru©, e.g.:
    17911772\begin{lstlisting}
    17921773®choose® ( i ) {
    1793   case 1:  case 2:  case 3:
     1774  case 3:
    17941775        ...
    1795         ®// implicit end of switch (break)
    1796   ®case 5:
    1797         ...
    1798         ®fallthru®;                                     §\C{// explicit fall through}§
     1776        ®fallthru®;             §\C{// explicit fall through}§
     1777  case 5:
     1778        ...                             §\C{// implicit end of switch}§
    17991779  case 7:
    18001780        ...
    1801         ®break®                                         §\C{// explicit end of switch}§
     1781        ®break®                 §\C{// transfer to end of enclosing loop / switch}§
    18021782  default:
    18031783        j = 3;
    18041784}
    18051785\end{lstlisting}
    1806 Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses;
    1807 the implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
    1808 The explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
    1809 As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers.
    1810 \item
    1811 \Index*{Duff's device} is eliminated from both ©switch© and ©choose© statements, and only invalidates a small amount of very questionable code.
    1812 Hence, the ©case© clause must appear at the same nesting level as the ©switch©/©choose© body, as is done in most other programming languages with ©switch© statements.
     1786The 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.
     1787\item
     1788Eliminating \Index*{Duff's device} is straightforward and only invalidates a small amount of very questionable code.
     1789The 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.
    18131790\item
    18141791The issue of ©default© at locations other than at the end of the cause clause can be solved by using good programming style, and there are a few reasonable situations involving fall-through where the ©default© clause needs to appear is locations other than at the end.
    1815 Therefore, no change is made for this issue.
    1816 \item
    1817 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{
    1818 Essentially, these declarations are hoisted before the statement and both declarations and statement are surrounded by a compound statement.} and precluding statements before the first ©case© clause.
    1819 Further declaration in the statement body are disallowed.
    1820 \begin{lstlisting}
    1821 switch ( x ) {
    1822         ®int i = 0;®                            §\C{// allowed}§
     1792Therefore, no language change is made for this issue.
     1793\item
     1794Dealing with unreachable code at the start of a ©switch© statement is solved by defining the declaration-list, including any associated initialization, at the start of a ©switch© statement body to be executed \emph{before} the transfer to the appropriate ©case© clause.
     1795This semantics is the same as for declarations at the start of a loop body, which are executed before each iteration of the loop body.
     1796As well, statements cannot appear before the first ©case© clause.
     1797The change is compatible for declarations with initialization in this context because existing code cannot assume the initialization has occurred.
     1798The change is incompatible for statements, but any existing code using it is highly questionable, as in:
     1799\begin{lstlisting}
     1800switch ( i ) {
     1801        L: x = 5;               §\C{// questionable code}§
    18231802  case 0:
    18241803        ...
    1825         ®int i = 0;®                            §\C{// disallowed}§
    1826   case 1:
    1827     {
    1828                 ®int i = 0;®                    §\C{// allowed in any compound statement}§
    1829                 ...
    1830         }
    1831   ...
    1832 }
    1833 \end{lstlisting}
     1804}
     1805\end{lstlisting}
     1806The statement after the ©switch© can never be executed unless it is labelled.
     1807If it is labelled, it must be transfered to from outside or inside the ©switch© statement, neither of which is acceptable control flow.
    18341808\end{enumerate}
    18351809
     
    19131887\section{Exception Handling}
    19141888
    1915 Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler.
     1889Exception handling provides two mechanim: change of control flow from a raise to a handler, and commumication from the riase to the handler.
    19161890\begin{lstlisting}
    19171891exception void h( int i );
     
    21662140A facility that let programmers declare specific constants..const Rational 12., for instance. would not be much of an improvement.
    21672141Some facility for defining the creation of values of programmer-defined types from arbitrary integer tokens would be needed.
    2168 The complexity of such a feature does not seem worth the gain.
     2142The complexity of such a feature doesn.t seem worth the gain.
    21692143
    21702144For example, to define the constants for a complex type, the programmer would define the following:
     
    26942668} s;
    26952669\end{lstlisting}
    2696 The problem occurs in accessing these fields using the selection operation ``©.©'':
     2670The problem occurs in accesing these fields using the selection operation ``©.©'':
    26972671\begin{lstlisting}
    26982672s.0 = 0;        // ambiguity with floating constant .0
     
    27042678®s.§\textvisiblespace§1® = 1;
    27052679\end{lstlisting}
    2706 While this syntax is awkward, it is unlikely many programmers will name fields of a structure 0 or 1.
     2680While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1.
    27072681Like 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.
    27082682
     
    30162990In \CFA, multiple definitions are not necessary.
    30172991Within a module, all of the module's global definitions are visible throughout the module.
    3018 For example, the following code compiles, even though ©isOdd© was not declared before being called:
     2992For example, the following code compiles, even though isOdd was not declared before being called:
    30192993\begin{lstlisting}
    30202994bool isEven(unsigned int x) {
     
    43564330\item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
    43574331\begin{lstlisting}
    4358 int `otype` = 3;                                // make keyword an identifier
     4332int `otype` = 3;                                // make keyword an indentifier
    43594333double `choose` = 3.5;
    43604334\end{lstlisting}
     
    44934467\begin{description}
    44944468\item[Change:] comma expression is disallowed as subscript
    4495 \item[Rationale:] safety issue to prevent subscripting error for multidimensional arrays: ©x[i,j]© instead of ©x[i][j]©, and this syntactic form then taken by \CFA for new style arrays.
     4469\item[Rationale:] safety issue to prevent subscripting error for multidimensional arrays: ©x[i,j]© instead of ©x[i][j]©, and this syntactic form then taken by \CFA for new styple arrays.
    44964470\item[Effect on original feature:] change to semantics of well-defined feature.
    44974471\item[Difficulty of converting:] semantic transformation of ©x[i,j]© to ©x[(i,j)]©
     
    45054479\index{input/output library}
    45064480
    4507 The goal for the \CFA I/O is to make I/O as simple as possible in the common cases, while fully supporting polymorphism and user defined types in a consistent way.
     4481The 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.
    45084482The common case is printing out a sequence of variables separated by whitespace.
    45094483\begin{quote2}
     
    45424516Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, although data flows in the opposite direction.
    45434517
    4544 The implicit separator\index{I/O separator} character (space/blank) is a separator not a terminator.
     4518The implicit seperator\index{I/O separator} character (space/blank) is a separator not a terminator.
    45454519The rules for implicitly adding the separator are:
    45464520\begin{enumerate}
    45474521\item
    4548 A separator does not appear at the start or end of a line.
     4522A seperator does not appear at the start or end of a line.
    45494523\begin{lstlisting}[belowskip=0pt]
    45504524sout | 1 | 2 | 3 | endl;
     
    45544528\end{lstlisting}
    45554529\item
    4556 A separator does not appear before or after a character literal or variable.
     4530A seperator does not appear before or after a character literal or variable.
    45574531\begin{lstlisting}
    45584532sout | '1' | '2' | '3' | endl;
     
    45604534\end{lstlisting}
    45614535\item
    4562 A separator does not appear before or after a null (empty) C string
     4536A seperator does not appear before or after a null (empty) C string
    45634537\begin{lstlisting}
    45644538sout | 1 | "" | 2 | "" | 3 | endl;
     
    45674541which is a local mechanism to disable insertion of the separator character.
    45684542\item
    4569 A separator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@
     4543A seperator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@
    45704544%$
    45714545\begin{lstlisting}[mathescape=off]
     
    47704744
    47714745
    4772 \subsection{min / max / clamp / swap}
     4746\subsection{min / max / swap}
    47734747
    47744748\begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
     
    47784752forall( otype T | { int ?>?( T, T ); } )
    47794753T max( const T t1, const T t2 );§\indexc{max}§
    4780 
    4781 forall( otype T | { T min( T, T ); T max( T, T ); } )
    4782 T clamp( T value, T min_val, T max_val );§\indexc{clamp}§
    47834754
    47844755forall( otype T )
     
    51655136When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible.
    51665137
    5167 \begin{lstlisting}[belowskip=0pt]
     5138\begin{lstlisting}[aboveskip=0pt,belowskip=0pt]
    51685139// implementation
    51695140struct Rational {§\indexc{Rational}§
Note: See TracChangeset for help on using the changeset viewer.