The Parrot Bytecode Format
0 1 2 3 +----------+----------+----------+----------+ | Wordsize | Byteorder| Major | Minor | +----------+----------+----------+----------+
Wordsize must be at least 4 (32-bit). Loader is responsible for transforming the file into the VM native wordsize on the fly. For performance, a utility should be provided to convert PBCs on disk if they cannot be recompiled.
Byteorder currently supports two values: (0-Little Endian, 1-Big Endian)
4 5 +----------+----------+----------+----------+ | Flags | FloatType| Pad - For future use| +----------+----------+----------+----------+ | Pad - For future use | +----------+----------+----------+----------+ | Pad - For future use | +----------+----------+----------+----------+ 16 +----------+----------+----------+----------+ | Parrot Magic = 0x 13155a1 | +----------+----------+----------+----------+
Magic is stored in native byteorder. The loader uses the byteorder header to convert the Magic to verify. More specifically, ALL words (non-bytes) in the bytecode file are stored in native order, unless otherwise specified.
20 +----------+----------+----------+----------+ | Opcode Type (Perl = 0x5045524c) | +----------+----------+----------+----------+ For each segment: 4, 4 + (4 + S0), 4 + (4 + S0) + (4 + S1) +----------+----------+----------+----------+ | Segment length in bytes (S) | +----------+----------+----------+----------+ | | : S bytes of segment content : | | +----------+----------+----------+----------+
Currently there are three segment types defined, and they must occur in precisely the order: FIXUP, CONSTANT TABLE, BYTE CODE. Every segment must be present, even if empty.
<< The format for the FIXUP segment is not yet defined. >>
0 (relative) +----------+----------+----------+----------+ | Constant Count (N) | +----------+----------+----------+----------+
For each constant:
+----------+----------+----------+----------+ | Constant Type (T) | +----------+----------+----------+----------+ | Constant Size (S) | +----------+----------+----------+----------+ | | | S bytes of constant content | : appropriate for representing : | a value of type T | | | +----------+----------+----------+----------+
For integer constants:
<< integer constants are represented as manifest constants in the byte code stream currently, limiting them to 32 bit values. >>
For number constants (S is constant, and is equal to sizeof(FLOATVAL)):
sizeof(FLOATVAL)
+----------+----------+----------+----------+ | | | S' bytes of Data | | | +----------+----------+----------+----------+
where
S' = S + (S % 4) ? (4 - (S % 4)) : 0
If S' > S, then the extra bytes are filled with zeros.
For string constants (S varies, and is the size of the particular string):
4, 4 + (16 + S'0), 4 + (16 + S'0) + (16 + S'1) +----------+----------+----------+----------+ | Flags | +----------+----------+----------+----------+ | Encoding | +----------+----------+----------+----------+ | Type | +----------+----------+----------+----------+ | Size (S) | +----------+----------+----------+----------+ | | : S' bytes of Data : | | +----------+----------+----------+----------+
The pieces that can be found in the byte code segment are as follows:
+----------+----------+----------+----------+ | Operation Code | +----------+----------+----------+----------+ +----------+----------+----------+----------+ | Register Argument | +----------+----------+----------+----------+ +----------+----------+----------+----------+ | Integer Argument (Manifest Constant) | +----------+----------+----------+----------+ +----------+----------+----------+----------+ | String Argument (Constant Table Index) | +----------+----------+----------+----------+ +----------+----------+----------+----------+ | Number Argument (Constant Table Index) | +----------+----------+----------+----------+
The number and types for each argument can be determined by consulting Parrot::Opcode.
Currently there are no utilities that use this segment, even though it is mentioned in some of the early Parrot documents.
Eventually there will be a more complete and useful PackFile specification, but this simple format works well enough for now (c. Parrot 0.0.5).
Gregor N. Purdy <gregor@focusresearch.com>
To install Make, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Make
CPAN shell
perl -MCPAN -e shell install Make
For more information on module installation, please visit the detailed CPAN module installation guide.