Changes in doc/user/user.tex [07bc165:a17e7b8]
- File:
-
- 1 edited
-
doc/user/user.tex (modified) (79 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r07bc165 ra17e7b8 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sun Jul 10 12:52:09201614 %% Update Count : 1 20013 %% Last Modified On : Thu Jul 7 08:25:37 2016 14 %% Update Count : 1099 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 127 127 \section{Introduction} 128 128 129 \CFA\footnote{Pronounced ``C-for-all'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed a s anevolutionary step forward from the C programming language.130 The syntax of the \CFA language builds from C, and should look immediately familiar to C/\ Index*[C++]{\CC}programmers.129 \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. 130 The syntax of the \CFA language builds from C, and should look immediately familiar to C/\CC programmers. 131 131 % Any language feature that is not described here can be assumed to be using the standard C11 syntax. 132 132 \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. 133 133 Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global garbage-collection. 134 The primary new features include parametric-polymorphi croutines and types, exceptions, concurrency, and modules.134 The primary new features include parametric-polymorphism routines and types, exceptions, concurrency, and modules. 135 135 136 136 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''. … … 140 140 instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features. 141 141 New programs can be written in \CFA using a combination of C and \CFA features. 142 \ Index*[C++]{\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.142 \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. 143 143 \CFA has 30 years of hindsight and a clean starting point. 144 144 145 Like \ Index*[C++]{\CC}, there may be both an old and new ways to achieve the same effect.145 Like \CC, there may be both an old and new ways to achieve the same effect. 146 146 For example, the following programs compare the \CFA and C I/O mechanisms. 147 147 \begin{quote2} … … 166 166 \end{quote2} 167 167 Both programs output the same result. 168 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 also~\VRef{s:IOLibrary}).168 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}). 169 169 170 170 This document is a user manual for the \CFA programming language, targeted at \CFA programmers. … … 178 178 179 179 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. 180 (See~\cite{Werther96} for some similar work, but for \ Index*[C++]{\CC}.)181 The original \CFA project~\cite{Ditchfield92} extended the C type system with parametric polymorphism and overloading, as opposed to the \ Index*[C++]{\CC}approach of object-oriented extensions to the C type-system.180 (See~\cite{Werther96} for some similar work, but for \CC.) 181 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. 182 182 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. 183 183 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. … … 189 189 For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice. 190 190 As well, there are millions of lines of C legacy code, forming the base for many software development projects (especially on UNIX systems). 191 The TIOBE index (\url{http://www.tiobe.com/tiobe_index}) for March 2016 shows programming-language popularity, with \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC} 6.7\%, \CS 4.3\%, \Index*{Python}4.3\%, and all other programming languages below 3\%.191 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\%. 192 192 As well, for 30 years, C has been the number 1 and 2 most popular programming language: 193 193 \begin{center} … … 203 203 \end{tabular} 204 204 \end{center} 205 Hence, C is still an extremely important programming language, with double the usage of \ Index*[C++]{\CC}, where \CC itself is largely C code.205 Hence, C is still an extremely important programming language, with double the usage of \CC, where \CC itself is largely C code. 206 206 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. 207 207 Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs. … … 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.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.213 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. 214 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. 215 215 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection. 216 216 As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten. … … 232 232 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. 233 233 Language developers often state that adequate library support takes more work than designing and implementing the language itself. 234 Like \ Index*[C++]{\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.234 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. 235 235 Hence, \CFA begins by leveraging the large repository of C libraries with little cost. 236 236 … … 241 241 char abs( char ); 242 242 extern "C" { 243 int abs( int ); §\C{// use default C routine for int}§243 int abs( int ); // use default C routine for int 244 244 } // extern "C" 245 245 long int abs( long int ); … … 253 253 \end{lstlisting} 254 254 The problem is the name clash between the library routine ©abs© and the \CFA names ©abs©. 255 Hence, names appearing in an ©extern "C"© block have \newterm *{C linkage}.256 Then overloading polymorphism uses a mechanism called \newterm{name mangling} \index{mangling!name}to create unique names that are different from C names, which are not mangled.255 Hence, names appearing in an ©extern "C"© block have \newterm{C linkage}. 256 Then overloading polymorphism uses a mechanism called \newterm{name mangling} to create unique names that are different from C names, which are not mangled. 257 257 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. 258 258 There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type. … … 265 265 \section[Compiling CFA Program]{Compiling \CFA Program} 266 266 267 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, e.g.:267 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU ©gcc©\index{gcc} command, e.g.: 268 268 \begin{lstlisting} 269 269 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ] 270 270 \end{lstlisting} 271 \CFA programs having the following ©gcc© flags turned on:271 By default, \CFA programs having the following ©gcc© flags turned on: 272 272 \begin{description} 273 \item 274 \Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}} 273 \item\hspace*{-0.6ex}\Indexc{-std=gnu99}\index{compilation option!-std=gnu99@{©-std=gnu99©}} 275 274 The 1999 C standard plus GNU extensions. 276 \item 277 \Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}} 275 \item\hspace*{-0.6ex}\Indexc{-fgnu89-¶inline¶}\index{compilation option!-fgnu89-inline@{©-fgnu89-¶inline¶©}} 278 276 Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files. 279 277 \end{description} 280 The following new \CFA option s areavailable:278 The following new \CFA option is available: 281 279 \begin{description} 282 \item 283 \Indexc{-CFA}\index{compilation option!-CFA@©-CFA©} 280 \item\hspace*{-0.6ex}\Indexc{-CFA}\index{compilation option!-CFA@{©-CFA©}} 284 281 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. 285 The generated code started with the standard \CFA prelude.286 287 \item288 \Indexc{-debug}\index{compilation option!-debug@©-debug©}289 The program is linked with the debugging version of the runtime system.290 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program.291 The runtime checks should only be removed after the program is completely debugged.292 \textbf{This option is the default.}293 294 \item295 \Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}296 The program is linked with the non-debugging version of the unikernel or multikernel, so the execution of the program is faster.297 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}298 299 \item300 \Indexc{-help}\index{compilation option!-help@©-help©}301 Information about the set of \CFA compilation flags is printed.302 303 \item304 \Indexc{-nohelp}\index{compilation option!-nohelp@©-nohelp©}305 Information about the set of \CFA compilation flags is not printed.306 \textbf{This option is the default.}307 308 \item309 \Indexc{-quiet}\index{compilation option!-quiet@©-quiet©}310 The \CFA compilation message is not printed at the beginning of a compilation.311 312 \item313 \Indexc{-noquiet}\index{compilation option!-noquiet@©-noquiet©}314 The \CFA compilation message is printed at the beginning of a compilation.315 \textbf{This option is the default.}316 282 \end{description} 317 283 318 284 The following preprocessor variables are available: 319 285 \begin{description} 320 \item 321 \Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}} 286 \item\hspace*{-0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@{©__CFA__©}} 322 287 is always available during preprocessing and its value is the current major \Index{version number} of \CFA.\footnote{ 323 288 The C preprocessor allows only integer values in a preprocessor variable so a value like ``\Version'' is not allowed. 324 289 Hence, the need to have three variables for the major, minor and patch version number.} 325 290 326 \item 327 \Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}} 291 \item\hspace*{-0.6ex}\Indexc{__CFA_MINOR__}\index{preprocessor variables!__CFA_MINOR__@{©__CFA_MINOR__©}} 328 292 is always available during preprocessing and its value is the current minor \Index{version number} of \CFA. 329 293 330 \item 331 \Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©} 294 \item\hspace*{-0.6ex}\Indexc{__CFA_PATCH__}\index{preprocessor variables!__CFA_PATCH__@©__CFA_PATCH__©} 332 295 is always available during preprocessing and its value is the current patch \Index{version number} of \CFA. 333 296 334 \item 335 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} 336 is always available during preprocessing and has no value. 297 \item\hspace*{-0.6ex}\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©} and \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} 298 are always available during preprocessing and have no value. 337 299 \end{description} 300 338 301 These preprocessor variables allow conditional compilation of programs that must work differently in these situations. 339 302 For example, to toggle between C and \CFA extensions, using the following: … … 345 308 #endif 346 309 \end{lstlisting} 347 which conditionally includes the correct header file, if the program is compiled using \Indexc{gcc} or \Indexc{cfa}.310 which conditionally includes the correct header file, if the program is compiled using ©gcc© or ©cfa©. 348 311 349 312 … … 379 342 \end{enumerate} 380 343 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). 381 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in \Index*{Ada} and \Index*{Java}8.344 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in Ada and Java 8. 382 345 383 346 … … 396 359 \end{tabular} 397 360 \end{quote2} 398 Is this an array of 5 pointers to integers or a \Index{pointer}to an array of 5 integers?361 Is this an array of 5 pointers to integers or a pointer to an array of 5 integers? 399 362 The fact this declaration is unclear to many C programmers means there are \Index{productivity} and \Index{safety} issues even for basic programs. 400 363 Another example of confusion results from the fact that a routine name and its parameters are embedded within the return type, mimicking the way the return value is used at the routine's call site. 401 For example, a routine returning a \Index{pointer}to an array of integers is defined and used in the following way:364 For example, a routine returning a pointer to an array of integers is defined and used in the following way: 402 365 \begin{lstlisting} 403 366 int (*f())[5] {...}; §\C{}§ … … 410 373 The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type. 411 374 In the following example, \R{red} is for the base type and \B{blue} is for the qualifiers. 412 The \CFA declarations move the qualifiers to the left of the base type, i.e., move theblue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type.375 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 right to specify a variable's type. 413 376 \begin{quote2} 414 377 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 430 393 % 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. 431 394 However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list. 432 For instance, variables ©x© and ©y© of type \Index{pointer}to integer are defined in \CFA as follows:395 For instance, variables ©x© and ©y© of type pointer to integer are defined in \CFA as follows: 433 396 \begin{quote2} 434 397 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 443 406 \end{tabular} 444 407 \end{quote2} 445 The downside of this semantics is the need to separate regular and \Index{pointer}declarations:408 The downside of this semantics is the need to separate regular and pointer declarations: 446 409 \begin{quote2} 447 410 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 586 549 \end{tabular} 587 550 \end{quote2} 588 where the right example is how the compiler logically interpret s the variables in the left example.589 Since a variable name only points to one location during its lifetime, it is an \Index{immutable} \Index{pointer};551 where the right example is how the compiler logically interpreters the variables in the left example. 552 Since a variable name only points to one location during its lifetime, it is an \Index{immutable} pointer; 590 553 hence, variables ©x© and ©y© are constant pointers in the compiler interpretation. 591 554 In general, variable addresses are stored in instructions instead of loaded independently, so an instruction fetch implicitly loads a variable's address. … … 607 570 \end{tabular} 608 571 \end{quote2} 609 Finally, the immutable nature of a variable's address and the fact that there is no storage for a variable address means pointer assignment \index{pointer!assignment}\index{assignment!pointer}is impossible.572 Finally, the immutable nature of a variable's address and the fact that there is no storage for a variable address means pointer assignment is impossible. 610 573 Therefore, the expression ©x = y© only has one meaning, ©*x = *y©, i.e., manipulate values, which is why explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of instruction decoding. 611 574 612 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.575 A pointer/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 576 (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 577 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.: … … 618 581 int x, y, ®*® p1, ®*® p2, ®**® p3; 619 582 p1 = ®&®x; // p1 points to x 620 p2 = p1; // p2 points to x583 p2 = p1; // p2 also points to x 621 584 p1 = ®&®y; // p1 points to y 585 p1 = p2 + 1; // p1 points to y, pointer arithmetic 622 586 p3 = &p2; // p3 points to p2 623 587 \end{lstlisting} … … 628 592 629 593 Notice, an address has a duality\index{address!duality}: a location in memory or the value at that location. 630 In many cases, a compiler might be able toinfer the meaning:594 In many cases, the compiler can infer the meaning: 631 595 \begin{lstlisting} 632 596 p2 = p1 + x; §\C{// compiler infers *p2 = *p1 + x;}§ 633 597 \end{lstlisting} 634 598 because adding the arbitrary integer value in ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation. 635 \Index*{Algol68}~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage.636 However, in C, the following cases are ambiguous, especially with pointer arithmetic:599 Algol68~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage. 600 However, there are ambiguous cases, especially when \Index{pointer arithmetic} is possible, as in C: 637 601 \begin{lstlisting} 638 602 p1 = p2; §\C{// p1 = p2\ \ or\ \ *p1 = *p2}§ … … 640 604 \end{lstlisting} 641 605 642 Most languages pick one meaning as the default and the programmer explicitly indicates the other meaning to resolve the address-duality ambiguity\index{address! ambiguity}.606 Most languages pick one meaning as the default and the programmer explicitly indicates the other meaning to resolve the address-duality ambiguity\index{address!duality ambiguity}. 643 607 In C, the default meaning for pointers is to manipulate the pointer's address and the pointed-to value is explicitly accessed by the dereference operator ©*©. 644 608 \begin{lstlisting} … … 646 610 *p1 = *p1 + 1; §\C{// pointed-to value assignment / operation}§ 647 611 \end{lstlisting} 648 which works well for situations where manipulation of addresses i sthe primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).612 which works well for situations where manipulation of addresses in the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©). 649 613 650 614 However, in most other situations, the pointed-to value is requested more often than the pointer address. … … 662 626 int x, y, ®&® r1, ®&® r2, ®&&® r3; 663 627 ®&®r1 = &x; §\C{// r1 points to x}§ 664 ®&®r2 = &r1; §\C{// r2 points to x}§ 665 ®&®r1 = &y; §\C{// r1 points to y}§ 666 ®&&®r3 = ®&®&r2; §\C{// r3 points to r2}§ 628 ®&®r2 = &r1; §\C{// r2 also points to x}§ 629 ®&®r1 = &y; §\C{// r2 also points to x}§ 630 ®&®r1 = &r2 + 1; §\C{// r1 points to y, pointer arithmetic}§ 631 ®&®r3 = ®&®&r2; §\C{// r3 points to r2}§ 667 632 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); §\C{// implicit dereferencing}§ 668 633 \end{lstlisting} … … 683 648 Hence, assigning to a reference requires the address of the reference variable (\Index{lvalue}): 684 649 \begin{lstlisting} 685 (&®*®)r1 = &x; §\C{// (\&*) cancel giving variable r1 notvariable pointed-to by r1}§650 (&®*®)r1 = &x; §\C{// (\&*) cancel out giving variable r1 not the variable pointed-to by r1}§ 686 651 \end{lstlisting} 687 652 Similarly, the address of a reference can be obtained for assignment or computation (\Index{rvalue}): 688 653 \begin{lstlisting} 689 (& (&®*®)®*®)r3 = &(&®*®)r2; §\C{// (\&*) cancel giving address of r2, (\&(\&*)*) cancel giving variable r3}§690 \end{lstlisting} 691 Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth, and pointer and reference values are interchangeable because both contain addresses.654 (&®*®)r3 = &(&®*®)r2; §\C{// (\&*) cancel out giving the address of variable r2}§ 655 \end{lstlisting} 656 \Index{Cancellation}\index{pointer!cancellation rule} works to arbitrary depth, and pointer and reference values are interchangeable because both contain addresses. 692 657 \begin{lstlisting} 693 658 int x, *p1 = &x, **p2 = &p1, ***p3 = &p2, 694 &r1 = x, &&r2 = r1, &&&r3 =r2;659 &r1 = &x, &&r2 = &&r1, &&&r3 = &&r2; 695 660 ***p3 = 3; §\C{// change x}§ 696 661 r3 = 3; §\C{// change x, ***r3}§ … … 703 668 Finally, implicit dereferencing and cancellation are a static (compilation) phenomenon not a dynamic one. 704 669 That is, all implicit dereferencing and any cancellation is carried out prior to the start of the program, so reference performance is equivalent to pointer performance. 705 A programmer selects a pointer or reference type solely on whether the address is dereference dfrequently or infrequently, which dictates the amount of direct aid from the compiler;670 A programmer selects a pointer or reference type solely on whether the address is dereferences frequently or infrequently, which dictates the amount of direct aid from the compiler; 706 671 otherwise, everything else is equal. 707 672 708 Interestingly, \ Index*[C++]{\CC}deals with the address duality by making the pointed-to value the default, and prevent\-ing changes to the reference address, which eliminates half of the duality.709 \Index*{Java} deals with the address duality by making address assignment the default and requiring field assignment (direct or indirect via methods), i.e., there is no builtin bit-wise or method-wise assignment, which eliminates half of the duality.673 Interestingly, \CC deals with the address duality by making the pointed-to value the default, and prevent\-ing changes to the reference address, which eliminates half of the duality. 674 Java deals with the address duality by making address assignment the default and providing a \Index{clone} mechanism to change the pointed-to value. 710 675 711 676 As for a pointer, a reference may have qualifiers: 712 677 \begin{lstlisting} 713 678 const int cx = 5; §\C{// cannot change cx;}§ 714 const int & cr = cx; §\C{// cannot change what cr pointsto}§715 ®&® cr = &cx; §\C{// can change cr}§716 cr= 7; §\C{// error, cannot change cx}§717 int & const r c = x;§\C{// must be initialized, \CC reference}§718 ®&®r c = &x; §\C{// error, cannot change rc}§719 const int & const crc =cx; §\C{// must be initialized, \CC reference}§720 crc = 7;§\C{// error, cannot change cx}§721 ®&® crc = &cx; §\C{// error, cannot change crc}§722 \end{lstlisting} 723 Hence, for type ©& const©, there is no pointer assignment, so ©&r c = &x© is disallowed, and \emph{the address value cannot be ©0© unless an arbitrary pointer is assigned to the reference}.724 In effect, the compiler is managing the addresses f or type ©& const© not the programmer, and by a programming discipline of only using references with references, address errors can be prevented.725 726 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage ofan object.679 const int & r3 = &cx; §\C{// cannot change what r3 is pointing to}§ 680 ®&®r3 = &cx; §\C{// can change r3}§ 681 r3 = 7; §\C{// error, cannot change cx}§ 682 int & const r4 = &x; §\C{// must be initialized, \CC reference}§ 683 ®&®r4 = &x; §\C{// error, cannot change r4}§ 684 const int & const r5 = &cx; §\C{// must be initialized, \CC reference}§ 685 r5 = 7; §\C{// error, cannot change cx}§ 686 ®&®r5 = &cx; §\C{// error, cannot change r5}§ 687 \end{lstlisting} 688 Hence, for type ©& const©, there is no pointer assignment, so ©&r4 = &x© is disallowed, and \emph{the address value cannot be ©0©}. 689 In effect, the compiler is managing the addresses fpr type ©& const© not the programmer. 690 691 \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 for an object. 727 692 There are three initialization contexts in \CFA: declaration initialization, argument/parameter binding, return/temporary binding. 728 For reference initialization (like pointer), the initializing value must be an address ( \Index{lvalue}) not a value (\Index{rvalue}).693 For reference initialization (like pointer), the initializing value must be an address (lvalue) not a value (rvalue). 729 694 \begin{lstlisting} 730 695 int * p = &x; §\C{// both \&x and x are possible interpretations}§ 731 696 int & r = x; §\C{// x unlikely interpretation, because of auto-dereferencing}§ 732 697 \end{lstlisting} 733 Hence, the compiler implicitly inserts a reference operator, ©&©, before the initialization expression .698 Hence, the compiler implicitly inserts a reference operator, ©&©, before the initialization expression: 734 699 Similarly, when a reference is used for a parameter/return type, the call-site argument does not require a reference operator. 735 700 \begin{lstlisting} 736 int & f( int & r p); §\C{// reference parameter and return}§737 z = f( x ) + f( y ); §\C{// reference operator added }§738 \end{lstlisting} 739 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©r p© can be locally reassigned within ©f©.701 int & f( int & ri ); §\C{// reference parameter and return}§ 702 z = f( x ) + f( y ); §\C{// reference operator added not required}§ 703 \end{lstlisting} 704 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©ri© can be locally reassigned within ©f©. 740 705 The return reference from ©f© is copied into a compiler generated temporary, which is treated as an initialization. 741 706 742 707 When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions. 743 708 \begin{lstlisting} 744 void f( ®const® int & cr p);745 void g( ®const® int * c pp);709 void f( ®const® int & cri ); 710 void g( ®const® int * cri ); 746 711 f( 3 ); g( &3 ); 747 712 f( x + y ); g( &(x + y) ); 748 713 \end{lstlisting} 749 714 Here, the compiler passes the address to the literal 3 or the temporary for the expression ©x + y©, knowing the argument cannot be changed through the parameter. 750 (The ©&© is necessary for the pointer parameter to make the types match, and is acommon requirement for a C programmer.)751 \CFA \emph{extends} this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed-to by the reference parameter and can be changed.752 \begin{lstlisting} 753 void f( int & rp);754 void g( int * pp);715 (The ©&© is necessary for the pointer parameter to make the types match, and is common requirement for a C programmer.) 716 \CFA extends this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed to by the reference parameter and can be changed. 717 \begin{lstlisting} 718 void f( int & cri ); 719 void g( int * cri ); 755 720 f( 3 ); g( &3 ); §\C{// compiler implicit generates temporaries}§ 756 721 f( x + y ); g( &(x + y) ); §\C{// compiler implicit generates temporaries}§ 757 722 \end{lstlisting} 758 Essentially, there is an implicit \Index{rvalue} to \Index{lvalue}conversion in this case.\footnote{759 This conversion attempts to address the \newterm{const hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.}760 The implicit conversion allows seamless calls to any routine without having to explicit lyname/copy the literal/expression to allow the call.761 762 While \CFA attempts to handle pointers and references in a uniform, symmetric manner, C handles routine variables in an inconsistent way: a routine variable is both a pointer and a reference(particle and wave).723 Essentially, there is an implicit rvalue to lvalue conversion in this case.\footnote{ 724 This conversion attempts to address the \newterm{const Hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.} 725 The implicit conversion allows seamless calls to any routine without having to explicit name/copy the literal/expression to allow the call. 726 727 While \CFA attempts to handle pointers and references in a uniform, symmetric manner, C handles routine pointers in an inconsistent way: a routine pointer is both a reference and a pointer (particle and wave). 763 728 \begin{lstlisting} 764 729 void f( int p ) {...} … … 772 737 const void (&fp)( int ) = f; 773 738 fp( 3 ); 774 fp = ... §\C{// error, cannot change code}§775 &fp = ...; §\C{// chang ingroutine reference}§739 fp = ... §\C{// change code not allowed}§ 740 &fp = ...; §\C{// change routine reference}§ 776 741 \end{lstlisting} 777 742 because the value of the routine variable is a routine literal, i.e., the routine code is normally immutable during execution.\footnote{ 778 743 Dynamic code rewriting is possible but only in special circumstances.} 779 \CFA allows this additional use of references for routine variables in an attempt to give a more consistent meaning for them.744 \CFA allows this additional use of references for routine variables in an attempt to give a more consistent meaning for routine variables. 780 745 781 746 … … 812 777 813 778 In detail, the brackets, ©[]©, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{ 814 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}779 Michael Tiemann, with help from Doug Lea, provided named return values in g++, circa 1989.} 815 780 The value of each local return variable is automatically returned at routine termination. 816 781 Declaration qualifiers can only appear at the start of a routine definition, e.g.: … … 1091 1056 1092 1057 Given the \CFA restrictions above, both named and default arguments are backwards compatible. 1093 \ Index*[C++]{\CC}only supports default arguments;1094 \Index*{Ada}supports both named and default arguments.1058 \CC only supports default arguments; 1059 Ada supports both named and default arguments. 1095 1060 1096 1061 … … 1168 1133 \end{figure} 1169 1134 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope. 1170 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does \Index*{Java}, rather than the \CC type-selection operator ``©::©''.1135 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does Java, rather than the \CC type-selection operator ``©::©''. 1171 1136 1172 1137 … … 1193 1158 Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks; 1194 1159 the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program. 1195 The following program in undefined in \CFA (and Indexc{gcc})1160 The following program in undefined in \CFA (and ©gcc©\index{gcc}) 1196 1161 \begin{lstlisting} 1197 1162 [* [int]( int )] foo() { §\C{// int (*foo())( int )}§ … … 1372 1337 [ §\emph{lvalue}§, ..., §\emph{lvalue}§ ] = §\emph{expr}§; 1373 1338 \end{lstlisting} 1374 \index{lvalue}1375 1339 The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, i.e., any data object that can appear on the left-hand side of a conventional assignment statement. 1376 1340 ©$\emph{expr}$© is any standard arithmetic expression. … … 1412 1376 [ §\emph{lvalue}§, . . ., §\emph{lvalue}§ ] = [ §\emph{expr}§, . . ., §\emph{expr}§ ]; 1413 1377 \end{lstlisting} 1414 \index{lvalue}1415 1378 The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s. 1416 1379 Each \emph{expr} appearing on the righthand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment. … … 1702 1665 Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors. 1703 1666 There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it. 1704 Nevertheless, C does have an idiom where this capability is used, known as `` \Index*{Duff's device}''~\cite{Duff83}:1667 Nevertheless, C does have an idiom where this capability is used, known as ``Duff's device''~\cite{Duff83}: 1705 1668 \begin{lstlisting} 1706 1669 register int n = (count + 7) / 8; … … 1751 1714 the number of ©switch© statements is small, 1752 1715 \item 1753 most ©switch© statements are well formed (i.e., no \Index*{Duff's device}),1716 most ©switch© statements are well formed (i.e., no Duff's device), 1754 1717 \item 1755 1718 the ©default© clause is usually written as the last case-clause, … … 1786 1749 The ability to fall-through is retained because it is a sufficient C-idiom that most C programmers simply expect it, and its absence might discourage these programmers from using the ©choose© statement. 1787 1750 \item 1788 Eliminating \Index*{Duff's device}is straightforward and only invalidates a small amount of very questionable code.1751 Eliminating Duff's device is straightforward and only invalidates a small amount of very questionable code. 1789 1752 The solution is to allow ©case© clauses to only appear at the same nesting level as the ©switch© body, as is done in most other programming languages with ©switch© statements. 1790 1753 \item … … 2028 1991 \CFA supports C initialization of structures, but it also adds constructors for more advanced initialization. 2029 1992 Additionally, \CFA adds destructors that are called when a variable is de-allocated (variable goes out of scope or object is deleted). 2030 These functions take a reference to the structure as a parameter (see References for more information). 1993 These functions take a reference to the structure as a parameter (see 1994 References for more information). 2031 1995 2032 1996 \begin{figure} … … 2081 2045 \section{References} 2082 2046 2083 2047 \CFA supports reference types similar to rvalue references in \CC. 2048 A reference is essentially an alias for a variable, allowing multiple names to refer to the same object. 2049 A reference can be used as a safer alternative to a pointer, because it can be used to pass a variable by reference, but it must always reference an object. 2050 It cannot be NULL, it must be assigned a value at initialization, and the object it references cannot change once it is set. 2084 2051 By introducing references in parameter types, users are given an easy way to pass a value by reference, without the need for NULL pointer checks. 2085 2052 In structures, a reference can replace a pointer to an object that should always have a valid value. … … 2090 2057 When initializing a reference, \CFA uses a different syntax which differentiates reference initialization from assignment to a reference. 2091 2058 The ©&© is used on both sides of the expression to clarify that the address of the reference is being set to the address of the variable to which it refers. 2059 2060 \begin{figure} 2061 \begin{lstlisting} 2062 // parameter p is a reference to a Point 2063 void movePointUp(Point &p) { 2064 p.y += 1.0; // Uses dot-notation to access fields 2065 } 2066 2067 Point p1 = ...; 2068 ColoredPoint cp1 = ...; 2069 movePoint(p1); // reference to p1 passed to movePoint 2070 movePoint(cp1); // reference to cp1 passed to movePoint 2071 2072 // a ListElement cannot be created without a valid list 2073 2074 struct ListElement { 2075 int element; 2076 List &list; // a list element has a reference to the list 2077 } 2078 2079 // The constructor must initialize the reference 2080 void ?{}(ListElement &le, int e, List &l) { 2081 le.element = e; 2082 &le.list = &l; // initialize the reference 2083 } 2084 2085 ListElement e1{88, numberList}; // uses constructor 2086 ListElement e2; // compiler error: uninitialized reference 2087 Listing 10: References 2088 \end{lstlisting} 2089 \end{figure} 2092 2090 \end{comment} 2093 2091 … … 2133 2131 The operations ©&&©, ©||©, and ©!© can be applied to any scalar arguments and are defined in terms of comparison against 0 (ex. ©(a && b)© becomes ©(a != 0 && b != 0)©). 2134 2132 2135 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a special case. 2136 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their polymorphic parameters, and user-defined pointer-like types may need a null value. 2137 Defining special constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©. 2133 In C, the integer constants 0 and 1 suffice because the integer promotion rules can convert them to any 2134 arithmetic type, and the rules for pointer expressions treat constant expressions evaluating to 0 as a 2135 special case. 2136 However, user-defined arithmetic types often need the equivalent of a 1 or 0 for their 2137 functions or operators, polymorphic functions often need 0 and 1 constants of a type matching their 2138 polymorphic parameters, and user-defined pointer-like types may need a null value. 2139 Defining special 2140 constants for a user-defined type is more efficient than defining a conversion to the type from ©_Bool©. 2138 2141 2139 2142 Why just 0 and 1? Why not other integers? No other integers have special status in C. … … 2313 2316 \begin{quote2} 2314 2317 \begin{tabular}{@{}l@{\hspace{3em}}ll@{}} 2315 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CC}} & \multicolumn{1}{c}{ Indexc{gcc}} \\2318 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CC}} & \multicolumn{1}{c}{©gcc©}\index{gcc} \\ 2316 2319 \begin{lstlisting} 2317 2320 … … 2345 2348 2346 2349 In \CFA, ©typedef© provides a mechanism to alias long type names with short ones, both globally and locally, but not eliminate the use of the short name. 2347 \Indexc{gcc}provides ©typeof© to declare a secondary variable from a primary variable.2350 ©gcc© provides ©typeof© to declare a secondary variable from a primary variable. 2348 2351 \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. 2349 2352 Only for overloaded routines with the same return type is variable type-inferencing possible. … … 2375 2378 Generics allow programmers to use type variables in place of concrete types so that the code can be reused with multiple types. 2376 2379 The type parameters can be restricted to satisfy a set of constraints. 2377 This enables \CFA to build fully compiled generic functions and types, unlike other languages like \ Index*[C++]{\CC}where templates are expanded or must be explicitly instantiated.2380 This enables \CFA to build fully compiled generic functions and types, unlike other languages like \CC where templates are expanded or must be explicitly instantiated. 2378 2381 2379 2382 2380 2383 \subsection{Generic Functions} 2381 2384 2382 Generic functions in \CFA are similar to template functions in \ Index*[C++]{\CC}, and will sometimes be expanded into specialized versions, just like in \CC.2385 Generic functions in \CFA are similar to template functions in \CC, and will sometimes be expanded into specialized versions, just like in \CC. 2383 2386 The difference, however, is that generic functions in \CFA can also be separately compiled, using function pointers for callers to pass in all needed functionality for the given type. 2384 2387 This means that compiled libraries can contain generic functions that can be used by programs linked with them (statically or dynamically). … … 2499 2502 2500 2503 Generic types are defined using the same mechanisms as those described above for generic functions. 2501 This feature allows users to create types that have one or more fields that use generic parameters as types, similar to a template classes in \ Index*[C++]{\CC}.2504 This feature allows users to create types that have one or more fields that use generic parameters as types, similar to a template classes in \CC. 2502 2505 For example, to make a generic linked list, a placeholder is created for the type of the elements, so that the specific type of the elements in the list need not be specified when defining the list. 2503 2506 In C, something like this would have to be done using void pointers and unsafe casting. … … 2551 2554 Throwing an exception terminates execution of the current block, invokes the destructors of variables that are local to the block, and propagates the exception to the parent block. 2552 2555 The exception is immediately re-thrown from the parent block unless it is caught as described below. 2553 \CFA uses keywords similar to \ Index*[C++]{\CC}for exception handling.2556 \CFA uses keywords similar to \CC for exception handling. 2554 2557 An exception is thrown using a throw statement, which accepts one argument. 2555 2558 … … 2679 2682 \end{lstlisting} 2680 2683 While this sytact is awkward, it is unlikely many programers will name fields of a structure 0 or 1. 2681 Like the \ Index*[C++]{\CC}lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser.2684 Like the \CC lexical problem with closing template-syntax, e.g, ©Foo<Bar<int®>>®©, this issue can be solved with a more powerful lexer/parser. 2682 2685 2683 2686 There are several ambiguous cases with operator identifiers, e.g., ©int *?*?()©, where the string ©*?*?© can be lexed as ©*©/©?*?© or ©*?©/©*?©. … … 2716 2719 This enables a very familiar interface to all programmers, even those with no parallel programming experience. 2717 2720 It also allows the compiler to do static type checking of all communication, a very important safety feature. 2718 This controlled communication with type safety has some similarities with channels in \Index*{Go}, and can actually implement2721 This controlled communication with type safety has some similarities with channels in Go, and can actually implement 2719 2722 channels exactly, as well as create additional communication patterns that channels cannot. 2720 2723 Mutex objects, monitors, are used to contain mutual exclusion within an object and synchronization across concurrent threads. … … 2969 2972 2970 2973 There are two levels of encapsulation in \CFA, module and package. 2971 A module is a logical grouping of functionality that can be easily pulled into another project, much like a module in \Index*{Python} or a package in \Index*{Go}.2974 A module is a logical grouping of functionality that can be easily pulled into another project, much like a module in Python or a package in Go. 2972 2975 A module forms a namespace to limit the visibility and prevent naming conflicts of variables. 2973 2976 Furthermore, a module is an independent translation unit, which can be compiled separately to accelerate the compilation speed. … … 2975 2978 A package is a physical grouping of one or more modules that is used for code distribution and version management. 2976 2979 Package is also the level of granularity at which dependences are managed. 2977 A package is similar to the Crate in \Index*{Rust}.2980 A package is similar to the Crate in Rust. 2978 2981 2979 2982 2980 2983 \subsection{No Declarations, No Header Files} 2981 2984 2982 In C and \ Index*[C++]{\CC}, it is necessary to declare or define every global variable, global function, and type before it is used in each file.2985 In C and \CC, it is necessary to declare or define every global variable, global function, and type before it is used in each file. 2983 2986 Header files and a preprocessor are normally used to avoid repeating code. 2984 2987 Thus, many variables, functions, and types are described twice, which exposes an opportunity for errors and causes additional maintenance work. … … 2986 2989 This information is then stored in the object files for each module, in a format that can quickly be read by the compiler, and stored at the top of the file, for quick access. 2987 2990 In addition to the user productivity improvements, this simple change also improves compile time, by saving the information in a simple machine readable format, instead of making the compiler parse the same information over and over from a header file. 2988 This seems like a minor change, but according to (Pike, \Index*{Go}at Google: Language Design in the Service of Software Engineering), this simple change can cause massive reductions in compile time.2991 This seems like a minor change, but according to (Pike, Go at Google: Language Design in the Service of Software Engineering), this simple change can cause massive reductions in compile time. 2989 2992 2990 2993 In \CFA, multiple definitions are not necessary. … … 3625 3628 In developing \CFA, many other languages were consulted for ideas, constructs, and syntax. 3626 3629 Therefore, it is important to show how these languages each compare with Do. 3627 In this section, \CFA is compared with what the writers of this document consider to be the closest competitors of Do: \ Index*[C++]{\CC}, \Index*{Go}, \Index*{Rust}, and \Index*{D}.3630 In this section, \CFA is compared with what the writers of this document consider to be the closest competitors of Do: \CC, Go, Rust, and D. 3628 3631 3629 3632 … … 3631 3634 3632 3635 3633 {% local change to lstlising to reduce font size3634 3635 3636 \lstset{basicstyle=\linespread{0.9}\sf\relsize{-2}}3637 3638 3639 3636 \subsubsection{Constructors and Destructors} 3637 3638 \lstset{basicstyle=\sf\relsize{-2}} 3640 3639 3641 3640 \begin{flushleft} … … 4242 4241 \end{flushleft} 4243 4242 4244 }% local change to lstlising to reduce font size 4243 \lstset{basicstyle=\sf\relsize{-1}} 4245 4244 4246 4245 … … 4250 4249 \subsubsection[C++]{\CC} 4251 4250 4252 \ Index*[C++]{\CC}is a general-purpose programming language.4251 \CC is a general-purpose programming language. 4253 4252 It has imperative, object-oriented and generic programming features, while also providing facilities for low-level memory manipulation. (Wikipedia) 4254 4253 … … 4258 4257 Classes in \CC also enable inheritance among types. 4259 4258 Instead of inheritance, \CFA embraces composition and interfaces to achieve the same goals with more flexibility. 4260 There are many studies and articles comparing inheritance and composition (or is-a versus has-a relationships), so we will not go into more detail here (Venners, 1998) (Pike, \Index*{Go}at Google: Language Design in the Service of Software Engineering , 2012).4259 There are many studies and articles comparing inheritance and composition (or is-a versus has-a relationships), so we will not go into more detail here (Venners, 1998) (Pike, Go at Google: Language Design in the Service of Software Engineering , 2012). 4261 4260 4262 4261 Overloading in \CFA is very similar to overloading in \CC, with the exception of the additional use, in \CFA, of the return type to differentiate between overloaded functions. … … 4271 4270 \subsubsection{Go} 4272 4271 4273 \Index*{Go}, also commonly referred to as golang, is a programming language developed at Google in 2007 [.].4272 Go, also commonly referred to as golang, is a programming language developed at Google in 2007 [.]. 4274 4273 It is a statically typed language with syntax loosely derived from that of C, adding garbage collection, type 4275 4274 safety, some structural typing capabilities, additional built-in types such as variable-length arrays and key-value maps, and a large standard library. (Wikipedia) … … 4287 4286 \subsubsection{Rust} 4288 4287 4289 \Index*{Rust}is a general-purpose, multi-paradigm, compiled programming language developed by Mozilla Research.4288 Rust is a general-purpose, multi-paradigm, compiled programming language developed by Mozilla Research. 4290 4289 It is designed to be a "safe, concurrent, practical language", supporting pure-functional, concurrent-actor[dubious . discuss][citation needed], imperative-procedural, and object-oriented styles. 4291 4290 … … 4301 4300 \subsubsection{D} 4302 4301 4303 The \Index*{D}programming language is an object-oriented, imperative, multi-paradigm system programming4302 The D programming language is an object-oriented, imperative, multi-paradigm system programming 4304 4303 language created by Walter Bright of Digital Mars and released in 2001. [.] 4305 Though it originated as a re-engineering of \CC, D is a distinct language, having redesigned some core \CC features while also taking inspiration from other languages, notably \Index*{Java}, \Index*{Python}, Ruby, C\#, and Eiffel.4304 Though it originated as a re-engineering of \CC, D is a distinct language, having redesigned some core \CC features while also taking inspiration from other languages, notably Java, Python, Ruby, C\#, and Eiffel. 4306 4305 4307 4306 D and \CFA both start with C and add productivity features. … … 4443 4442 \item[How widely used:] C programs rarely have nest types because they are equivalent to the hoisted version. 4444 4443 4445 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \ Index*[C++]{\CC}.4444 \CFA is C \emph{incompatible} on this issue, and provides semantics similar to \CC. 4446 4445 Nested types are not hoisted and can be referenced using the field selection operator ``©.©'', unlike the \CC scope-resolution operator ``©::©''. 4447 4446 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. … … 4479 4478 \index{input/output library} 4480 4479 4481 The goal for the \CFA I/O is to make I/O as simple as possible in the common cases, while fully supporting polmorphism and user defined types in a consistent way.4482 The commoncase is printing out a sequence of variables separated by whitespace.4480 The goal for \CFA I/O is to make I/O as simple as possible for the general case, while fully supporting polmorphism and user defined types in a consistent way. 4481 The general case is printing out a sequence of variables separated by whitespace. 4483 4482 \begin{quote2} 4484 4483 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 4495 4494 \end{tabular} 4496 4495 \end{quote2} 4497 The \CFA form has half as many characters as the \CC form, and is similar to \Index*{Python} I/O with respect to implicit separators.4496 The \CFA form is half as many characters, and is similar to \Index{Python} I/O with respect to implicit separators. 4498 4497 4499 4498 The logical-or operator is used because it is the lowest-priority overloadable operator, other than assignment. … … 4647 4646 \subsection{malloc} 4648 4647 4649 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4648 \begin{lstlisting} 4650 4649 forall( otype T ) T * malloc( void );§\indexc{malloc}§ 4651 4650 forall( otype T ) T * malloc( char fill ); … … 4663 4662 forall( otype T ) T * memset( T * ptr ); // remove when default value available 4664 4663 \end{lstlisting} 4665 \ 4664 4666 4665 4667 4666 \subsection{ato / strto} 4668 4667 4669 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4668 \begin{lstlisting} 4670 4669 int ato( const char * ptr );§\indexc{ato}§ 4671 4670 unsigned int ato( const char * ptr ); … … 4694 4693 long double _Complex strto( const char * sptr, char ** eptr ); 4695 4694 \end{lstlisting} 4696 \4697 4695 4698 4696 4699 4697 \subsection{bsearch / qsort} 4700 4698 4701 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4699 \begin{lstlisting} 4702 4700 forall( otype T | { int ?<?( T, T ); } ) 4703 4701 T * bsearch( const T key, const T * arr, size_t dimension );§\indexc{bsearch}§ … … 4706 4704 void qsort( const T * arr, size_t dimension );§\indexc{qsort}§ 4707 4705 \end{lstlisting} 4708 \4709 4706 4710 4707 4711 4708 \subsection{abs} 4712 4709 4713 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4710 \begin{lstlisting} 4714 4711 char abs( char );§\indexc{abs}§ 4715 4712 int abs( int ); … … 4723 4720 long double abs( long double _Complex ); 4724 4721 \end{lstlisting} 4725 \4726 4722 4727 4723 4728 4724 \subsection{random} 4729 4725 4730 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4726 \begin{lstlisting} 4731 4727 void rand48seed( long int s );§\indexc{rand48seed}§ 4732 4728 char rand48();§\indexc{rand48}§ … … 4741 4737 long double _Complex rand48(); 4742 4738 \end{lstlisting} 4743 \4744 4739 4745 4740 4746 4741 \subsection{min / max / swap} 4747 4742 4748 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4743 \begin{lstlisting} 4749 4744 forall( otype T | { int ?<?( T, T ); } ) 4750 4745 T min( const T t1, const T t2 );§\indexc{min}§ … … 4756 4751 void swap( T * t1, T * t2 );§\indexc{swap}§ 4757 4752 \end{lstlisting} 4758 \4759 4753 4760 4754 … … 4767 4761 \subsection{General} 4768 4762 4769 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4763 \begin{lstlisting} 4770 4764 float fabs( float );§\indexc{fabs}§ 4771 4765 double fabs( double ); … … 4812 4806 long double nan( const char * ); 4813 4807 \end{lstlisting} 4814 \4815 4808 4816 4809 4817 4810 \subsection{Exponential} 4818 4811 4819 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4812 \begin{lstlisting} 4820 4813 float exp( float );§\indexc{exp}§ 4821 4814 double exp( double ); … … 4869 4862 long double logb( long double ); 4870 4863 \end{lstlisting} 4871 \4872 4864 4873 4865 4874 4866 \subsection{Power} 4875 4867 4876 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4868 \begin{lstlisting} 4877 4869 float sqrt( float );§\indexc{sqrt}§ 4878 4870 double sqrt( double ); … … 4897 4889 long double _Complex pow( long double _Complex, long double _Complex ); 4898 4890 \end{lstlisting} 4899 \4900 4891 4901 4892 4902 4893 \subsection{Trigonometric} 4903 4894 4904 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4895 \begin{lstlisting} 4905 4896 float sin( float );§\indexc{sin}§ 4906 4897 double sin( double ); … … 4953 4944 long double atan( long double, long double ); 4954 4945 \end{lstlisting} 4955 \4956 4946 4957 4947 4958 4948 \subsection{Hyperbolic} 4959 4949 4960 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4950 \begin{lstlisting} 4961 4951 float sinh( float );§\indexc{sinh}§ 4962 4952 double sinh( double ); … … 5001 4991 long double _Complex atanh( long double _Complex ); 5002 4992 \end{lstlisting} 5003 \5004 4993 5005 4994 5006 4995 \subsection{Error / Gamma} 5007 4996 5008 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]4997 \begin{lstlisting} 5009 4998 float erf( float );§\indexc{erf}§ 5010 4999 double erf( double ); … … 5032 5021 long double tgamma( long double ); 5033 5022 \end{lstlisting} 5034 \5035 5023 5036 5024 5037 5025 \subsection{Nearest Integer} 5038 5026 5039 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]5027 \begin{lstlisting} 5040 5028 float floor( float );§\indexc{floor}§ 5041 5029 double floor( double ); … … 5086 5074 long long int llround( long double ); 5087 5075 \end{lstlisting} 5088 \5089 5076 5090 5077 5091 5078 \subsection{Manipulation} 5092 5079 5093 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]5080 \begin{lstlisting} 5094 5081 float copysign( float, float );§\indexc{copysign}§ 5095 5082 double copysign( double, double ); … … 5127 5114 long double scalbln( long double, long int ); 5128 5115 \end{lstlisting} 5129 \5130 5116 5131 5117 … … 5136 5122 When creating and computing with rational numbers, results are constantly reduced to keep the numerator and denominator as small as possible. 5137 5123 5138 \begin{lstlisting} [aboveskip=0pt,belowskip=0pt]5124 \begin{lstlisting} 5139 5125 // implementation 5140 5126 struct Rational {§\indexc{Rational}§
Note:
See TracChangeset
for help on using the changeset viewer.