Changes in / [69addb4:87b9332]


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/fangren_yu_COOP_S20/Report.tex

    r69addb4 r87b9332  
    1313\usepackage{latexsym}                                   % \Box glyph
    1414\usepackage{mathptmx}                                   % better math font with "times"
    15 \usepackage{appendix}
    1615\usepackage[usenames]{color}
    1716\input{common}                                          % common CFA document macros
    1817\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
    1918\usepackage{breakurl}
    20 \urlstyle{sf}
    21 
    22 % reduce spacing
    23 \setlist[itemize]{topsep=5pt,parsep=0pt}% global
    24 \setlist[enumerate]{topsep=5pt,parsep=0pt}% global
    2519
    2620\usepackage[pagewise]{lineno}
     
    118112\begin{itemize}
    119113\item
    120 type declaration: @struct@, @union@, @typedef@ or type parameter (see \VRef[Appendix]{s:KindsTypeParameters})
     114type declaration: @struct@, @union@, @typedef@ or type parameter (see Appendix A.1)
    121115\item
    122116variable declaration
     
    380374
    381375\subsubsection{Source: \lstinline{AST/SymbolTable.hpp}}
    382 
    383 
    384376\subsubsection{Source: \lstinline{SymTab/Indexer.h}}
    385377
     
    534526Each pair of compatible branch expression types produce a possible interpretation, and the cost is defined as the sum of the expression costs plus the sum of conversion costs to the common type.
    535527
    536 
    537528\subsection{Conversion and Application Cost}
    538 
    539 There were some unclear parts in the previous documentation in the cost system, as described in the Moss thesis~\cite{Moss19}, section 4.1.2.
    540 Some clarification are presented in this section.
     529There were some unclear parts in the previous documentation of cost system, as described in the Moss thesis \cite{Moss19}, section 4.1.2. Some clarification are presented in this section.
    541530
    542531\begin{enumerate}
    543532\item
    544 Conversion to a type denoted by parameter may incur additional cost if the match is not exact.
    545 For example, if a function is declared to accept @(T, T)@ and receives @(int, long)@, @T@ is deducted @long@ and an additional widening conversion cost is added for @int@ to @T@.
    546 
    547 \item
    548 The specialization level of a function is the sum of the least depth of an appearance of a type parameter (counting pointers, references and parameterized types), plus the number of assertions.
    549 A higher specialization level is favoured if argument conversion costs are equal.
    550 
    551 \item
    552 Coercion of pointer types is only allowed in explicit cast expressions;
    553 the only allowed implicit pointer casts are adding qualifiers to the base type and cast to @void*@, and these counts as safe conversions.
    554 Note that implicit cast from @void *@ to other pointer types is no longer valid, as opposed to standard C.
     533Conversion to a type denoted by parameter may incur additional cost if the match is not exact. For example, if a function is declared to accept @(T, T)@ and receives @(int, long)@, @T@ is deducted @long@ and an additional widening conversion cost is added for @int@ to @T@.
     534
     535\item
     536The specialization level of a function is the sum of the least depth of an appearance of type parameter (counting pointers, references and parameterized types), plus the number of assertions. A higher specialization level is favored if conversion cost of arguments are equal.
     537
     538\item
     539Coercion of pointer types is only allowed in explicit cast expressions; the only allowed implicit pointer casts are adding qualifiers to the base type and cast to @void*@, and those counts as safe conversions. Note that implicit cast from @void*@ to other pointer types is no longer valid, as opposed to standard C.
     540
    555541\end{enumerate}
    556542
     
    570556At the call site, implicit parameters are automatically inserted by the compiler.
    571557
    572 Implementation of implicit parameters is discussed in \VRef[Appendix]{s:ImplementationParametricFunctions}.
     558Implementation of implicit parameters is discussed in Appendix A.3.
    573559
    574560\section{Tests}
     
    611597It is suggested to run performance tests with optimization (@g++@ flag @-O3@).
    612598
    613 
    614 \begin{appendices}[toc,titletoc]
    615599\section{Appendix}
    616600
    617 
    618601\subsection{Kinds of Type Parameters}
    619 \label{s:KindsTypeParameters}
    620 
    621 A type parameter in a @forall@ clause has three possible kinds:
    622 \begin{enumerate}[listparindent=0pt]
    623 \item
    624 @dtype@: any data type (built-in or user defined).
    625 
    626 There is also a difference between opaque types (incomplete types, \ie those with only a forward declaration) and concrete types.
    627 Only concrete types can be directly used as a variable type.
    628 
    629 \CFA provides the @otype@ shorthand to require a type parameter be concrete, which also implicitly asserts the existence of its default and copy constructors, assignment, and destructor\footnote{\CFA implements the same automatic resource management (RAII) semantics as \CC.}.
    630 \item
    631 @ftype@: any function type.
    632 
    633 @ftype@ provides two purposes:
    634 \begin{itemize}
    635 \item
    636 Differentiate function pointer from data pointer because (in theory) some systems have different sizes for these pointers.
    637 \item
    638 Disallow a function pointer to match an overloaded data pointer, since variables and functions can have the same names.
    639 \end{itemize}
    640 
    641 \item
    642 @ttype@: tuple (variadic) type.
    643 
    644 @ttype@ parameter may only appear as type of the last parameter in a function, and it provides a type-safe way to implement variadic functions.
    645 Note however, that it has certain restrictions, as described in the implementation section below.
     602The type parameters in a @forall@ clause has three different kinds:
     603\begin{enumerate}
     604\item
     605@dtype@: any data type (built-in or user defined). There is also a difference between opaque types (incomplete types, those with only a forward declaration) and concrete types. Only concrete types can be directly used as a variable type. \CFA provides the @otype@ shorthand to require a type parameter as concrete, which also implicitly asserts the existence of its constructor and destructor\footnote{\CFA implements the same automatic resource management (RAII) semantics as \CC.}.
     606\item
     607@ftype@: any function type. Since @ftype@ does not provide any information about parameter types of a function, it is rarely used. The main purpose of introducing @ftype@ is to disallow a function to match a pointer overload, since variables and functions can have the same names.
     608\item
     609@ttype@: tuple (variadic) type. @ttype@ parameter may only appear as type of the last parameter in a function, and it provides a type-safe way to implement variadic functions. Note however, that it has certain restrictions, as described in the implementation section below.
     610
    646611\end{enumerate}
    647612
    648 
    649613\subsection{GNU C Nested Functions}
    650614
     
    652616
    653617In ISO C, function definitions are not allowed to be nested. GCC allows nested functions with full lexical scoping. The following example is taken from GCC documentation\footnote{\url{https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html}}:
    654 \begin{C++}
    655 void bar( int * array, int offset, int size ) {
    656         int access( int * array, int index ) { return array[index + offset]; }
    657         int i;
    658         /* ... */
    659         for ( i = 0; i < size; i++ )
    660                 /* ... */ access (array, i) /* ... */
     618
     619\begin{C++}
     620bar (int *array, int offset, int size)
     621{
     622  int access (int *array, int index)
     623    { return array[index + offset]; }
     624  int i;
     625  /* ... */
     626  for (i = 0; i < size; i++)
     627    /* ... */ access (array, i) /* ... */
    661628}
    662629\end{C++}
    663 GCC nested functions behave identically to \CC lambda functions with default by-reference capture (stack-allocated, lifetime ends upon exiting the declared block), while also possible to be passed as arguments with standard function pointer types.
    664 
     630
     631GCC nested functions behave identically to \CC lambda functions with default by-reference capture (stack-allocated, lifetime ends upon exiting the block declared in), while also possible to be passed as arguments with standard function pointer types.
    665632
    666633\subsection{Implementation of Parametric Functions}
    667 \label{s:ImplementationParametricFunctions}
    668 
    669 \CFA implements parametric functions using the implicit parameter approach: required assertions are passed to the callee by function pointers;
    670 size of a parametric type must also be known if referenced directly (\ie not as a pointer).
     634\CFA implements parametric functions using the implicit parameter approach: required assertions are passed to the callee by function pointers; size of a parametric type must also be known if referenced directly (i.e. not as a pointer).
    671635
    672636The implementation is similar to the one from Scala\footnote{\url{https://www.scala-lang.org/files/archive/spec/2.13/07-implicits.html}}, with some notable differences in resolution:
     
    677641The parameter (assertion) name must match the actual declarations.
    678642\item
    679 Currently, assertions are all functions.
    680 Note that since \CFA has variable overloading, implicit value parameters might also be supported in the future.
     643Currently, assertions are all functions. Note that since \CFA has variable overloading, implicit value parameters might also be supported in the future.
    681644\end{enumerate}
    682645
    683646For example, the \CFA function declaration
     647
    684648\begin{cfa}
    685 forall( otype T | { int foo( T, int ); } )
     649forall(otype T | {int foo(T, int);})
    686650int bar(T);
    687651\end{cfa}
     652
    688653after implicit parameter expansion, has the actual signature\footnote{\textbf{otype} also requires the type to have constructor and destructor, which are the first two function pointers preceding the one for \textbf{foo}.}
    689 \begin{C++}
    690 int bar( T, size_t, void (*)(T&), void (*)(T&), int (*)(T, int) );
    691 \end{C++}
    692 The implicit parameter approach has an apparent issue: when the satisfying declaration is also parametric, it may require its own implicit parameters too.
    693 That also causes the supplied implicit parameter to have a different \textbf{actual} type than the \textbf{nominal} type, so it cannot be passed directly.
    694 Therefore, a wrapper with matching actual type must be created, and it is here where GCC nested functions are used internally by the compiler.
     654
     655\begin{C++}
     656int bar(T, size_t, void (*)(T&), void (*)(T&), int (*)(T, int));
     657\end{C++}
     658
     659The implicit parameter approach has an apparent issue: when the satisfying declaration is also parametric, it may require its own implicit parameters too. That also causes the supplied implicit parameter to have a different \textbf{actual} type than the \textbf{nominal} type, so it cannot be passed directly. Therefore, a wrapper with matching actual type must be created, and here it is where GCC nested function is used internally by the compiler.
    695660
    696661Consider the following program:
     
    698663int assertion(int);
    699664
    700 forall( otype T | { int assertion(T); } )
     665forall (otype T | {int assertion(T);})
    701666void foo(T);
    702667
    703 forall(otype T | { void foo(T); } )
     668forall (otype T | {void foo(T);})
    704669void bar(T t) {
    705670        foo(t);
    706671}
    707672\end{cfa}
    708 The \CFA compiler translates the program to non-parametric form\footnote{In the final code output, \lstinline@T@ needs to be replaced by an opaque type, and arguments must be accessed by a frame pointer offset table, due to the unknown sizes. The presented code here is simplified for better understanding.}
     673
     674\CFA compiler translates the program to non-parametric form\footnote{In the final code output, T needs to be replaced by an opaque type, and arguments must be accessed by a frame pointer offset table, due to the unknown sizes. The presented code here is simplified for better understanding.}
     675
    709676\begin{C++}
    710677// ctor, dtor and size arguments are omitted
     
    715682}
    716683\end{C++}
     684
    717685However, when @bar(1)@ is called, @foo@ cannot be directly provided as an argument:
     686
    718687\begin{C++}
    719688bar(1, foo); // WRONG: foo has different actual type
    720689\end{C++}
     690
    721691and an additional step is required:
     692
    722693\begin{C++}
    723694{
    724695        void _foo_wrapper(int t) {
    725                 foo( t, assertion );
     696                foo(t, assertion);
    726697        }
    727         bar( 1, _foo_wrapper );
     698        bar(1, _foo_wrapper);
    728699}
    729700\end{C++}
    730 Nested assertions and implicit parameter creation may continue indefinitely.
    731 This issue is a limitation of implicit parameter implementation.
    732 In particular, polymorphic variadic recursion must be structural (\ie the number of arguments decreases in any possible recursive calls), otherwise code generation gets into an infinite loop.
    733 The \CFA compiler sets a limit on assertion depth and reports an error if assertion resolution does not terminate within the limit (as for \lstinline[language=C++]@templates@ in \CC).
    734 \end{appendices}
     701
     702Nested assertions and implicit parameter creation may continue indefinitely. This is a limitation of implicit parameter implementation. In particular, polymorphic variadic recursion must be structural (i.e. number of arguments decreases in any possible recursive calls), otherwise code generation gets into an infinite loop. \CFA compiler sets a limit on assertion depth and reports an error if assertion resolution does not terminate within the limit.
    735703
    736704\bibliographystyle{plain}
Note: See TracChangeset for help on using the changeset viewer.