Changes in doc/user/user.tex [5479e63:07bc165]
- File:
-
- 1 edited
-
doc/user/user.tex (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r5479e63 r07bc165 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Wed Jul 13 08:14:39 201614 %% Update Count : 12 4713 %% Last Modified On : Sun Jul 10 12:52:09 2016 14 %% Update Count : 1200 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 294 294 \item 295 295 \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.296 The program is linked with the non-debugging version of the unikernel or multikernel, so the execution of the program is faster. 297 297 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.} 298 298 … … 721 721 ®&®crc = &cx; §\C{// error, cannot change crc}§ 722 722 \end{lstlisting} 723 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}, 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. 723 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}. 724 In effect, the compiler is managing the addresses for type ©& const© not the programmer, and by a programming discipline of only using references with references, address errors can be prevented. 728 725 729 726 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object. … … 738 735 \begin{lstlisting} 739 736 int & f( int & rp ); §\C{// reference parameter and return}§ 740 z = f( x ) + f( y ); §\C{// reference operator added , temporaries needed for call results}§737 z = f( x ) + f( y ); §\C{// reference operator added}§ 741 738 \end{lstlisting} 742 739 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©rp© can be locally reassigned within ©f©. 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.740 The return reference from ©f© is copied into a compiler generated temporary, which is treated as an initialization. 744 741 745 742 When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions. … … 1649 1646 \end{lstlisting} 1650 1647 The 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@{}}1653 1648 \begin{lstlisting} 1654 1649 switch ( argc ) { … … 1663 1658 } 1664 1659 \end{lstlisting} 1665 &1666 \begin{lstlisting}1667 1668 if ( argc == 3 ) {1669 // open output file1670 ®// open input file1671 ®} else if ( argc == 2 ) {1672 ®// open input file1673 1674 ®} else {1675 // usage message1676 }1677 \end{lstlisting}1678 \end{tabular}1679 \end{quote2}1680 1660 In this example, case 2 is always done if case 3 is done. 1681 1661 This 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. … … 1692 1672 \end{lstlisting} 1693 1673 However, 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 manyprogrammers and is different from virtually all other programming languages with a ©switch© statement.1674 While 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. 1695 1675 Hence, 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. 1696 1676 … … 1702 1682 if ( j < k ) { 1703 1683 ... 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: 1708 1692 while ( j < 5 ) { 1709 1693 ... 1710 ®case 3:®// transfer into "while" statement1694 case 4: // transfer into "while" statement 1711 1695 ... 1712 } // while1713 } // switch1696 } 1697 } 1714 1698 \end{lstlisting} 1715 1699 The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties. … … 1750 1734 \begin{lstlisting} 1751 1735 switch ( 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}§ 1754 1738 case 3: ... 1739 y = 3; 1755 1740 ... 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}§1760 1741 } 1761 1742 \end{lstlisting} 1762 1743 While 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. 1744 Furthermore, 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©. 1745 As mentioned, transfer into control structures should be forbidden. 1746 Transfers from within the ©switch© body using a ©goto© are equally unpalatable. 1767 1747 \end{enumerate} 1768 1769 1748 Before discussing potential language changes to deal with these problems, it is worth observing that in a typical C program: 1770 1749 \begin{itemize} … … 1778 1757 and 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. 1779 1758 \end{itemize} 1780 These observations help to put the suggested changes to the ©switch©into perspective.1759 These observations help to put the effects of suggested changes into perspective. 1781 1760 \begin{enumerate} 1782 1761 \item … … 1788 1767 still work. 1789 1768 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. 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.: 1769 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no fall-through semantics. 1770 The ©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). 1771 It is still possible to fall-through if a case-clause ends with the new keyword ©fallthru©, e.g.: 1791 1772 \begin{lstlisting} 1792 1773 ®choose® ( i ) { 1793 case 1: case 2: case3:1774 case 3: 1794 1775 ... 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}§ 1799 1779 case 7: 1800 1780 ... 1801 ®break® §\C{// explicit end ofswitch}§1781 ®break® §\C{// transfer to end of enclosing loop / switch}§ 1802 1782 default: 1803 1783 j = 3; 1804 1784 } 1805 1785 \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. 1786 The 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 1788 Eliminating \Index*{Duff's device} is straightforward and only invalidates a small amount of very questionable code. 1789 The 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. 1813 1790 \item 1814 1791 The 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}§ 1792 Therefore, no language change is made for this issue. 1793 \item 1794 Dealing 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. 1795 This semantics is the same as for declarations at the start of a loop body, which are executed before each iteration of the loop body. 1796 As well, statements cannot appear before the first ©case© clause. 1797 The change is compatible for declarations with initialization in this context because existing code cannot assume the initialization has occurred. 1798 The change is incompatible for statements, but any existing code using it is highly questionable, as in: 1799 \begin{lstlisting} 1800 switch ( i ) { 1801 L: x = 5; §\C{// questionable code}§ 1823 1802 case 0: 1824 1803 ... 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} 1806 The statement after the ©switch© can never be executed unless it is labelled. 1807 If it is labelled, it must be transfered to from outside or inside the ©switch© statement, neither of which is acceptable control flow. 1834 1808 \end{enumerate} 1835 1809 … … 1913 1887 \section{Exception Handling} 1914 1888 1915 Exception handling provides two mechani sm: change of control flow from a raise to a handler, and communication from the raise to the handler.1889 Exception handling provides two mechanim: change of control flow from a raise to a handler, and commumication from the riase to the handler. 1916 1890 \begin{lstlisting} 1917 1891 exception void h( int i ); … … 2166 2140 A facility that let programmers declare specific constants..const Rational 12., for instance. would not be much of an improvement. 2167 2141 Some 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.2142 The complexity of such a feature doesn.t seem worth the gain. 2169 2143 2170 2144 For example, to define the constants for a complex type, the programmer would define the following: … … 2694 2668 } s; 2695 2669 \end{lstlisting} 2696 The problem occurs in acces sing these fields using the selection operation ``©.©'':2670 The problem occurs in accesing these fields using the selection operation ``©.©'': 2697 2671 \begin{lstlisting} 2698 2672 s.0 = 0; // ambiguity with floating constant .0 … … 2704 2678 ®s.§\textvisiblespace§1® = 1; 2705 2679 \end{lstlisting} 2706 While this sy ntax is awkward, it is unlikely many programmers will name fields of a structure 0 or 1.2680 While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1. 2707 2681 Like the \Index*[C++]{\CC} lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser. 2708 2682 … … 3016 2990 In \CFA, multiple definitions are not necessary. 3017 2991 Within 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:2992 For example, the following code compiles, even though isOdd was not declared before being called: 3019 2993 \begin{lstlisting} 3020 2994 bool isEven(unsigned int x) { … … 4356 4330 \item[Difficulty of converting:] keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism: 4357 4331 \begin{lstlisting} 4358 int `otype` = 3; // make keyword an i dentifier4332 int `otype` = 3; // make keyword an indentifier 4359 4333 double `choose` = 3.5; 4360 4334 \end{lstlisting} … … 4493 4467 \begin{description} 4494 4468 \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 sty le 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. 4496 4470 \item[Effect on original feature:] change to semantics of well-defined feature. 4497 4471 \item[Difficulty of converting:] semantic transformation of ©x[i,j]© to ©x[(i,j)]© … … 4505 4479 \index{input/output library} 4506 4480 4507 The goal for the \CFA I/O is to make I/O as simple as possible in the common cases, while fully supporting pol ymorphism and user defined types in a consistent way.4481 The goal for the \CFA I/O is to make I/O as simple as possible in the common cases, while fully supporting polmorphism and user defined types in a consistent way. 4508 4482 The common case is printing out a sequence of variables separated by whitespace. 4509 4483 \begin{quote2} … … 4542 4516 Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, although data flows in the opposite direction. 4543 4517 4544 The implicit sep arator\index{I/O separator} character (space/blank) is a separator not a terminator.4518 The implicit seperator\index{I/O separator} character (space/blank) is a separator not a terminator. 4545 4519 The rules for implicitly adding the separator are: 4546 4520 \begin{enumerate} 4547 4521 \item 4548 A sep arator does not appear at the start or end of a line.4522 A seperator does not appear at the start or end of a line. 4549 4523 \begin{lstlisting}[belowskip=0pt] 4550 4524 sout | 1 | 2 | 3 | endl; … … 4554 4528 \end{lstlisting} 4555 4529 \item 4556 A sep arator does not appear before or after a character literal or variable.4530 A seperator does not appear before or after a character literal or variable. 4557 4531 \begin{lstlisting} 4558 4532 sout | '1' | '2' | '3' | endl; … … 4560 4534 \end{lstlisting} 4561 4535 \item 4562 A sep arator does not appear before or after a null (empty) C string4536 A seperator does not appear before or after a null (empty) C string 4563 4537 \begin{lstlisting} 4564 4538 sout | 1 | "" | 2 | "" | 3 | endl; … … 4567 4541 which is a local mechanism to disable insertion of the separator character. 4568 4542 \item 4569 A sep arator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@4543 A seperator does not appear before a C string starting with the (extended) \Index{ASCII}\index{ASCII!extended} characters: \lstinline[mathescape=off]@([{$£¥¡¿«@ 4570 4544 %$ 4571 4545 \begin{lstlisting}[mathescape=off] … … 4770 4744 4771 4745 4772 \subsection{min / max / clamp /swap}4746 \subsection{min / max / swap} 4773 4747 4774 4748 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] … … 4778 4752 forall( otype T | { int ?>?( T, T ); } ) 4779 4753 T 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}§4783 4754 4784 4755 forall( otype T ) … … 5165 5136 When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible. 5166 5137 5167 \begin{lstlisting}[ belowskip=0pt]5138 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 5168 5139 // implementation 5169 5140 struct Rational {§\indexc{Rational}§
Note:
See TracChangeset
for help on using the changeset viewer.