# Bytecode TODO ## Example Let's consider a simple algorithm that tests the [Collatz conjecture](collatz_conjecture.md) (which says that applying a simple operation from any starting number over and over will always lead to number 1). The algorithm in [C](c.md) would look as follows: ``` // Collatz conjecture #include int next(int n) { return n % 2 ? // is odd? 3 * n + 1 : n / 2; } int main(void) { int n = getchar() - '0'; // read input ASCII digit while (1) { printf("%d\n",n); if (n == 1) break; n = next(n); } return 0; } ``` The program reads a number (one digit for simplicity) and then prints the sequence until reaching the final number 1. Now let's rewrite the same algorithm in [comun](comun.md), a language which will allow us to produce bytecode: ``` # Collatz conjecture next: $0 2 % ? # is odd? 3 * 1 + ; 2 / . . <- # read input ASCII digit "0" - # convert it to number @@ # print: $0 10 / "0" + -> $0 10 % "0" + -> 10 -> $0 1 = ? !@ . next . ``` Here is annotated bytecode this compiles to: ``` 000000: DES 00 0111 # func \ next: 000001: JMA 00 0100... # 20 (#14) | 000002: COC 00 0001 | 000003: MGE 00 0000 | $0 000004: CON' 00 0010 # 2 (#2) | 2 000005: MOX 00 0000 | % 000006: DES 00 0001 # if | \ ? 000007: JNA 00 0000... # 16 (#10) | | 000008: COC 00 0001 | | 000009: CON' 00 0011 # 3 (#3) | | 3 00000a: MUX 00 0000 | | * 00000b: CON' 00 0001 # 1 (#1) | | 1 00000c: ADX 00 0000 | | + 00000d: DES 00 0010 # else | < ; 00000e: JMA 00 0011... # 19 (#13) | | 00000f: COC 00 0001 | | 000010: CON' 00 0010 # 2 (#2) | | 2 000011: DIX 00 0000 | | / 000012: DES 00 0011 # end if | / . 000013: RET 00 0000 / . 000014: INI 00 0000 000015: INP 00 0000 <- 000016: CON' 00 0000... # 48 (#30) "0" 000017: COC 00 0011 000018: SUX 00 0000 - 000019: DES 00 0100 # loop \ @@ 00001a: MGE 00 0000 | $0 00001b: CON' 00 1010 # 10 (#a) | 10 00001c: DIX 00 0000 | / 00001d: CON' 00 0000... # 48 (#30) | "0" 00001e: COC 00 0011 | 00001f: ADX 00 0000 | + 000020: OUT 00 0000 | -> 000021: MGE 00 0000 | $0 000022: CON' 00 1010 # 10 (#a) | 10 000023: MOX 00 0000 | % 000024: CON' 00 0000... # 48 (#30) | "0" 000025: COC 00 0011 | 000026: ADX 00 0000 | + 000027: OUT 00 0000 | -> 000028: CON' 00 1010 # 10 (#a) | 10 000029: OUT 00 0000 | -> 00002a: MGE 00 0000 | $0 00002b: CON' 00 0001 # 1 (#1) | 1 00002c: EQX 00 0000 | = 00002d: DES 00 0001 # if | \ ? 00002e: JNA 00 0100... # 52 (#34) | | 00002f: COC 00 0011 | | 000030: DES 00 0101 # break | | !@ 000031: JMA 00 1000... # 56 (#38) | | 000032: COC 00 0011 | | 000033: DES 00 0011 # end if | / . 000034: CAL 00 0011 # 3 (#3) | next 000035: DES 00 0110 # end loop / . 000036: JMA 00 1010... # 26 (#1a) 000037: COC 00 0001 000038: END 00 0000 ``` TODO: analyze the above, show other bytecodes (python, java, ...)