Skip to content

Commit 3f3a8ab

Browse files
committed
glossary: define place, value, representation
1 parent d86d39c commit 3f3a8ab

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

Diff for: reference/src/glossary.md

+37-3
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,44 @@ niches. For example, the "all bits uninitialized" is an invalid bit-pattern for
129129
`&mut T`, but this bit-pattern cannot be used by layout optimizations, and is not a
130130
niche.
131131

132+
#### Place
133+
134+
A *place* (called "lvalue" in C and "glvalue" in C++) is the result of computing a [*place expression*][place-value-expr].
135+
A place is basically a pointer (pointing to some location in memory, potentially carrying [provenance](#pointer-provenance)), but might contain more information such as size or alignment (the details will have to be determined as the Rust Abstract Machine gets specified more precisely).
136+
A place has a type.
137+
Places cannot be "stored" in memory, only [values](#value) can.
138+
139+
The key operations on a place are:
140+
* storing a [value](#value) of the same type in it (when it is used on the left-hand side of an assignment),
141+
* turning it into a [pointer value](#value) (when it is used inside `&expr`),
142+
* and loading a [value](#value) of the same type from it (through the place-to-value coercion).
143+
144+
145+
#### Value
146+
147+
A *value* (called "value of the expression" or "rvalue" in C and "prvalue" in C++) is what gets stored in a [place](#place), and also the result of computing a [*value expression*][place-value-expr].
148+
A value has a type, and it denotes the abstract mathematical concept that is represented by data in our programs.
149+
For example, a value of type `u8` is a mathematical integer in the range `0..256`.
150+
Values can be (according to their type) turned into a list of bytes, which is called a [representation](#representation) of the value.
151+
Values are ephemeral; they arise during the computation of an instruction but are only ever persisted in memory through their representation.
152+
(This is comparable to how run-time data in a program is ephemeral and is only ever persisted in serialized form.)
153+
154+
#### Representation (relation)
155+
156+
A *representation* of a [value](#value) is a list of bytes that is used to store or "represent" that value in memory.
157+
158+
We also sometimes speak of the *representation of a type*; this should more correctly be called the *representation relation* as it relates values of this type to lists of bytes that represent this value.
159+
The term "relation" here is used in the mathematical sense: the representation relation is a predicate that, given a value and a list of bytes, says whether this value is represented by that list of bytes (`val -> list byte -> Prop`).
160+
161+
The relation should be functional for a fixed list of bytes (i.e., every list of bytes has at most one associated representation).
162+
It is partial in both directions: not all values have a representation (e.g. the mathematical integer `300` has no representation at type `u8`), and not all lists of bytes correspond to a value of a specific type (e.g. lists of the wrong size correspond to no value, and the list consisting of the single byte `0x10` corresponds to no value of type `bool`).
163+
For a fixed value, there can be many representations (e.g., when considering type `#[repr(C)] Pair(u8, u16)`, the second byte is a padding byte so changing it does not affect the value represented by a list of bytes).
164+
165+
See the [value domain][value-domain] for an example how values and representation relations can be made more precise.
132166

133167
### TODO
134168

135169
* *tag*
136-
* *rvalue*
137-
* *lvalue*
138-
* *representation*
170+
171+
[value-domain]: https://github.com/rust-lang/unsafe-code-guidelines/tree/master/wip/value-domain.md
172+
[place-value-expr]: https://doc.rust-lang.org/reference/expressions.html#place-expressions-and-value-expressions

0 commit comments

Comments
 (0)