Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Bytecode

VM load the bytecode -> build tree in vm (Tree with value const, if value is lamda, it will eval the bytecode with offset) ->

The format

The opcode

  • LDC dr, const_offset
  • LIM dr, number
  • MTB dr
  • SAT dr, rKey, rValue
  • RET dr
  • MTH dr

LDC - Load const

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|    8bit               |   4bit    |                          20bit                            |

MTB - Make Table

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|    8bit               |                                                           |           |
|    opcode             |                                                           |    Reg    |

SAT - Set Attribute

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|    8bit               |                                   |    4bit   |           |           |
|    opcode             |                                   |  Des Reg  |  Key Reg  | Value Reg |

MTK - Make Thunk

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|    8bit               |   4bit    |                          20bit                            |

RET - Return

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|    8bit               |                                                           |           |
|    opcode             |                                                           |    Reg    |
port = 3030;
response.message = "Hello";

 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
|              |           |           |        |
     opcode       Des Reg         ...

Section

In head

  • Magic number(u32): 0x414E4749 = "ANGI"
  • version(u32): 0x0001 = "0.0.1"
  • const_offset(u32)
  • const_size(u32)
  • code_offset(u32)
  • code_size(u32)

Example

Save

{
   port = 3030;
   response = {
      message = "Hello";
   };
}

To memory

[Const]
1: "port"
2: "response"
3: "message"
4: "Hello"
5: 3030
...
[Code]
MTB r0
LDC r1, c1
LDC r2, c5
SAT r0, r1, r2 // port = 3030
LDC r1, c2
MTK r2, 1
SAT r0, r1, r2 // response = <thunk 1>
RET r0

:thunk 1
MTB r0
LDC r3, c3
LDC r4, c4
SAT r0, r3, r4 // message = "Hello"
RET r0
{
   port = 3030;
   handler = () {
      let b = 1 + 1;
      return b;
   }
}
[Const]
1: "port"
2: "path"
3: "handler"
5: 3030
...
[Code]
MTB r0
LDC r1, c1
LDC r2, c5
SAT r0, r1, r2

MTB r2
LDC r3, c3
LDC r4, c4
SAT r2, r3, r4

LDC r1, c2
SAT r0, r1, r2
RET r0