micropython

docs/concepts.txt

227:8c504f98e45f
2009-05-24 Paul Boddie Changed the interface to functions and instantiators to expose the body block (after argument checking) instead of an explicit location.
     1 Concepts
     2 ========
     3 
     4 This document describes the underlying concepts employed in micropython.
     5 
     6   * Namespaces and attribute definition
     7   * Contexts and values
     8   * Tables, attributes and lookups
     9   * Objects and structures
    10   * Parameters and lookups
    11   * Instantiation
    12   * Register usage
    13 
    14 Namespaces and Attribute Definition
    15 ===================================
    16 
    17 Namespaces are any objects which can retain attributes.
    18 
    19   * Module attributes are defined either at the module level or by global
    20     statements.
    21   * Class attributes are defined only within class statements.
    22   * Instance attributes are defined only by assignments to attributes of self
    23     within __init__ methods.
    24 
    25 These restrictions apply because such attributes are thus explicitly declared,
    26 permitting the use of tables (described below). Module and class attributes
    27 can also be finalised in this way in order to permit certain optimisations.
    28 
    29 See rejected.txt for complicating mechanisms which could be applied to
    30 mitigate the effects of these restrictions on optimisations.
    31 
    32 Contexts and Values
    33 ===================
    34 
    35 Values are used as the common reference representation in micropython: as
    36 stored representations of attributes (of classes, instances, modules, and
    37 other objects supporting attribute-like entities) as well as the stored values
    38 associated with names in functions and methods.
    39 
    40 Unlike other implementations, micropython does not create things like bound
    41 method objects for individual instances. Instead, all objects are referenced
    42 using a context, reference pair:
    43 
    44 Value Layout
    45 ------------
    46 
    47     0           1
    48     context     object
    49     reference   reference
    50 
    51 Specific implementations might reverse this ordering for optimisation
    52 purposes.
    53 
    54 Rationale
    55 ---------
    56 
    57 To reduce the number of created objects whilst retaining the ability to
    58 support bound method invocations. The context indicates the context in which
    59 an invocation is performed, typically the owner of the method.
    60 
    61 Usage
    62 -----
    63 
    64 The context may be inserted as the first argument when a value is involved in
    65 an invocation. This argument may then be omitted from the invocation if its
    66 usage is not appropriate.
    67 
    68 See invocation.txt for details.
    69 
    70 Contexts in Acquired Values
    71 ---------------------------
    72 
    73 There are three classes of instructions which provide values:
    74 
    75     Instruction         Purpose                 Context Operations
    76     -----------         -------                 ------------------
    77 
    78 1)  LoadConst           Load class, module,     Use loaded object with itself
    79                         constant                as context
    80 
    81 2)  LoadFunction        Load function           Combine null context with
    82                                                 loaded object
    83 
    84 3)  LoadAddress*        Load attribute from     Preserve or override stored
    85     LoadAttr*           class, module,          context (as described in
    86                         instance                assignment.txt)
    87 
    88 In order to comply with traditional Python behaviour, contexts may or may not
    89 represent the object from which an attribute has been acquired.
    90 
    91 See assignment.txt for details.
    92 
    93 Contexts in Stored Values
    94 -------------------------
    95 
    96 There are two classes of instruction for storing values:
    97 
    98     Instruction         Purpose                 Context Operations
    99     -----------         -------                 ------------------
   100 
   101 1)  StoreAddress        Store attribute in a    Preserve context; note that no
   102                         known object            test for class attribute
   103                                                 assignment should be necessary
   104                                                 since this instruction should only
   105                                                 be generated for module globals
   106 
   107     StoreAttr           Store attribute in an   Preserve context; note that no
   108                         instance                test for class attribute
   109                                                 assignment should be necessary
   110                                                 since this instruction should only
   111                                                 be generated for self accesses
   112 
   113     StoreAttrIndex      Store attribute in an   Preserve context; since the index
   114                         unknown object          lookup could yield a class
   115                                                 attribute, a test of the nature of
   116                                                 the nature of the structure is
   117                                                 necessary in order to prevent
   118                                                 assignments to classes
   119 
   120 2)  StoreAddressContext Store attribute in a    Override context if appropriate;
   121                         known object            if the value has a null context,
   122                                                 permit the target to take
   123                                                 ownership of the value
   124 
   125 See assignment.txt for details.
   126 
   127 Tables, Attributes and Lookups
   128 ==============================
   129 
   130 Attribute lookups, where the exact location of an object attribute is deduced,
   131 are performed differently in micropython than in other implementations.
   132 Instead of providing attribute dictionaries, in which attributes are found,
   133 attributes are located at fixed places in object structures (described below)
   134 and their locations are stored using a special representation known as a
   135 table.
   136 
   137 For a given program, a table can be considered as being like a matrix mapping
   138 classes to attribute names. For example:
   139 
   140     class A:
   141         # instances have attributes x, y
   142 
   143     class B(A):
   144         # introduces attribute z for instances
   145 
   146     class C:
   147         # instances have attributes a, b, z
   148 
   149 This would provide the following table, referred to as an object table in the
   150 context of classes and instances:
   151 
   152     Class/attr      a   b   x   y   z
   153 
   154     A                       1   2
   155     B                       1   2   3
   156     C               1   2           3
   157 
   158 A limitation of this representation is that instance attributes may not shadow
   159 class attributes: if an attribute with a given name is not defined on an
   160 instance, an attribute with the same name cannot be provided by the class of
   161 the instance or any superclass of the instance's class.
   162 
   163 The table can be compacted using a representation known as a displacement
   164 list (referred to as an object list in this context):
   165 
   166                 Classes with attribute offsets
   167 
   168     classcode   A
   169     attrcode    a   b   x   y   z
   170 
   171                         B
   172                         a   b   x   y   z
   173 
   174                                             C
   175                                             a   b   x   y   z
   176 
   177     List        .   .   1   2   1   2   3   1   2   .   .   3
   178 
   179 Here, the classcode refers to the offset in the list at which a class's
   180 attributes are defined, whereas the attrcode defines the offset within a
   181 region of attributes corresponding to a single attribute of a given name.
   182 
   183 Attribute Locations
   184 -------------------
   185 
   186 The locations stored in table/list elements are for instance attributes
   187 relative to the location of the instance, whereas those for class attributes
   188 and modules are absolute addresses (although these could also be changed to
   189 object-relative locations).
   190 
   191 Objects and Structures 
   192 ======================
   193 
   194 As well as references, micropython needs to have actual objects to refer to.
   195 Since classes, functions and instances are all objects, it is desirable that
   196 certain common features and operations are supported in the same way for all
   197 of these things. To permit this, a common data structure format is used.
   198 
   199     Header....................................................  Attributes.................
   200 
   201     Identifier  Identifier  Address     Identifier  Size        Object      Object      ...
   202 
   203     0           1           2           3           4           5           6           7
   204     classcode   attrcode/   invocation  funccode    size        __class__   attribute   ...
   205                 instance    reference                           reference   reference
   206                 status
   207 
   208 Classcode
   209 ---------
   210 
   211 Used in attribute lookup.
   212 
   213 Here, the classcode refers to the attribute lookup table for the object (as
   214 described above). Classes and instances share the same classcode, and their
   215 structures reflect this. Functions all belong to the same type and thus employ
   216 the classcode for the function built-in type, whereas modules have distinct
   217 types since they must support different sets of attributes.
   218 
   219 Attrcode
   220 --------
   221 
   222 Used to test instances for membership of classes (or descendants of classes).
   223 
   224 Since, in traditional Python, classes are only ever instances of the "type"
   225 built-in class, support for testing such a relationship directly has been
   226 removed and the attrcode is not specified for classes: the presence of an
   227 attrcode indicates that a given object is an instance.
   228 
   229 See the "Testing Instance Compatibility with Classes (Attrcode)" section below
   230 for details of attrcodes.
   231 
   232 Invocation Reference
   233 --------------------
   234 
   235 Used when an object is called.
   236 
   237 This is the address of the code to be executed when an invocation is performed
   238 on the object.
   239 
   240 Funccode
   241 --------
   242 
   243 Used to look up argument positions by name.
   244 
   245 The strategy with keyword arguments in micropython is to attempt to position
   246 such arguments in the invocation frame as it is being constructed.
   247 
   248 See the "Parameters and Lookups" section for more information.
   249 
   250 Size
   251 ----
   252 
   253 Used to indicate the size of an object including attributes.
   254 
   255 Attributes
   256 ----------
   257 
   258 For classes, modules and instances, the attributes in the structure correspond
   259 to the attributes of each kind of object. For functions, however, the
   260 attributes in the structure correspond to the default arguments for each
   261 function, if any.
   262 
   263 Structure Types
   264 ---------------
   265 
   266 Class C:
   267 
   268     0           1           2           3           4           5           6           7
   269     classcode   (unused)    __new__     funccode    size        class type  attribute   ...
   270     for C                   reference   for                     reference   reference
   271                                         instantiator
   272 
   273 Instance of C:
   274 
   275     0           1           2           3           4           5           6           7
   276     classcode   attrcode    C.__call__  funccode    size        class C     attribute   ...
   277     for C       for C       reference   for                     reference   reference
   278                             (if exists) C.__call__
   279 
   280 Function f:
   281 
   282     0           1           2           3           4           5           6           7
   283     classcode   attrcode    code        funccode    size        class       attribute   ...
   284     for         for         reference                           function    (default)
   285     function    function                                        reference   reference
   286 
   287 Module m:
   288 
   289     0           1           2           3           4           5           6           7
   290     classcode   attrcode    (unused)    (unused)    (unused)    module type attribute   ...
   291     for m       for m                                           reference   (global)
   292                                                                             reference
   293 
   294 The __class__ Attribute
   295 -----------------------
   296 
   297 All objects support the __class__ attribute and this is illustrated above with
   298 the first attribute.
   299 
   300 Class: refers to the type class (type.__class__ also refers to the type class)
   301 Function: refers to the function class
   302 Instance: refers to the class instantiated to make the object
   303 
   304 Lists and Tuples
   305 ----------------
   306 
   307 The built-in list and tuple sequences employ variable length structures using
   308 the attribute locations to store their elements, where each element is a
   309 reference to a separately stored object.
   310 
   311 Testing Instance Compatibility with Classes (Attrcode)
   312 ------------------------------------------------------
   313 
   314 Although it would be possible to have a data structure mapping classes to
   315 compatible classes, such as a matrix indicating the subclasses (or
   316 superclasses) of each class, the need to retain the key to such a data
   317 structure for each class might introduce a noticeable overhead.
   318 
   319 Instead of having a separate structure, descendant classes of each class are
   320 inserted as special attributes into the object table. This requires an extra
   321 key to be retained, since each class must provide its own attribute code such
   322 that upon an instance/class compatibility test, the code may be obtained and
   323 used in the object table.
   324 
   325 Invocation and Code References
   326 ------------------------------
   327 
   328 Modules: there is no meaningful invocation reference since modules cannot be
   329 explicitly called.
   330 
   331 Functions: a simple code reference is employed pointing to code implementing
   332 the function. Note that the function locals are completely distinct from this
   333 structure and are not comparable to attributes. Instead, attributes are
   334 reserved for default parameter values, although they do not appear in the
   335 object table described above, appearing instead in a separate parameter table
   336 described below.
   337 
   338 Classes: given that classes must be invoked in order to create instances, a
   339 reference must be provided in class structures. However, this reference does
   340 not point directly at the __init__ method of the class. Instead, the
   341 referenced code belongs to a special initialiser function, __new__, consisting
   342 of the following instructions:
   343 
   344     create instance for C
   345     call C.__init__(instance, ...)
   346     return instance
   347 
   348 Instances: each instance employs a reference to any __call__ method defined in
   349 the class hierarchy for the instance, thus maintaining its callable nature.
   350 
   351 Both classes and modules may contain code in their definitions - the former in
   352 the "body" of the class, potentially defining attributes, and the latter as
   353 the "top-level" code in the module, potentially defining attributes/globals -
   354 but this code is not associated with any invocation target. It is thus
   355 generated in order of appearance and is not referenced externally.
   356 
   357 Invocation Operation
   358 --------------------
   359 
   360 Consequently, regardless of the object an invocation is always done as
   361 follows:
   362 
   363     get invocation reference from the header
   364     jump to reference
   365 
   366 Additional preparation is necessary before the above code: positional
   367 arguments must be saved in the invocation frame, and keyword arguments must be
   368 resolved and saved to the appropriate position in the invocation frame.
   369 
   370 See invocation.txt for details.
   371 
   372 Parameters and Lookups 
   373 ======================
   374 
   375 Since Python supports keyword arguments when making invocations, it becomes
   376 necessary to record the parameter names associated with each function or
   377 method. Just as object tables record attributes positions on classes and
   378 instances, parameter tables record parameter positions in function or method
   379 parameter lists.
   380 
   381 For a given program, a parameter table can be considered as being like a
   382 matrix mapping functions/methods to parameter names. For example:
   383 
   384     def f(x, y, z):
   385         pass
   386 
   387     def g(a, b, c):
   388         pass
   389 
   390     def h(a, x):
   391         pass
   392 
   393 This would provide the following table, referred to as a parameter table in
   394 the context of functions and methods:
   395 
   396     Function/param  a   b   c   x   y   z
   397 
   398     f                           1   2   3
   399     g               1   2   3
   400     h               1           2
   401 
   402 Just as with parameter tables, a displacement list can be prepared from a
   403 parameter table:
   404 
   405                 Functions with parameter (attribute) offsets
   406 
   407     funccode    f
   408     attrcode    a   b   c   x   y   z
   409 
   410                                         g
   411                                         a   b   c   x   y   z
   412 
   413                                                     h
   414                                                     a   b   c   x   y   z
   415 
   416     List        .   .   .   1   2   3   1   2   3   1   .   .   2   .   .
   417 
   418 Here, the funccode refers to the offset in the list at which a function's
   419 parameters are defined, whereas the attrcode defines the offset within a
   420 region of attributes corresponding to a single parameter of a given name.
   421 
   422 Instantiation
   423 =============
   424 
   425 When instantiating classes, memory must be reserved for the header of the
   426 resulting instance, along with locations for the attributes of the instance.
   427 Since the instance header contains data common to all instances of a class, a
   428 template header is copied to the start of the newly reserved memory region.
   429 
   430 Register Usage
   431 ==============
   432 
   433 During code generation, much of the evaluation produces results which are
   434 implicitly recorded in the "active value" register, and various instructions
   435 will consume the active value. In addition, some instructions will consume a
   436 separate "active source value" from a register, typically those which are
   437 assigning the result of an expression to an assignment target.
   438 
   439 Since values often need to be retained for later use, a set of temporary
   440 storage locations are typically employed. However, optimisations may reduce
   441 the need to use such temporary storage where instructions which provide the
   442 "active value" can be re-executed and will produce the same result.