Changeset da7fe39 for doc/papers/general/Paper.tex
- Timestamp:
- Apr 23, 2018, 12:57:46 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 57acae0
- Parents:
- ba89e9b7 (diff), c8ad5d9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/general/Paper.tex
rba89e9b7 rda7fe39 18 18 \usepackage{upquote} % switch curled `'" to straight 19 19 \usepackage{listings} % format program code 20 \captionsetup{justification=raggedright,singlelinecheck=false} 20 21 %\usepackage{enumitem} 21 22 %\setlist[itemize]{topsep=3pt,itemsep=2pt,parsep=0pt}% global … … 28 29 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 29 30 30 \lefthyphenmin= 4% hyphen only after 4 characters31 \righthyphenmin= 431 \lefthyphenmin=3 % hyphen only after 4 characters 32 \righthyphenmin=3 32 33 33 34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 86 87 % Latin abbreviation 87 88 \newcommand{\abbrevFont}{\textit} % set empty for no italics 88 \newcommand{\EG}{\abbrevFont{e}.\abbrevFont{g}.} 89 \@ifundefined{eg}{ 90 \newcommand{\EG}{\abbrevFont{e}\abbrevFont{g}} 89 91 \newcommand*{\eg}{% 90 92 \@ifnextchar{,}{\EG}% 91 93 {\@ifnextchar{:}{\EG}% 92 94 {\EG,\xspace}}% 93 }% 94 \newcommand{\IE}{\abbrevFont{i}.\abbrevFont{e}.} 95 }}{}% 96 \@ifundefined{ie}{ 97 \newcommand{\IE}{\abbrevFont{i}\abbrevFont{e}} 95 98 \newcommand*{\ie}{% 96 99 \@ifnextchar{,}{\IE}% 97 100 {\@ifnextchar{:}{\IE}% 98 101 {\IE,\xspace}}% 99 }% 102 }}{}% 103 \@ifundefined{etc}{ 100 104 \newcommand{\ETC}{\abbrevFont{etc}} 101 105 \newcommand*{\etc}{% 102 106 \@ifnextchar{.}{\ETC}% 103 107 {\ETC.\xspace}% 104 }% 108 }}{}% 109 \@ifundefined{etal}{ 105 110 \newcommand{\ETAL}{\abbrevFont{et}~\abbrevFont{al}} 106 \ renewcommand*{\etal}{%111 \newcommand*{\etal}{% 107 112 \@ifnextchar{.}{\protect\ETAL}% 108 113 {\protect\ETAL.\xspace}% 109 }% 114 }}{}% 115 \@ifundefined{viz}{ 110 116 \newcommand{\VIZ}{\abbrevFont{viz}} 111 117 \newcommand*{\viz}{% 112 118 \@ifnextchar{.}{\VIZ}% 113 119 {\VIZ.\xspace}% 114 } %120 }}{}% 115 121 \makeatother 116 122 … … 125 131 \lstdefinelanguage{CFA}[ANSI]{C}{ 126 132 morekeywords={ 127 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, __attribute, 128 __attribute__, auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, 129 __const, __const__, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, 130 finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t, 131 otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof, 132 __typeof__, virtual, with, zero_t}, 133 morekeywords=[2]{ 134 _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex, or, 135 resume, suspend, thread, _Thread_local, waitfor, when, yield}, 133 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__, 134 auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__, 135 coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally, 136 __float80, float80, __float128, float128, forall, ftype, _Generic, _Imaginary, __imag, __imag__, 137 inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or, 138 otype, restrict, __restrict, __restrict__, __signed, __signed__, _Static_assert, thread, 139 _Thread_local, throw, throwResume, timeout, trait, try, ttype, typeof, __typeof, __typeof__, 140 virtual, __volatile, __volatile__, waitfor, when, with, zero_t}, 136 141 moredirectives={defined,include_next}% 137 142 } … … 154 159 literate={-}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scriptstyle\land\,$}}1 155 160 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 % {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1 156 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0. 5ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textgreater}}2,161 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0.4ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textgreater}}2, 157 162 moredelim=**[is][\color{red}]{`}{`}, 158 163 }% lstset … … 174 179 \author[1]{Robert Schluntz} 175 180 \author[1]{Peter A. Buhr*} 176 \authormark{ Aaron Moss\textsc{et al}}177 178 \address[1]{\orgdiv{ David R. Cheriton School of Computer Science}, \orgname{University of Waterloo}, \orgaddress{\state{Ontario}, \country{Canada}}}179 180 \corres{*Peter A. Buhr, \email{pabuhr{\char`\@}uwaterloo.ca}}181 \presentaddress{David R. Cheriton School of Computer Science, University of Waterloo, Waterloo, ON, N2L 3G1, Canada} 182 181 \authormark{MOSS \textsc{et al}} 182 183 \address[1]{\orgdiv{Cheriton School of Computer Science}, \orgname{University of Waterloo}, \orgaddress{\state{Waterloo, ON}, \country{Canada}}} 184 185 \corres{*Peter A. Buhr, Cheriton School of Computer Science, University of Waterloo, 200 University Avenue West, Waterloo, ON, N2L 3G1, Canada. \email{pabuhr{\char`\@}uwaterloo.ca}} 186 187 \fundingInfo{Natural Sciences and Engineering Research Council of Canada} 183 188 184 189 \abstract[Summary]{ … … 224 229 Nevertheless, C, first standardized over thirty years ago, lacks many features that make programming in more modern languages safer and more productive. 225 230 226 \CFA (pronounced ``C-for-all'', and written \CFA or Cforall) is an evolutionary extension of the C programming language that aims to add modern language features to C while maintaining both source compatibility with C and a familiar programming model for programmers.231 \CFA (pronounced ``C-for-all'', and written \CFA or Cforall) is an evolutionary extension of the C programming language that aims to add modern language features to C, while maintaining both source and runtime compatibility with C and a familiar programming model for programmers. 227 232 The four key design goals for \CFA~\cite{Bilson03} are: 228 233 (1) The behaviour of standard C code must remain the same when translated by a \CFA compiler as when translated by a C compiler; … … 324 329 A simple example is leveraging the existing type-unsafe (@void *@) C @bsearch@ to binary search a sorted float array: 325 330 \begin{cfa} 326 void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, 327 int (* compar)( const void *, const void * )); 331 void * bsearch( const void * key, const void * base, size_t nmemb, size_t size, int (* compar)( const void *, const void * )); 328 332 int comp( const void * t1, const void * t2 ) { 329 333 return *(double *)t1 < *(double *)t2 ? -1 : *(double *)t2 < *(double *)t1 ? 1 : 0; … … 332 336 double * val = (double *)bsearch( &key, vals, 10, sizeof(vals[0]), comp ); $\C{// search sorted array}$ 333 337 \end{cfa} 334 which can be augmented simply with ageneralized, type-safe, \CFA-overloaded wrappers:338 which can be augmented simply with generalized, type-safe, \CFA-overloaded wrappers: 335 339 \begin{cfa} 336 340 forall( otype T | { int ?<?( T, T ); } ) T * bsearch( T key, const T * arr, size_t size ) { … … 394 398 T ?++( T * ); 395 399 }; 396 forall( otype T `| summable( T )` ) T sum( T a[$\,$], size_t size ) { // use trait400 forall( otype T `| summable( T )` ) T sum( T a[$\,$], size_t size ) {$\C{// use trait}$ 397 401 `T` total = { `0` }; $\C{// instantiate T from 0 by calling its constructor}$ 398 402 for ( unsigned int i = 0; i < size; i += 1 ) total `+=` a[i]; $\C{// select appropriate +}$ … … 572 576 return (scalar(U)){ a.value + b.value }; 573 577 } 574 scalar(metres) half_marathon = { 21 093 };575 scalar(litres) swimming_pool = { 2 500000 };578 scalar(metres) half_marathon = { 21_093 }; 579 scalar(litres) swimming_pool = { 2_500_000 }; 576 580 scalar(metres) marathon = half_marathon + half_marathon; 577 581 scalar(litres) two_pools = swimming_pool + swimming_pool; … … 720 724 \end{cfa} 721 725 Here, the mass assignment sets all members of @s@ to zero. 722 Since tuple-index expressions are a form of member-access expression, it is possible to use tuple-index expressions in conjunction with member 726 Since tuple-index expressions are a form of member-access expression, it is possible to use tuple-index expressions in conjunction with member-tuple expressions to manually restructure a tuple (\eg rearrange, drop, and duplicate components). 723 727 \begin{cfa} 724 728 [int, int, long, double] x; … … 1875 1879 \lstDeleteShortInline@% 1876 1880 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}} 1877 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c }{\textbf{C Implicit Hoisting}} & \multicolumn{1}{|c}{\textbf{\CFA}} \\1881 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c|}{\textbf{C Implicit Hoisting}} & \multicolumn{1}{c}{\textbf{\CFA}} \\ 1878 1882 \hline 1879 1883 \begin{cfa} … … 1998 2002 { 1999 2003 VLA x, y = { 20, 0x01 }, z = y; $\C{// z points to y}$ 2000 // ?{}( x ); ?{}( y, 20, 0x01 );?{}( z, y );2004 // ?{}( x ); ?{}( y, 20, 0x01 ); ?{}( z, y ); 2001 2005 ^x{}; $\C{// deallocate x}$ 2002 2006 x{}; $\C{// reallocate x}$ … … 2023 2027 These semantics closely mirror the rule for implicit declaration of constructors in \CC\cite[p.~186]{ANSI98:C++}. 2024 2028 2025 In some circumstance programmers may not wish to have constructor and destructor calls. 2026 In these cases, \CFA provides the initialization syntax \lstinline|S x @= {}|, and the object becomes unmanaged, so implicit constructor and destructor calls are not generated. 2027 Any C initializer can be the right-hand side of an \lstinline|@=| initializer, \eg \lstinline|VLA a @= { 0, 0x0 }|, with the usual C initialization semantics. 2029 In some circumstance programmers may not wish to have implicit constructor and destructor generation and calls. 2030 In these cases, \CFA provides the initialization syntax \lstinline|S x `@=` {}|, and the object becomes unmanaged, so implicit constructor and destructor calls are not generated. 2031 Any C initializer can be the right-hand side of an \lstinline|@=| initializer, \eg \lstinline|VLA a @= { 0, 0x0 }|, with the usual C initialization semantics. 2032 The same syntax can be used in a compound literal, \eg \lstinline|a = VLA`@`{ 0, 0x0 }|, to create a C-style literal. 2028 2033 The point of \lstinline|@=| is to provide a migration path from legacy C code to \CFA, by providing a mechanism to incrementally convert to implicit initialization. 2029 2034 … … 2043 2048 \subsection{Integral Suffixes} 2044 2049 2045 Additional integral suffixes are added to cover all the integral types and lengths. 2050 New integral suffixes @hh@ (half of half of @int@) for @char@, @h@ (half of @int@) for @short@, and @z@ for @size_t@, and length suffixes for 8, 16, 32, 64, and 128 bit integers. 2051 %Additional integral suffixes are added to cover all the integral types and lengths. 2046 2052 \begin{cquote} 2047 2053 \lstDeleteShortInline@% … … 2049 2055 \begin{cfa} 2050 2056 20_`hh` // signed char 2051 21_`hh u`// unsigned char2057 21_`hh`u // unsigned char 2052 2058 22_`h` // signed short int 2053 23_ `uh` // unsigned short int2054 24 _`z`// size_t2059 23_u`h` // unsigned short int 2060 24`z` // size_t 2055 2061 \end{cfa} 2056 2062 & 2057 2063 \begin{cfa} 2058 2064 20_`L8` // int8_t 2059 21_ `ul8` // uint8_t2065 21_u`l8` // uint8_t 2060 2066 22_`l16` // int16_t 2061 23_ `ul16` // uint16_t2067 23_u`l16` // uint16_t 2062 2068 24_`l32` // int32_t 2063 2069 \end{cfa} 2064 2070 & 2065 2071 \begin{cfa} 2066 25_ `ul32` // uint32_t2072 25_u`l32` // uint32_t 2067 2073 26_`l64` // int64_t 2068 27_`l64 u`// uint64_t2074 27_`l64`u // uint64_t 2069 2075 26_`L128` // int128 2070 27_`L128 u`// unsigned int1282076 27_`L128`u // unsigned int128 2071 2077 \end{cfa} 2072 2078 \end{tabular} … … 2083 2089 To provide this precision, \CFA introduces a new type @zero_t@ as the type of literal @0@ (somewhat analagous to @nullptr_t@ and @nullptr@ in \CCeleven); 2084 2090 @zero_t@ can only take the value @0@, but has implicit conversions to the integer and pointer types so that C code involving @0@ continues to work. 2085 With this addition, \CFA rewrites @if (x)@ and similar expressions to @if ( (x) != 0)@ or the appropriate analogue, and any type @T@ is ``truthy'' by defining an operator overload @int ?!=?(T, zero_t)@.2091 With this addition, \CFA rewrites @if (x)@ and similar expressions to @if ( (x) != 0 )@ or the appropriate analogue, and any type @T@ is ``truthy'' by defining an operator overload @int ?!=?( T, zero_t )@. 2086 2092 \CC makes types truthy by adding a conversion to @bool@; 2087 2093 prior to the addition of explicit cast operators in \CCeleven, this approach had the pitfall of making truthy types transitively convertable to any numeric type; … … 2115 2121 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{postfix function}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{constant}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{variable/expression}} & \multicolumn{1}{c}{\textbf{postfix pointer}} \\ 2116 2122 \begin{cfa} 2117 int ?`h( int s );2118 int ?`h( double s );2119 int ?`m( char c );2120 int ?`m( const char * s );2121 int ?`t( int a, int b, int c );2122 \end{cfa} 2123 & 2124 \begin{cfa} 2125 0 `h;2126 3.5 `h;2127 '1' `m;2128 "123" "456" `m;2129 [1,2,3] `t;2123 int |?`h|( int s ); 2124 int |?`h|( double s ); 2125 int |?`m|( char c ); 2126 int |?`m|( const char * s ); 2127 int |?`t|( int a, int b, int c ); 2128 \end{cfa} 2129 & 2130 \begin{cfa} 2131 0 |`h|; 2132 3.5|`h|; 2133 '1'|`m|; 2134 "123" "456"|`m|; 2135 [1,2,3]|`t|; 2130 2136 \end{cfa} 2131 2137 & 2132 2138 \begin{cfa} 2133 2139 int i = 7; 2134 i `h;2135 (i + 3) `h;2136 (i + 3.5) `h;2137 2138 \end{cfa} 2139 & 2140 \begin{cfa} 2141 int (* ?`p)( int i );2142 ?`p = ?`h;2143 3 `p;2144 i `p;2145 (i + 3) `p;2140 i|`h|; 2141 (i + 3)|`h|; 2142 (i + 3.5)|`h|; 2143 2144 \end{cfa} 2145 & 2146 \begin{cfa} 2147 int (* |?`p|)( int i ); 2148 |?`p| = |?`h|; 2149 3|`p|; 2150 i|`p|; 2151 (i + 3)|`p|; 2146 2152 \end{cfa} 2147 2153 \end{tabular} … … 2158 2164 \lstset{language=CFA,moredelim=**[is][\color{red}]{|}{|},deletedelim=**[is][]{`}{`}} 2159 2165 \lstDeleteShortInline@% 2160 \begin{tabular}{@{}l@{\hspace{ \parindentlnth}}l@{}}2161 \multicolumn{1}{c@{\hspace{ \parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\2166 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2167 \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\ 2162 2168 \begin{cfa} 2163 2169 struct W { … … 2255 2261 \begin{cfa} 2256 2262 MIN 2257 2258 2263 MAX 2259 2260 2264 PI 2261 2265 E … … 2263 2267 & 2264 2268 \begin{cfa} 2265 SCHAR_MIN, CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, 2266 FLT_MIN, DBL_MIN, LDBL_MIN 2267 SCHAR_MAX, UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX, 2268 FLT_MAX, DBL_MAX, LDBL_MAX 2269 SCHAR_MIN, CHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, FLT_MIN, DBL_MIN, LDBL_MIN 2270 SCHAR_MAX, UCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX, FLT_MAX, DBL_MAX, LDBL_MAX 2269 2271 M_PI, M_PIl 2270 2272 M_E, M_El … … 2439 2441 ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) ); 2440 2442 ip = (int *)realloc( ip, 2 * dim * sizeof( int ) ); 2441 ip = (int *)realloc( ip, 4 * dim * sizeof( int ) ); 2442 memset( ip, fill, 4 * dim * sizeof( int ) ); 2443 ip = (int *)realloc( ip, 4 * dim * sizeof( int ) ); memset( ip, fill, 4 * dim * sizeof( int ) ); 2444 2443 2445 ip = memalign( 16, sizeof( int ) ); 2444 2446 ip = memalign( 16, sizeof( int ) ); memset( ip, fill, sizeof( int ) );
Note: See TracChangeset
for help on using the changeset viewer.