Skip to content

Commit ed31fa2

Browse files
committed
02: Interpreters
1 parent 5f66758 commit ed31fa2

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

02-Interpreters/index.js

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
const instructions = {
2+
'SET A': 0,
3+
'PRINT A': 1,
4+
'IFN A': 2,
5+
'RET': 3,
6+
'DEC A': 4,
7+
'JMP': 5
8+
};
9+
10+
const program = [
11+
// Ставим значения аккумулятора
12+
instructions['SET A'],
13+
// В 10
14+
10,
15+
16+
// Выводим значение на экран
17+
instructions['PRINT A'],
18+
19+
// Если A равно 0
20+
instructions['IFN A'],
21+
22+
// Программа завершается
23+
instructions['RET'],
24+
25+
// И возвращает 0
26+
0,
27+
28+
// Уменьшаем A на 1
29+
instructions['DEC A'],
30+
31+
// Устанавливаем курсор выполняемой инструкции
32+
instructions['JMP'],
33+
34+
// В значение 2
35+
2
36+
];
37+
38+
function execute(code) {
39+
let acc = 0;
40+
let i = 0;
41+
42+
while (true) {
43+
switch (code[i]) {
44+
case reg['SET A']:
45+
acc = code[i+1];
46+
i += 2;
47+
break;
48+
case reg['PRINT A']:
49+
console.log(acc);
50+
++i;
51+
break;
52+
case reg['IFN A']:
53+
if (acc === 0) {
54+
++i;
55+
} else {
56+
i += 2;
57+
}
58+
break;
59+
case reg['DEC A']:
60+
--acc;
61+
++i
62+
break;
63+
case reg['JMP']:
64+
i = code[i+1]
65+
break;
66+
case reg['RET']:
67+
return acc;
68+
}
69+
}
70+
}
71+
execute([0, 10, 1, 2, 3, 4, 5, 2])

02-Interpreters/База#2. ДЗ.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# ДЗ к лекции База#2
2+
3+
## Придумать простой формат "байткода" и написать для него интерпретатор
4+
5+
```
6+
const instructions = {
7+
'SET A': 0,
8+
'PRINT A': 1,
9+
'IFN A': 2,
10+
'RET': 3,
11+
'DEC A': 4,
12+
'JMP': 5
13+
};
14+
15+
const program = [
16+
// Ставим значения аккумулятора
17+
instructions['SET A'],
18+
// В 10
19+
10,
20+
21+
// Выводим значение на экран
22+
instructions['PRINT A'],
23+
24+
// Если A равно 0
25+
instructions['IFN A'],
26+
27+
// Программа завершается
28+
instructions['RET'],
29+
30+
// И возвращает 0
31+
0,
32+
33+
// Уменьшаем A на 1
34+
instructions['DEC A'],
35+
36+
// Устанавливаем курсор выполняемой инструкции
37+
instructions['JMP'],
38+
39+
// В значение 2
40+
2
41+
];
42+
43+
// Выведет в консоль
44+
// 10
45+
// 9
46+
// 8
47+
// 7
48+
// 6
49+
// 5
50+
// 4
51+
// 3
52+
// 2
53+
// 1
54+
// 0
55+
// И вернет 0
56+
execute(program);
57+
```

0 commit comments

Comments
 (0)