Changeset 4ed7946e
- Timestamp:
- Jun 4, 2021, 11:24:41 AM (3 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 53692b3, 9e67e92
- Parents:
- 553f8abe
- Location:
- doc/theses/andrew_beach_MMath
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/andrew_beach_MMath/existing.tex
r553f8abe r4ed7946e 2 2 \label{c:existing} 3 3 4 \CFA (C-for-all)~\cite{Cforall}is an open-source project extending ISO C with4 \CFA is an open-source project extending ISO C with 5 5 modern safety and productivity features, while still ensuring backwards 6 6 compatibility with C and its programmers. \CFA is designed to have an … … 9 9 existing C code-base allowing programmers to learn \CFA on an as-needed basis. 10 10 11 Only those \CFA features pert inentto this thesis are discussed. Many of the11 Only those \CFA features pertaining to this thesis are discussed. Many of the 12 12 \CFA syntactic and semantic features used in the thesis should be fairly 13 13 obvious to the reader. … … 29 29 // name mangling on by default 30 30 int i; // _X1ii_1 31 extern "C"{ // disables name mangling31 @extern "C"@ { // disables name mangling 32 32 int j; // j 33 extern "Cforall"{ // enables name mangling33 @extern "Cforall"@ { // enables name mangling 34 34 int k; // _X1ki_1 35 35 } … … 45 45 \CFA adds a reference type to C as an auto-dereferencing pointer. 46 46 They work very similarly to pointers. 47 Reference-types are written the same way as a pointer-type isbut each47 Reference-types are written the same way as a pointer-type but each 48 48 asterisk (@*@) is replaced with a ampersand (@&@); 49 this includes cv-qualifiers and multiple levels of reference. 50 51 They are intended for cases where you would want to use pointers but would 52 be dereferencing them (almost) every usage. 53 In most cases a reference can just be thought of as a pointer that 54 automatically puts a dereference infront of each of its uses (per-level of 55 reference). 56 The address-of operator (@&@) acts as an escape and removes one of the 57 automatic dereference operations. 58 Mutable references may be assigned to by converting them to a pointer 59 with a @&@ and then assigning a pointer too them. 60 61 \begin{minipage}{0,45\textwidth} 49 this includes cv-qualifiers and multiple levels of reference, \eg: 50 51 \begin{minipage}{0,5\textwidth} 62 52 With references: 63 53 \begin{cfa} … … 66 56 int && rri = ri; 67 57 rri = 3; 68 &ri = &j; 58 &ri = &j; // reference assignment 69 59 ri = 5; 70 60 \end{cfa} 71 61 \end{minipage} 72 \begin{minipage}{0, 45\textwidth}62 \begin{minipage}{0,5\textwidth} 73 63 With pointers: 74 64 \begin{cfa} … … 77 67 int ** ppi = π 78 68 **ppi = 3; 79 pi = &j; 69 pi = &j; // pointer assignment 80 70 *pi = 5; 81 71 \end{cfa} 82 72 \end{minipage} 83 73 84 \section{Constructors and Destructors} 85 86 Both constructors and destructors are operators, which means they are 87 functions with special operator names rather than type names in \Cpp. The 88 special operator names may be used to call the functions explicitly (not 89 allowed in \Cpp for constructors). 74 References are intended for cases where you would want to use pointers but would 75 be dereferencing them (almost) every usage. 76 In most cases a reference can just be thought of as a pointer that 77 automatically puts a dereference in front of each of its uses (per-level of 78 reference). 79 The address-of operator (@&@) acts as an escape and removes one of the 80 automatic dereference operations. 81 Mutable references may be assigned by converting them to a pointer 82 with a @&@ and then assigning a pointer to them, as in @&ri = &j;@ above. 83 84 \section{Operators} 90 85 91 86 In general, operator names in \CFA are constructed by bracketing an operator … … 95 90 (such as @++?@) and post-fix operations (@?++@). 96 91 97 The special name for a constructor is @?{}@, which comes from the 98 initialization syntax in C. That initialation syntax is also the operator 99 form. \CFA will generate a constructor call each time a variable is declared, 100 passing the initialization arguments to the constructort. 101 \begin{cfa} 102 struct Example { ... }; 103 void ?{}(Example & this) { ... } 104 { 105 Example a; 106 Example b = {}; 107 } 108 void ?{}(Example & this, char first, int num) { ... } 109 { 110 Example c = {'a', 2}; 111 } 112 \end{cfa} 113 Both @a@ and @b@ will be initalized with the first constructor (there is no 114 general way to skip initialation) while @c@ will be initalized with the 115 second. 92 An operator name may describe any function signature (it is just a name) but 93 only certain signatures may be called in operator form. 94 \begin{cfa} 95 int ?+?( int i, int j, int k ) { return i + j + k; } 96 { 97 sout | ?+?( 3, 4, 5 ); // no infix form 98 } 99 \end{cfa} 100 Some ``near-misses" for unary/binary operator prototypes generate warnings. 101 102 Both constructors and destructors are operators, which means they are 103 functions with special operator names rather than type names in \Cpp. The 104 special operator names may be used to call the functions explicitly (not 105 allowed in \Cpp for constructors). 106 107 The special name for a constructor is @?{}@, where the name @{}@ comes from the 108 initialization syntax in C, \eg @Structure s = {...}@. 109 % That initialization syntax is also the operator form. 110 \CFA generates a constructor call each time a variable is declared, 111 passing the initialization arguments to the constructor. 112 \begin{cfa} 113 struct Structure { ... }; 114 void ?{}(Structure & this) { ... } 115 { 116 Structure a; 117 Structure b = {}; 118 } 119 void ?{}(Structure & this, char first, int num) { ... } 120 { 121 Structure c = {'a', 2}; 122 } 123 \end{cfa} 124 Both @a@ and @b@ are initialized with the first constructor, 125 while @c@ is initialized with the second. 126 Currently, there is no general way to skip initialization. 116 127 117 128 % I don't like the \^{} symbol but $^\wedge$ isn't better. 118 Similarly destructors use the special name @^?{}@ (the @^@ has no special119 meaning). They can be called explicatly as well but normally they are120 implicitly called on a variable when it goes out of scope.121 \begin{cfa} 122 void ^?{}( Example & this) { ... }123 { 124 Example d;129 Similarly, destructors use the special name @^?{}@ (the @^@ has no special 130 meaning). Normally, they are implicitly called on a variable when it goes out 131 of scope but they can be called explicitly as well. 132 \begin{cfa} 133 void ^?{}(Structure & this) { ... } 134 { 135 Structure d; 125 136 } // <- implicit destructor call 126 137 \end{cfa} 127 No operator name is restricted in what function signatures they may be bound 128 to although most of the forms cannot be called in operator form. Some 129 ``near-misses" will generate warnings. 130 131 Whenever a type is defined, \CFA will create a default zero-argument 138 139 Whenever a type is defined, \CFA creates a default zero-argument 132 140 constructor, a copy constructor, a series of argument-per-field constructors 133 141 and a destructor. All user constructors are defined after this. … … 153 161 char capital_a = identity( 'A' ); 154 162 \end{cfa} 155 Each use of a polymorphic declaration will resolveits polymorphic parameters163 Each use of a polymorphic declaration resolves its polymorphic parameters 156 164 (in this case, just @T@) to concrete types (@int@ in the first use and @char@ 157 165 in the second). … … 159 167 To allow a polymorphic function to be separately compiled, the type @T@ must be 160 168 constrained by the operations used on @T@ in the function body. The @forall@ 161 clause sis augmented with a list of polymorphic variables (local type names)169 clause is augmented with a list of polymorphic variables (local type names) 162 170 and assertions (constraints), which represent the required operations on those 163 171 types used in a function, \eg: 164 172 \begin{cfa} 165 forall( T | { void do_once(T); } )173 forall( T | { void do_once(T); } ) 166 174 void do_twice(T value) { 167 175 do_once(value); … … 190 198 void do_once(double y) { ... } 191 199 int quadruple(int x) { 192 void do_once(int y) { y = y * 2; } 193 do_twice(x); 200 void do_once(int y) { y = y * 2; } // replace global do_once 201 do_twice(x); // use local do_once 202 do_twice(x + 1.5); // use global do_once 194 203 return x; 195 204 } 196 205 \end{cfa} 197 206 Specifically, the complier deduces that @do_twice@'s T is an integer from the 198 argument @x@. It then looks for the most specificdefinition matching the207 argument @x@. It then looks for the most \emph{specific} definition matching the 199 208 assertion, which is the nested integral @do_once@ defined within the 200 209 function. The matched assertion function is then passed as a function pointer 201 to @do_twice@ and called within it. 202 The global definition of @do_once@ is ignored.210 to @do_twice@ and called within it. The global definition of @do_once@ is used 211 for the second call because the float-point argument is a better match. 203 212 204 213 To avoid typing long lists of assertions, constraints can be collect into … … 270 279 Each coroutine has a @main@ function, which takes a reference to a coroutine 271 280 object and returns @void@. 272 \begin{cfa} 281 \begin{cfa}[numbers=left] 273 282 void main(CountUp & this) { 274 283 for (unsigned int next = 0 ; true ; ++next) { 275 284 next = up; 276 285 suspend;$\label{suspend}$ -
doc/theses/andrew_beach_MMath/features.tex
r553f8abe r4ed7946e 3 3 4 4 This chapter covers the design and user interface of the \CFA 5 exception-handling mechanism (EHM). % or exception system. 6 7 We will begin with an overview of EHMs in general. It is not a strict 8 definition of all EHMs nor an exaustive list of all possible features. 9 However it does cover the most common structure and features found in them. 5 EHM, % or exception system. 6 and begins with a general overview of EHMs. It is not a strict 7 definition of all EHMs nor an exhaustive list of all possible features. 8 However it does cover the most common structures and features found in them. 10 9 11 10 % We should cover what is an exception handling mechanism and what is an 12 11 % exception before this. Probably in the introduction. Some of this could 13 12 % move there. 14 \ paragraph{Raise / Handle}13 \section{Raise / Handle} 15 14 An exception operation has two main parts: raise and handle. 16 15 These terms are sometimes also known as throw and catch but this work uses 17 16 throw/catch as a particular kind of raise/handle. 18 These are the two parts that the user w ill write themselves and may17 These are the two parts that the user writes and may 19 18 be the only two pieces of the EHM that have any syntax in the language. 20 19 21 \ subparagraph{Raise}20 \paragraph{Raise} 22 21 The raise is the starting point for exception handling. It marks the beginning 23 of exception handling by raising an excep ion, which passes it to22 of exception handling by raising an exception, which passes it to 24 23 the EHM. 25 24 26 25 Some well known examples include the @throw@ statements of \Cpp and Java and 27 the \code{Python}{raise} statement from Python. In real systems araise may28 p reform some other work (such as memory management) but for the26 the \code{Python}{raise} statement from Python. A raise may 27 perform some other work (such as memory management) but for the 29 28 purposes of this overview that can be ignored. 30 29 31 \ subparagraph{Handle}30 \paragraph{Handle} 32 31 The purpose of most exception operations is to run some user code to handle 33 32 that exception. This code is given, with some other information, in a handler. 34 33 35 34 A handler has three common features: the previously mentioned user code, a 36 region of code they coverand an exception label/condition that matches35 region of code they guard, and an exception label/condition that matches 37 36 certain exceptions. 38 Only raises inside the covered region and raising exceptions that match the37 Only raises inside the guarded region and raising exceptions that match the 39 38 label can be handled by a given handler. 40 Different EHMs will have different rules to pick a handler41 if multip e handlers could be usedsuch as ``best match" or ``first found".39 Different EHMs have different rules to pick a handler, 40 if multiple handlers could be used, such as ``best match" or ``first found". 42 41 43 42 The @try@ statements of \Cpp, Java and Python are common examples. All three 44 also show another common feature of handlers, they are grouped by the covered43 also show another common feature of handlers, they are grouped by the guarded 45 44 region. 46 45 47 \ paragraph{Propagation}46 \section{Propagation} 48 47 After an exception is raised comes what is usually the biggest step for the 49 EHM: finding and setting up the handler. The prop ogation from raise to48 EHM: finding and setting up the handler. The propagation from raise to 50 49 handler can be broken up into three different tasks: searching for a handler, 51 matching against the handler and installing the handler.52 53 \ subparagraph{Searching}50 matching against the handler, and installing the handler. 51 52 \paragraph{Searching} 54 53 The EHM begins by searching for handlers that might be used to handle 55 54 the exception. Searching is usually independent of the exception that was 56 thrown as it looks for handlers that have the raise site in their covered55 thrown as it looks for handlers that have the raise site in their guarded 57 56 region. 58 This includes handlers in the current function, as well as any in callers59 on the stack that have the function call in their covered region.60 61 \ subparagraph{Matching}57 This search includes handlers in the current function, as well as any in callers 58 on the stack that have the function call in their guarded region. 59 60 \paragraph{Matching} 62 61 Each handler found has to be matched with the raised exception. The exception 63 label defines a condition that be use used with exception and decidesif62 label defines a condition that is used with the exception to decide if 64 63 there is a match or not. 65 64 66 In languages where the first match is used this step is intertwined with67 searching , a match check is preformed immediately after the search finds65 In languages where the first match is used, this step is intertwined with 66 searching: a match check is performed immediately after the search finds 68 67 a possible handler. 69 68 70 \s ubparagraph{Installing}69 \section{Installing} 71 70 After a handler is chosen it must be made ready to run. 72 71 The implementation can vary widely to fit with the rest of the … … 75 74 case when stack unwinding is involved. 76 75 77 If a matching handler is not guarantied to be found the EHM will need a 78 different course of action here in the cases where no handler matches. 79 This is only required with unchecked exceptions as checked exceptions 80 (such as in Java) can make than guaranty. 81 This different action can also be installing a handler but it is usually an 82 implicat and much more general one. 83 84 \subparagraph{Hierarchy} 76 If a matching handler is not guarantied to be found, the EHM needs a 77 different course of action for the case where no handler matches. 78 This situation only occurs with unchecked exceptions as checked exceptions 79 (such as in Java) can make the guarantee. 80 This unhandled action can abort the program or install a very general handler. 81 82 \paragraph{Hierarchy} 85 83 A common way to organize exceptions is in a hierarchical structure. 86 This is especially truein object-orientated languages where the84 This organization is often used in object-orientated languages where the 87 85 exception hierarchy is a natural extension of the object hierarchy. 88 86 … … 113 111 114 112 The EHM can return control to many different places, 115 the most common are after the handler definition and after the raise.113 the most common are after the handler definition (termination) and after the raise (resumption). 116 114 117 115 \paragraph{Communication} 118 116 For effective exception handling, additional information is often passed 119 from the raise to the handler .117 from the raise to the handler and back again. 120 118 So far only communication of the exceptions' identity has been covered. 121 A common method is putting fields into the exception instance and giving the122 handler access to them. 119 A common communication method is putting fields into the exception instance and giving the 120 handler access to them. References in the exception instance can push data back to the raise. 123 121 124 122 \section{Virtuals} 125 123 Virtual types and casts are not part of \CFA's EHM nor are they required for 126 124 any EHM. 127 However the \CFA uses a hierarchy built with the virtual system as the basis128 for exceptions andexception matching.129 130 The virtual system would have ideallybeen part of \CFA before the work125 However, one of the best ways to support an exception hierarchy is via a virtual system 126 among exceptions and used for exception matching. 127 128 Ideally, the virtual system would have been part of \CFA before the work 131 129 on exception handling began, but unfortunately it was not. 132 Because of thisonly the features and framework needed for the EHM were130 Therefore, only the features and framework needed for the EHM were 133 131 designed and implemented. Other features were considered to ensure that 134 the structure could accom idate other desirable featuresbut they were not132 the structure could accommodate other desirable features in the future but they were not 135 133 implemented. 136 The rest of this section will only discuss the finalized portionof the137 virtual system.134 The rest of this section discusses the implemented subset of the 135 virtual-system design. 138 136 139 137 The virtual system supports multiple ``trees" of types. Each tree is … … 145 143 % A type's ancestors are its parent and its parent's ancestors. 146 144 % The root type has no ancestors. 147 % A type's dece ndents are its children and its children's decendents.145 % A type's decedents are its children and its children's decedents. 148 146 149 147 Every virtual type also has a list of virtual members. Children inherit … … 151 149 It is important to note that these are virtual members, not virtual methods 152 150 of object-orientated programming, and can be of any type. 151 152 \PAB{I do not understand these sentences. Can you add an example? $\Rightarrow$ 153 153 \CFA still supports virtual methods as a special case of virtual members. 154 Function pointers that take a pointer to the virtual type will be modified154 Function pointers that take a pointer to the virtual type are modified 155 155 with each level of inheritance so that refers to the new type. 156 156 This means an object can always be passed to a function in its virtual table 157 as if it were a method. 157 as if it were a method.} 158 158 159 159 Each virtual type has a unique id. 160 This uniqueid and all the virtual members are combined160 This id and all the virtual members are combined 161 161 into a virtual table type. Each virtual type has a pointer to a virtual table 162 162 as a hidden field. 163 164 \PAB{God forbid, maybe you need a UML diagram to relate these entities.} 163 165 164 166 Up until this point the virtual system is similar to ones found in 165 167 object-orientated languages but this where \CFA diverges. Objects encapsulate a 166 168 single set of behaviours in each type, universally across the entire program, 167 and indeed all programs that use that type definition. In this sense the169 and indeed all programs that use that type definition. In this sense, the 168 170 types are ``closed" and cannot be altered. 169 171 170 In \CFA types do not encapsulate any behaviour. Traits are local and171 types can begin to s tatify a trait, stop satifying a trait or satify the same172 In \CFA, types do not encapsulate any behaviour. Traits are local and 173 types can begin to satisfy a trait, stop satisfying a trait or satisfy the same 172 174 trait in a different way at any lexical location in the program. 173 In this sense they are ``open" as they can change at any time. Thismeans it174 is imp lossible to pick a single set of functions that repersent the type's175 In this sense, they are ``open" as they can change at any time. This capability means it 176 is impossible to pick a single set of functions that represent the type's 175 177 implementation across the program. 176 178 177 179 \CFA side-steps this issue by not having a single virtual table for each 178 type. A user can define virtual tables whichare filled in at their179 declaration and given a name. Anywhere that name is visible, even if it was180 defined locally inside a function (although that means it willnot have a180 type. A user can define virtual tables that are filled in at their 181 declaration and given a name. Anywhere that name is visible, even if 182 defined locally inside a function (although that means it does not have a 181 183 static lifetime), it can be used. 182 Specifically, a virtual type is ``bound" to a virtual table which184 Specifically, a virtual type is ``bound" to a virtual table that 183 185 sets the virtual members for that object. The virtual members can be accessed 184 186 through the object. 185 187 188 \PAB{The above explanation is very good!} 189 186 190 While much of the virtual infrastructure is created, it is currently only used 187 191 internally for exception handling. The only user-level feature is the virtual 188 cast , which is the same as the \Cpp \code{C++}{dynamic_cast}.192 cast 189 193 \label{p:VirtualCast} 190 194 \begin{cfa} 191 195 (virtual TYPE)EXPRESSION 192 196 \end{cfa} 197 which is the same as the \Cpp \code{C++}{dynamic_cast}. 193 198 Note, the syntax and semantics matches a C-cast, rather than the function-like 194 199 \Cpp syntax for special casts. Both the type of @EXPRESSION@ and @TYPE@ must be … … 212 217 \end{cfa} 213 218 The trait is defined over two types, the exception type and the virtual table 214 type. Each exception type should have buta single virtual table type.215 Now there are no actual assertions in this trait becausethe trait system216 actually can't express them (adding such assertions would be part of219 type. Each exception type should have a single virtual table type. 220 There are no actual assertions in this trait because currently the trait system 221 cannot express them (adding such assertions would be part of 217 222 completing the virtual system). The imaginary assertions would probably come 218 223 from a trait defined by the virtual system, and state that the exception type 219 is a virtual type, is a de cendent of @exception_t@ (the base exception type)224 is a virtual type, is a descendent of @exception_t@ (the base exception type) 220 225 and note its virtual table type. 221 226 … … 236 241 }; 237 242 \end{cfa} 238 Both traits ensure a pair of types are an exception type and its virtual table 243 Both traits ensure a pair of types are an exception type and its virtual table, 239 244 and defines one of the two default handlers. The default handlers are used 240 245 as fallbacks and are discussed in detail in \vref{s:ExceptionHandling}. … … 264 269 \section{Exception Handling} 265 270 \label{s:ExceptionHandling} 266 \CFA provides two kinds of exception handling: termination and resumption.271 As stated, \CFA provides two kinds of exception handling: termination and resumption. 267 272 These twin operations are the core of \CFA's exception handling mechanism. 268 This section will coverthe general patterns shared by the two operations and269 then go on to cover the details each individual operation.273 This section covers the general patterns shared by the two operations and 274 then go on to cover the details of each individual operation. 270 275 271 276 Both operations follow the same set of steps. 272 Both start with the user p reforming a raise on an exception.273 Then the exception prop ogates up the stack.277 Both start with the user performing a raise on an exception. 278 Then the exception propagates up the stack. 274 279 If a handler is found the exception is caught and the handler is run. 275 After that control returns to normal execution.276 If the search fails a default handler is run and thencontrol277 returns to normal execution after the raise.280 After that control returns to a point specific to the kind of exception. 281 If the search fails a default handler is run, and if it returns, control 282 continues after the raise. Note, the default handler may further change control flow rather than return. 278 283 279 284 This general description covers what the two kinds have in common. 280 Differences include how prop ogation is preformed, where exception continues285 Differences include how propagation is performed, where exception continues 281 286 after an exception is caught and handled and which default handler is run. 282 287 283 288 \subsection{Termination} 284 289 \label{s:Termination} 290 285 291 Termination handling is the familiar kind and used in most programming 286 292 languages with exception handling. 287 It is dynamic, non-local goto. If the raised exception is matched and288 handled the stack is unwound and control will (usually) continuethe function293 It is a dynamic, non-local goto. If the raised exception is matched and 294 handled, the stack is unwound and control (usually) continues in the function 289 295 on the call stack that defined the handler. 290 296 Termination is commonly used when an error has occurred and recovery is … … 301 307 termination exception is any type that satisfies the trait 302 308 @is_termination_exception@ at the call site. 303 Through \CFA's trait system the trait functions are implicity passed into the309 Through \CFA's trait system, the trait functions are implicitly passed into the 304 310 throw code and the EHM. 305 311 A new @defaultTerminationHandler@ can be defined in any scope to 306 change the throw's behavio r (see below).307 308 The throw will copythe provided exception into managed memory to ensure309 the exception is not destroyed ifthe stack is unwound.312 change the throw's behaviour (see below). 313 314 The throw copies the provided exception into managed memory to ensure 315 the exception is not destroyed when the stack is unwound. 310 316 It is the user's responsibility to ensure the original exception is cleaned 311 up whe ither the stack is unwound or not. Allocating it on the stack is317 up whether the stack is unwound or not. Allocating it on the stack is 312 318 usually sufficient. 313 319 314 Then prop ogation starts withthe search. \CFA uses a ``first match" rule so315 matching is p reformed with the copied exception as the search continues.316 It starts from the throwing function and proceeds to the base of the stack,320 Then propagation starts the search. \CFA uses a ``first match" rule so 321 matching is performed with the copied exception as the search continues. 322 It starts from the throwing function and proceeds towards the base of the stack, 317 323 from callee to caller. 318 324 At each stack frame, a check is made for resumption handlers defined by the … … 327 333 } 328 334 \end{cfa} 329 When viewed on its own, a try statement will simply executethe statements330 in \snake{GUARDED_BLOCK} and when those are finished the try statement finishes.335 When viewed on its own, a try statement simply executes the statements 336 in \snake{GUARDED_BLOCK} and when those are finished, the try statement finishes. 331 337 332 338 However, while the guarded statements are being executed, including any 333 invoked functions, all the handlers in the statement are nowon the search334 path. If a termination exception is thrown and not handledfurther up the335 stack they will be matched against the exception.339 invoked functions, all the handlers in these statements are included on the search 340 path. Hence, if a termination exception is raised, the search includes the added handlers associated with the guarded block and those further up the 341 stack from the guarded block. 336 342 337 343 Exception matching checks the handler in each catch clause in the order 338 they appear, top to bottom. If the representation of the thrownexception type344 they appear, top to bottom. If the representation of the raised exception type 339 345 is the same or a descendant of @EXCEPTION_TYPE@$_i$ then @NAME@$_i$ 340 (if provided) is 341 bound to a pointer to the exception and the statements in @HANDLER_BLOCK@$_i$ 342 are executed.If control reaches the end of the handler, the exception is346 (if provided) is bound to a pointer to the exception and the statements in 347 @HANDLER_BLOCK@$_i$ are executed. 348 If control reaches the end of the handler, the exception is 343 349 freed and control continues after the try statement. 344 350 345 If no termination handler is found during the search thenthe default handler346 (\defaultTerminationHandler) is run.347 Through \CFA's trait system the best match at the throw sight will beused.348 This function is run and is passed the copied exception. Afterthe default349 handler is runcontrol continues after the throw statement.351 If no termination handler is found during the search, the default handler 352 (\defaultTerminationHandler) visible at the raise statement is called. 353 Through \CFA's trait system, the best match at the raise sight is used. 354 This function is run and is passed the copied exception. If the default 355 handler returns, control continues after the throw statement. 350 356 351 357 There is a global @defaultTerminationHandler@ that is polymorphic over all 352 exception types. Since it is so generala more specific handler can be353 defined and will beused for those types, effectively overriding the handler354 for particular exception type.358 termination exception types. Since it is so general, a more specific handler can be 359 defined and is used for those types, effectively overriding the handler 360 for a particular exception type. 355 361 The global default termination handler performs a cancellation 356 362 (see \vref{s:Cancellation}) on the current stack with the copied exception. … … 362 368 just as old~\cite{Goodenough75} and is simpler in many ways. 363 369 It is a dynamic, non-local function call. If the raised exception is 364 matched a closure will be taken from up the stack and executed, 365 after which the raising function will continue executing. 366 These are most often used when an error occurred and if the error is repaired 367 then the function can continue. 370 matched a closure is taken from up the stack and executed, 371 after which the raising function continues executing. 372 These are most often used when a potentially repairable error occurs, some handler is found on the stack to fix it, and 373 the raising function can continue with the correction. 374 Another common usage is dynamic event analysis, \eg logging, without disrupting control flow. 375 Note, if an event is raised and there is no interest, control continues normally. 376 377 \PAB{We also have \lstinline{report} instead of \lstinline{throwResume}, \lstinline{recover} instead of \lstinline{catch}, and \lstinline{fixup} instead of \lstinline{catchResume}. 378 You may or may not want to mention it. You can still stick with \lstinline{catch} and \lstinline{throw/catchResume} in the thesis.} 368 379 369 380 A resumption raise is started with the @throwResume@ statement: … … 376 387 @is_resumption_exception@ at the call site. 377 388 The assertions from this trait are available to 378 the exception system while handling the exception.379 380 At run-time, no exception copy is made.381 As the stack is not unwound the exception and382 any values on the stack will remain in scopewhile the resumption is handled.389 the exception system, while handling the exception. 390 391 Resumption does not need to copy the raised exception, as the stack is not unwound. 392 The exception and 393 any values on the stack remain in scope, while the resumption is handled. 383 394 384 395 The EHM then begins propogation. The search starts from the raise in the 385 resuming function and proceeds to the base of the stack, from callee to caller.396 resuming function and proceeds towards the base of the stack, from callee to caller. 386 397 At each stack frame, a check is made for resumption handlers defined by the 387 398 @catchResume@ clauses of a @try@ statement. … … 398 409 Note that termination handlers and resumption handlers may be used together 399 410 in a single try statement, intermixing @catch@ and @catchResume@ freely. 400 Each type of handler will only interactwith exceptions from the matching401 typeof raise.402 When a try statement is executed it simply executes the statements in the403 @GUARDED_BLOCK@ and then finishes.411 Each type of handler only interacts with exceptions from the matching 412 kind of raise. 413 When a try statement is executed, it simply executes the statements in the 414 @GUARDED_BLOCK@ and then returns. 404 415 405 416 However, while the guarded statements are being executed, including any 406 invoked functions, all the handlers in the statement are nowon the search407 path. If a resumption exception is reported and not handledfurther up the408 stack they will be matched against the exception.417 invoked functions, all the handlers in these statements are included on the search 418 path. Hence, if a resumption exception is raised the search includes the added handlers associated with the guarded block and those further up the 419 stack from the guarded block. 409 420 410 421 Exception matching checks the handler in each catch clause in the order 411 they appear, top to bottom. If the representation of the thrownexception type422 they appear, top to bottom. If the representation of the raised exception type 412 423 is the same or a descendant of @EXCEPTION_TYPE@$_i$ then @NAME@$_i$ 413 424 (if provided) is bound to a pointer to the exception and the statements in … … 416 427 the raise statement that raised the handled exception. 417 428 418 Like termination, if no resumption handler is found, the default handler 419 visible at the throw statement is called. It will use the best match at the 420 call sight according to \CFA's overloading rules. The default handler is 429 Like termination, if no resumption handler is found during the search, the default handler 430 (\defaultResumptionHandler) visible at the raise statement is called. 431 It uses the best match at the 432 raise sight according to \CFA's overloading rules. The default handler is 421 433 passed the exception given to the throw. When the default handler finishes 422 434 execution continues after the raise statement. 423 435 424 There is a global \defaultResumptionHandler{} is polymorphic over all 425 termination exceptions and preforms a termination throw on the exception. 426 The \defaultTerminationHandler{} for that raise is matched at the 427 original raise statement (the resumption @throw@\-@Resume@) and it can be 436 There is a global \defaultResumptionHandler{} that is polymorphic over all 437 resumption exception types and preforms a termination throw on the exception. 438 The \defaultTerminationHandler{} can be 428 439 customized by introducing a new or better match as well. 429 440 430 441 \subsubsection{Resumption Marking} 431 442 \label{s:ResumptionMarking} 443 432 444 A key difference between resumption and termination is that resumption does 433 445 not unwind the stack. A side effect that is that when a handler is matched 434 and run it's try block (the guarded statements) and every try statement435 searched before it are still on the stack. Th iscan lead to the recursive446 and run, its try block (the guarded statements) and every try statement 447 searched before it are still on the stack. Their existence can lead to the recursive 436 448 resumption problem. 437 449 … … 446 458 } 447 459 \end{cfa} 448 When this code is executed the guarded @throwResume@ will throw, starta449 search and match the handler in the @catchResume@ clause. This will be450 call and placed on the stack on top of the try-block. The second throw then451 throws and will search the same try block and putcall another instance of the452 same handler leading to an infinite loop.453 454 This situation is trivial and easy to avoid, butmuch more complex cycles460 When this code is executed, the guarded @throwResume@ starts a 461 search and matchs the handler in the @catchResume@ clause. This 462 call is placed on the top of stack above the try-block. The second throw 463 searchs the same try block and puts call another instance of the 464 same handler on the stack leading to an infinite recursion. 465 466 While this situation is trivial and easy to avoid, much more complex cycles 455 467 can form with multiple handlers and different exception types. 456 468 457 To prevent all of these cases we mark try statements on the stack.469 To prevent all of these cases, the exception search marks the try statements it visits. 458 470 A try statement is marked when a match check is preformed with it and an 459 exception. The statement will beunmarked when the handling of that exception471 exception. The statement is unmarked when the handling of that exception 460 472 is completed or the search completes without finding a handler. 461 While a try statement is marked its handlers are never matched, effectify462 skipping over itto the next try statement.473 While a try statement is marked, its handlers are never matched, effectify 474 skipping over them to the next try statement. 463 475 464 476 \begin{center} … … 467 479 468 480 These rules mirror what happens with termination. 469 When a termination throw happens in a handler the search willnot look at481 When a termination throw happens in a handler, the search does not look at 470 482 any handlers from the original throw to the original catch because that 471 part of the stack has beenunwound.483 part of the stack is unwound. 472 484 A resumption raise in the same situation wants to search the entire stack, 473 but it will not try to match the exception with try statements in the section474 that would have been unwound as they are marked.475 476 The symmetry between resumption termination is why this pattern was picked.477 Other patterns, such as marking just the handlers that caught , also work but478 lack the symmetry meansthere are more rules to remember.485 but with marking, the search does match exceptions for try statements at equivalent sections 486 that would have been unwound by termination. 487 488 The symmetry between resumption termination is why this pattern is picked. 489 Other patterns, such as marking just the handlers that caught the exception, also work but 490 lack the symmetry, meaning there are more rules to remember. 479 491 480 492 \section{Conditional Catch} 493 481 494 Both termination and resumption handler clauses can be given an additional 482 495 condition to further control which exceptions they handle: … … 491 504 did not match. 492 505 493 The condition matching allows finer matching by allowing the matchto check506 The condition matching allows finer matching to check 494 507 more kinds of information than just the exception type. 495 508 \begin{cfa} … … 506 519 // Can't handle a failure relating to f2 here. 507 520 \end{cfa} 508 In this example the file that experianced the IO error is used to decide521 In this example, the file that experianced the IO error is used to decide 509 522 which handler should be run, if any at all. 510 523 … … 535 548 536 549 \subsection{Comparison with Reraising} 550 537 551 A more popular way to allow handlers to match in more detail is to reraise 538 the exception after it has been caught if it could not be handled here.552 the exception after it has been caught, if it could not be handled here. 539 553 On the surface these two features seem interchangable. 540 554 541 If we used @throw;@to start a termination reraise then these two statements542 wouldhave the same behaviour:555 If @throw@ is used to start a termination reraise then these two statements 556 have the same behaviour: 543 557 \begin{cfa} 544 558 try { … … 560 574 } 561 575 \end{cfa} 562 If there are further handlers after this handler only the first version will 563 check them. If multiple handlers on a single try block that could handle the 564 same exception the translations get more complex but they are equivilantly 565 powerful. 566 567 Until stack unwinding comes into the picture. In termination handling, a 576 However, if there are further handlers after this handler only the first is 577 check. For multiple handlers on a single try block that could handle the 578 same exception, the equivalent translations to conditional catch becomes more complex, resulting is multiple nested try blocks for all possible reraises. 579 So while catch-with-reraise is logically equivilant to conditional catch, there is a lexical explosion for the former. 580 581 \PAB{I think the following discussion makes an incorrect assumption. 582 A conditional catch CAN happen with the stack unwound. 583 Roy talked about this issue in Section 2.3.3 here: \newline 584 \url{http://plg.uwaterloo.ca/theses/KrischerThesis.pdf}} 585 586 Specifically for termination handling, a 568 587 conditional catch happens before the stack is unwound, but a reraise happens 569 588 afterwards. Normally this might only cause you to loose some debug 570 589 information you could get from a stack trace (and that can be side stepped 571 590 entirely by collecting information during the unwind). But for \CFA there is 572 another issue, if the exception is n't handled the default handler should be591 another issue, if the exception is not handled the default handler should be 573 592 run at the site of the original raise. 574 593 575 There are two problems with this: the site of the original raise does n't576 exist anymore and the default handler might not exist anymore. The site will577 always beremoved as part of the unwinding, often with the entirety of the594 There are two problems with this: the site of the original raise does not 595 exist anymore and the default handler might not exist anymore. The site is 596 always removed as part of the unwinding, often with the entirety of the 578 597 function it was in. The default handler could be a stack allocated nested 579 598 function removed during the unwind. … … 586 605 \section{Finally Clauses} 587 606 \label{s:FinallyClauses} 607 588 608 Finally clauses are used to preform unconditional clean-up when leaving a 589 609 scope and are placed at the end of a try statement after any handler clauses: … … 598 618 The @FINALLY_BLOCK@ is executed when the try statement is removed from the 599 619 stack, including when the @GUARDED_BLOCK@ finishes, any termination handler 600 finishes or during an unwind.620 finishes, or during an unwind. 601 621 The only time the block is not executed is if the program is exited before 602 622 the stack is unwound. … … 614 634 615 635 Not all languages with unwinding have finally clauses. Notably \Cpp does 616 without it as des cructorsserve a similar role. Although destructors and617 finally clauses can be used in many of the same areasthey have their own618 use caseslike top-level functions and lambda functions with closures.619 Destructors take a bit more work to set up but are much easier to reuse while620 finally clauses are good for one-off uses and 621 can easily include local information.636 without it as destructors with RAII serve a similar role. Although destructors and 637 finally clauses have overlapping usage cases, they have their own 638 specializations, like top-level functions and lambda functions with closures. 639 Destructors take more work if a number of unrelated, local variables without destructors or dynamically allocated variables must be passed for de-intialization. 640 Maintaining this destructor during local-block modification is a source of errors. 641 A finally clause places local de-intialization inline with direct access to all local variables. 622 642 623 643 \section{Cancellation} … … 632 652 raise, this exception is not used in matching only to pass information about 633 653 the cause of the cancellation. 634 (This also means matching cannot fail so there is no default handler.)654 (This restriction also means matching cannot fail so there is no default handler.) 635 655 636 656 After @cancel_stack@ is called the exception is copied into the EHM's memory 637 657 and the current stack is 638 unwound. After that it depends one which stack is being cancelled. 658 unwound. 659 The result of a cancellation depends on the kind of stack that is being unwound. 639 660 640 661 \paragraph{Main Stack} … … 643 664 After the main stack is unwound there is a program-level abort. 644 665 645 There are two reasons for this . The first is that it obviously had to do this666 There are two reasons for this semantics. The first is that it obviously had to do the abort 646 667 in a sequential program as there is nothing else to notify and the simplicity 647 668 of keeping the same behaviour in sequential and concurrent programs is good. 648 Also, even in concurrent programsthere is no stack that an innate connection649 to, so it would have be explicitly managed. 669 \PAB{I do not understand this sentence. $\Rightarrow$ Also, even in concurrent programs, there is no stack that an innate connection 670 to, so it would have be explicitly managed.} 650 671 651 672 \paragraph{Thread Stack} 652 673 A thread stack is created for a \CFA @thread@ object or object that satisfies 653 674 the @is_thread@ trait. 654 After a thread stack is unwound there exception is stored until another675 After a thread stack is unwound, the exception is stored until another 655 676 thread attempts to join with it. Then the exception @ThreadCancelled@, 656 677 which stores a reference to the thread and to the exception passed to the 657 cancellation, is reported from the join .678 cancellation, is reported from the join to the joining thread. 658 679 There is one difference between an explicit join (with the @join@ function) 659 680 and an implicit join (from a destructor call). The explicit join takes the 660 681 default handler (@defaultResumptionHandler@) from its calling context while 661 the implicit join provides its own which does a program abort if the682 the implicit join provides its own, which does a program abort if the 662 683 @ThreadCancelled@ exception cannot be handled. 663 684 664 Communication is done at join because a thread only has to have to points of 665 communication with other threads: start and join. 685 \PAB{Communication can occur during the lifetime of a thread using shared variable and \lstinline{waitfor} statements. 686 Are you sure you mean communication here? Maybe you mean synchronization (rendezvous) point. $\Rightarrow$ Communication is done at join because a thread only has two points of 687 communication with other threads: start and join.} 666 688 Since a thread must be running to perform a cancellation (and cannot be 667 689 cancelled from another stack), the cancellation must be after start and 668 before the join . So join is the one that we willuse.690 before the join, so join is use. 669 691 670 692 % TODO: Find somewhere to discuss unwind collisions. … … 678 700 A coroutine stack is created for a @coroutine@ object or object that 679 701 satisfies the @is_coroutine@ trait. 680 After a coroutine stack is unwound control returns to the resumefunction681 that most recently resumed it. The resume statementreports a682 @CoroutineCancelled@ exception, which contains areferences to the cancelled702 After a coroutine stack is unwound, control returns to the @resume@ function 703 that most recently resumed it. The resume reports a 704 @CoroutineCancelled@ exception, which contains references to the cancelled 683 705 coroutine and the exception used to cancel it. 684 The resumefunction also takes the \defaultResumptionHandler{} from the685 caller's context and passes it to the internal report.706 The @resume@ function also takes the \defaultResumptionHandler{} from the 707 caller's context and passes it to the internal cancellation. 686 708 687 709 A coroutine knows of two other coroutines, its starter and its last resumer. 688 The starter has a much more distant connection while the last resumer just710 The starter has a much more distant connection, while the last resumer just 689 711 (in terms of coroutine state) called resume on this coroutine, so the message 690 712 is passed to the latter. -
doc/theses/andrew_beach_MMath/intro.tex
r553f8abe r4ed7946e 1 1 \chapter{Introduction} 2 2 3 \PAB{Stay in the present tense. \newline 4 \url{https://plg.uwaterloo.ca/~pabuhr/technicalWriting.shtml}} 5 \newline 6 \PAB{Note, \lstinline{lstlisting} normally bolds keywords. None of the keywords in your thesis are bolded.} 7 3 8 % Talk about Cforall and exceptions generally. 4 This thesis goes over the design and implementation of the exception handling5 mechanism (EHM) of6 \CFA (pernounced sea-for-all and may be written Cforall or CFA).7 Exception handling provides dynamic inter-function control flow.9 %This thesis goes over the design and implementation of the exception handling 10 %mechanism (EHM) of 11 %\CFA (pernounced sea-for-all and may be written Cforall or CFA). 12 Exception handling provides alternative dynamic inter-function control flow. 8 13 There are two forms of exception handling covered in this thesis: 9 14 termination, which acts as a multi-level return, 10 15 and resumption, which is a dynamic function call. 11 This seperation is uncommon because termination exception handling is so 12 much more common that it is often assumed.16 Note, termination exception handling is so common it is often assumed to be the only form. 17 Lesser know derivations of inter-function control flow are continuation passing in Lisp~\cite{CommonLisp}. 13 18 14 19 Termination exception handling allows control to return to any previous … … 31 36 32 37 % Overview of exceptions in Cforall. 33 This work describes the design and implementation of the \CFA EHM. 38 39 \PAB{You need section titles here. Don't take them out.} 40 41 \section{Thesis Overview} 42 43 This thesis goes over the design and implementation of the exception handling 44 mechanism (EHM) of 45 \CFA (pernounced sea-for-all and may be written Cforall or CFA). 46 %This thesis describes the design and implementation of the \CFA EHM. 34 47 The \CFA EHM implements all of the common exception features (or an 35 48 equivalent) found in most other EHMs and adds some features of its own. … … 52 65 53 66 % A note that yes, that was a very fast overview. 54 All the design and implementation of all of \CFA's EHM's features are67 The design and implementation of all of \CFA's EHM's features are 55 68 described in detail throughout this thesis, whether they are a common feature 56 69 or one unique to \CFA. 57 70 58 71 % The current state of the project and what it contributes. 59 All of these features have been added to the \CFA implemenation, along with72 All of these features have been implemented in \CFA, along with 60 73 a suite of test cases as part of this project. 61 74 The implementation techniques are generally applicable in other programming … … 63 76 Some parts of the EHM use other features unique to \CFA and these would be 64 77 harder to replicate in other programming languages. 78 79 \section{Background} 65 80 66 81 % Talk about other programming languages. … … 70 85 Exceptions also can replace return codes and return unions. 71 86 In functional languages will also sometimes fold exceptions into monads. 87 88 \PAB{You must demonstrate knowledge of background material here. 89 It should be at least a full page.} 90 91 \section{Contributions} 72 92 73 93 The contributions of this work are:
Note: See TracChangeset
for help on using the changeset viewer.