Changes in doc/user/user.tex [fe97a7d8:67f2170]
- File:
-
- 1 edited
-
doc/user/user.tex (modified) (48 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
rfe97a7d8 r67f2170 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sat Jul 22 11:01:19 201714 %% Update Count : 2 87813 %% Last Modified On : Fri Jul 7 10:36:39 2017 14 %% Update Count : 2547 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 57 57 \CFAStyle % use default CFA format-style 58 58 59 \lstnewenvironment{C++}[1][]60 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}61 {}62 63 59 % inline code ©...© (copyright symbol) emacs: C-q M-) 64 60 % red highlighting ®...® (registered trademark symbol) emacs: C-q M-. … … 141 137 142 138 \CFA{}\index{cforall@\CFA}\footnote{Pronounced ``\Index*{C-for-all}'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed as an evolutionary step forward for the C programming language. 143 The syntax of \CFA builds from Cand should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.139 The syntax of the \CFA language builds from C, and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers. 144 140 % Any language feature that is not described here can be assumed to be using the standard \Celeven syntax. 145 \CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving similarperformance.146 Like C, \CFA is a statically typed, procedural (non-\Index{object-oriented})language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.141 \CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving C performance. 142 Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible. 147 143 The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules. 148 144 149 One of the main design philosophies of \CFA is to ``\Index{describe not prescribe}'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''. 150 Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming. 151 A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to there C counterpart. 152 There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA; 153 instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features. 154 As well, new programs can be written in \CFA using a combination of C and \CFA features. 155 156 \Index*[C++]{\CC{}} had a similar goal 30 years ago, allowing object-oriented programming to be incrementally added to C. 157 However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that cannot be updated, and active divergence of the language model from C, all of which requires significant effort and training to incrementally add \CC to a C-based project. 145 One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''. 146 Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming features. 147 A programmer is always free to reach back to C from \CFA for any reason, and in many cases, new \CFA features have a fallback to a C mechanism. 148 There is no notion or requirement for rewriting a legacy C program in \CFA; 149 instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features. 150 New programs can be written in \CFA using a combination of C and \CFA features. 151 \Index*[C++]{\CC{}} had a similar goal 30 years ago, but currently has the disadvantages of multiple legacy design-choices that cannot be updated and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project. 158 152 In contrast, \CFA has 30 years of hindsight and a clean starting point. 159 153 … … 162 156 \begin{quote2} 163 157 \begin{tabular}{@{}l@{\hspace{1.5em}}l@{\hspace{1.5em}}l@{}} 164 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{C}} & \multicolumn{1}{c}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\ 165 \begin{cfa} 158 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} & \multicolumn{1}{c}{\textbf{\CC}} \\ 159 \begin{cfa} 160 #include <fstream>§\indexc{fstream}§ 161 162 int main( void ) { 163 int x = 0, y = 1, z = 2; 164 ®sout | x | y | z | endl;® 165 } 166 \end{cfa} 167 & 168 \begin{lstlisting} 166 169 #include <stdio.h>§\indexc{stdio.h}§ 167 170 … … 170 173 ®printf( "%d %d %d\n", x, y, z );® 171 174 } 172 \end{ cfa}175 \end{lstlisting} 173 176 & 174 \begin{cfa} 175 #include <fstream>§\indexc{fstream}§ 176 177 int main( void ) { 178 int x = 0, y = 1, z = 2; 179 ®sout | x | y | z | endl;®§\indexc{sout}§ 180 } 181 \end{cfa} 182 & 183 \begin{cfa} 177 \begin{lstlisting} 184 178 #include <iostream>§\indexc{iostream}§ 185 179 using namespace std; … … 188 182 ®cout<<x<<" "<<y<<" "<<z<<endl;® 189 183 } 190 \end{ cfa}184 \end{lstlisting} 191 185 \end{tabular} 192 186 \end{quote2} 193 187 While the \CFA I/O looks similar to the \Index*[C++]{\CC{}} output style, there are important differences, such as automatic spacing between variables as in \Index*{Python} (see~\VRef{s:IOLibrary}). 194 188 195 \subsection{Background}196 197 189 This document is a programmer reference-manual for the \CFA programming language. 198 190 The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature. 199 191 The manual does not teach programming, i.e., how to combine the new constructs to build complex programs. 200 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented ,as well as some experience programming in C/\CC.201 Implementers shouldrefer to the \CFA Programming Language Specification for details about the language syntax and semantics.192 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented as well as some experience programming in C/\CC. 193 Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics. 202 194 Changes to the syntax and additional features are expected to be included in later revisions. 203 195 … … 208 200 This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more. 209 201 Even with all its problems, C continues to be popular because it allows writing software at virtually any level in a computer system without restriction. 210 For system programming, where direct access to hardware , storage management, and real-time issues are a requirement, C is usually the onlylanguage of choice.202 For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice. 211 203 The TIOBE index~\cite{TIOBE} for March 2016 showed the following programming-language popularity: \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC{}} 6.7\%, \Csharp 4.3\%, \Index*{Python} 4.3\%, where the next 50 languages are less than 3\% each with a long tail. 212 204 As well, for 30 years, C has been the number 1 and 2 most popular programming language: … … 224 216 \end{center} 225 217 Hence, C is still an extremely important programming language, with double the usage of \Index*[C++]{\CC{}}; in many cases, \CC is often used solely as a better C. 226 Love it or hate it, C has been an important and influential part of computer science for 40 years and itsappeal is not diminishing.227 Unfortunately, C has many problems and omissions that make it an unacceptable programming language for modern needs.228 229 As stated, the goal of the \CFA project is to engineer modern language -features into C in an evolutionary rather than revolutionary way.218 Love it or hate it, C has been an important and influential part of computer science for 40 years and sit appeal is not diminishing. 219 Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs. 220 221 As stated, the goal of the \CFA project is to engineer modern language features into C in an evolutionary rather than revolutionary way. 230 222 \CC~\cite{C++14,C++} is an example of a similar project; 231 however, it largely extended the C language, and did not address most of C'sexisting problems.\footnote{%223 however, it largely extended the language, and did not address many existing problems.\footnote{% 232 224 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.} 233 \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.225 \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. 234 226 \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. 235 These languages have different syntax and semantics from C, do not interoperate directly with C, and are not systems languages because of restrictive memory-management orgarbage collection.227 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection. 236 228 As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten. 237 These costs can be prohibitive for many companies with a large software -base in C/\CC, and a significant number of programmers require retraining to thenew programming language.238 239 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fix es many of the well known C problems while containing modern language-features.229 These costs can be prohibitive for many companies with a large software base in C/\CC, and a significant number of programmers requiring retraining to a new programming language. 230 231 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixing some of the well known C problems and containing many modern language features. 240 232 Without significant extension to the C programming language, it is becoming unable to cope with the needs of modern programming problems and programmers; 241 233 as a result, it will fade into disuse. 242 234 Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language. 243 While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language -features.244 While some may argue that modern language -features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.235 While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language features. 236 While some may argue that modern language features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today. 245 237 246 238 247 239 \section{History} 248 240 249 The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples.241 The \CFA project started with \Index*{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. 250 242 (See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.) 251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}. 252 253 The signature feature of \CFA is \emph{\Index{overload}able} \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name): 243 A first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}. 244 The signature feature of \CFA is parametric-polymorphic functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name): 254 245 \begin{lstlisting} 255 246 ®forall( otype T )® T identity( T val ) { return val; } … … 257 248 \end{lstlisting} 258 249 % extending the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC{}} approach of object-oriented extensions. 259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfi eld~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.250 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}. 260 251 However, at that time, there was little interesting in extending C, so work did not continue. 261 As the saying goes, `` \Index*{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.252 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. 262 253 263 254 … … 266 257 267 258 \CFA is designed to integrate directly with existing C programs and libraries. 268 The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no complex interface oroverhead to call existing C routines.259 The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no overhead to call existing C routines. 269 260 This feature allows \CFA programmers to take advantage of the existing panoply of C libraries to access thousands of external software features. 270 261 Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself. 271 262 Fortunately, \CFA, like \Index*[C++]{\CC{}}, 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. 272 Hence, \CFA begins by leveraging the large repository of C libraries , and than allows programmers to incrementally augment their C programs with modern \Index{backward-compatible} features.263 Hence, \CFA begins by leveraging the large repository of C libraries with little cost. 273 264 274 265 \begin{comment} … … 313 304 \end{comment} 314 305 315 However, it is necessary to differentiate between C and \CFA code because of name \Index{overload}ing, as for \CC.306 However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC. 316 307 For example, the C math-library provides the following routines for computing the absolute value of the basic types: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©. 317 Whereas, \CFA wraps each of these routines into ones with the overloadedname ©abs©:308 Whereas, \CFA wraps each of these routines into ones with the common name ©abs©: 318 309 \begin{cfa} 319 310 char abs( char ); 320 ®extern "C" {® int abs( int ); ®}® §\C{// use default C routine for int}§ 311 ®extern "C" {® 312 int abs( int ); §\C{// use default C routine for int}§ 313 ®}® // extern "C" 321 314 long int abs( long int ); 322 315 long long int abs( long long int ); … … 333 326 Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed. 334 327 There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type. 335 336 This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}. 328 This example strongly illustrates a core idea in \CFA: \emph{the power of a name}. 337 329 The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value. 338 Hence, knowing the name ©abs© issufficient to apply it to any type where it is applicable.339 The time savings and safety of using one name uniformly versus $N$ unique names cannot be underestimated.340 341 342 \section[Compiling a CFA Program]{Compiling a\CFA Program}343 344 The command ©cfa© is used to compile a \CFA program and is based on the \Index{GNU}\Indexc{gcc} command, \eg:345 \begin{cfa} 346 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA {}§-files [ assembler/loader-files ]330 Hence, knowing the name ©abs© should be sufficient to apply it to any type where it is applicable. 331 The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated. 332 333 334 \section[Compiling CFA Program]{Compiling \CFA Program} 335 336 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg: 337 \begin{cfa} 338 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] 347 339 \end{cfa} 348 340 \CFA programs having the following ©gcc© flags turned on: … … 352 344 The 1999 C standard plus GNU extensions. 353 345 \item 354 \Indexc[deletekeywords=inline]{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{\lstinline[deletekeywords=inline]$-fgnu89-inline$}} 346 {\lstset{deletekeywords={inline}} 347 \Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}} 355 348 Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files. 349 }% 356 350 \end{description} 357 351 The following new \CFA options are available: … … 360 354 \Indexc{-CFA}\index{compilation option!-CFA@©-CFA©} 361 355 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. 362 The generated code start s with the standard \CFA \Index{prelude}.356 The generated code started with the standard \CFA prelude. 363 357 364 358 \item 365 359 \Indexc{-debug}\index{compilation option!-debug@©-debug©} 366 360 The program is linked with the debugging version of the runtime system. 367 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but can substantially slow program execution.361 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program. 368 362 The runtime checks should only be removed after the program is completely debugged. 369 363 \textbf{This option is the default.} … … 372 366 \Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©} 373 367 The program is linked with the non-debugging version of the runtime system, so the execution of the program is faster. 374 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program behaviour ortermination.}368 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.} 375 369 376 370 \item … … 392 386 \textbf{This option is the default.} 393 387 394 \begin{comment}395 388 \item 396 389 \Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©} 397 390 Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}). 398 391 \textbf{This option is \emph{not} the default.} 399 \end{comment}400 392 \end{description} 401 393 … … 418 410 \item 419 411 \Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©}, 420 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} ,and412 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} and 421 413 \Indexc{__cforall}\index{preprocessor variables!__cforall@©__cforall©} 422 414 are always available during preprocessing and have no value. 423 415 \end{description} 424 416 These preprocessor variables allow conditional compilation of programs that must work differently in these situations. 425 For example, to toggle between C and \CFA extensions, us ethe following:417 For example, to toggle between C and \CFA extensions, using the following: 426 418 \begin{cfa} 427 419 #ifndef __CFORALL__ … … 434 426 435 427 436 \section{Constant Underscores}437 438 Numeric constants are extended to allow \Index{underscore}s \index{constant!underscore}, \eg:428 \section{Constants Underscores} 429 430 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg: 439 431 \begin{cfa} 440 432 2®_®147®_®483®_®648; §\C{// decimal constant}§ … … 449 441 L®_®§"\texttt{\textbackslash{x}}§®_®§\texttt{ff}§®_®§\texttt{ee}"§; §\C{// wide character constant}§ 450 442 \end{cfa} 451 The rules for placement of underscores are:452 \begin{enumerate} [topsep=5pt,itemsep=5pt,parsep=0pt]443 The rules for placement of underscores is as follows: 444 \begin{enumerate} 453 445 \item 454 446 A sequence of underscores is disallowed, \eg ©12__34© is invalid. … … 471 463 \label{s:BackquoteIdentifiers} 472 464 473 \CFA introduces several new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code. 474 Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism: 465 \CFA accommodates keyword clashes with existing C variable-names by syntactic transformations using the \CFA backquote escape-mechanism: 475 466 \begin{cfa} 476 467 int ®`®otype®`® = 3; §\C{// make keyword an identifier}§ 477 468 double ®`®forall®`® = 3.5; 478 469 \end{cfa} 479 480 470 Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name. 481 \VRef[Figure]{f:HeaderFileInterposition} shows how clashes in existing C header-files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©. 482 Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience. 471 \VRef[Figure]{f:InterpositionHeaderFile} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©: 483 472 484 473 \begin{figure} 485 474 \begin{cfa} 486 // include file uses the CFA keyword " with".487 #if ! defined( with) §\C{// nesting ?}§488 #define with ®`®with®`®§\C{// make keyword an identifier}§475 // include file uses the CFA keyword "otype". 476 #if ! defined( otype ) §\C{// nesting ?}§ 477 #define otype ®`®otype®`® §\C{// make keyword an identifier}§ 489 478 #define __CFA_BFD_H__ 490 #endif 491 492 ®#include_next <bfdlink.h>§\C{// must have internal check for multiple expansion}§493 ® 494 #if defined( with) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§495 #undef with479 #endif // ! otype 480 481 #®include_next® <bfd.h> §\C{// must have internal check for multiple expansion}§ 482 483 #if defined( otype ) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§ 484 #undef otype 496 485 #undef __CFA_BFD_H__ 497 #endif 498 \end{cfa} 499 \caption{ Header-File Interposition}500 \label{f: HeaderFileInterposition}486 #endif // otype && __CFA_BFD_H__ 487 \end{cfa} 488 \caption{Interposition of Header File} 489 \label{f:InterpositionHeaderFile} 501 490 \end{figure} 502 491 503 492 504 \section{ \texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break}}{Labelled continue / break}}493 \section{Labelled Continue/Break} 505 494 506 495 While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure. 507 496 Unfortunately, this restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting. 508 To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85 }, as in Java.497 To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85,Java}. 509 498 For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement; 510 499 for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement. … … 523 512 ®LF:® for ( ... ) { 524 513 ®LW:® while ( ... ) { 525 ... break ®LC®; ... // terminate compound526 ... break ®LS®; ... // terminate switch527 ... break ®LIF®; ... // terminate if528 ... continue ®LF;® ... // resume loop529 ... break ®LF®; ... // terminate loop530 ... continue ®LW®; ... // resume loop531 ... break ®LW®; ... // terminate loop514 ... break ®LC®; ... // terminate compound 515 ... break ®LS®; ... // terminate switch 516 ... break ®LIF®; ... // terminate if 517 ... continue ®LF;® ... // resume loop 518 ... break ®LF®; ... // terminate loop 519 ... continue ®LW®; ... // resume loop 520 ... break ®LW®; ... // terminate loop 532 521 } // while 533 522 } // for 534 523 } else { 535 ... break ®LIF®; ... // terminate if524 ... break ®LIF®; ... // terminate if 536 525 } // if 537 526 } // switch … … 575 564 LF: for ( ;; ) { 576 565 LW: while ( 1 ) { 577 break LC; // terminate compound578 break LS; // terminate switch579 break LIF; // terminate if580 continue LF; // resume loop581 break LF; // terminate loop582 continue LW; // resume loop583 break LW; // terminate loop566 break LC; // terminate compound 567 break LS; // terminate switch 568 break LIF; // terminate if 569 continue LF; // resume loop 570 break LF; // terminate loop 571 continue LW; // resume loop 572 break LW; // terminate loop 584 573 } // while 585 574 } // for 586 575 } else { 587 break LIF; // terminate if576 break LIF; // terminate if 588 577 } // if 589 578 } // switch … … 624 613 \item 625 614 They cannot branch into a control structure. 626 This restriction prevents missing declarations and/or initializationsat the start of a control structure resulting in undefined behaviour.615 This restriction prevents missing initialization at the start of a control structure resulting in undefined behaviour. 627 616 \end{itemize} 628 617 The advantage of the labelled ©continue©/©break© is allowing static multi-level exits without having to use the ©goto© statement, and tying control flow to the target control structure rather than an arbitrary point in a program. 629 Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader (\Index{eye candy})that complex control-flow is occurring in the body of the control structure.618 Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure. 630 619 With ©goto©, the label is at the end of the control structure, which fails to convey this important clue early enough to the reader. 631 620 Finally, using an explicit target for the transfer instead of an implicit target allows new constructs to be added or removed without affecting existing constructs. … … 633 622 634 623 635 \section{ \texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}}624 \section{Switch Statement} 636 625 637 626 C allows a number of questionable forms for the ©switch© statement: … … 674 663 ®// open input file 675 664 ®} else if ( argc == 2 ) { 676 ®// open input file (duplicate)665 ®// open input file 677 666 678 667 ®} else { … … 687 676 \begin{cfa} 688 677 switch ( i ) { 689 ®case 1: case 3: case 5:®// odd values690 // oddaction678 case 1: case 3: case 5: // odd values 679 // same action 691 680 break; 692 ®case 2: case 4: case 6:®// even values693 // evenaction681 case 2: case 4: case 6: // even values 682 // same action 694 683 break; 695 684 } … … 697 686 However, this situation is handled in other languages without fall-through by allowing a list of case values. 698 687 While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is unintuitive to many programmers and is different from virtually all other programming languages with a ©switch© statement. 699 Hence, default fall-through semantics results in a large number of programming errors as programmers often \emph{forget}the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.688 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. 700 689 701 690 \item … … 719 708 The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties. 720 709 The comprehension problem occurs from the inability to determine how control reaches a particular point due to the number of branches leading to it. 721 The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning. 722 There are no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it. 710 The technical problem results from the inability to ensure allocation and initialization of variables when blocks are not entered at the beginning. 711 Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors. 712 There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it. 723 713 Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}: 724 714 \begin{cfa} … … 780 770 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. 781 771 \end{itemize} 782 These observations put into perspective the \CFA changes to the ©switch©.772 These observations help to put the \CFA changes to the ©switch© into perspective. 783 773 \begin{enumerate} 784 774 \item … … 801 791 case 7: 802 792 ... 803 ®break® §\C{// redundantexplicit end of switch}§793 ®break® §\C{// explicit end of switch}§ 804 794 default: 805 795 j = 3; … … 807 797 \end{cfa} 808 798 Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses; 809 Animplicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.810 Anexplicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.799 the implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause. 800 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. 811 801 As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers. 812 802 \item … … 837 827 838 828 839 \section{ \texorpdfstring{\LstKeywordStyle{case} Clause}{case Clause}}829 \section{Case Clause} 840 830 841 831 C restricts the ©case© clause of a ©switch© statement to a single value. … … 913 903 914 904 915 \section{\texorpdfstring{\LstKeywordStyle{with} Clause / Statement}{with Clause / Statement}}916 \label{s:WithClauseStatement}917 918 In \Index{object-oriented} programming, there is an implicit first parameter, often names \textbf{©self©} or \textbf{©this©}, which is elided.919 \begin{C++}920 class C {921 int i, j;922 int mem() { ®// implicit "this" parameter923 ® i = 1; ®// this->i924 ® j = 3; ®// this->j925 ® }926 }927 \end{C++}928 Since CFA is non-object-oriented, the equivalent object-oriented program looks like:929 \begin{cfa}930 struct S { int i, j; };931 int mem( S &this ) { // explicit "this" parameter932 ®this.®i = 1; // "this" is not elided933 ®this.®j = 2;934 }935 \end{cfa}936 but it is cumbersome having to write "©this.©" many times in a member.937 938 \CFA provides a ©with© clause/statement (see Pascal~\cite[\S~4.F]{Pascal}) to elided the "©this.©" by opening a scope containing field identifiers, changing the qualified fields into variables and giving an opportunity for optimizing qualified references.939 \begin{cfa}940 int mem( S &this ) ®with this® { // with clause941 i = 1; ®// this.i942 ® j = 2; ®// this.j943 ®}944 \end{cfa}945 which extends to multiple routine parameters:946 \begin{cfa}947 struct T { double m, n; };948 int mem2( S &this1, T &this2 ) ®with this1, this2® {949 i = 1; j = 2;950 m = 1.0; n = 2.0;951 }952 \end{cfa}953 954 The statement form is used within a block:955 \begin{cfa}956 int foo() {957 struct S1 { ... } s1;958 struct S2 { ... } s2;959 ®with s1® { // with statement960 // access fields of s1 without qualification961 ®with s2® { // nesting962 // access fields of s1 and s2 without qualification963 }964 }965 ®with s1, s2® {966 // access unambiguous fields of s1 and s2 without qualification967 }968 }969 \end{cfa}970 971 When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified.972 For fields with the same name but different type, context/cast can be used to disambiguate.973 \begin{cfa}974 struct S { int i; int j; double m; } a, c;975 struct T { int i; int k; int m } b, c;976 ®with a, b® {977 j + k; §\C{// unambiguous, unique names define unique types}§978 i; §\C{// ambiguous, same name and type}§979 a.i + b.i; §\C{// unambiguous, qualification defines unique names}§980 m; §\C{// ambiguous, same name and no context to define unique type}§981 m = 5.0; §\C{// unambiguous, same name and context defines unique type}§982 m = 1; §\C{// unambiguous, same name and context defines unique type}§983 }984 ®with c® { ... } §\C{// ambiguous, same name and no context}§985 ®with (S)c® { ... } §\C{// unambiguous, same name and cast defines unique type}§986 \end{cfa}987 988 989 905 \section{Exception Handling} 990 \label{s:ExceptionHandling}991 906 992 907 Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler. 993 Transfer of control can be local, within a routine, or non-local, among routines. 994 Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise. 995 \begin{cfa} 996 exception_t E {}; §\C{// exception type}§ 908 \begin{cfa} 909 exception void h( int i ); 910 exception int h( int i, double d ); 911 997 912 void f(...) { 998 ... throw E{}; ... §\C{// termination}§ 999 ... throwResume E{}; ... §\C{// resumption}§ 1000 } 913 ... throw h( 3 ); 914 ... i = resume h( 3, 5.1 ); 915 } 916 1001 917 try { 1002 918 f(...); 1003 } catch ( E e : §boolean-predicate§ ) { §\C{// termination handler}§1004 // re cover and continue1005 } catchResume( E e : §boolean-predicate§ ) { §\C{// resumption handler}§1006 // repair and return919 } catch h( int w ) { 920 // reset 921 } resume h( int p, double x ) { 922 return 17; // recover 1007 923 } finally { 1008 // always executed 1009 } 1010 \end{cfa} 1011 The kind of raise and handler match: ©throw© with ©catch© and ©throwResume© with ©catchResume©. 1012 Then the exception type must match along with any additonal predicate must be true. 1013 The ©catch© and ©catchResume© handlers may appear in any oder. 1014 However, the ©finally© clause must appear at the end of the ©try© statement. 924 } 925 \end{cfa} 926 So the type raised would be the mangled name of the exception prototype and that name would be matched at the handler clauses by comparing the strings. 927 The arguments for the call would have to be packed in a message and unpacked at handler clause and then a call made to the handler. 1015 928 1016 929 … … 1223 1136 1224 1137 1225 \section{Exponentiation Operator} 1226 1227 C, \CC, and Java (and many other programming languages) have no exponentiation operator\index{exponentiation!operator}\index{operator!exponentiation}, \ie $x^y$, and instead use a routine, like \Indexc{pow}, to perform the exponentiation operation. 1228 \CFA extends the basic operators with the exponentiation operator ©?\?©\index{?\\?@\lstinline$?\?$} and ©?\=?©\index{?\\=?@\lstinline$?\=?$}, as in, ©x \ y© and ©x \= y©, which means $x^y$ and $x \leftarrow x^y$. 1229 The priority of the exponentiation operator is between the cast and multiplicative operators, so that ©w * (int)x \ (int)y * z© is parenthesized as ©((w * (((int)x) \ ((int)y))) * z)©. 1230 1231 As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types. 1232 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2). 1233 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$. 1234 Hence, it is important to designate exponent integral-constants as unsigned or signed: ©3 \ 3u© return an integral result, while ©3 \ 3© returns a floating-point result. 1235 Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative. 1236 \begin{cfa} 1237 sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl; 1238 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i 1239 \end{cfa} 1240 Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©. 1241 The exponentiation operator is available for all the basic types, but for user-defined types, only the integral-computation versions are available. 1242 For returning an integral value, the user type ©T© must define multiplication, ©*©, and one, ©1©; 1243 for returning a floating-point value, an additional divide of type ©T© into a ©double© returning a ©double© (©double ?/?( double, T )©) is necessary for negative exponents. 1244 1245 1246 \section{Pointer / Reference} 1138 \section{Pointer/Reference} 1247 1139 1248 1140 C provides a \newterm{pointer type}; … … 1252 1144 An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{ 1253 1145 One way to conceptualize the null pointer is that no variable is placed at this address, so the null-pointer address can be used to denote an uninitialized pointer/reference object; 1254 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine. 1255 In general, a value with special meaning among a set of values is called a \emph{\Index{sentinel value}}, \eg ©-1© as a return code value.} 1146 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.} 1256 1147 An address is \newterm{sound}, if it points to a valid memory location in scope, \ie within the program's execution-environment and has not been freed. 1257 1148 Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}. … … 1288 1179 \hline 1289 1180 \begin{cfa} 1290 lda r1,100 // load address of x1291 ld r2,(r1) // load value of x1292 lda r3,104 // load address of y1293 st r2,(r3) // store x into y1181 lda r1,100 // load address of x 1182 ld r2,(r1) // load value of x 1183 lda r3,104 // load address of y 1184 st r2,(r3) // store x into y 1294 1185 \end{cfa} 1295 1186 & 1296 1187 \begin{cfa} 1297 1188 1298 ld r2,(100) // load value of x1299 1300 st r2,(104) // store x into y1189 ld r2,(100) // load value of x 1190 1191 st r2,(104) // store x into y 1301 1192 \end{cfa} 1302 1193 \end{tabular} … … 1594 1485 1595 1486 \item 1596 lvalue to reference conversion: \lstinline[deletekeywords= lvalue]$lvalue-type cv1 T$converts to ©cv2 T &©, which allows implicitly converting variables to references.1487 lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references. 1597 1488 \begin{cfa} 1598 1489 int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &) … … 2703 2594 \begin{cfa}[belowskip=0pt] 2704 2595 char store[®sepSize®]; §\C{// sepSize is the maximum separator size}§ 2705 strcpy( store, sepGet( sout ) ); §\C{// copy current separator}§2706 sepSet( sout, "_" ); §\C{// change separator to underscore}§2596 strcpy( store, sepGet( sout ) ); 2597 sepSet( sout, "_" ); 2707 2598 sout | 1 | 2 | 3 | endl; 2708 2599 \end{cfa} … … 2711 2602 \end{cfa} 2712 2603 \begin{cfa}[belowskip=0pt] 2713 sepSet( sout, store ); §\C{// change separator back to original}§2604 sepSet( sout, store ); 2714 2605 sout | 1 | 2 | 3 | endl; 2715 2606 \end{cfa} … … 3268 3159 \Indexc{gcc} provides ©typeof© to declare a secondary variable from a primary variable. 3269 3160 \CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression. 3270 Only for overloaded routines \emph{with the same return type}is variable type-inferencing possible.3161 Only for overloaded routines with the same return type is variable type-inferencing possible. 3271 3162 Finally, ©auto© presents the programming problem of tracking down a type when the type is actually needed. 3272 3163 For example, given … … 5367 5258 5368 5259 5369 \section{\ texorpdfstring{\CFA Keywords}{Cforall Keywords}}5260 \section{\CFA Keywords} 5370 5261 \label{s:CFAKeywords} 5371 5262 5372 \CFA introduces the following new keywords.5373 5374 5263 \begin{quote2} 5375 \begin{tabular}{llll l}5264 \begin{tabular}{llll} 5376 5265 \begin{tabular}{@{}l@{}} 5377 ©_A t© \\5266 ©_AT© \\ 5378 5267 ©catch© \\ 5379 5268 ©catchResume© \\ 5380 5269 ©choose© \\ 5381 5270 ©coroutine© \\ 5271 ©disable© \\ 5382 5272 \end{tabular} 5383 5273 & 5384 5274 \begin{tabular}{@{}l@{}} 5385 ©disable© \\5386 5275 ©dtype© \\ 5387 5276 ©enable© \\ 5388 5277 ©fallthrough© \\ 5389 5278 ©fallthru© \\ 5279 ©finally© \\ 5280 ©forall© \\ 5390 5281 \end{tabular} 5391 5282 & 5392 5283 \begin{tabular}{@{}l@{}} 5393 ©finally© \\5394 ©forall© \\5395 5284 ©ftype© \\ 5396 5285 ©lvalue© \\ 5397 5286 ©monitor© \\ 5287 ©mutex© \\ 5288 ©one_t© \\ 5289 ©otype© \\ 5398 5290 \end{tabular} 5399 5291 & 5400 5292 \begin{tabular}{@{}l@{}} 5401 ©mutex© \\5402 ©one_t© \\5403 ©otype© \\5404 5293 ©throw© \\ 5405 5294 ©throwResume© \\ 5406 \end{tabular}5407 &5408 \begin{tabular}{@{}l@{}}5409 5295 ©trait© \\ 5410 5296 ©try© \\ 5411 5297 ©ttype© \\ 5412 ©with© \\5413 5298 ©zero_t© \\ 5414 5299 \end{tabular} … … 5445 5330 g( p1, p2 ) int p1, p2; §\C{// int g( int p1, int p2 );}§ 5446 5331 \end{cfa} 5447 \CFA continues to supportK\&R routine definitions:5332 \CFA supports K\&R routine definitions: 5448 5333 \begin{cfa} 5449 5334 f( a, b, c ) §\C{// default int return}§ … … 5586 5471 \Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list: 5587 5472 \begin{quote2} 5588 \begin{tabular}{@{}lllll|l@{}} 5589 \multicolumn{5}{c|}{C11} & \multicolumn{1}{c}{\CFA} \\ 5473 \lstset{deletekeywords={float}} 5474 \begin{tabular}{@{}llll|l@{}} 5475 \multicolumn{4}{c|}{C11} & \multicolumn{1}{c}{\CFA} \\ 5590 5476 \hline 5591 5477 \begin{tabular}{@{}l@{}} … … 5595 5481 \Indexc{errno.h} \\ 5596 5482 \Indexc{fenv.h} \\ 5597 \Indexc[deletekeywords=float]{float.h} \\ 5483 \Indexc{float.h} \\ 5484 \Indexc{inttypes.h} \\ 5485 \Indexc{iso646.h} \\ 5598 5486 \end{tabular} 5599 5487 & 5600 5488 \begin{tabular}{@{}l@{}} 5601 \Indexc{inttypes.h} \\5602 \Indexc{iso646.h} \\5603 5489 \Indexc{limits.h} \\ 5604 5490 \Indexc{locale.h} \\ 5605 5491 \Indexc{math.h} \\ 5606 5492 \Indexc{setjmp.h} \\ 5607 \end{tabular}5608 &5609 \begin{tabular}{@{}l@{}}5610 5493 \Indexc{signal.h} \\ 5611 5494 \Indexc{stdalign.h} \\ 5612 5495 \Indexc{stdarg.h} \\ 5613 5496 \Indexc{stdatomic.h} \\ 5614 \Indexc{stdbool.h} \\5615 \Indexc{stddef.h} \\5616 5497 \end{tabular} 5617 5498 & 5618 5499 \begin{tabular}{@{}l@{}} 5500 \Indexc{stdbool.h} \\ 5501 \Indexc{stddef.h} \\ 5619 5502 \Indexc{stdint.h} \\ 5620 5503 \Indexc{stdio.h} \\ … … 5632 5515 \Indexc{wctype.h} \\ 5633 5516 \\ 5517 \\ 5518 \\ 5634 5519 \end{tabular} 5635 5520 & … … 5637 5522 \Indexc{unistd.h} \\ 5638 5523 \Indexc{gmp.h} \\ 5524 \\ 5525 \\ 5639 5526 \\ 5640 5527 \\ … … 5676 5563 The table shows allocation routines supporting different combinations of storage-management capabilities: 5677 5564 \begin{center} 5678 \begin{tabular}{@{} r|r|l|l|l|l@{}}5679 \multicolumn{1}{c}{}&& \multicolumn{1}{c|}{fill} & resize & alignment & array \\5565 \begin{tabular}{@{}lr|l|l|l|l@{}} 5566 & & \multicolumn{1}{c|}{fill} & resize & alignment & array \\ 5680 5567 \hline 5681 5568 C & ©malloc© & no & no & no & no \\ … … 5684 5571 & ©memalign© & no & no & yes & no \\ 5685 5572 & ©posix_memalign© & no & no & yes & no \\ 5686 \hline5687 5573 C11 & ©aligned_alloc© & no & no & yes & no \\ 5688 \hline5689 5574 \CFA & ©alloc© & no/copy/yes & no/yes & no & yes \\ 5690 5575 & ©align_alloc© & no/yes & no & yes & yes \\
Note:
See TracChangeset
for help on using the changeset viewer.