- Timestamp:
- Aug 3, 2016, 11:33:36 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- e93bc13
- Parents:
- ac43954 (diff), aea7168 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- doc
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/LaTeXmacros/common.tex
rac43954 ra14187f 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Tue Jul 12 20:37:57201614 %% Update Count : 2 0613 %% Last Modified On : Tue Aug 2 17:02:02 2016 14 %% Update Count : 228 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%18 16 19 17 \setlength{\textheight}{9in} 20 18 %\oddsidemargin 0.0in 21 \renewcommand{\topfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page22 \renewcommand{\bottomfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page19 \renewcommand{\topfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 20 \renewcommand{\bottomfraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 23 21 \renewcommand{\floatpagefraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 24 \renewcommand{\textfraction}{0.0} % the entire page maybe devoted to floats with no text on the page at all25 26 \lefthyphenmin=4 22 \renewcommand{\textfraction}{0.0} % the entire page maybe devoted to floats with no text on the page at all 23 24 \lefthyphenmin=4 % hyphen only after 4 characters 27 25 \righthyphenmin=4 28 26 … … 38 36 % Names used in the document. 39 37 40 \newcommand{\CFA}{C$\mathbf\forall$\xspace} 41 \newcommand{\CFL}{Cforall\xspace} 38 \newcommand{\CFA}{C$\mathbf\forall$\xspace} % set language symbolic name 39 \newcommand{\CFL}{Cforall\xspace} % set language text name 42 40 \newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name 43 41 \newcommand{\CCeleven}{\rm C\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name 44 \ def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name)42 \newcommand{\Celeven}{C11\xspace} % C11 symbolic name 45 43 46 44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 52 50 \setlength{\parindentlnth}{\parindent} 53 51 54 \newlength{\gcolumnposn} 52 \newlength{\gcolumnposn} % temporary hack because lstlisting does handle tabs correctly 55 53 \newlength{\columnposn} 56 54 \setlength{\gcolumnposn}{2.5in} … … 63 61 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}} 64 62 65 \usepackage{pslatex} 66 \usepackage{relsize} 63 \usepackage{pslatex} % reduce size of san serif font 64 \usepackage{relsize} % must be after change to small or selects old size 67 65 68 66 % reduce size of chapter/section titles … … 120 118 121 119 % inline text and lowercase index: \Index{inline and lowercase index text} 120 \newcommand{\Index}{\@ifstar\@sIndex\@Index} 122 121 % inline text and as-in index: \Index[as-is index text]{inline text} 122 \newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi} 123 123 % inline text but index with different as-is text: \Index[index text]{inline text} 124 \newcommand{\Index}{\@ifstar\@sIndex\@Index}125 \newcommand{\@Index}[2][\@empty]{\lowercase{\def\temp{#2}}#2\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi}126 124 \newcommand{\@sIndex}[2][\@empty]{#2\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi} 127 125 128 % cannot use ©126 % inline text and code index (cannot use ©) 129 127 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}} 128 % code index (cannot use ©) 130 129 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}} 131 130 … … 137 136 \newcommand{\@newterm}[2][\@empty]{\lowercase{\def\temp{#2}}{\newtermFontInline{#2}}\ifx#1\@empty\index{\temp}\else\index{#1@{\protect#2}}\fi} 138 137 \newcommand{\@snewterm}[2][\@empty]{{\newtermFontInline{#2}}\ifx#1\@empty\index{#2}\else\index{#1@{\protect#2}}\fi} 138 139 % Latin abbreviation 140 \newcommand{\abbrevFont}{\textit} % set empty for no italics 141 \newcommand*{\eg}{% 142 \@ifnextchar{,}{\abbrevFont{e}.\abbrevFont{g}.}% 143 {\@ifnextchar{:}{\abbrevFont{e}.\abbrevFont{g}.}% 144 {\abbrevFont{e}.\abbrevFont{g}.,\xspace}}% 145 }% 146 \newcommand*{\ie}{% 147 \@ifnextchar{,}{\abbrevFont{i}.\abbrevFont{e}.}% 148 {\@ifnextchar{:}{\abbrevFont{i}.\abbrevFont{e}.}% 149 {\abbrevFont{i}.\abbrevFont{e}.,\xspace}}% 150 }% 151 \newcommand*{\etc}{% 152 \@ifnextchar{.}{\abbrevFont{etc}}% 153 {\abbrevFont{etc}.\xspace}% 154 }% 139 155 \makeatother 140 156 … … 145 161 \endlist 146 162 }% quote2 163 147 164 \newenvironment{rationale}{% 148 165 \begin{quote2}\noindent$\Box$\enspace … … 188 205 \newcommand{\VPageref}[2][page]{\ifx#1\@empty\else{#1}\nobreakspace\fi\pageref{#2}} 189 206 190 % Go programming language 207 % Go programming language: https://github.com/julienc91/listings-golang/blob/master/listings-golang.sty 191 208 \lstdefinelanguage{Golang}{ 192 209 morekeywords=[1]{package,import,func,type,struct,return,defer,panic, recover,select,var,const,iota,},% … … 204 221 } 205 222 206 % CFA programming language, based on ANSI C 223 % CFA programming language, based on ANSI C (with some gcc additions) 207 224 \lstdefinelanguage{CFA}[ANSI]{C}{ 208 225 morekeywords={_Alignas,_Alignof,__alignof,__alignof__,asm,__asm,__asm__,_At,_Atomic,__attribute,__attribute__,auto, 209 226 _Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__, 210 fallthr u,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert,227 fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,otype,restrict,_Static_assert, 211 228 _Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,}, 212 229 }% … … 215 232 language=CFA, 216 233 columns=fullflexible, 217 basicstyle=\linespread{0.9}\sf, 218 stringstyle=\tt, 219 tabsize=4, 220 xleftmargin=\parindentlnth, 221 extendedchars=true, 222 escapechar=§, 223 mathescape=true, 224 keepspaces=true, 225 showstringspaces=false, 226 showlines=true, 227 aboveskip=4pt, 234 basicstyle=\linespread{0.9}\sf, % reduce line spacing and use sanserif font 235 stringstyle=\tt, % use typewriter font 236 tabsize=4, % 4 space tabbing 237 xleftmargin=\parindentlnth, % indent code to paragraph indentation 238 extendedchars=true, % allow ASCII characters in the range 128-255 239 escapechar=§, % escape to latex in CFA code 240 mathescape=true, % allow $...$ LaTeX math escapes in code 241 %keepspaces=true, % 242 showstringspaces=false, % do not show spaces with cup 243 showlines=true, % show blank lines at end of code 244 aboveskip=4pt, % spacing above/below code block 228 245 belowskip=3pt, 229 moredelim=**[is][\color{red}]{®}{®}, 230 moredelim=**[is][\color{blue}]{ß}{ß}, 246 moredelim=**[is][\color{red}]{®}{®}, % red highlighting 247 moredelim=**[is][\color{blue}]{ß}{ß}, % blue highlighting 231 248 moredelim=**[is][\color{OliveGreen}]{¢}{¢}, % green highlighting 232 249 moredelim=[is][\lstset{keywords={}}]{¶}{¶}, % temporarily turn off keywords … … 242 259 \renewcommand\thebibliography[1]{ 243 260 \Oldthebibliography{#1} 244 \setlength{\parskip}{0pt} % reduce vertical spacing between references261 \setlength{\parskip}{0pt} % reduce vertical spacing between references 245 262 \setlength{\itemsep}{5pt plus 0.3ex} 246 263 }% 247 248 \newcommand*{\eg}{\textit{e.g}.\@\xspace}249 \newcommand*{\ie}{\textit{i.e}.\@\xspace}250 251 \makeatletter252 \newcommand*{\etc}{%253 \@ifnextchar{.}%254 {\textit{etc}}%255 {\textit{etc}.\@\xspace}%256 }257 \makeatother258 264 259 265 % Local Variables: % -
doc/user/user.tex
rac43954 ra14187f 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:39201614 %% Update Count : 12 4713 %% Last Modified On : Tue Aug 2 17:39:02 2016 14 %% Update Count : 1286 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 211 211 however, it largely extended the language, and did not address many existing problems.\footnote{% 212 212 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.} 213 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features ( e.g.,objects, concurrency) are added and problems fixed within the framework of the existing language.213 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language. 214 214 \Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent. 215 215 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection. … … 226 226 227 227 \section{Interoperability} 228 \label{s:Interoperability} 228 229 229 230 \CFA is designed to integrate well with existing C programs and libraries. … … 265 266 \section[Compiling CFA Program]{Compiling \CFA Program} 266 267 267 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, e.g.:268 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg: 268 269 \begin{lstlisting} 269 270 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] … … 314 315 The \CFA compilation message is printed at the beginning of a compilation. 315 316 \textbf{This option is the default.} 317 318 \item 319 \Indexc{-no-include-std}\index{compilation option!-no-include-std@©-no-include-std©} 320 Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}). 321 \textbf{This option is \emph{not} the default.} 316 322 \end{description} 317 323 … … 350 356 \section{Underscores in Constants} 351 357 352 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.:358 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg: 353 359 \begin{lstlisting} 354 360 2®_®147®_®483®_®648; §\C{// decimal constant}§ … … 366 372 \begin{enumerate} 367 373 \item 368 A sequence of underscores is disallowed, e.g.,©12__34© is invalid.374 A sequence of underscores is disallowed, \eg ©12__34© is invalid. 369 375 \item 370 376 Underscores may only appear within a sequence of digits (regardless of the digit radix). 371 In other words, an underscore cannot start or end a sequence of digits, e.g.,©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names).377 In other words, an underscore cannot start or end a sequence of digits, \eg ©_1©, ©1_© and ©_1_© are invalid (actually, the 1st and 3rd examples are identifier names). 372 378 \item 373 379 A numeric prefix may end with an underscore; … … 498 504 \end{quote2} 499 505 500 All type qualifiers, e.g., ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, e.g.:506 All type qualifiers, \eg ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, \eg: 501 507 \begin{quote2} 502 508 \begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}} … … 518 524 \end{tabular} 519 525 \end{quote2} 520 All declaration qualifiers, e.g.,©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}521 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} e.g.:526 All declaration qualifiers, \eg ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier} 527 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} \eg: 522 528 \begin{quote2} 523 529 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}} … … 542 548 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified,\footnote{ 543 549 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}} 544 e.g.:550 \eg: 545 551 \begin{lstlisting} 546 552 x; §\C{// int x}§ … … 612 618 A \Index{pointer}/\Index{reference} is a generalization of a variable name, i.e., a mutable address that can point to more than one memory location during its lifetime. 613 619 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime and may not occupy storage as the literal is embedded directly into instructions.) 614 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.:620 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg: 615 621 \begin{quote2} 616 622 \begin{tabular}{@{}ll@{}} … … 669 675 Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example. 670 676 Hence, a reference behaves like the variable name for the current variable it is pointing-to. 671 The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, e.g.:677 The simplest way to understand a reference is to imagine the compiler inserting a dereference operator before the reference variable for each reference qualifier in a declaration, \eg: 672 678 \begin{lstlisting} 673 679 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); … … 677 683 ®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15); 678 684 \end{lstlisting} 679 When a reference operation appears beside a dereference operation, e.g.,©&*©, they cancel out.\footnote{685 When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out.\footnote{ 680 686 The unary ©&© operator yields the address of its operand. 681 687 If the operand has type ``type'', the result has type ``pointer to type''. … … 721 727 ®&®crc = &cx; §\C{// error, cannot change crc}§ 722 728 \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.:729 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}, \eg: 724 730 \begin{lstlisting} 725 731 int & const r = *0; §\C{// where 0 is the int * zero}§ 726 732 \end{lstlisting} 727 733 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. 734 Finally, the position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers. 735 The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations; 736 \CFA-style declarations attempt to address this issue: 737 \begin{quote2} 738 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} 739 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 740 \begin{lstlisting} 741 ®const® * ®const® * const int ccp; 742 ®const® & ®const® & const int ccr; 743 \end{lstlisting} 744 & 745 \begin{lstlisting} 746 const int * ®const® * ®const® ccp; 747 748 \end{lstlisting} 749 \end{tabular} 750 \end{quote2} 751 where the \CFA declaration is read left-to-right (see \VRef{s:Declarations}). 728 752 729 753 \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. … … 785 809 \section{Type Operators} 786 810 787 The new declaration syntax can be used in other contexts where types are required, e.g.,casts and the pseudo-routine ©sizeof©:811 The new declaration syntax can be used in other contexts where types are required, \eg casts and the pseudo-routine ©sizeof©: 788 812 \begin{quote2} 789 813 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 805 829 806 830 \CFA also supports a new syntax for routine definition, as well as ISO C and K\&R routine syntax. 807 The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, e.g.:831 The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, \eg: 808 832 \begin{lstlisting} 809 833 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) { … … 817 841 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.} 818 842 The value of each local return variable is automatically returned at routine termination. 819 Declaration qualifiers can only appear at the start of a routine definition, e.g.:843 Declaration qualifiers can only appear at the start of a routine definition, \eg: 820 844 \begin{lstlisting} 821 845 ®extern® [ int x ] g( int y ) {§\,§} … … 849 873 The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts. 850 874 851 C-style declarations can be used to declare parameters for \CFA style routine definitions, e.g.:875 C-style declarations can be used to declare parameters for \CFA style routine definitions, \eg: 852 876 \begin{lstlisting} 853 877 [ int ] f( * int, int * ); §\C{// returns an integer, accepts 2 pointers to integers}§ … … 898 922 899 923 The syntax of the new routine prototype declaration follows directly from the new routine definition syntax; 900 as well, parameter names are optional, e.g.:924 as well, parameter names are optional, \eg: 901 925 \begin{lstlisting} 902 926 [ int x ] f (); §\C{// returning int with no parameters}§ … … 906 930 \end{lstlisting} 907 931 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa). 908 It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), e.g.:932 It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), \eg: 909 933 \begin{quote2} 910 934 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 919 943 \end{tabular} 920 944 \end{quote2} 921 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} e.g.:945 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg: 922 946 \begin{lstlisting} 923 947 extern [ int ] f (int); … … 928 952 \section{Routine Pointers} 929 953 930 The syntax for pointers to \CFA routines specifies the pointer name on the right, e.g.:954 The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg: 931 955 \begin{lstlisting} 932 956 * [ int x ] () fp; §\C{// pointer to routine returning int with no parameters}§ … … 1046 1070 p( /* positional */, /* named */, . . . ); 1047 1071 \end{lstlisting} 1048 While it is possible to implement both approaches, the first possibly is more complex than the second, e.g.:1072 While it is possible to implement both approaches, the first possibly is more complex than the second, \eg: 1049 1073 \begin{lstlisting} 1050 1074 p( int x, int y, int z, . . . ); … … 1056 1080 In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call. 1057 1081 1058 The problem is exacerbated with default arguments, e.g.:1082 The problem is exacerbated with default arguments, \eg: 1059 1083 \begin{lstlisting} 1060 1084 void p( int x, int y = 2, int z = 3. . . ); … … 1264 1288 1265 1289 As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call. 1266 In unambiguous situations, the tuple brackets may be omitted, e.g.,a tuple that appears as an argument may have its1290 In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its 1267 1291 square brackets omitted for convenience; therefore, the following routine invocations are equivalent: 1268 1292 \begin{lstlisting} … … 1303 1327 1304 1328 Type qualifiers, i.e., const and volatile, may modify a tuple type. 1305 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)], i.e., the qualifier is distributed across all of the types in the tuple, e.g.:1329 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)], i.e., the qualifier is distributed across all of the types in the tuple, \eg: 1306 1330 \begin{lstlisting} 1307 1331 const volatile [ int, float, const int ] x; … … 1311 1335 [ const volatile int, const volatile float, const volatile int ] x; 1312 1336 \end{lstlisting} 1313 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, e.g.:1337 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg: 1314 1338 \begin{lstlisting} 1315 1339 extern [ int, int ] w1; … … 1319 1343 Unfortunately, C's syntax for subscripts precluded treating them as tuples. 1320 1344 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©. 1321 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, e.g.,©f[g()]© always means a single subscript value because there is only one set of brackets.1345 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, \eg ©f[g()]© always means a single subscript value because there is only one set of brackets. 1322 1346 Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression. 1323 1347 \end{rationale} … … 1380 1404 Clearly, the types of the entities being assigned must be type compatible with the value of the expression. 1381 1405 1382 Mass assignment has parallel semantics, e.g.,the statement:1406 Mass assignment has parallel semantics, \eg the statement: 1383 1407 \begin{lstlisting} 1384 1408 [ x, y, z ] = 1.5; … … 1469 1493 \section{Unnamed Structure Fields} 1470 1494 1471 C requires each field of a structure to have a name, except for a bit field associated with a basic type, e.g.:1495 C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg: 1472 1496 \begin{lstlisting} 1473 1497 struct { 1474 int f1; // named field1475 int f2 : 4; // named field with bit field size1476 int : 3; // unnamed field for basic type with bit field size1477 int ; // disallowed, unnamed field1478 int *; // disallowed, unnamed field1479 int (*)(int); // disallowed, unnamed field1498 int f1; §\C{// named field}§ 1499 int f2 : 4; §\C{// named field with bit field size}§ 1500 int : 3; §\C{// unnamed field for basic type with bit field size}§ 1501 int ; §\C{// disallowed, unnamed field}§ 1502 int *; §\C{// disallowed, unnamed field}§ 1503 int (*)(int); §\C{// disallowed, unnamed field}§ 1480 1504 }; 1481 1505 \end{lstlisting} 1482 1506 This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed. 1483 1507 As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size. 1484 A list of unnamed fields is also supported, e.g.:1508 A list of unnamed fields is also supported, \eg: 1485 1509 \begin{lstlisting} 1486 1510 struct { 1487 int , , ; // 3 unnamed fields1511 int , , ; §\C{// 3 unnamed fields}§ 1488 1512 } 1489 1513 \end{lstlisting} … … 1498 1522 §\emph{expr}§ -> [ §\emph{fieldlist}§ ] 1499 1523 \end{lstlisting} 1500 \emph{expr} is any expression yielding a value of type record, e.g.,©struct©, ©union©.1524 \emph{expr} is any expression yielding a value of type record, \eg ©struct©, ©union©. 1501 1525 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}. 1502 1526 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is … … 1760 1784 } 1761 1785 \end{lstlisting} 1762 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. 1786 While the declaration of the local variable ©y© is useful with a scope across all ©case© clauses, the initialization for such a variable is defined to never be executed because control always transfers over it. 1787 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©, both of which are problematic. 1788 As well, the declaration of ©z© 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. 1789 The key observation is that the ©switch© statement branches into control structure, i.e., there are multiple entry points into its statement body. 1767 1790 \end{enumerate} 1768 1791 … … 1778 1801 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 1802 \end{itemize} 1780 These observations help to put the suggestedchanges to the ©switch© into perspective.1803 These observations help to put the \CFA changes to the ©switch© into perspective. 1781 1804 \begin{enumerate} 1782 1805 \item 1783 1806 Eliminating default fall-through has the greatest potential for affecting existing code. 1784 However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, e.g.:1785 \begin{lstlisting}1807 However, even if fall-through is removed, most ©switch© statements would continue to work because of the explicit transfers already present at the end of each ©case© clause, the common placement of the ©default© clause at the end of the case list, and the most common use of fall-through, i.e., a list of ©case© clauses executing common code, \eg: 1808 \begin{lstlisting} 1786 1809 case 1: case 2: case 3: ... 1787 1810 \end{lstlisting} 1788 1811 still work. 1789 1812 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.: 1813 <<<<<<< HEAD 1814 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©, \eg: 1815 ======= 1816 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©, e.g.: 1817 >>>>>>> 080615890f586cb9954c252b55cab47f52c25758 1791 1818 \begin{lstlisting} 1792 1819 ®choose® ( i ) { … … 1815 1842 Therefore, no change is made for this issue. 1816 1843 \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.1844 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{ 1845 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. 1846 Further declarations at the same nesting level as the statement body are disallowed to ensure every transfer into the body is sound. 1820 1847 \begin{lstlisting} 1821 1848 switch ( x ) { 1822 ®int i = 0;® §\C{// allowed }§1849 ®int i = 0;® §\C{// allowed only at start}§ 1823 1850 case 0: 1824 1851 ... 1825 ®int i= 0;® §\C{// disallowed}§1852 ®int j = 0;® §\C{// disallowed}§ 1826 1853 case 1: 1827 1854 { 1828 ®int i = 0;® §\C{// allowed in any compound statement}§1855 ®int k = 0;® §\C{// allowed at different nesting levels}§ 1829 1856 ... 1830 1857 } … … 2707 2734 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 2735 2709 There are several ambiguous cases with operator identifiers, e.g.,©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©.2710 Since it is common practise to put a unary operator juxtaposed to an identifier, e.g.,©*i©, users will be annoyed if they cannot do this with respect to operator identifiers.2736 There are several ambiguous cases with operator identifiers, \eg ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©. 2737 Since it is common practise to put a unary operator juxtaposed to an identifier, \eg ©*i©, users will be annoyed if they cannot do this with respect to operator identifiers. 2711 2738 Even with this special hack, there are 5 general cases that cannot be handled. 2712 2739 The first case is for the function-call identifier ©?()©: … … 2773 2800 This means that a function requiring mutual exclusion could block if the lock is already held by another thread. 2774 2801 Blocking on a monitor lock does not block the kernel thread, it simply blocks the user thread, which yields its kernel thread while waiting to obtain the lock. 2775 If multiple mutex parameters are specified, they will be locked in parameter order ( i.e.first parameter is locked first) and unlocked in the2802 If multiple mutex parameters are specified, they will be locked in parameter order (\ie first parameter is locked first) and unlocked in the 2776 2803 reverse order. 2777 2804 \begin{lstlisting} … … 4342 4369 4343 4370 4371 \section{New Keywords} 4372 \label{s:NewKeywords} 4373 4374 \begin{quote2} 4375 \begin{tabular}{ll} 4376 ©catch© & ©lvalue© \\ 4377 ©catchResume© & \\ 4378 ©choose© & ©otype© \\ 4379 & \\ 4380 ©disable© & ©throw© \\ 4381 ©dtype© & ©throwResume© \\ 4382 & ©trait© \\ 4383 ©enable© & ©try© \\ 4384 & \\ 4385 ©fallthrough© \\ 4386 ©fallthru© \\ 4387 ©finally© \\ 4388 ©forall© \\ 4389 ©ftype© \\ 4390 \end{tabular} 4391 \end{quote2} 4392 4393 4394 \section{Standard Headers} 4395 \label{s:StandardHeaders} 4396 4397 C prescribes the following standard header-files: 4398 \begin{quote2} 4399 \begin{minipage}{\linewidth} 4400 \begin{tabular}{lll} 4401 assert.h & math.h & stdlib.h \\ 4402 complex.h & setjmp.h & stdnoreturn.h \\ 4403 ctype.h & signal.h & string.h \\ 4404 errno.h & stdalign.h & tgmath.h \\ 4405 fenv.h & stdarg.h & threads.h \\ 4406 float.h & stdatomic.h & time.h \\ 4407 inttypes.h & stdbool.h & uchar.h \\ 4408 iso646.h & stddef.h & wchar.h \\ 4409 limits.h & stdint.h & wctype.h \\ 4410 locale.h & stdio.h & unistd.h\footnote{\CFA extension} 4411 \end{tabular} 4412 \end{minipage} 4413 \end{quote2} 4414 For the prescribed head-files, \CFA implicit wraps their includes in an ©extern "C"©; 4415 hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}). 4416 All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling. 4417 4418 4344 4419 \section{Incompatible} 4345 4420 … … 4349 4424 \item 4350 4425 \begin{description} 4351 \item[Change:] add new keywords \\4426 \item[Change:] add new keywords (see~\VRef{s:NewKeywords}) \\ 4352 4427 New keywords are added to \CFA. 4353 4428 \item[Rationale:] keywords added to implement new semantics of \CFA. … … 4447 4522 \begin{description} 4448 4523 \item[Change:] have ©struct© introduce a scope for nested types 4449 In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing 4524 In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing 4450 4525 Example: 4451 4526 \begin{lstlisting} … … 4471 4546 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \Index*[C++]{\CC}. 4472 4547 Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''. 4473 Given that nested types in C are equivalent to not using them, i.e.,they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility.4548 Given that nested types in C are equivalent to not using them, \ie they are essentially useless, it is unlikely there are any realistic usages that break because of this incompatibility. 4474 4549 \end{description} 4475 4550 … … 4570 4645 %$ 4571 4646 \begin{lstlisting}[mathescape=off] 4572 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 | "x ¿" | 8 | "x «" | 9 | endl; 4647 sout | "x (" | 1 | "x [" | 2 | "x {" | 3 | "x $" | 4 | "x £" | 5 | "x ¥" | 6 | "x ¡" | 7 4648 | "x ¿" | 8 | "x «" | 9 | endl; 4573 4649 \end{lstlisting} 4574 4650 %$ … … 4580 4656 A seperator does not appear after a C string ending with the (extended) \Index{ASCII}\index{ASCII!extended} characters: ©,.:;!?)]}%¢»© 4581 4657 \begin{lstlisting}[belowskip=0pt] 4582 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 | ") x" | 8 | "] x" | 9 | "} x"4583 | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl;4658 sout | 1 | ", x" | 2 | ". x" | 3 | ": x" | 4 | "; x" | 5 | "! x" | 6 | "? x" | 7 4659 | ") x" | 8 | "] x" | 9 | "} x" | 10 | "% x" | 11 | "¢ x" | 12 | "» x" | endl; 4584 4660 \end{lstlisting} 4585 4661 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4597 4673 The following \CC-style \Index{manipulator}s allow further control over implicit seperation. 4598 4674 \begin{lstlisting}[mathescape=off,belowskip=0pt] 4599 sout | sepOn | 1 | 2 | 3 | sepOn | endl; // separator at start of line4675 sout | sepOn | 1 | 2 | 3 | sepOn | endl; §\C{// separator at start of line}§ 4600 4676 \end{lstlisting} 4601 4677 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4603 4679 \end{lstlisting} 4604 4680 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4605 sout | 1 | sepOff | 2 | 3 | endl; // turn off implicit separator temporarily4681 sout | 1 | sepOff | 2 | 3 | endl; §\C{// turn off implicit separator temporarily}§ 4606 4682 \end{lstlisting} 4607 4683 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4609 4685 \end{lstlisting} 4610 4686 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4611 sout | sepDisable | 1 | 2 | 3 | endl; // turn off implicit separation, affects all subsequent prints4687 sout | sepDisable | 1 | 2 | 3 | endl; §\C{// turn off implicit separation, affects all subsequent prints}§ 4612 4688 \end{lstlisting} 4613 4689 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4615 4691 \end{lstlisting} 4616 4692 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4617 sout | 1 | sepOn | 2 | 3 | endl; // turn on implicit separator temporarily4693 sout | 1 | sepOn | 2 | 3 | endl; §\C{// turn on implicit separator temporarily}§ 4618 4694 \end{lstlisting} 4619 4695 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4621 4697 \end{lstlisting} 4622 4698 \begin{lstlisting}[mathescape=off,aboveskip=0pt,belowskip=0pt] 4623 sout | sepEnable | 1 | 2 | 3 | endl; // turn on implicit separation, affects all subsequent prints4699 sout | sepEnable | 1 | 2 | 3 | endl; §\C{// turn on implicit separation, affects all subsequent prints}§ 4624 4700 \end{lstlisting} 4625 4701 \begin{lstlisting}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 4627 4703 \end{lstlisting} 4628 4704 \begin{lstlisting}[mathescape=off,aboveskip=0pt,aboveskip=0pt,belowskip=0pt] 4629 sepSet( sout, ", $" ); // change separator from " " to ", $"4705 sepSet( sout, ", $" ); §\C{// change separator from " " to ", \$"}§ 4630 4706 sout | 1 | 2 | 3 | endl; 4631 4707 \end{lstlisting} … … 5162 5238 \label{s:RationalNumbers} 5163 5239 5164 Rational numbers are numbers written as a ratio, i.e.,as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers.5240 Rational numbers are numbers written as a ratio, \ie as a fraction, where the numerator (top number) and the denominator (bottom number) are whole numbers. 5165 5241 When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible. 5166 5242
Note: See TracChangeset
for help on using the changeset viewer.