Changes in / [35ea4f3:0edd11a]
- Files:
-
- 4 edited
-
doc/theses/andrew_beach_MMath/features.tex (modified) (16 diffs)
-
doc/theses/andrew_beach_MMath/future.tex (modified) (3 diffs)
-
doc/theses/fangren_yu_COOP_F20/Report.tex (modified) (2 diffs)
-
libcfa/src/stdlib.hfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/andrew_beach_MMath/features.tex
r35ea4f3 r0edd11a 10 10 of they virtual system was designed and implemented. 11 11 12 Virtual types are organiz ed in simple hierarchies. Each virtual type may have12 Virtual types are organizied in simple hierarchies. Each virtual type may have 13 13 a parent and can have any number of children. A type's descendants are its 14 14 children and its children's descendants. A type may not be its own descendant. … … 17 17 structure that has fields for all the virtual members of a type. A virtual 18 18 type has all the virtual members of its parent and can add more. It may also 19 update the values of the virtual members and should in many cases.19 update the values of the virtual members. 20 20 21 21 Except for virtual casts, this is only used internally in the exception … … 27 27 \end{lstlisting} 28 28 29 This has the same prec edence as a traditional C-cast and can be used in the29 This has the same precidence as a traditional C-cast and can be used in the 30 30 same places. This will convert the result of EXPRESSION to the type TYPE. Both 31 31 the type of EXPRESSION and TYPE must be pointers to virtual types. … … 41 41 % features all exceptions support. 42 42 43 \subsection{Exception Traits}44 Exceptions are defined by the trait system; there are a series of traits and45 if a type satisfies them then they can be used as exceptions.46 47 \begin{lstlisting}48 trait is_exception(dtype exceptT, dtype virtualT) {49 virtualT const & get_exception_vtable(exceptT *);50 };51 \end{lstlisting}52 This is the base trait that all exceptions need to match.53 The single function takes any pointer (including the null pointer) and54 returns a reference to the virtual table instance. Defining this function55 also establishes the virtual type and virtual table pair to the resolver56 and promises that \codeCFA{exceptT} is a virtual type and a child of the57 base exception type.58 59 One odd thing about \codeCFA{get_exception_vtable} is that it should always60 be a constant function, returning the same value regardless of its argument.61 A pointer or reference to the virtual table instance could be used instead,62 however using a function has some ease of implementation advantages and63 allows for easier disambiguation because the virtual type name (or the64 address of an instance that is in scope) can be used instead of the mangled65 virtual table name.66 67 Also note the use of the word ``promise" in the trait description. \CFA68 cannot currently check to see if either \codeCFA{exceptT} or69 \codeCFA{virtualT} match the layout requirements. Currently this is70 considered part of \codeCFA{get_exception_vtable}'s correct implementation.71 72 \begin{lstlisting}73 trait is_termination_exception(74 dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {75 void defaultTerminationHandler(exceptT &);76 };77 \end{lstlisting}78 The only additional function required to make the exception usable with79 termination is a default handler. This function is called whenever a80 termination throw on an exception of this type is preformed and no handler81 is found.82 83 \begin{lstlisting}84 trait is_resumption_exception(85 dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) {86 void defaultResumptionHandler(exceptT &);87 };88 \end{lstlisting}89 Creating a resumption exception is exactly the same except for resumption.90 The name change reflects that and the function is called when a resumption91 throw on an exception of this type is preformed and no handler is found.92 93 Finally there are three additional macros that can be used to refer to the94 these traits. They are \codeCFA{IS_EXCEPTION},95 \codeCFA{IS_TERMINATION_EXCEPTION} and \codeCFA{IS_RESUMPTION_EXCEPTION}.96 Each takes the virtual type's name and, for polymorphic types only, the97 parenthesized list of polymorphic arguments. These do the name mangling to98 get the virtual table name and provide the arguments to both sides.99 100 43 \section{Termination} 101 44 102 Termination exception throws are likely the most f amiliar kind, as they are45 Termination exception throws are likely the most framilar kind, as they are 103 46 used in several popular programming languages. A termination will throw an 104 47 exception, search the stack for a handler, unwind the stack to where the … … 123 66 124 67 Then the exception system will search the stack starting from the throw and 125 proce eding towards the base of the stack, from callee to caller. As it goes68 proceding towards the base of the stack, from callee to caller. As it goes 126 69 it will check any termination handlers it finds: 127 70 … … 168 111 \paragraph{Re-Throwing} 169 112 170 You can also re -throw the most recent termination exception with113 You can also rethrow the most recent termination exception with 171 114 \codeCFA{throw;}. % This is terrible and you should never do it. 172 115 This can be done in a handler or any function that could be called from a … … 192 135 \end{lstlisting} 193 136 The result of EXPRESSION must be a resumption exception type. A resumption 194 exception type is any type that sati sfies the assertion137 exception type is any type that satifies the assertion 195 138 \codeCFA{void defaultResumptionHandler(T &);} (the default handler). When the 196 139 statement is executed the expression is evaluated and the result is thrown. … … 216 159 continues from the throw statement. 217 160 218 If no appropr iate handler is found then the default handler is called. The161 If no approprate handler is found then the default handler is called. The 219 162 throw statement acts as a regular function call passing the exception to 220 163 the default handler and after the handler finishes executing control continues … … 231 174 which is what most users expect. 232 175 233 % This might need a diagram. But it is an important part of the justif ication176 % This might need a diagram. But it is an important part of the justifaction 234 177 % of the design of the traversal order. 235 178 It also avoids the recursive resumption problem. If the entire stack is … … 241 184 system an A resumed from the top of the stack will be handled by the first 242 185 handler. A B resumed from the top or from the first handler it will be handled 243 by the second hand ler. The only difference is when A is thrown from the second186 by the second hander. The only difference is when A is thrown from the second 244 187 handler. The entire stack search will call the first handler again, creating a 245 188 loop. Starting from the position in the stack though will break this loop. … … 255 198 It also has the same behaviour, after the exception type has been matched 256 199 with the EXCEPTION\_TYPE the CONDITION is evaluated with NAME in scope. If 257 the result is true then the hand ler is run, otherwise the search continues200 the result is true then the hander is run, otherwise the search continues 258 201 just as if there had been a type mismatch. 259 202 … … 298 241 the finally block. Other ways to leave the finally block - such as a long 299 242 jump or termination - are much harder to check, at best requiring additional 300 run -time overhead, and so are merely discouraged.243 runtime overhead, and so are merely discouraged. 301 244 302 245 \section{Cancellation} … … 307 250 308 251 There is no special statement for starting a cancellation, instead you call 309 the standard lib rary function \codeCFA{cancel\_stack} which takes an exception.252 the standard libary function \codeCFA{cancel\_stack} which takes an exception. 310 253 Unlike in a throw this exception is not used in control flow but is just there 311 254 to pass information about why the cancellation happened. 312 255 313 The handler is decided entirely by which stack is being cancel ed. There are256 The handler is decided entirely by which stack is being cancelled. There are 314 257 three handlers that apply to three different groups of stacks: 315 258 \begin{itemize} … … 323 266 324 267 \item Thread Stack: 325 Thread stacks are those created \codeCFA{thread} or otherwise sati sfy the268 Thread stacks are those created \codeCFA{thread} or otherwise satify the 326 269 \codeCFA{is\_thread} trait. 327 270 … … 345 288 context required for the other. This can happen with join but as the 346 289 destructors will always be run when the stack is being unwound and one 347 termination/cancellation is already active. Also since they are implicit they290 termination/cancellation is already active. Also since they are implicite they 348 291 are easier to forget about. 349 292 350 293 \item Coroutine Stack: 351 294 Coroutine stacks are those created with \codeCFA{coroutine} or otherwise 352 sati sfy the \codeCFA{is\_coroutine} trait.295 satify the \codeCFA{is\_coroutine} trait. 353 296 354 297 A coroutine knows of two other coroutines, its starter and its last resumer. … … 358 301 Resume will resume throw a \codeCFA{CoroutineCancelled} exception, which is 359 302 polymorphic over the coroutine type and has a pointer to the coroutine being 360 cancel ed and the canceling exception. The resume function also has an303 cancelled and the cancelling exception. The resume function also has an 361 304 assertion that the \codeCFA{defaultResumptionHandler} for the exception. So it 362 305 will use the default handler like a regular throw. -
doc/theses/andrew_beach_MMath/future.tex
r35ea4f3 r0edd11a 8 8 parts of the exception system that use the current version. 9 9 10 There are several improvements to the virtual system that would improve 11 the exception traits. The biggest one is an assertion that checks that one 12 virtual type is a child of another virtual type. This would capture many of 13 the requirements much more precisely. 14 15 The full virtual system might also include other improvement like associated 16 types. This is a proposed feature that would allow traits to refer to types 17 not listed in their header. This would allow the exception traits to not 18 refer to the virtual table type explicatly which would remove the need for 19 the interface macros. 10 For instance a full virtual system would probably allow for several 11 improvements to the exception traits. Although they do currently work they 12 could be made easier to use by making the virtual table type implitate in the 13 trait (which would remove the need for those wrapper marcos) or allowing 14 for assertions that give the layout of a virtual table for safety. 20 15 21 16 \section{Additional Throws} … … 70 65 71 66 Also new techniques to skip previously searched parts of the stack will have 72 to be developed. The recursive resume problem still remains and ideally the 73 same pattern of ignoring sections of the stack. 67 to be developed. 74 68 75 \section{Signal Exceptions} 76 Exception Handling: Issues and a Proposed Notation suggests there are three 77 types of exceptions: escape, notify and signal. 78 Escape exceptions are our termination exceptions, notify exceptions are 79 resumption exceptions and that leaves signal exception unimplemented. 69 \section{Support for More Platforms} 70 Termination is not portable because it is implemented with inline assembly. 71 Those sections will have to be rewritten to support different architectures 80 72 81 Signal exceptions allow either behaviour, that is after the exception is 82 handled control can either return to the throw or from where the handler is 83 defined. 84 85 The design should be rexamined and be updated for \CFA. A very direct 86 translation would perhaps have a new throw and catch pair and a statement 87 (or statements) could be used to decide if the handler returns to the throw 88 or continues where it is, but there are other options. 89 90 For instance resumption could be extended to cover this use by allowing 91 local control flow out of it. This would require an unwind as part of the 92 transition as there are stack frames that have to be removed. 93 This would mean there is no notify like throw but because \CFA does not have 94 exception signatures a termination can be thrown from any resumption handler 95 already so there are already ways one could try to do this in existing \CFA. 96 97 % Maybe talk about the escape; and escape CONTROL_STMT; statements or how 98 % if we could choose if _Unwind_Resume proceeded to the clean-up stage this 99 % would be much easier to implement. 100 101 \section{Language Improvements} 102 There is also a lot of work that are not follow ups to this work in terms of 103 research, some have no interesting research to be done at all, but would 104 improve \CFA as a programming language. The full list of these would 105 naturally be quite extensive but here are a few examples that involve 106 exceptions: 73 \section{Quality-of-Life Improvements} 74 Finally come various improvements to the usability of \CFA. Most of these 75 would just require time. Time that would not lead to interesting research so 76 it has been left aside for now. A few examples are included here but there 77 are more: 107 78 108 79 \begin{itemize} 109 \item The implementation of termination is not portable because it includes110 some assembly statements. These sections will have to be re-written to so111 \CFA has full support on more machines.112 80 \item Allowing exception handler to bind the exception to a reference instead 113 81 of a pointer. This should actually result in no change in behaviour so there … … 120 88 much easier. (To do the same for try blocks would probably wait for zero-cost 121 89 exceptions, which would allow the try block to be inlined as well.) 90 \item Enabling local control flow out of a resumption handler. This would be 91 a weighty operation, causing a stack unwind like a termination, so there might 92 be a different statement or a statement modifier to make sure the user does 93 this purposefully. 94 95 However this would require the more complex system as they cannot be inlined 96 into the original function as they can be run at a different place on the 97 stack. So instead the unwinding will have to carry with it information on 98 which one of these points to continue at and possibly also the return value 99 for the function if a \codeCFA{return} statement was used. 122 100 \end{itemize} -
doc/theses/fangren_yu_COOP_F20/Report.tex
r35ea4f3 r0edd11a 87 87 88 88 \begin{abstract} 89 90 \CFA is an evolutionary extension to the C programming language, featuring a parametric type system, and is currently under active development. The reference compiler for \CFA language, @cfa-cc@, has some of its major components dated back to early 2000s, and is based on inefficient data structures and algorithms. Some improvements targeting the expression resolution algorithm, suggested by a recent prototype experiment on a simplified model, are implemented in @cfa-cc@ to support the full \CFA language. These optimizations speed up the compiler significantly by a factor of 20 across the existing \CFA codebase, bringing the compilation time of a mid-sized \CFA source file down to 10-second level. A few cases derived from realistic code examples that causes trouble to the compiler are analyzed in detail, with proposed solutions. This step of \CFA project development is critical to its eventual goal to be used alongside C for large software systems.91 92 89 \end{abstract} 93 90 94 91 \section{Introduction} 95 96 \CFA language, developed by the Programming Language Group at University of Waterloo, has a long history, with the first proof-of-concept compiler built in 2003 by Richard Bilson~\cite{Bilson03}. Many new features are added to the language over time, but the core of \CFA, parametric functions introduced by the @forall@ clause (hence the name of the language), with the type system supporting parametric overloading, remains mostly unchanged.97 98 The current \CFA reference compiler @cfa-cc@ still includes many parts taken directly from the original Bilson's implementation, and serves as a starting point for the enhancement work to the type system. Unfortunately, it does not provide the efficiency required for the language to be used practically: a \CFA source file of approximately 1000 lines of code can take a few minutes to compile. The cause of the problem is that the old compiler used inefficient data structures and algorithms for expression resolution, which involved a lot of copying and redundant work.99 100 This paper presents a series of optimizations to the performance-critical parts of the resolver, with a major rework of the data structure used by the compiler, using a functional programming approach to reduce memory complexity. Subsequent improvements are mostly suggested by running the compiler builds with a performance profiler against the \CFA standard library source code and a test suite to find the most underperforming components in the compiler algorithm.101 102 The \CFA team endorses a pragmatic philosophy in work that mostly focuses on practical implications of language design and implementation, rather than the theoretical limits. In particular, the compiler is designed to work on production \CFA code efficiently and keep type safety, while sometimes making compromises to expressiveness in extreme corner cases. However, when these corner cases do appear in actual usage, they need to be thoroughly investigated. Analysis presented in this paper, therefore, are conducted on a case-by-case basis. Some of them eventually point to certain weaknesses in the language design and solutions are proposed based on experimental results.103 92 104 93 \section{Completed work} … … 455 444 \section{Timing results} 456 445 457 For the timing results presented here, the \CFA compiler is built with gcc 9.3.0, and tested on a server machine running Ubuntu 20.04, 64GB RAM and 32-core 2.2 GHz CPU, results reported by the time command, and using only 8 cores in parallel such that the time is close to the case with 100 \% CPU utilization on a single thread.446 For the timing results presented here, the \CFA compiler is built with gcc 9.3.0, and tested on a server machine running Ubuntu 20.04, 64GB RAM and 32-core 2.2 GHz CPU, results reported by the time command, and using only 8 cores in parallel such that the time is close to the case with 100% CPU utilization on a single thread. 458 447 459 448 On the most recent build, the \CFA standard library (~1.3 MB of source code) compiles in 4 minutes 47 seconds total processor time (single thread equivalent), with the slowest file taking 13 seconds. The test suite (178 test cases, ~2.2MB of source code) completes within 25 minutes total processor time,\footnote{Including a few runtime tests; total time spent in compilation is approximately 21 minutes.} with the slowest file taking 23 seconds. In contrast, the library build on old compiler takes 85 minutes total, 5 minutes for the slowest file. Full test suite takes too long with old compiler build and is therefore not run, but the slowest test cases take approximately 5 minutes. Overall, the most recent build compared to old build in April 2020, before the project started, is consistently faster by a factor of 20. -
libcfa/src/stdlib.hfa
r35ea4f3 r0edd11a 191 191 } else if(Fill.tag == 't') { 192 192 for ( int i = copy_end; i < Dim * size; i += size ) { 193 #pragma GCC diagnostic push194 #pragma GCC diagnostic ignored "-Warray-bounds"195 #pragma GCC diagnostic push196 #pragma GCC diagnostic ignored "-Wstringop-overflow="197 193 memcpy( (char *)ptr + i, &Fill.t, size ); 198 #pragma GCC diagnostic pop199 #pragma GCC diagnostic pop200 194 } 201 195 } else if(Fill.tag == 'a') {
Note:
See TracChangeset
for help on using the changeset viewer.