Changeset 3d60c08 for doc/papers/general
- Timestamp:
- May 8, 2018, 9:20:23 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:
- b4a835d
- Parents:
- 83034ec
- Location:
- doc/papers/general
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/general/Makefile
r83034ec r3d60c08 44 44 clean : 45 45 @rm -frv ${DOCUMENT} ${BASE}.ps WileyNJD-AMA.bst ${BASE}.out.ps ${Build} 46 47 Paper.zip : 48 zip -x general/.gitignore -x general/"*AMA*" -x general/Paper.out.ps -x general/Paper.tex.plain -x general/evaluation.zip -x general/mail -x general/response -x general/test.c -x general/evaluation.zip -x general/Paper.tex.plain -x general/Paper.ps -x general/Paper.pdf -x general/"*build*" -x general/evaluation/.gitignore -x general/evaluation/timing.xlsx -r Paper.zip general 46 49 47 50 evaluation.zip : -
doc/papers/general/Paper.tex
r83034ec r3d60c08 60 60 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}} 61 61 62 \renewcommand*{\thefootnote}{\ alph{footnote}} % hack because fnsymbol does not work62 \renewcommand*{\thefootnote}{\Alph{footnote}} % hack because fnsymbol does not work 63 63 %\renewcommand*{\thefootnote}{\fnsymbol{footnote}} 64 64 … … 249 249 All languages features discussed in this paper are working, except some advanced exception-handling features. 250 250 Not discussed in this paper are the integrated concurrency-constructs and user-level threading-library~\cite{Delisle18}. 251 \CFA is an \emph{open-source} project implemented as a nsource-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3).251 \CFA is an \emph{open-source} project implemented as a source-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3). 252 252 Ultimately, a compiler is necessary for advanced features and optimal performance. 253 253 % @plg2[9]% cd cfa-cc/src; cloc ArgTweak CodeGen CodeTools Common Concurrency ControlStruct Designators GenPoly InitTweak MakeLibCfa.cc MakeLibCfa.h Parser ResolvExpr SymTab SynTree Tuples driver prelude main.cc … … 323 323 There are only two hard things in Computer Science: cache invalidation and \emph{naming things} -- Phil Karlton 324 324 \end{quote} 325 \vspace{- 10pt}325 \vspace{-9pt} 326 326 C already has a limited form of ad-hoc polymorphism in the form of its basic arithmetic operators, which apply to a variety of different types using identical syntax. 327 327 \CFA extends the built-in operator overloading by allowing users to define overloads for any function, not just operators, and even any variable; … … 438 438 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types. 439 439 440 To reduc ingduplication, it is possible to distribute a group of @forall@ (and storage-class qualifiers) over functions/types, so each block declaration is prefixed by the group (see example in Appendix~\ref{s:CforallStack}).440 To reduce duplication, it is possible to distribute a group of @forall@ (and storage-class qualifiers) over functions/types, so each block declaration is prefixed by the group (see example in Appendix~\ref{s:CforallStack}). 441 441 \begin{cfa} 442 442 forall( otype `T` ) { $\C{// distribution block, add forall qualifier to declarations}$ … … 480 480 \end{cquote} 481 481 482 In fact, the set of @summable@ trait operators is incomplete, as it is missing assignment for type @T@, but @otype@ is syntactic sugar for the following implicit trait: 482 Note, the @sumable@ trait does not include a copy constructor needed for the right side of @?+=?@ and return; 483 it is provided by @otype@, which is syntactic sugar for the following trait: 483 484 \begin{cfa} 484 485 trait otype( dtype T | sized(T) ) { // sized is a pseudo-trait for types with known size and alignment … … 498 499 Instead, each polymorphic function (or generic type) defines the structural type needed for its execution (polymorphic type-key), and this key is fulfilled at each call site from the lexical environment, which is similar to Go~\cite{Go} interfaces. 499 500 Hence, new lexical scopes and nested functions are used extensively to create local subtypes, as in the @qsort@ example, without having to manage a nominal-inheritance hierarchy. 500 (Nominal inheritance can be approximated with traits using marker variables or functions, as is done in Go.)501 % (Nominal inheritance can be approximated with traits using marker variables or functions, as is done in Go.) 501 502 502 503 % Nominal inheritance can be simulated with traits using marker variables or functions: … … 525 526 526 527 527 \vspace*{-2pt}528 528 \section{Generic Types} 529 529 … … 571 571 Concrete types have a fixed memory layout regardless of type parameters, while dynamic types vary in memory layout depending on their type parameters. 572 572 A \newterm{dtype-static} type has polymorphic parameters but is still concrete. 573 Polymorphic pointers are an example of dtype-static types, \eg @forall(dtype T) T *@ is a polymorphic type, but for any @T@, @T *@ is a fixed-sized pointer, and therefore, can be represented by a @void *@ in code generation. 573 Polymorphic pointers are an example of dtype-static types; 574 given some type variable @T@, @T@ is a polymorphic type, as is @T *@, but @T *@ has a fixed size and can therefore be represented by @void *@ in code generation. 574 575 575 576 \CFA generic types also allow checked argument-constraints. … … 955 956 } 956 957 \end{cfa} 957 One more step permits the summation of any sum mable type with all arguments of the same type:958 \begin{cfa} 959 trait sum mable( otype T ) {958 One more step permits the summation of any sumable type with all arguments of the same type: 959 \begin{cfa} 960 trait sumable( otype T ) { 960 961 T ?+?( T, T ); 961 962 }; 962 forall( otype R | sum mable( R ) ) R sum( R x, R y ) {963 forall( otype R | sumable( R ) ) R sum( R x, R y ) { 963 964 return x + y; 964 965 } 965 forall( otype R, ttype Params | sum mable(R) | { R sum(R, Params); } ) R sum(R x, R y, Params rest) {966 forall( otype R, ttype Params | sumable(R) | { R sum(R, Params); } ) R sum(R x, R y, Params rest) { 966 967 return sum( x + y, rest ); 967 968 } … … 1108 1109 \begin{cquote} 1109 1110 \lstDeleteShortInline@% 1110 \begin{tabular}{@{}l |@{\hspace{2\parindentlnth}}l@{}}1111 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1111 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1112 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1112 1113 \begin{cfa} 1113 1114 case 2, 10, 34, 42: … … 1124 1125 \lstDeleteShortInline@% 1125 1126 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1126 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1127 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1127 1128 \begin{cfa} 1128 1129 case 2~42: … … 1178 1179 \lstDeleteShortInline@% 1179 1180 \begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}} 1180 \multicolumn{1}{ c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1181 \multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1181 1182 \begin{cfa} 1182 1183 `choose` ( day ) { … … 1224 1225 \lstDeleteShortInline@% 1225 1226 \begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}} 1226 \multicolumn{1}{ c|@{\hspace{\parindentlnth}}}{\textbf{non-terminator}} & \multicolumn{1}{c}{\textbf{target label}} \\1227 \multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{non-terminator}} & \multicolumn{1}{c@{}}{\textbf{target label}} \\ 1227 1228 \begin{cfa} 1228 1229 choose ( ... ) { … … 1268 1269 \lstDeleteShortInline@% 1269 1270 \begin{tabular}{@{\hspace{\parindentlnth}}l|@{\hspace{\parindentlnth}}l@{\hspace{\parindentlnth}}l@{}} 1270 \multicolumn{1}{@{\hspace{\parindentlnth}}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c }{\textbf{C}} \\1271 \multicolumn{1}{@{\hspace{\parindentlnth}}c|@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c@{}}{\textbf{C}} \\ 1271 1272 \begin{cfa} 1272 1273 `LC:` { … … 1364 1365 \lstDeleteShortInline@% 1365 1366 \begin{tabular}{@{}l|@{\hspace{\parindentlnth}}l@{}} 1366 \multicolumn{1}{ c|@{\hspace{\parindentlnth}}}{\textbf{Resumption}} & \multicolumn{1}{c}{\textbf{Termination}} \\1367 \multicolumn{1}{@{}c|@{\hspace{\parindentlnth}}}{\textbf{Resumption}} & \multicolumn{1}{c@{}}{\textbf{Termination}} \\ 1367 1368 \begin{cfa} 1368 1369 `exception R { int fix; };` … … 1632 1633 \lstDeleteShortInline@% 1633 1634 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1634 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1635 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1635 1636 \begin{cfa} 1636 1637 `[5] *` int x1; … … 1660 1661 \lstDeleteShortInline@% 1661 1662 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1662 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1663 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1663 1664 \begin{cfa} 1664 1665 `*` int x, y; … … 1681 1682 \lstDeleteShortInline@% 1682 1683 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1683 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\1684 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\ 1684 1685 \begin{cfa} 1685 1686 [ 5 ] int z; … … 1723 1724 \lstDeleteShortInline@% 1724 1725 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 1725 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\1726 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{\hspace{2\parindentlnth}}}{\textbf{C}} \\ 1726 1727 \begin{cfa} 1727 1728 extern const * const int x; … … 1748 1749 \lstDeleteShortInline@% 1749 1750 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1750 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1751 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1751 1752 \begin{cfa} 1752 1753 y = (* int)x; … … 1776 1777 \lstDeleteShortInline@% 1777 1778 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 1778 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\1779 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 1779 1780 \begin{cfa} 1780 1781 [double] foo(), foo( int ), foo( double ) {...} … … 1794 1795 * [ * int ] ( int y ) gp; $\C{// pointer to function returning pointer to int with int parameter}$ 1795 1796 * [ ] ( int, char ) hp; $\C{// pointer to function returning no result with int and char parameters}$ 1796 * [ * int, int ] ( int ) jp; $\C{// pointer to function returning pointer to int and int with int parameter} $1797 * [ * int, int ] ( int ) jp; $\C{// pointer to function returning pointer to int and int with int parameter}\CRT$ 1797 1798 \end{cfa} 1798 1799 Note, the name of the function pointer is specified last, as for other variable declarations. … … 1993 1994 The symbol \lstinline+^+ is used for the destructor name because it was the last binary operator that could be used in a unary context.}. 1994 1995 The name @{}@ comes from the syntax for the initializer: @struct S { int i, j; } s = `{` 2, 3 `}`@. 1995 Like other \CFA operators, these names represent the syntax used to call the constructor or destructor, \eg @?{}(x, ...)@ or @^{}(x, ...)@.1996 Like other \CFA operators, these names represent the syntax used to explicitly call the constructor or destructor, \eg @s{...}@ or @^s{...}@. 1996 1997 The constructor and destructor have return type @void@, and the first parameter is a reference to the object type to be constructed or destructed. 1997 1998 While the first parameter is informally called the @this@ parameter, as in object-oriented languages, any variable name may be used. 1998 Both constructors and destructors allow additional paramete s after the @this@ parameter for specifying values for initialization/de-initialization\footnote{1999 Both constructors and destructors allow additional parameters after the @this@ parameter for specifying values for initialization/de-initialization\footnote{ 1999 2000 Destruction parameters are useful for specifying storage-management actions, such as de-initialize but not deallocate.}. 2000 2001 \begin{cfa} … … 2003 2004 void ^?{}( VLA & vla ) with ( vla ) { free( data ); } $\C{// destructor}$ 2004 2005 { 2005 VLA x; $\C{// implicit: ?\{\}( x );}$2006 } $\C{// implicit: ?\^{}\{\}( x );}$2006 VLA x; $\C{// implicit:\ \ x\{\};}$ 2007 } $\C{// implicit:\ \textasciicircum{}x\{\};}$ 2007 2008 \end{cfa} 2008 2009 @VLA@ is a \newterm{managed type}\footnote{ … … 2029 2030 appropriate care is taken to not recursively call the copy constructor when initializing the second parameter. 2030 2031 2031 \CFA constructors may be explicitly call , like Java, and destructors may be explicitly called, like \CC.2032 \CFA constructors may be explicitly called, like Java, and destructors may be explicitly called, like \CC. 2032 2033 Explicit calls to constructors double as a \CC-style \emph{placement syntax}, useful for construction of member fields in user-defined constructors and reuse of existing storage allocations. 2033 While existing call syntax works for explicit calls to constructors and destructors, \CFA also provides a more concise \newterm{operator syntax} for both:2034 Like the other operators in \CFA, there is a concise syntax for constructor/destructor function calls: 2034 2035 \begin{cfa} 2035 2036 { 2036 2037 VLA x, y = { 20, 0x01 }, z = y; $\C{// z points to y}$ 2037 // ?{}( x ); ?{}( y, 20, 0x01 ); ?{}( z, y );2038 // x{}; y{ 20, 0x01 }; z{ z, y }; 2038 2039 ^x{}; $\C{// deallocate x}$ 2039 2040 x{}; $\C{// reallocate x}$ … … 2042 2043 y{ x }; $\C{// reallocate y, points to x}$ 2043 2044 x{}; $\C{// reallocate x, not pointing to y}$ 2044 // ^?{}(z); ^?{}(y); ^?{}(x);2045 // ^z{}; ^y{}; ^x{}; 2045 2046 } 2046 2047 \end{cfa} … … 2063 2064 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. 2064 2065 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. 2065 The same syntax can be used in a compound literal, \eg \lstinline|a = VLA`@`{ 0, 0x0 }|, to create a C-style literal.2066 The same syntax can be used in a compound literal, \eg \lstinline|a = (VLA)`@`{ 0, 0x0 }|, to create a C-style literal. 2066 2067 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. 2067 2068 … … 2119 2120 2120 2121 In C, @0@ has the special property that it is the only ``false'' value; 2121 fromthe standard, any value that compares equal to @0@ is false, while any value that compares unequal to @0@ is true.2122 by the standard, any value that compares equal to @0@ is false, while any value that compares unequal to @0@ is true. 2122 2123 As such, an expression @x@ in any boolean context (such as the condition of an @if@ or @while@ statement, or the arguments to @&&@, @||@, or @?:@\,) can be rewritten as @x != 0@ without changing its semantics. 2123 2124 Operator overloading in \CFA provides a natural means to implement this truth-value comparison for arbitrary types, but the C type system is not precise enough to distinguish an equality comparison with @0@ from an equality comparison with an arbitrary integer or pointer. … … 2154 2155 \lstDeleteShortInline@% 2155 2156 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{\hspace{2\parindentlnth}}l@{}} 2156 \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}} \\2157 \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}} \\ 2157 2158 \begin{cfa} 2158 2159 int |?`h|( int s ); … … 2199 2200 \lstset{language=CFA,moredelim=**[is][\color{red}]{|}{|},deletedelim=**[is][]{`}{`}} 2200 2201 \lstDeleteShortInline@% 2201 \begin{tabular}{@{}l@{\hspace{ 2\parindentlnth}}l@{}}2202 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\2202 \begin{tabular}{@{}l@{\hspace{1.25\parindentlnth}}l@{}} 2203 \multicolumn{1}{@{}c@{\hspace{1.25\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{\CC}} \\ 2203 2204 \begin{cfa} 2204 2205 struct W { … … 2274 2275 \lstDeleteShortInline@% 2275 2276 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2276 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2277 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c@{}}{\textbf{Usage}} \\ 2277 2278 \begin{cfa} 2278 2279 const short int `MIN` = -32768; … … 2293 2294 \lstDeleteShortInline@% 2294 2295 \begin{tabular}{@{}l@{\hspace{\parindentlnth}}l@{}} 2295 \multicolumn{1}{ c@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2296 \multicolumn{1}{@{}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 2296 2297 \begin{cfa} 2297 2298 MIN … … 2319 2320 \lstDeleteShortInline@% 2320 2321 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2321 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2322 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c@{}}{\textbf{Usage}} \\ 2322 2323 \begin{cfa} 2323 2324 float `log`( float x ); … … 2338 2339 \lstDeleteShortInline@% 2339 2340 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2340 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2341 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 2341 2342 \begin{cfa} 2342 2343 log … … 2366 2367 \lstDeleteShortInline@% 2367 2368 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2368 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c}{\textbf{Usage}} \\2369 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{Definition}} & \multicolumn{1}{c@{}}{\textbf{Usage}} \\ 2369 2370 \begin{cfa} 2370 2371 unsigned int `abs`( int ); … … 2385 2386 \lstDeleteShortInline@% 2386 2387 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2387 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2388 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 2388 2389 \begin{cfa} 2389 2390 abs … … 2408 2409 an allocation with a specified character. 2409 2410 \item[resize] 2410 an existing allocation to decrease d or increasedits size.2411 an existing allocation to decrease or increase its size. 2411 2412 In either case, new storage may or may not be allocated and, if there is a new allocation, as much data from the existing allocation is copied. 2412 2413 For an increase in storage size, new storage after the copied data may be filled. … … 2447 2448 \begin{figure} 2448 2449 \centering 2449 \begin{cquote} 2450 \begin{cfa}[aboveskip=0pt] 2450 \begin{cfa}[aboveskip=0pt,xleftmargin=0pt] 2451 2451 size_t dim = 10; $\C{// array dimension}$ 2452 2452 char fill = '\xff'; $\C{// initialization fill value}$ … … 2454 2454 \end{cfa} 2455 2455 \lstDeleteShortInline@% 2456 \begin{tabular}{@{}l@{\hspace{ 2\parindentlnth}}l@{}}2457 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\2458 \begin{cfa} 2456 \begin{tabular}{@{}l@{\hspace{\parindentlnth}}l@{}} 2457 \multicolumn{1}{@{}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 2458 \begin{cfa}[xleftmargin=-10pt] 2459 2459 ip = alloc(); 2460 2460 ip = alloc( fill ); … … 2471 2471 & 2472 2472 \begin{cfa} 2473 ip = (int *)malloc( sizeof( int ) ); 2474 ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, sizeof( int ) ); 2475 ip = (int *)malloc( dim * sizeof( int ) ); 2476 ip = (int *)malloc( sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) ); 2477 ip = (int *)realloc( ip, 2 * dim * sizeof( int ) ); 2478 ip = (int *)realloc( ip, 4 * dim * sizeof( int ) ); 2479 memset( ip, fill, 4 * dim * sizeof( int ) ); 2480 ip = memalign( 16, sizeof( int ) ); 2481 ip = memalign( 16, sizeof( int ) ); memset( ip, fill, sizeof( int ) ); 2482 ip = memalign( 16, dim * sizeof( int ) ); 2483 ip = memalign( 16, dim * sizeof( int ) ); memset( ip, fill, dim * sizeof( int ) ); 2484 \end{cfa} 2485 \end{tabular} 2486 \lstMakeShortInline@% 2487 \end{cquote} 2473 ip = (int *)malloc( sizeof(int) ); 2474 ip = (int *)malloc( sizeof(int) ); memset( ip, fill, sizeof(int) ); 2475 ip = (int *)malloc( dim * sizeof(int) ); 2476 ip = (int *)malloc( sizeof(int) ); memset( ip, fill, dim * sizeof(int) ); 2477 ip = (int *)realloc( ip, 2 * dim * sizeof(int) ); 2478 ip = (int *)realloc( ip, 4 * dim * sizeof(int) ); memset( ip, fill, 4 * dim * sizeof(int)); 2479 2480 ip = memalign( 16, sizeof(int) ); 2481 ip = memalign( 16, sizeof(int) ); memset( ip, fill, sizeof(int) ); 2482 ip = memalign( 16, dim * sizeof(int) ); 2483 ip = memalign( 16, dim * sizeof(int) ); memset( ip, fill, dim * sizeof(int) ); 2484 \end{cfa} 2485 \end{tabular} 2486 \lstMakeShortInline@% 2488 2487 \caption{\CFA versus C Storage-Allocation} 2489 2488 \label{f:StorageAllocation} … … 2498 2497 S * as = anew( dim, 2, 3 ); $\C{// each array element initialized to 2, 3}$ 2499 2498 \end{cfa} 2500 Note, \CC can only initializ ationarray elements via the default constructor.2499 Note, \CC can only initialize array elements via the default constructor. 2501 2500 2502 2501 Finally, the \CFA memory-allocator has \newterm{sticky properties} for dynamic storage: fill and alignment are remembered with an object's storage in the heap. … … 2515 2514 \lstDeleteShortInline@% 2516 2515 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 2517 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{\CC}} \\2516 \multicolumn{1}{@{}c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{\CC}} \\ 2518 2517 \begin{cfa} 2519 2518 int x = 1, y = 2, z = 3; … … 2604 2603 \centering 2605 2604 \lstDeleteShortInline@% 2606 \begin{tabular}{@{}l@{\hspace{ 2\parindentlnth}}@{\hspace{2\parindentlnth}}l@{}}2607 \multicolumn{1}{ c@{\hspace{2\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{2\parindentlnth}}c}{\textbf{C}} \\2605 \begin{tabular}{@{}l@{\hspace{3\parindentlnth}}l@{}} 2606 \multicolumn{1}{@{}c@{\hspace{3\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{c@{}}{\textbf{C}} \\ 2608 2607 \begin{cfa} 2609 2608 #include <gmp> … … 2638 2637 2639 2638 2640 \section{Polymorphi cEvaluation}2639 \section{Polymorphism Evaluation} 2641 2640 \label{sec:eval} 2642 2641 … … 2727 2726 Line-count is a fairly rough measure of code complexity; 2728 2727 another important factor is how much type information the programmer must specify manually, especially where that information is not compiler-checked. 2729 Such unchecked type information produces a heavier documentation burden and increased potential for runtime bugs, and is much less common in \CFA than C, with its manually specified function pointer arguments and format codes, or \CCV, with its extensive use of un type-checked downcasts, \eg @object@ to @integer@ when popping a stack.2728 Such unchecked type information produces a heavier documentation burden and increased potential for runtime bugs, and is much less common in \CFA than C, with its manually specified function pointer arguments and format codes, or \CCV, with its extensive use of un-type-checked downcasts, \eg @object@ to @integer@ when popping a stack. 2730 2729 To quantify this manual typing, the ``redundant type annotations'' line in Table~\ref{tab:eval} counts the number of lines on which the type of a known variable is respecified, either as a format specifier, explicit downcast, type-specific function, or by name in a @sizeof@, struct literal, or @new@ expression. 2731 2730 The \CC benchmark uses two redundant type annotations to create a new stack nodes, while the C and \CCV benchmarks have several such annotations spread throughout their code. 2732 2731 The \CFA benchmark is able to eliminate all redundant type annotations through use of the polymorphic @alloc@ function discussed in Section~\ref{sec:libraries}. 2733 2732 2734 We conjecture these results scale across most generic data-types as the underlying polymorphi cimplement is constant.2733 We conjecture these results scale across most generic data-types as the underlying polymorphism implement is constant. 2735 2734 2736 2735 -
doc/papers/general/response
r83034ec r3d60c08 61 61 judithbishop@outlook.com 62 62 63 64 We have attempted to response to all the issues raised by the Editor and referee's comments. For two 65 of the issues, we have "pushed back", with an explanation. Specifically, moving the related work 66 forward, and moving text from Section 9 into the captions of Table2 and Figure 10. Our reasons for 67 not making these changes are address below. Finally, as pointed out below, there are a couple of 68 issues with the Wiley LaTeX macros that we worked around as best as possible. 69 70 The paper is long by SPE standards (33 pages). We have a maximum of 40 pages. Please do not 71 extend the paper beyond 35 pages. If necessary, find ways to cut the examples or text. If you 72 have an accompanying website for the system where some examples are stored, please mention it. 73 74 The paper is 35 pages using the supplied Wiley LaTeX macros. 75 76 63 77 Referee(s)' Comments to Author: 64 78 65 79 Reviewing: 1 66 80 67 Most of the content in Section 10 RELATED WORK appears to belong to Section 68 1 INTRODUCTION as a Subsection or as a new Section after Section 1. (Please 69 also see #4.1 below.) Remaining discussion that cannot be moved earlier can 70 become a DISCUSSION Section or a Subsection within the last Section of the 71 paper. 72 73 Sometimes it is appropriate to put related work at the start of a paper and 74 sometimes at the end. For this paper, it seems appropriate to put the related 75 work at the end of the paper. The purpose of the related work in this paper is 76 two fold: to introduce prior work and to contrast it with Cforall. Only at the 77 end of the paper does the reader have sufficient knowledge about Cforall to 78 make detailed contrasts with other programming languages possible. If the 79 related work is moved to the end of the introduction, the reader knows nothing 80 about Cforall so talking about other programming languages in isolation makes 81 little sense, especially non-C-related languages, like Java, Go, Rust, 82 Haskell. We see no easy way to separate the related work into a general 83 discussion at the start and a specific discussion at the end. We explicitly 84 attempt to deal with the reader's anticipation at the end of the introduction: 85 86 Finally, it is impossible to describe a programming language without usages 87 before definitions. Therefore, syntax and semantics appear before 88 explanations; hence, patience is necessary until details are presented. 89 90 91 2. Presentation 92 93 2.1 More information should be moved from the text and added to Figure 10 and 94 Table 2 so that readers can understand the comparison quickly. Imagine a reader 95 read the summary and jump directly to these two display elements. Questions 96 would be raised about the binary size and pop pair result of Cforall and it 97 would take time to find answers in the text. 98 99 This suggestion is an alternative writing style. The experiment is complex 100 enough that it is unlikely a reader could jump to the table/graph and 101 understand the experiment without putting a substantive amount of the text from 102 Section 9 into the table and figure, which the reader then has to read anyway. 103 In fact, we prefer a writing style where the reader does not have to look at 104 the table/figure to understand the experiment and the results, i.e., the 105 table/figure are only there to complement the discussion. 106 107 2.2 The pronunciation of ("C-for-all") should be provided in the summary 108 (page 1 line 22) so that people not having an access to the full-text can 109 see it. 81 Most of the content in Section 10 RELATED WORK appears to belong to Section 1 INTRODUCTION as a 82 Subsection or as a new Section after Section 1. (Please also see #4.1 below.) Remaining 83 discussion that cannot be moved earlier can become a DISCUSSION Section or a Subsection within 84 the last Section of the paper. 85 86 Sometimes it is appropriate to put related work at the start of a paper and sometimes at the 87 end. For this paper, it seems appropriate to put the related work at the end of the paper. The 88 purpose of the related work in this paper is two fold: to introduce prior work and to contrast it 89 with Cforall. Only at the end of the paper does the reader have sufficient knowledge about Cforall 90 to make detailed contrasts with other programming languages possible. If the related work is moved 91 to the end of the introduction, the reader knows nothing about Cforall so talking about other 92 programming languages in isolation makes little sense, especially non-C-related languages, like 93 Java, Go, Rust, Haskell. We see no easy way to separate the related work into a general discussion 94 at the start and a specific discussion at the end. We explicitly attempt to deal with the reader's 95 anticipation at the end of the introduction: 96 97 Finally, it is impossible to describe a programming language without usages before definitions. 98 Therefore, syntax and semantics appear before explanations; hence, patience is necessary until 99 details are presented. 100 101 102 2.1 More information should be moved from the text and added to Figure 10 and Table 2 so that 103 readers can understand the comparison quickly. Imagine a reader read the summary and jump 104 directly to these two display elements. Questions would be raised about the binary size and pop 105 pair result of Cforall and it would take time to find answers in the text. 106 107 This suggestion is an alternative writing style. The experiment is complex enough that it is 108 unlikely a reader could jump to the table/graph and understand the experiment without putting a 109 substantive amount of the text from Section 9 into the table and figure, which the reader then has 110 to read anyway. In fact, we prefer a writing style where the reader does not have to look at the 111 table/figure to understand the experiment and the results, i.e., the table/figure are only there to 112 complement the discussion. 113 114 115 2.2 The pronunciation of ("C-for-all") should be provided in the summary (page 1 line 22) so that 116 people not having an access to the full-text can see it. 110 117 111 118 Done. 112 119 113 2.3 Error comment in the code should be written with the same capitalization 114 and it will be helpful if you say specifically compilation error or runtime115 error. (Please see attached annotated manuscript.)116 117 Fixed. All errors in the paper are compilation errors because they are related 118 to the type system.119 120 2.4 It is possible to provide a bit more information in Appendix A e.g. how 121 many lines/bytes of code and some details about software/hardware can be122 added/moved here. The aim is to provide sufficient information for readers123 to reproduce the results and to appreciate the context of the comparison.124 125 Table 2 indicates the source-code size in lines of code. The third paragraph of 126 Section 9 gives precise details of the software/hardware used in the 127 experiments.120 121 2.3 Error comment in the code should be written with the same capitalization and it will be 122 helpful if you say specifically compilation error or runtime error. (Please see attached 123 annotated manuscript.) 124 125 Fixed. All errors in the paper are compilation errors because they are related to the type system. 126 127 128 2.4 It is possible to provide a bit more information in Appendix A e.g. how many lines/bytes of 129 code and some details about software/hardware can be added/moved here. The aim is to provide 130 sufficient information for readers to reproduce the results and to appreciate the context of the 131 comparison. 132 133 Table 2 indicates the source-code size in lines of code. The third paragraph of Section 9 gives 134 precise details of the software/hardware used in the experiments. 128 135 129 136 3. Practical information about the work 130 137 131 There are three separate pieces of information on pages 2 ("All features 132 discussed in this paper are working, unless otherwise stated as under 133 construction."), 138 There are three separate pieces of information on pages 2 ("All features discussed in this paper 139 are working, unless otherwise stated as under construction."), 134 140 135 141 This sentence is replace with: 136 142 137 All languages features discussed in this paper are working, except some 138 advanced exception-handlingfeatures.143 All languages features discussed in this paper are working, except some advanced exception-handling 144 features. 139 145 140 146 and Section 5.4 Exception Handling states: 141 147 142 The following framework for Cforall exception handling is in place, excluding 143 some runtime type-information and virtual functions. 148 The following framework for Cforall exception handling is in place, excluding some runtime 149 type-information and virtual functions. 150 144 151 145 152 page 4 ("Under construction is a mechanism to distribute...") … … 147 154 The feature on page 4 is now complete. 148 155 156 149 157 and page 33 ("There is ongoing work on a wide range ... ") 150 158 151 159 This sentence is replace to indicate the ongoing work is future work. 152 160 153 While all examples in the paper compile and run, a public beta-release of 154 Cforall will take 6-8 months to reduce compilation time, provide better155 debugging, and add a few more libraries. There is also new work on a number156 of Cforall features, including arrays with size, runtime type-information,157 virtual functions, user-defined conversions, and modules. 158 159 My recommendation is to move them to an appendix so that the length is 160 preserved. 161 162 There is nothing to move into an appendix, except 3 sentences. We do not intend 163 to discuss these items in this paper. 164 165 3.1 Any under construction work (only small part of page 4) should not be 166 mingled into the mainpart of the manuscript.161 While all examples in the paper compile and run, a public beta-release of Cforall will take 6-8 162 months to reduce compilation time, provide better debugging, and add a few more libraries. There 163 is also new work on a number of Cforall features, including arrays with size, runtime 164 type-information, virtual functions, user-defined conversions, and modules. 165 166 167 My recommendation is to move them to an appendix so that the length is preserved. 168 169 There is nothing to move into an appendix, except 3 sentences. We do not intend to discuss these 170 items in this paper. 171 172 173 3.1 Any under construction work (only small part of page 4) should not be mingled into the main 174 part of the manuscript. 167 175 168 176 See above. 169 177 170 3.2 Instructions on how to access/use the working functionality of Cforall 171 should be given. 172 173 We will indicate release of Cforall in a public location, when we believe the 174 code base is acceptable. In the interim, we have made public all the 175 experimental code from section 9, and there is a reference in the paper to 176 access this code. We can make a private beta-copy of Cforall available to the 177 SP&E editor for distribution to the referees so they can verify our claims. 178 179 3.3 Planned work should be given a specific time of completion/release not 180 just "8-12 months". 181 182 Software development is not rigorous engineering discipline. Given our small 183 research development-team and the size of the project, we cannot give a 184 specific time for completion of anything associated with the project. Having 185 said that, we have reduced our expected time for Cforall release to 6-8 months 186 as work is progressing well. 187 188 189 4. Citations 190 191 4.1 The impression after reading Section 1 INTRODUCTION is that the 192 referencing is poor. It is not until Section 10 RELATED WORK where majority 193 of the prior literature are discussed. Please consider moving the content 194 and improve citations - at least cite all main variations of C languages. 178 179 3.2 Instructions on how to access/use the working functionality of Cforall should be given. 180 181 We will indicate release of Cforall in a public location, when we believe the code base is 182 acceptable. In the interim, we have made public all the experimental code from section 9, and there 183 is a reference in the paper to access this code. We can make a private beta-copy of Cforall 184 available to the SP&E editor for distribution to the referees so they can verify our claims. 185 186 3.3 Planned work should be given a specific time of completion/release not just "8-12 months". 187 188 Software development is not a rigorous engineering discipline. Given our small research 189 development-team and the size of the project, we cannot give a specific time for completion of 190 anything associated with the project. Having said that, we have reduced our expected time for 191 Cforall release to 6-8 months as work is progressing well. 192 193 194 4.1 The impression after reading Section 1 INTRODUCTION is that the referencing is poor. It is 195 not until Section 10 RELATED WORK where majority of the prior literature are discussed. Please 196 consider moving the content and improve citations - at least cite all main variations of C 197 languages. 195 198 196 199 See point 1. 197 200 198 4.2 I also would like to see citations at these specific places: Page 2 199 after Phil Karlton, page 22 after const hell problem. 201 202 4.2 I also would like to see citations at these specific places: Page 2 after Phil Karlton, page 203 22 after const hell problem. 200 204 201 205 The Phil-Karlton quote is an urban legend without a specific academic citation: … … 205 209 The term "const hell" is replaced with "const poisoning" with a citation. 206 210 207 5.1 Footnotes and citations will need to have different schemes - number and 208 perhaps letter. 209 210 The latex macros from Wiley generate those symbols. I assume during 211 copy-editing the format is changed to suit the journal format. 212 213 5.2 Many references are not properly formatted e.g. date is incomplete, 214 extra/missing white spaces, extra dots, use of page number or section number 215 as part of superscript ref number. Please refer to attached document. 216 217 Agreed. The bibtex BST macros are at fault. I have fixed some issues but I 218 cannot fix them all as my BST macro-knowledge is limited. 211 212 5.1 Footnotes and citations will need to have different schemes - number and perhaps letter. 213 214 Switched to letters. SP&E uses symbol footnotes but this macros fails with their macros: 215 216 \renewcommand*{\thefootnote}{\fnsymbol{footnote}} 217 218 219 5.2 Many references are not properly formatted e.g. date is incomplete, extra/missing white 220 spaces, extra dots, use of page number or section number as part of superscript ref 221 number. Please refer to attached document. 222 223 Agreed. The bibtex BST macros are at fault. I have fixed some issues but I cannot fix them all as my 224 BST macro-knowledge is limited. 225 219 226 220 227 5.3 Typos: … … 233 240 234 241 6. Conflict of interest 235 I see that the work is partially supported by Huawei. Perhaps statement 236 ab out any presence or absence of conflicts of interest should be explicitly237 added. Please get a clear direction on thisfrom the editor of the journal.238 239 The paper now states the project is open-source, hence there is no conflict of 240 interest with thefunding received from Huawei.242 I see that the work is partially supported by Huawei. Perhaps statement about any presence or 243 absence of conflicts of interest should be explicitly added. Please get a clear direction on this 244 from the editor of the journal. 245 246 The paper now states the project is open-source, hence there is no conflict of interest with the 247 funding received from Huawei. 241 248 242 249 … … 245 252 Comments to the Author 246 253 247 Overloading requires the compiler to mangle a function's signature into its 248 name in the object file. I'm pretty sure that this will complicate the 249 build process of mixed Cforall/C projects. 250 251 There is no complexity with building Cforall/C programs, and there is an 252 existence proof because C++ has name mangling for overloading and has no problem 253 interacting with C. 254 255 I found the evaluation underwhelming. There were only ~200 LoC ported from 256 C to Cforall. This is too less to encounter potential caveats Cforall's 257 type system might impose. 258 259 260 261 Also, how is the compiler implemented? I guess, Cforall is a 262 source-to-source compiler (from Cforall to C). But this is left in the 263 dark. What features are actually implemented? 264 265 The following paragraph has been added to the introduction to address this 266 comment: 267 268 All languages features discussed in this paper are working, except some 269 advanced exception-handling features. Not discussed in this paper are the 270 integrated concurrency-constructs and user-level 271 threading-library~\cite{Delisle18}. Cforall is an open-source project 272 implemented as an source-to-source translator from Cforall to the gcc-dialect 273 of C~\cite{GCCExtensions}, allowing it to leverage the portability and code 274 optimizations provided by gcc, meeting goals (1)--(3). Ultimately, a compiler 275 is necessary for advanced features and optimal performance. The Cforall 276 translator is 200+ files and 46,000+ lines of code written in C/C++. Starting 277 with a translator versus a compiler makes it easier and faster to generate and 278 debug C object-code rather than intermediate, assembler or machine code. The 279 translator design is based on the visitor pattern, allowing multiple passes 280 over the abstract code-tree, which works well for incrementally adding new 281 feature through additional visitor passes. At the heart of the translator is 282 the type resolver, which handles the polymorphic routine/type 283 overload-resolution. The Cforall runtime system is 100+ files and 11,000+ 284 lines of code, written in Cforall. Currently, the Cforall runtime is the 285 largest user of Cforall providing a vehicle to test the language features and 286 implementation. The Cforall tests are 290+ files and 27,000+ lines of code. 287 The tests illustrate syntactic and semantic features in Cforall, plus a 288 growing number of runtime benchmarks. The tests check for correctness and are 289 used for daily regression testing of commits (3800+). 290 291 Furthermore, the article lacks some related work. Many proposed features 292 are present in functional languages such as Haskell, ML etc. In particular, 293 the dealing of parametric polymorphism reminds me of Haskell. 254 Overloading requires the compiler to mangle a function's signature into its name in the object 255 file. I'm pretty sure that this will complicate the build process of mixed Cforall/C projects. 256 257 There is no complexity with building Cforall/C programs, and there is an existence proof because C++ 258 has name mangling for overloading and has no problem interacting with C. 259 260 261 I found the evaluation underwhelming. There were only ~200 LoC ported from C to Cforall. This 262 is too less to encounter potential caveats Cforall's type system might impose. 263 264 We have clarified that the evaluation is not for the type system, but rather the underlying 265 implementation approach for the parametric polymorphism. Section 9 now starts: 266 267 Cforall adds parametric polymorphism to C. A runtime evaluation is performed to compare the cost 268 of alternative styles of polymorphism. The goal is to compare just the underlying mechanism for 269 implementing different kinds of polymorphism. 270 271 and ends with: 272 273 We conjecture these results scale across most generic data-types as the underlying polymorphic 274 implement is constant. 275 276 277 Also, how is the compiler implemented? I guess, Cforall is a source-to-source compiler (from 278 Cforall to C). But this is left in the dark. What features are actually implemented? 279 280 The following paragraph has been added to the introduction to address this comment: 281 282 All languages features discussed in this paper are working, except some advanced exception-handling 283 features. Not discussed in this paper are the integrated concurrency-constructs and user-level 284 threading-library~\cite{Delisle18}. Cforall is an open-source project implemented as an 285 source-to-source translator from Cforall to the gcc-dialect of C~\cite{GCCExtensions}, allowing it 286 to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3). 287 Ultimately, a compiler is necessary for advanced features and optimal performance. The Cforall 288 translator is 200+ files and 46,000+ lines of code written in C/C++. Starting with a translator 289 versus a compiler makes it easier and faster to generate and debug C object-code rather than 290 intermediate, assembler or machine code. The translator design is based on the visitor pattern, 291 allowing multiple passes over the abstract code-tree, which works well for incrementally adding new 292 feature through additional visitor passes. At the heart of the translator is the type resolver, 293 which handles the polymorphic routine/type overload-resolution. The Cforall runtime system is 100+ 294 files and 11,000+ lines of code, written in Cforall. Currently, the Cforall runtime is the largest 295 user of Cforall providing a vehicle to test the language features and implementation. The Cforall 296 tests are 290+ files and 27,000+ lines of code. The tests illustrate syntactic and semantic 297 features in Cforall, plus a growing number of runtime benchmarks. The tests check for correctness 298 and are used for daily regression testing of commits (3800+). 299 300 301 Furthermore, the article lacks some related work. Many proposed features are present in 302 functional languages such as Haskell, ML etc. In particular, the dealing of parametric 303 polymorphism reminds me of Haskell. 294 304 295 305 The following paragraph has been added at the start of Section 10.1: 296 306 297 ML~\cite{ML} was the first language to support parametric polymorphism. Like 298 Cforall, it supports universal type parameters, but not the use of assertions 299 and traits to constrain type arguments. Haskell~\cite{Haskell10} combines 300 ML-style polymorphism, polymorphic data types, and type inference with the 301 notion of type classes, collections of overloadable methods that correspond in 302 intent to traits in Cforall. Unlike Cforall, Haskell requires an explicit 303 association between types and their classes that specifies the implementation 304 of operations. These associations determine the functions that are assertion 305 arguments for particular combinations of class and type, in contrast to 306 Cforall where the assertion arguments are selected at function call sites 307 based upon the set of operations in scope at that point. Haskell also 308 severely restricts the use of overloading: an overloaded name can only be 309 associated with a single class, and methods with overloaded names can only be 310 defined as part of instance declarations. 311 312 Cforall's approach to tuples is also quite similar to many functional 313 languages. 307 ML~\cite{ML} was the first language to support parametric polymorphism. Like Cforall, it supports 308 universal type parameters, but not the use of assertions and traits to constrain type arguments. 309 Haskell~\cite{Haskell10} combines ML-style polymorphism, polymorphic data types, and type inference 310 with the notion of type classes, collections of overloadable methods that correspond in intent to 311 traits in Cforall. Unlike Cforall, Haskell requires an explicit association between types and 312 their classes that specifies the implementation of operations. These associations determine the 313 functions that are assertion arguments for particular combinations of class and type, in contrast 314 to Cforall where the assertion arguments are selected at function call sites based upon the set of 315 operations in scope at that point. Haskell also severely restricts the use of overloading: an 316 overloaded name can only be associated with a single class, and methods with overloaded names can 317 only be defined as part of instance declarations. 318 319 320 Cforall's approach to tuples is also quite similar to many functional languages. 314 321 315 322 At the end of Section 10.2, we state: 316 323 317 Tuples are a fundamental abstraction in most functional programming languages, 318 such as Standard ML, Haskell}, and Scala, which decompose tuples using pattern 319 matching. 324 Tuples are a fundamental abstraction in most functional programming languages, such as Standard ML, 325 Haskell}, and Scala, which decompose tuples using pattern matching. 320 326 321 327
Note: See TracChangeset
for help on using the changeset viewer.