Changeset 5d9c4bb
- Timestamp:
- Mar 22, 2023, 11:34:45 AM (20 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 1d245ea, d63aeba
- Parents:
- 1f771fc
- Location:
- doc/theses/mike_brooks_MMath
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/mike_brooks_MMath/list.tex
r1f771fc r5d9c4bb 13 13 14 14 15 16 15 \section{Design Issues} 17 16 \label{toc:lst:issue} … … 20 19 21 20 All design-issue discussions assume the following invariants. 22 They are stated here to clarify that none of the discussed design issues refers to one of these. 21 \PAB{They are stated here to clarify that none of the discussed design issues refers to one of these.} 23 22 Alternatives to the assumptions are discussed under Future Work (Section~\ref{toc:lst:futwork}). 24 23 \begin{itemize} … … 30 29 The system has freedom over how to represent these links. 31 30 The library is not providing applied wrapper operations that consume a user's hand-implemented list primitives. 32 \item These issues are compared at a requirement/functional level.31 \item \PAB{These issues are compared at a requirement/functional level.} 33 32 \end{itemize} 34 33 35 34 Two preexisting linked-list libraries are used throughout, to show examples of the concepts being defined, 36 35 and further libraries are introduced as needed. 37 A general comparison of libraries' abilities is given under Related Work (Section~\ref{toc:lst:relwork}).38 36 \begin{description} 39 37 \item[LQ] Linux Queue library\cite{lst:linuxq} of @<sys/queue.h>@. 40 38 \item[STL] C++ Standard Template Library's @std::list@\cite{lst:stl} 41 39 \end{description} 40 A general comparison of libraries' abilities is given under Related Work (Section~\ref{toc:lst:relwork}). 42 41 43 42 The fictional type @req@ (request) is the user's payload in examples. … … 58 57 59 58 The wrapped style admits the further distinction between wrapping a reference and wrapping a value. 60 This distinction is pervasive in all STL collections; @list<req *>@ wraps a reference; @list<req>@ wraps a value.61 (For this discussion, @list<req &>@ is similar to @list<req*>@.)59 This distinction is pervasive in all STL collections; @list<req *>@ wraps a reference; @list<req>@ wraps a value. 60 (For this discussion, @list<req &>@ is similar to @list<req *>@.) 62 61 This difference is one of user style, not framework capability. 63 62 Figure~\ref{fig:lst-issues-attach} compares the three styles. 63 64 \begin{comment} 64 65 \begin{figure} 65 66 \begin{tabularx}{\textwidth}{Y|Y|Y}\lstinputlisting[language=C , firstline=20, lastline=39]{lst-issues-intrusive.run.c} … … 77 78 (a) & (b) & (c) 78 79 \end{tabularx} 79 80 \caption{ 80 81 Three styles of link attachment: (a)~intrusive, (b)~wrapped reference, and (c)~wrapped value. 81 82 The diagrams show the memory layouts that result after the code runs, eliding the head object \lstinline{reqs}; … … 87 88 (TODO: cite? found in /usr/include/c++/7/bits/stl\_list.h ) 88 89 } 90 \label{fig:lst-issues-attach} 91 \end{figure} 92 \end{comment} 93 94 \begin{figure} 95 \centering 96 \newsavebox{\myboxA} % used with subfigure 97 \newsavebox{\myboxB} 98 \newsavebox{\myboxC} 99 100 \begin{lrbox}{\myboxA} 101 \begin{tabular}{@{}l@{}} 102 \lstinputlisting[language=C, firstline=20, lastline=39]{lst-issues-intrusive.run.c} \\ 103 \ \\ 104 \includegraphics[page=1]{lst-issues-attach.pdf} 105 \end{tabular} 106 \end{lrbox} 107 108 \begin{lrbox}{\myboxB} 109 \begin{tabular}{@{}l@{}} 110 \lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-byref.run.cpp} \\ 111 \ \\ 112 \includegraphics[page=2]{lst-issues-attach.pdf} 113 \end{tabular} 114 \end{lrbox} 115 116 \begin{lrbox}{\myboxC} 117 \begin{tabular}{@{}l@{}} 118 \lstinputlisting[language=C++, firstline=20, lastline=39]{lst-issues-wrapped-emplaced.run.cpp} \\ 119 \ \\ 120 \includegraphics[page=3]{lst-issues-attach.pdf} 121 \end{tabular} 122 \end{lrbox} 123 124 \subfloat[Intrusive]{\label{f:Intrusive}\usebox\myboxA} 125 \hspace{10pt} 126 \vrule 127 \hspace{10pt} 128 \subfloat[Wrapped reference]{\label{f:WrappedRef}\usebox\myboxB} 129 \hspace{10pt} 130 \vrule 131 \hspace{10pt} 132 \subfloat[Wrapped value]{\label{f:WrappedValue}\usebox\myboxC} 133 134 \caption{ 135 Three styles of link attachment: \protect\subref*{f:Intrusive}~intrusive, \protect\subref*{f:WrappedRef}~wrapped 136 reference, and \protect\subref*{f:WrappedValue}~wrapped value. 137 The diagrams show the memory layouts that result after the code runs, eliding the head object \lstinline{reqs}; 138 head objects are discussed in Section~\ref{toc:lst:issue:ident}. 139 In \protect\subref*{f:Intrusive}, the field \lstinline{req.x} names a list direction; 140 these are discussed in Section~\ref{toc:lst:issue:derection}. 141 In \protect\subref*{f:WrappedRef} and \protect\subref*{f:WrappedValue}, the type \lstinline{node} represents a 142 system-internal type, which is \lstinline{std::_List_node} in the GNU implementation. 143 (TODO: cite? found in /usr/include/c++/7/bits/stl\_list.h ) 144 } 89 145 \label{fig:lst-issues-attach} 90 146 \end{figure} 91 92 93 Figure~\ref{fig:lst-issues-attach} compares the three styles.94 147 95 148 The advantage of intrusive attachment is the control that it gives the user over memory layout. … … 97 150 Both wrapped attachment styles imply system-induced heap allocations. 98 151 Such an allocation has a lifetime that matches the item's membership in the list. 99 In (a) and (b), one @req@ object can enter and leave a list many times.100 In (b), doing do implies a dynamic allocation for each time joining; in (a), it does not.152 In \subref*{f:Intrusive} and \subref*{f:WrappedRef}, one @req@ object can enter and leave a list many times. 153 In \subref*{f:WrappedRef}, it implies a dynamic allocation/deallocation for each enter/leave; in \subref*{f:Intrusive}, it does not. 101 154 102 155 A further aspect of layout control is allowing the user to specify the location of the link fields within the @req@ object. … … 110 163 Another subtle advantage of intrusive arrangement is that 111 164 a reference to a user-level item (@req@) is sufficient to navigate or manage the item's membership. 112 In LQ, (a), a @req@ pointer is the right argument type for operations @LIST_NEXT@ or @LIST_REMOVE@;165 In LQ, \subref*{f:Intrusive}, a @req@ pointer is the right argument type for operations @LIST_NEXT@ or @LIST_REMOVE@; 113 166 there is no distinguishing a @req@ from ``a @req@ in a list.'' 114 The same is not true of STL, (b) or (c).167 The same is not true of STL, \subref*{f:WrappedRef} or \subref*{f:WrappedValue}. 115 168 There, the analogous operations work on a parameter of type @list<T>::iterator@; 116 169 they are @iterator::operator++()@, @iterator::operator*()@, and @list::erase(iterator)@. 117 There is no mapping from @req &@ to @list<req>::iterator@, except for linear search.170 There is no mapping from @req &@ to @list<req>::iterator@, except for linear search. 118 171 119 172 The advantage of wrapped attachment is the abstraction of a data item from its list membership(s). 120 173 In the wrapped style, the @req@ type can come from a library that serves many independent uses, 121 174 which generally have no need for listing. 122 Then, a novel use can still put @req@ in a (further) list, without requiring any upstream change in the @re @ library.175 Then, a novel use can still put @req@ in a (further) list, without requiring any upstream change in the @req@ library. 123 176 In intrusive attachment, the ability to be listed must be planned during the definition of @req@. 124 Similarly, style (b) allows for one @req@ to occur at several positions in one list. 125 Styles (a) and (c) do not support this ability. 177 Similarly, style \subref*{f:WrappedRef} allows for one @req@ to occur at several positions in one list. 178 Styles \subref*{f:Intrusive} and \subref*{f:WrappedValue} do not support this ability. 179 \PAB{But style \subref*{f:WrappedValue} can sort of mimic this effect by have multiple copies of \lstinline{req} in the list, modulo changes to the copies are not seen by the original.} 126 180 127 181 \begin{figure} … … 135 189 the LQ C macros do not expand to valid C++ when instantiated with template parameters---there is no \lstinline{struct El}. 136 190 When using a custom-patched version of LQ to work around this issue, 137 the programs of Figure~\ref{f ig:lst-issues-attach}~(b) and (c)work with this shim in place of real STL.191 the programs of Figure~\ref{f:WrappedRef} and \protect\subref*{f:WrappedValue} work with this shim in place of real STL. 138 192 Their executions lead to the same memory layouts. 139 193 } … … 147 201 148 202 So intrusion is a lower-level listing primitive. 149 And so, the system design choice is not between forcing users to use intrusion and forcing them to usewrapping.203 And so, the system design choice is not between forcing users to use intrusion or wrapping. 150 204 The choice is whether or not to provide access to an allocation-free layer of functionality. 151 205 A wrapped-primitive library like STL forces users to incur the costs of wrapping, whether or not they access its benefits. … … 153 207 154 208 155 156 157 209 \subsection{Directionality: Single vs.\ Multi-Static vs.\ Dynamic} 158 210 \label{toc:lst:issue:derection} 159 211 212 \PAB{I'm not sure about the term \newterm{Directionality}. Directionality to me, means going forward or backwards through a list. 213 Would \newterm{dimensionality} work? Think of each list containing the node as a different dimension in which the node sits.} 214 160 215 Directionality deals with the question: 161 216 In how many different lists can an item be stored, at a given time? 162 217 163 164 Consider STL in the wrapped-value arrangement of Figure~\ref{fig:lst-issues-attach}~(c). 218 Consider STL in the wrapped-value arrangement of Figure~\ref{f:WrappedValue}. 165 219 The STL API completely hides its @node@ type from a user; the user cannot configure this choice or impose a custom one. 166 220 STL's @node@ type offers the sole set of links shown in the diagram. 167 Therefore, every @req@ in existence was allocated either to belong to an occurrence of the diagrammed arrangement,221 Therefore, every @req@ in existence is allocated either to belong to an occurrence of the diagrammed arrangement, 168 222 or to be apart from all occurrences of it. 169 223 In the first case, the @req@ belongs to exactly one list (of the style in question). … … 171 225 172 226 \begin{figure} 173 \label{fig:lst-issues-multi-static}174 227 \parbox[t]{3.5in} { 175 228 \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c} … … 187 240 The zoomed-in diagram portion shows the field-level state that results from running the LQ code. 188 241 } 242 \label{fig:lst-issues-multi-static} 189 243 \end{figure} 190 244 … … 205 259 The corresponding flexibility of wrapped attachment means 206 260 the STL wrapped-reference arrangement supports an item being a member of arbitrarily many lists. 207 This support also applies to the hybrid in which an item's allocation is within a wrapped-value list,261 This support also applies to the wrapped-value list because the @req@ is copied, 208 262 but wrapped-reference lists provide further link directions. 263 \PAB{Explain how} 209 264 STL with wrapped references supports dynamic link directions. 210 211 When allowing multiple static directions,frameworks differ in their ergonomics for 212 the typical case, when the user needs only one direction, vs.\ the atypical case, when the user needs several. 213 265 \PAB{Expand} 266 267 When allowing multiple static directions, frameworks differ in their ergonomics for 268 the typical case: when the user needs only one direction, vs.\ the atypical case, when the user needs several. 214 269 LQ's ergonomics are well-suited to the uncommon case of multiple list directions. 215 270 Its intrusion declaration and insertion operation both use a mandatory explicit parameter naming the direction. 216 271 This decision works well in Figure~\ref{fig:lst-issues-multi-static}, where the names @by_pri@ and @by_rqr@ work well, 217 but it clutters Figure~\ref{f ig:lst-issues-attach}~(a), where a contrived name must be invented and used.218 The example uses @x@; @reqs@ would be a more readily ignored choice. 272 but it clutters Figure~\ref{f:Intrusive}, where a contrived name must be invented and used. 273 The example uses @x@; @reqs@ would be a more readily ignored choice. \PAB{wording?} 219 274 220 275 \uCpp offers an intrusive list that makes the opposite choice. TODO: elaborate on inheritance for first direction and acrobatics for subsequent directions. 221 276 222 277 223 224 225 278 \subsection{User integration: Preprocessed vs.\ Type-System Mediated} 226 279 227 280 % example of poor error message due to LQ's preprocessed integration 228 % programs/lst-issues-multi-static.run.c:46:1: error: expected identifier or ‘(’ before ‘do’281 % programs/lst-issues-multi-static.run.c:46:1: error: expected identifier or '(' before 'do' 229 282 % 46 | LIST_INSERT_HEAD(&reqs_rtr_42, &r42b, by_rqr); 230 283 % | ^~~~~~~~~~~~~~~~ … … 239 292 an item found in a list (type @req@, of variables like @r1@), and 240 293 a list (type @reql@ or @list<req>@, of variables like @reqs@ or @reqs_rqr_42@). 241 The latter type is a head, and these examples are of are headed lists. 294 \see{Figure~\ref{fig:lst-issues-attach} and Figure~\ref{fig:lst-issues-multi-static}} 295 The latter type is a head, and these examples are of headed lists. 242 296 243 297 A bespoke ``pointer to next @req@'' implementation often omits the latter type. … … 246 300 In headed thinking, there are length-zero lists (heads with no elements), and an element can be listed or not listed. 247 301 In ad-hoc thinking, there are no length-zero lists and every element belongs to a list of length at least one. 302 \PAB{Create a figure for this.} 248 303 249 304 By omitting the head, elements can enter into an adjacency relationship, … … 283 338 identifies a list using an explicit head. 284 339 285 286 \begin{figure} 287 \label{fig:lst-features-intro} 288 \lstinputlisting[language=CFA, firstline=20, lastline=32]{lst-features-intro.run.cfa} 289 \caption[Multiple link directions in \CFA list library]{ 290 Demonstration of the running \lstinline{req} example, done using the \CFA list library\protect\footnotemark. 291 This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways. 292 } 293 \end{figure} 294 \footnotetext{ 340 The \CFA list library's version of the running @req@ example is in Figure~\ref{fig:lst-features-intro}. 341 Its link attachment is intrusive and the resulting memory layout is pure-stack, just as for the LQ version of Figure~\ref{f:Intrusive}. 342 The framework-provided type @dlink(...)@ provides the links. 343 The user inserts the links into the @req@ structure by using \CFA inline-inheritance (TODO: reference introduction). 344 Inline inheritance means the type of the field is @dlink(req)@, the field is unnamed, a reference to a @req@ is implicitly convertible to @dlink@.\footnote{ 295 345 The \CFA list examples elide the \lstinline{P9_EMBEDDED} annotations that (TODO: xref P9E future work) proposes to obviate. 296 346 Thus, these examples illustrate a to-be state, free of what is to be historic clutter. 297 347 The elided portions are immaterial to the discussion and the examples work with the annotations provided. 298 The \CFA test suite (TODO:cite?) includes equivalent demonstrations, with the annotations included. 299 }. 300 301 My \CFA list library's version of the running @req@ example is in Figure~\ref{fig:lst-features-intro}. 302 Its link attachment is intrusive and the resulting memory layout is pure-stack, just as for the LQ version of Figure~\ref{fig:lst-issues-attach}-(a). 303 The framework-provided type @dlink(-)@ provides the links. 304 The user puts links into the @req@ structure by inline-inheriting (TODO: reference introduction) this type. 305 Which means: the type of the field is @dlink(req)@; the field is unnamed; a reference to a @req@ is implicitly convertible to @dlink@. 306 As these links have a nontrivial, user-specified location within the @req@ structure, this conversion also encapsulates the implied pointer arithmetic safely. 307 308 \begin{figure} 309 \label{fig:lst-features-multidir} 310 \lstinputlisting[language=CFA, firstline=20, lastline=25]{lst-features-multidir.run.cfa} 348 The \CFA test suite (TODO:cite?) includes equivalent demonstrations, with the annotations included.} 349 These links have a nontrivial, user-specified location within the @req@ structure; 350 this convention encapsulates the implied pointer arithmetic safely. 351 352 \begin{figure} 353 \lstinputlisting[language=CFA, firstline=20, lastline=32]{lst-features-intro.run.cfa} 354 \caption[Multiple link directions in \CFA list library]{ 355 Demonstration of the running \lstinline{req} example, done using the \CFA list library. 356 This example does the same job that Figure~\ref{fig:lst-issues-attach} shows three ways. 357 } 358 \label{fig:lst-features-intro} 359 \end{figure} 360 361 \begin{figure} 362 \centering 363 \begin{tabular}{@{}ll@{}} 364 \begin{tabular}{@{}l@{}} 365 \lstinputlisting[language=CFA, firstline=20, lastline=25]{lst-features-multidir.run.cfa} \\ 311 366 \lstinputlisting[language=CFA, firstline=40, lastline=67]{lst-features-multidir.run.cfa} 312 \caption{ 367 \end{tabular} 368 & 369 \lstinputlisting[language=C++, firstline=20, lastline=60]{lst-issues-multi-static.run.c} 370 \end{tabular} 371 372 \caption{ 313 373 Demonstration of multiple static link directions done in the \CFA list library. 314 374 This example does the same job as Figure~\ref{fig:lst-issues-multi-static}. 315 375 } 316 \end{figure} 317 318 The \CFA library supports multi-static link directionality. Figure~\ref{fig:lst-features-multidir} illustrates how. 376 \label{fig:lst-features-multidir} 377 \end{figure} 378 379 Figure~\ref{fig:lst-features-multidir} shows how the \CFA library supports multi-static link directionality. 319 380 The declaration of @req@ now has two inline-inheriting @dlink@ occurrences. 320 The first of these lines gives a type named @req.by_pri@ ; @req@ inherits from it;it inherits from @dlink@.321 The second line gives a similar @req.by_rqr@.381 The first of these lines gives a type named @req.by_pri@, @req@ inherits from it, and it inherits from @dlink@. 382 The second line @req.by_rqr@ is similar to @req.by_pri@. 322 383 Thus, there is a diamond, non-virtual, inheritance from @req@ to @dlink@, with @by_pri@ and @by_rqr@ being the mid-level types. 323 384 Disambiguation occurs in the declarations of the list-head objects. 324 385 The type of the variable @reqs_pri_global@ is @dlist(req, req.by_pri)@, 325 386 meaning operations called on @reqs_pri_global@ are implicitly disambiguated. 326 In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we 're working by priority.''387 In the example, the calls @insert_first(reqs_pri_global, ...)@ imply, ``here, we are working by priority.'' 327 388 328 389 The \CFA library also supports the common case, of single directionality, more naturally than LQ. 329 390 Figure~\ref{fig:lst-features-intro} shows a single-direction list done with no contrived name for the link direction, 330 where Figure~\ref{f ig:lst-issues-attach}-(a)adds the unnecessary name, @x@.391 where Figure~\ref{f:Intrusive} adds the unnecessary name, @x@. 331 392 In \CFA, a user doing a single direction (Figure~\ref{fig:lst-features-intro}) 332 sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist( -)@.393 sets up a simple inheritance with @dlink@, and declares a list head to have the simpler type @dlist(...)@. 333 394 While a user doing multiple link directions (Figure~\ref{fig:lst-features-multidir}) 334 sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist( -, DIR)@.395 sets up a diamond inheritance with @dlink@, and declares a list head to have the more-informed type @dlist(..., DIR)@. 335 396 336 397 The \CFA library offers a type-system mediated integration with user code. … … 348 409 349 410 350 351 352 353 411 \subsection{Iteration} 354 412 -
doc/theses/mike_brooks_MMath/uw-ethesis.tex
r1f771fc r5d9c4bb 60 60 % For hyperlinked PDF, suitable for viewing on a computer, use this: 61 61 \documentclass[letterpaper,12pt,titlepage,oneside,final]{book} 62 \usepackage{times} 62 63 \usepackage[T1]{fontenc} % Latin-1 => 256-bit characters, => | not dash, <> not Spanish question marks 63 64 … … 87 88 \usepackage{comment} % Removes large sections of the document. 88 89 \usepackage{tabularx} 89 \usepackage{subfigure} 90 \usepackage[labelformat=simple,aboveskip=0pt,farskip=0pt,font=normalsize]{subfig} 91 \renewcommand\thesubfigure{(\alph{subfigure})} 90 92 91 93 \usepackage{algorithm} 92 94 \usepackage{algpseudocode} 93 94 \usepackage{pbox}95 95 96 96 % Hyperlinks make it very easy to navigate an electronic document. … … 117 117 citecolor=blue, % color of links to bibliography 118 118 filecolor=magenta, % color of file links 119 urlcolor=blue % color of external links 119 urlcolor=blue, % color of external links 120 breaklinks=true 120 121 } 121 122 \ifthenelse{\boolean{PrintVersion}}{ % for improved print quality, change some hyperref options … … 180 181 \CFAStyle % CFA code-style 181 182 \lstset{language=CFA} % default language 182 \lstset{basicstyle=\linespread{0.9}\ tt} % CFA typewriter font183 \lstset{basicstyle=\linespread{0.9}\sf} % CFA typewriter font 183 184 \lstset{inputpath={programs}} 184 185 \newcommand{\PAB}[1]{{\color{red}PAB: #1}} 185 186 186 187 \newcommand{\uCpp}{$\mu${C}{\kern-.1em\hbox{\large\texttt{+\kern-.25em+}}}} 187 \newcommand{\uCpp}{$\mu$\CC} 188 188 189 189 %======================================================================
Note: See TracChangeset
for help on using the changeset viewer.