Changes in doc/user/user.tex [45576af9:e229c22]
- File:
-
- 1 edited
-
doc/user/user.tex (modified) (40 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r45576af9 re229c22 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Jun 10 16:38:22201614 %% Update Count : 39413 %% Last Modified On : Fri Jun 3 09:49:31 2016 14 %% Update Count : 281 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 18 18 19 19 % inline code ©...© (copyright symbol) emacs: C-q M-) 20 % red highlighting ®...® (registered trademark symbol) emacs: C-q M-. 21 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_ 22 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-" 23 % Latex escape §...§ (section symbol) emacs: C-q M-' 20 % red highlighting ®...® (registered trademark sumbol) emacs: C-q M-. 21 % latex escape §...§ (section symbol) emacs: C-q M-' 24 22 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 25 23 % math escape $...$ (dollar symbol) 26 24 27 \documentclass[ twoside,11pt]{article}25 \documentclass[openright,twoside]{article} 28 26 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 27 … … 34 32 \usepackage{fullpage,times,comment} 35 33 \usepackage{epic,eepic} 36 \usepackage{upquote} % switch curled `' " to straight `'"34 \usepackage{upquote} % switch curled `' to straight `' 37 35 \usepackage{xspace} 38 36 \usepackage{varioref} % extended references 39 37 \usepackage{listings} % format program code 40 \usepackage [flushmargin]{footmisc}% support label/reference in footnote38 \usepackage{footmisc} % support label/reference in footnote 41 39 \usepackage{latexsym} % \Box glyph 42 40 \usepackage{mathptmx} % better math font with "times" 43 \usepackage[usenames]{color}44 41 \usepackage[pagewise]{lineno} 45 42 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 46 \input{common} % bespoke macros used in the document47 43 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} 48 44 \usepackage{breakurl} 49 45 \renewcommand{\UrlFont}{\small\sf} 50 46 47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 48 49 % Bespoke macros used in the document. 50 \input{common} 51 52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 53 51 54 % Names used in the document. 52 55 53 56 \newcommand{\Version}{1.0.0} 54 57 \newcommand{\CS}{C\raisebox{-0.9ex}{\large$^\sharp$}\xspace} 55 56 \newcommand{\Textbf}[2][red]{{\color{#1}{\textbf{#2}}}}57 \newcommand{\Emph}[2][red]{{\color{#1}\textbf{\emph{#2}}}}58 \newcommand{\R}[1]{\Textbf{#1}}59 \newcommand{\B}[1]{{\Textbf[blue]{#1}}}60 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}61 58 62 59 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 113 110 114 111 \CFA\footnote{Pronounced ``C-for-all'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed an as evolutionary step forward from the C programming language. 115 The syntax of the \CFA language builds from C, and should look immediately familiar to C /\CCprogrammers.112 The syntax of the \CFA language builds from C, and should look immediately familiar to C programmers. 116 113 % Any language feature that is not described here can be assumed to be using the standard C11 syntax. 117 \CFA adds many modern programming-language features that directly lead to increased \emph{safety} and \emph{productivity}, while maintaining interoperability with existing C programs and achieving C performance.114 \CFA adds many modern programming-language features that directly leads to increased \emph{safety} and \emph{productivity}, while maintaining interoperability with existing C programs and achieving C performance. 118 115 Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global garbage-collection. 119 116 The primary new features include parametric-polymorphism routines and types, exceptions, concurrency, and modules. … … 126 123 New programs can be written in \CFA using a combination of C and \CFA features. 127 124 \CC had a similar goal 30 years ago, but has struggled over the intervening time to incorporate modern programming-language features because of early design choices. 128 \CFA has 30 years of hindsight and aclean starting point.125 \CFA has 30 years of hindsight and clean starting point. 129 126 130 127 Like \CC, there may be both an old and new ways to achieve the same effect. 131 128 For example, the following programs compare the \CFA and C I/O mechanisms. 132 129 \begin{quote2} 133 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}134 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\130 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 131 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 135 132 \begin{lstlisting} 136 133 #include <fstream> 137 134 int main( void ) { 138 135 int x = 0, y = 1, z = 2; 139 ®sout | x | y | z | endl;®136 sout | x | y | z | endl; 140 137 } 141 138 \end{lstlisting} … … 145 142 int main( void ) { 146 143 int x = 0, y = 1, z = 2; 147 ®printf( "%d %d %d\n", x, y, z );®144 printf( "%d %d %d\n", x, y, z ); 148 145 } 149 146 \end{lstlisting} … … 151 148 \end{quote2} 152 149 Both programs output the same result. 153 While the \CFA I/O looks similar to the \CC output style, there are important differences, such as automatic spacing between variables as in Python (see also~\VRef{s:IOLibrary}).154 155 This document is a usermanual for the \CFA programming language, targeted at \CFA programmers.150 While the \CFA I/O looks similar to the \CC output style, there are several important differences, such as automatic spacing between variables as in Python (see also~\VRef{s:IOLibrary}). 151 152 This document is a reference manual for the \CFA programming language, targeted at \CFA programmers. 156 153 Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics. 157 154 In its current state, this document covers the intended core features of the language. … … 162 159 \section{History} 163 160 164 The \CFA project started with K-W C~\cite{ Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples.161 The \CFA project started with K-W C~\cite{Till89,Buhr94a}, which extended C with new declaration syntax, multiple return values from routines, and extended assignment capabilities using the notion of tuples. 165 162 (See~\cite{Werther96} for some similar work, but for \CC.) 166 163 The original \CFA project~\cite{Ditchfield92} extended the C type system with parametric polymorphism and overloading, as opposed to the \CC approach of object-oriented extensions to the C type-system. 167 164 A first implementation of the core Cforall language was created~\cite{Bilson03,Esteves04}, but at the time there was little interesting in extending C, so work did not continue. 168 As the saying goes, ``What goes around, comes around .'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted.165 As the saying goes, ``What goes around, comes around'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted. 169 166 170 167 … … 172 169 173 170 Even with all its problems, C is a very popular programming language because it allows writing software at virtually any level in a computer system without restriction. 174 For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.171 For systems programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice. 175 172 As well, there are millions of lines of C legacy code, forming the base for many software development projects (especially on UNIX systems). 176 173 The TIOBE index (\url{http://www.tiobe.com/tiobe_index}) for March 2016 shows programming-language popularity, with Java 20.5\%, C 14.5\%, \CC 6.7\%, \CS 4.3\%, Python 4.3\%, and all other programming languages below 3\%. 177 As well, for 30 years, C has been the number 1 and 2 most popular programming language:178 \begin{center}179 \setlength{\tabcolsep}{1.5ex}180 \begin{tabular}{@{}r|c|c|c|c|c|c|c@{}}181 Ranking & 2016 & 2011 & 2006 & 2001 & 1996 & 1991 & 1986 \\182 \hline183 Java & 1 & 1 & 1 & 3 & 29 & - & - \\184 \hline185 \R{C} & \R{2} & \R{2} & \R{2} & \R{1} & \R{1} & \R{1} & \R{1} \\186 \hline187 \CC & 3 & 3 & 3 & 2 & 2 & 2 & 7 \\188 \end{tabular}189 \end{center}190 174 Hence, C is still an extremely important programming language, with double the usage of \CC, where \CC itself is largely C code. 191 175 Finally, love it or hate it, C has been an important and influential part of computer science for 40 years and it appears it will continue to be for many more years. … … 194 178 The goal of this project is to engineer modern language features into C in an evolutionary rather than revolutionary way. 195 179 \CC~\cite{c++,ANSI14:C++} is an example of a similar project; 196 however, it largely extended the language, and did not address manyexisting problems.\footnote{%180 however, it largely extended the language, and did not address existing problems.\footnote{% 197 181 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.} 198 Fortran~\cite{Fortran08}, Ada~\cite{Ada12}, and 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.182 Fortran~\cite{Fortran08}, Ada~\cite{Ada12}, and Cobol~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features are added and problems fixed within the framework of the existing language. 199 183 Java~\cite{Java8}, Go~\cite{Go}, Rust~\cite{Rust} and 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. 200 184 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection. 201 185 As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten. 202 These costs can be prohibitive for many companies with a large software base in C/\CC, and a significant number of programmers requiringretraining to a new programming language.203 204 The result of this project is a language that is largely backwards compatible with C11~\cite{C11}, but fixing some of the well known C problems and containing many modern language features.205 Without significant extension to the C programming language, it is becomingunable to cope with the needs of modern programming problems and programmers;186 These costs can be prohibitive for many companies with a large software base in C/\CC, and many programmers that require retraining to a new programming language. 187 188 The result of this project is a language that is largely backwards compatible with C11~\cite{C11}, but containing many modern language features and fixing some of the well known C problems. 189 Without significant extension to the C programming language, C will be unable to cope with the needs of modern programming problems and programmers; 206 190 as a result, it will fade into disuse. 207 191 Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language. … … 216 200 This feature allows users of \CFA to take advantage of the existing panoply of C libraries from inside their \CFA code. 217 201 In fact, one of the biggest issues for any new programming language is establishing a minimum level of library code to support a large body of activities. 218 Language developers often state that adequate library support takes more work than designing and implementing the language itself.202 Programming-language developers often state that adequate library support takes more work than designing and implementing the language itself. 219 203 Like \CC, \CFA starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost. 220 Hence, \CFA begins by leveraging the large repository of C libraries with little cost.221 204 222 205 However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC. 223 For example, the C math-library provides the following routines for computing the absolute value of the basic type s: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©.224 Whereas, \CFA wraps each of these routines into one s with the common name ©abs©:206 For example, the C math-library provides the following routines for computing the absolute value of the basic type: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©. 207 Whereas, \CFA wraps each of these routines into one with the common name ©abs©. 225 208 \begin{lstlisting} 226 209 char abs( char ); 227 210 extern "C" { 228 int abs( int ); // use default C routine for int211 int abs( int ); // use default C routine for int 229 212 } // extern "C" 230 213 long int abs( long int ); … … 250 233 \section[Compiling CFA Program]{Compiling \CFA Program} 251 234 252 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU ©gcc©\index{gcc} command, e.g.: 235 The command ©cfa© is used to compile \CFA program(s). 236 This command works like the GNU ©gcc©\index{gcc} command, e.g.: 253 237 \begin{lstlisting} 254 238 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] … … 256 240 By default, \CFA programs having the following ©gcc© flags turned on: 257 241 \begin{description} 258 \item\hspace*{- 0.6ex}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}}242 \item\hspace*{-4pt}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}} 259 243 The 1999 C standard plus GNU extensions. 260 \item\hspace*{- 0.6ex}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{©-fgnu89-¶inline¶©}}244 \item\hspace*{-4pt}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{©-fgnu89-¶inline¶©}} 261 245 Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files. 262 246 \end{description} 263 247 The following new \CFA option is available: 264 248 \begin{description} 265 \item\hspace*{- 0.6ex}\Indexc{-CFA}\index{compilation option!-CFA@{©-CFA©}}249 \item\hspace*{-4pt}\Indexc{-CFA}\index{compilation option!-CFA@{©-CFA©}} 266 250 Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator. 267 251 \end{description} … … 269 253 The following preprocessor variables are available: 270 254 \begin{description} 271 \item\hspace*{- 0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}}255 \item\hspace*{-4pt}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}} 272 256 is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{ 273 257 The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed. 274 258 Hence, the need to have three variables for the major, minor and patch version number.} 275 259 276 \item\hspace*{- 0.6ex}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}}260 \item\hspace*{-4pt}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}} 277 261 is always available during preprocessing and its value is the current minor \Index{version number} of \CFA. 278 262 279 \item\hspace*{- 0.6ex}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©}263 \item\hspace*{-4pt}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©} 280 264 is always available during preprocessing and its value is the current patch \Index{version number} of \CFA. 281 265 282 \item\hspace*{- 0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©} and\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}283 are always available during preprocessing and haveno value.266 \item\hspace*{-4pt}\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} 267 is always available during preprocessing and it has no value. 284 268 \end{description} 285 269 … … 288 272 \begin{lstlisting} 289 273 #ifndef __CFORALL__ 290 #include <stdio.h> // C header file274 #include <stdio.h> // C header file 291 275 #else 292 #include <fstream> // §\CFA{}§ header file276 #include <fstream> // §\CFA{}§ header file 293 277 #endif 294 278 \end{lstlisting} … … 300 284 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, e.g.: 301 285 \begin{lstlisting} 302 2®_®147®_®483®_®648; // decimal constant303 56_ul; // decimal unsigned long constant304 0_377; // octal constant305 0x_ff_ff; // hexadecimal constant306 0x_ef3d_aa5c; // hexadecimal constant307 3.141_592_654; // floating point constant308 10_e_+1_00; // floating point constant309 0x_ff_ff_p_3; // hexadecimal floating point310 0x_1.ffff_ffff_p_128_l; // hexadecimal floating point long constant311 L_"\x_ff_ee"; // wide character constant286 2®_®147®_®483®_®648; // decimal constant 287 56_ul; // decimal unsigned long constant 288 0_377; // octal constant 289 0x_ff_ff; // hexadecimal constant 290 0x_ef3d_aa5c; // hexadecimal constant 291 3.141_592_654; // floating point constant 292 10_e_+1_00; // floating point constant 293 0x_ff_ff_p_3; // hexadecimal floating point 294 0x_1.ffff_ffff_p_128_l; // hexadecimal floating point long constant 295 L_"\x_ff_ee"; // wide character constant 312 296 \end{lstlisting} 313 297 The rules for placement of underscores is as follows: … … 327 311 \end{enumerate} 328 312 It is significantly easier to read and enter long constants when they are broken up into smaller groupings (most cultures use comma or period among digits for the same purpose). 329 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in Ada and Java 8.313 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in Ada and Java. 330 314 331 315 … … 337 321 \begin{quote2} 338 322 \begin{tabular}{@{}ll@{}} 339 \begin{lstlisting} 340 int *x[ 5]323 \begin{lstlisting}[aboveskip=0pt,belowskip=0pt] 324 int *x[ 5 ] 341 325 \end{lstlisting} 342 326 & … … 348 332 For example, a routine returning a pointer to an array of integers is defined and used in the following way: 349 333 \begin{lstlisting} 350 int (*f())[ 5] {...};// definition mimics usage351 ... (*f())[ 3] += 1;334 int (*f())[ 5 ] {...}; // definition mimics usage 335 ... (*f())[ 3 ] += 1; 352 336 \end{lstlisting} 353 337 Essentially, the return type is wrapped around the routine name in successive layers (like an onion). 354 338 While attempting to make the two contexts consistent was a laudable goal, it has not worked out in practice. 355 339 356 \CFA provides its own type, variable and routine declarations, using a different syntax. 357 The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type. 358 In the following example, \R{red} is for the base type and \B{blue} is for the qualifiers. 359 The \CFA declarations move the qualifiers to the left of the base type, i.e., blue to the left of the red, while the qualifiers have the same meaning but are ordered left to left to right to specify the variable's type. 360 \begin{quote2} 361 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} 362 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 363 \begin{lstlisting} 364 ß[5] *ß ®int® x1; 365 ß* [5]ß ®int® x2; 366 ß[* [5] int]ß f®( int p )®; 367 \end{lstlisting} 368 & 369 \begin{lstlisting} 370 ®int® ß*ß x1 ß[5]ß; 371 ®int® ß(*ßx2ß)[5]ß; 372 ßint (*ßf®( int p )®ß)[5]ß; 373 \end{lstlisting} 374 \end{tabular} 375 \end{quote2} 340 \CFA provides its own type, variable and routine declarations, using a slightly different syntax. 341 The new declarations place modifiers to the left of the base type, while C declarations place modifiers to the right of the base type. 376 342 The only exception is bit field specification, which always appear to the right of the base type. 377 % Specifically, the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array or function return value, and parentheses ©()© are used to indicate a routine parameter. 378 However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list. 343 C and the new \CFA declarations may appear together in the same program block, but cannot be mixed within a specific declaration. 344 345 In \CFA declarations, the same tokens are used as in C: the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array, and parentheses ©()© are used to indicate a routine parameter. 346 However, unlike C, \CFA type declaration tokens are specified from left to right and the entire type specification is distributed across all variables in the declaration list. 379 347 For instance, variables ©x© and ©y© of type pointer to integer are defined in \CFA as follows: 380 348 \begin{quote2} 381 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}382 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\383 \begin{lstlisting} 384 ®* ® int x, y;349 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 350 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 351 \begin{lstlisting} 352 ®* int x, y;® 385 353 \end{lstlisting} 386 354 & 387 355 \begin{lstlisting} 388 int ®*®x, ®*®y;356 int *x, *y; 389 357 \end{lstlisting} 390 358 \end{tabular} … … 392 360 Other examples are: 393 361 \begin{quote2} 394 \begin{tabular}{@{}l@{\hspace{3 em}}l@{\hspace{2em}}l@{}}395 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\362 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} 363 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}} \\ 396 364 \begin{lstlisting} 397 365 [ 5 ] int z; … … 429 397 \end{quote2} 430 398 431 All type qualifiers, e.g., ©const©, ©volatile©, etc., are used in the normal way with the new declarations and alsoappear left to right, e.g.:399 All type qualifiers, i.e., ©const© and ©volatile©, are used in the normal way with the new declarations but appear left to right, e.g.: 432 400 \begin{quote2} 433 \begin{tabular}{@{}l@{\hspace{ 1em}}l@{\hspace{1em}}l@{}}434 \multicolumn{1}{c@{\hspace{ 1em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{1em}}}{\textbf{C}} \\401 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} 402 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}} \\ 435 403 \begin{lstlisting} 436 404 const * const int x; … … 449 417 \end{tabular} 450 418 \end{quote2} 451 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}419 All declaration qualifiers, i.e., ©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} 452 420 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.: 453 421 \begin{quote2} 454 \begin{tabular}{@{}l@{\hspace{3 em}}l@{\hspace{2em}}l@{}}455 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\422 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} 423 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}} \\ 456 424 \begin{lstlisting} 457 425 extern [ 5 ] int x; … … 475 443 e.g.: 476 444 \begin{lstlisting} 477 x; // int x478 *y; // int *y479 f( p1, p2 ); // int f( int p1, int p2 );480 f( p1, p2 ) {} // int f( int p1, int p2 ) {}481 \end{lstlisting} 482 483 Finally, new \CFA declarations may appear together with C declarations in the same program block, but cannot be mixed within a specific declaration.445 x; // int x 446 *y; // int *y 447 f( p1, p2 ); // int f( int p1, int p2 ); 448 f( p1, p2 ) {} // int f( int p1, int p2 ) {} 449 \end{lstlisting} 450 451 As stated above, the two styles of declaration may appear together in the same block. 484 452 Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style. 485 453 Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems. … … 490 458 The new declaration syntax can be used in other contexts where types are required, e.g., casts and the pseudo-routine ©sizeof©: 491 459 \begin{quote2} 492 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}493 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\494 \begin{lstlisting} 495 y = ( ®* int®)x;496 i = sizeof( ®[ 5 ] * int®);460 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 461 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 462 \begin{lstlisting} 463 y = (* int)x; 464 i = sizeof([ 5 ] * int); 497 465 \end{lstlisting} 498 466 & 499 467 \begin{lstlisting} 500 y = ( ®int *®)x;501 i = sizeof( ®int *[ 5 ]®);468 y = (int *)x; 469 i = sizeof(int *[ 5 ]); 502 470 \end{lstlisting} 503 471 \end{tabular} … … 508 476 509 477 \CFA also supports a new syntax for routine definition, as well as ISO C and K\&R routine syntax. 510 The point of the new syntax is to allow returning multiple values from a routine~\cite{ Galletly96,CLU}, e.g.:478 The point of the new syntax is to allow returning multiple values from a routine~\cite{CLU,Galletly96}, e.g.: 511 479 \begin{lstlisting} 512 480 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) { … … 522 490 Declaration qualifiers can only appear at the start of a routine definition, e.g.: 523 491 \begin{lstlisting} 524 ®extern®[ int x ] g( int y ) {§\,§}492 extern [ int x ] g( int y ) {§\,§} 525 493 \end{lstlisting} 526 494 Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified; 527 495 in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in: 528 496 \begin{lstlisting} 529 [§\,§] g(); // no input or output parameters530 [ void ] g( void ); // no input or output parameters497 [§\,§] g(); // no input or output parameters 498 [ void ] g( void ); // no input or output parameters 531 499 \end{lstlisting} 532 500 … … 535 503 [ i, j, ch ] = f( 3, 'a', ch ); 536 504 \end{lstlisting} 537 The list of return values from f and the grouping on the left-hand side of the assignment is called a \newterm{return list}and discussed in Section 12.505 The list of return values from f and the grouping on the left-hand side of the assignment is called a tuple and discussed in Section 12. 538 506 539 507 \CFA style declarations cannot be used to declare parameters for K\&R style routine definitions because of the following ambiguity: … … 546 514 \begin{lstlisting} 547 515 typedef int foo; 548 int f( int (* foo) ); // foo is redefined as a parameter name516 int f( int (* foo) ); // foo is redefined as a parameter name 549 517 \end{lstlisting} 550 518 The string ``©int (* foo)©'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo. 551 The redefinition of a type name in a parameter list is the only context in C where the character ©*© can appear to the left of a type name, and \CFA relies on all type qualifier characters appearing to the right of the type name.519 The redefinition of a type name in a parameter list is the only context in C where the character ©*© can appear to the left of a type name, and \CFA relies on all type modifier characters appearing to the right of the type name. 552 520 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. 553 521 554 522 C-style declarations can be used to declare parameters for \CFA style routine definitions, e.g.: 555 523 \begin{lstlisting} 556 [ int ] f( * int, int * ); // returns an integer, accepts 2 pointers to integers557 [ * int, int * ] f( int ); // returns 2 pointers to integers, accepts an integer524 [ int ] f( * int, int * ); // returns an integer, accepts 2 pointers to integers 525 [ * int, int * ] f( int ); // returns 2 pointers to integers, accepts an integer 558 526 \end{lstlisting} 559 527 The reason for allowing both declaration styles in the new context is for backwards compatibility with existing preprocessor macros that generate C-style declaration-syntax, as in: 560 528 \begin{lstlisting} 561 529 #define ptoa( n, d ) int (*n)[ d ] 562 int f( ptoa( p, 5) ) ... // expands to int f( int (*p)[ 5 ] )563 [ int ] f( ptoa( p, 5) ) ... // expands to [ int ] f( int (*p)[ 5 ] )530 int f( ptoa(p,5) ) ... // expands to int f( int (*p)[ 5 ] ) 531 [ int ] f( ptoa(p,5) ) ... // expands to [ int ] f( int (*p)[ 5 ] ) 564 532 \end{lstlisting} 565 533 Again, programmers are highly encouraged to use one declaration form or the other, rather than mixing the forms. 566 534 567 535 568 \subsection{ Named ReturnValues}569 570 \Index{Named return values}handle the case where it is necessary to define a local variable whose value is then returned in a ©return© statement, as in:536 \subsection{Returning Values} 537 538 Named return values handle the case where it is necessary to define a local variable whose value is then returned in a ©return© statement, as in: 571 539 \begin{lstlisting} 572 540 int f() { … … 577 545 \end{lstlisting} 578 546 Because the value in the return variable is automatically returned when a \CFA routine terminates, the ©return© statement \emph{does not} contain an expression, as in: 579 \newline 580 \begin{minipage}{\linewidth} 581 \begin{lstlisting} 582 ®[ int x, int y ]® f() { 583 int z; 584 ... x = 0; ... y = z; ... 585 ®return;® // implicitly return x, y 586 } 587 \end{lstlisting} 588 \end{minipage} 589 \newline 590 When the return is encountered, the current values of ©x© and ©y© are returned to the calling routine. 547 \begin{lstlisting} 548 ®[ int x ]® f() { 549 ... x = 0; ... x = y; ... 550 ®return;® // implicitly return x 551 } 552 \end{lstlisting} 553 When the return is encountered, the current value of ©x© is returned to the calling routine. 591 554 As well, ``falling off the end'' of a routine without a ©return© statement is permitted, as in: 592 555 \begin{lstlisting} 593 [ int x , int y] f() {594 ... 595 } // implicitly return x , y596 \end{lstlisting} 597 In this case, the current value s of ©x© and ©y© arereturned to the calling routine just as if a ©return© had been encountered.556 [ int x ] f() { 557 ... x = 0; ... x = y; ... 558 } // implicitly return x 559 \end{lstlisting} 560 In this case, the current value of ©x© is returned to the calling routine just as if a ©return© had been encountered. 598 561 599 562 … … 603 566 as well, parameter names are optional, e.g.: 604 567 \begin{lstlisting} 605 [ int x ] f (); // returning int with no parameters606 [ * int ] g (int y); // returning pointer to int with int parameter607 [ ] h (int,char); // returning no result with int and char parameters608 [ * int,int ] j (int); // returning pointer to int and int, with int parameter568 [ int x ] f (); // returning int with no parameters 569 [ * int ] g (int y); // returning pointer to int with int parameter 570 [ ] h (int,char); // returning no result with int and char parameters 571 [ * int,int ] j (int); // returning pointer to int and int, with int parameter 609 572 \end{lstlisting} 610 573 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa). 611 574 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.: 612 575 \begin{quote2} 613 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}614 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\576 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 577 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 615 578 \begin{lstlisting} 616 579 [ int ] f(int), g; … … 641 604 for example, the following is incorrect: 642 605 \begin{lstlisting} 643 * [ int x ] f () fp; // routine name "f" is not allowed606 * [ int x ] f () fp; // routine name "f" is not allowed 644 607 \end{lstlisting} 645 608 … … 774 737 While in theory default arguments can be simulated with overloading, as in: 775 738 \begin{quote2} 776 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}777 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{default arguments}} & \multicolumn{1}{c}{\textbf{overloading}} \\739 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 740 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{default arguments}} & \multicolumn{1}{c}{\textbf{overloading}} \\ 778 741 \begin{lstlisting} 779 742 void p( int x, int y = 2, int z = 3 ) {...} … … 810 773 \CFA allows \Index{type nesting}, and type qualification of the nested types, where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification. 811 774 \begin{quote2} 812 \begin{tabular}{@{}l@{\hspace{3 em}}l|l@{}}813 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}} & \multicolumn{1}{|c}{\textbf{\CFA}} \\775 \begin{tabular}{@{}l@{\hspace{30pt}}l|l@{}} 776 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}} & \multicolumn{1}{|c}{\textbf{\CFA}} \\ 814 777 \hline 815 778 \begin{lstlisting} … … 917 880 918 881 919 \section{ Lexical List}882 \section{Tuples} 920 883 921 884 In C and \CFA, lists of elements appear in several contexts, such as the parameter list for a routine call. 922 885 (More contexts are added shortly.) 923 A list of such elements is called a \newterm{lexical list}.924 The general syntax of a lexical listis:886 A list of such elements is called a tuple. 887 The general syntax of a tuple is: 925 888 \begin{lstlisting} 926 889 [ §\emph{exprlist}§ ] 927 890 \end{lstlisting} 928 891 where ©$\emph{exprlist}$© is a list of one or more expressions separated by commas. 929 The brackets, ©[]©, allow differentiating between lexical lists and expressions containing the C comma operator.930 The following are examples of lexical lists:892 The brackets, ©[]©, allow differentiating between tuples and expressions containing the C comma operator. 893 The following are examples of tuples: 931 894 \begin{lstlisting} 932 895 [ x, y, z ] … … 1217 1180 \begin{figure} 1218 1181 \centering 1219 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}1220 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1182 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 1183 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1221 1184 \begin{lstlisting} 1222 1185 ®L1:® for ( ... ) { … … 1248 1211 \vspace*{0.25in} 1249 1212 1250 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}1251 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1213 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 1214 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 1252 1215 \begin{lstlisting} 1253 1216 ®L1®: for ( ... ) { … … 1490 1453 Therefore, the ©case© clause is extended with a list of values, as in: 1491 1454 \begin{quote2} 1492 \begin{tabular}{@{}l@{\hspace{3 em}}l@{\hspace{2em}}l@{}}1493 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\1455 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} 1456 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{C}} \\ 1494 1457 \begin{lstlisting} 1495 1458 switch ( i ) { … … 1522 1485 In addition, two forms of subranges are allowed to specify case values: the GNU C form and a new \CFA form. 1523 1486 \begin{quote2} 1524 \begin{tabular}{@{}l@{\hspace{3 em}}l@{\hspace{2em}}l@{}}1525 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{GNU C}} \\1487 \begin{tabular}{@{}l@{\hspace{30pt}}l@{\hspace{20pt}}l@{}} 1488 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{20pt}}}{\textbf{GNU C}} \\ 1526 1489 \begin{lstlisting} 1527 1490 switch ( i ) { … … 2044 2007 Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization expression type. 2045 2008 \begin{quote2} 2046 \begin{tabular}{@{}l@{\hspace{3 em}}ll@{}}2047 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CC}} & \multicolumn{1}{c}{©gcc©}\index{gcc} \\2009 \begin{tabular}{@{}l@{\hspace{30pt}}ll@{}} 2010 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CC}} & \multicolumn{1}{c}{©gcc©}\index{gcc} \\ 2048 2011 \begin{lstlisting} 2049 2012 … … 4147 4110 The general case is printing out a sequence of variables separated by whitespace. 4148 4111 \begin{quote2} 4149 \begin{tabular}{@{}l@{\hspace{3 em}}l@{}}4150 \multicolumn{1}{c@{\hspace{3 em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\4112 \begin{tabular}{@{}l@{\hspace{30pt}}l@{}} 4113 \multicolumn{1}{c@{\hspace{30pt}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\ 4151 4114 \begin{lstlisting} 4152 4115 int x = 0, y = 1, z = 2;
Note:
See TracChangeset
for help on using the changeset viewer.