Supported Platforms
Firstly, some assumptions about the platforms the language targets, just to get a few things out of the way. An implementation will not be able to support all the language features if some of these assumptions are not met.
Note that these do not imply hardware support, merely compiler support; the difference is most relevant for floating-point and 64-bit integer types.
<stdint.h>
is available or can be implemented, with[u]int{8,16,32,64}_t
and[u]intptr_t
types present. This also implies the following:- Bytes are 8 bits in size. The smallest addressable unit is a
unsigned char == uint8_t
(CHAR_BIT == 8
). (implied by[u]int8_t
existing) (Required for array bitcasts and efficient storage of strings.) - Signed integers are represented via two’s complement representation. (implied by
int{8,16,32,64}_t
— these only exist if they are two’s complement) (Required for integer semantics.) - 64-bit integers are available. (Required for some integer types.)
- Pointers can be represented as integers, and vice-versa. (Required for internal VM logic.)
- Bytes are 8 bits in size. The smallest addressable unit is a
- Both 32-bit and 64-bit IEEE floating-point types are supported. (Required for some features & guarantees of
float
anddouble
types.) - The byte order is either big-endian or little-endian. Mixed endianness (“middle-endian”) systems are not supported. Note that this only rules out ancient systems such as the PDP-11. (Required for array bitcasts, internal VM logic, and possibly I/O.)
The target implementation language is a subset of C99.