Інтерпретація. SPL-процесор. Виконання SPL-програми. Алгоритм створення SPL-програми

Содержание

Слайд 2

1. SPL-процесор

1. SPL-процесор

Слайд 3

SPL-процесор має: пам‘ять SPL-програми, що моделюється глобальними даними: масив TCD (таблиця

SPL-процесор має:

пам‘ять SPL-програми, що моделюється глобальними даними:
масив TCD (таблиця команд);
adrnm- адреса

головної програми, точка входу в головну програму;
cpnm- кількість параметрів головної програми;
cgv- кількість глобальних змінних;
пам‘ять даних, що моделюється стеком st (масив), де містяться значення всіх даних в процесі інтерпретації.
Використовуються покажчики (індекси масивів):
t-вершини стека st,
sp – початок області локальних даних функції (запису активації),
p – поточної команди в TCD.
Слайд 4

Запис активації містить значення фактичних параметрів р1, р2,..., рn; кількість параметрів

Запис активації містить

значення фактичних параметрів р1, р2,..., рn;
кількість параметрів n;


адреса повернення в TCD (адреса команди виклику);
адреса попереднього запису активації в стеку (звідки відбувся виклик функції);
локальні та тимчасові дані, що використовуються при обчисленні цього виклику функції.
Слайд 5

Стек ST sp t Нехай викликаються функції main, р0, р1 Тоді

Стек ST

sp

t

Нехай викликаються функції main, р0, р1 Тоді стек st має

вигляд:
1)  Область глобальних даних, що вміщує сgv елементів.
2) Три записи активації для функцій main p0, р1

С. 7

Слайд 6

Звертанння до глобальних змінних: st[k], k=0,1,…,cgv-1; Доступні також локальні дані, які

Звертанння до глобальних змінних: st[k], k=0,1,…,cgv-1;
Доступні також локальні дані, які

знаходяться в верхньому запису активації:
параметри, розташовані “нижче” sp, мають зміщення k<0;
локальні змінні, розташовані “вище” sp, мають зміщення k>0;
Адресація до локальних змінних відбувається так: st[sp+k]
Зміщення для даних обчислюється при обробці описань в SPL-програмі; зміщення можуть бути:
для n фактичних параметрів: -(n+2),…,-4,-3;
для локальних даних: 1,2,3,…
для глобальних змінних: 0,1,2,…

С. 5

Слайд 7

Файл protot.h має опис кодів команд та структури команди SPL–процесора: enum

Файл protot.h має опис кодів команд та структури команди SPL–процесора:

enum {OPR=1,LIT,LDE,

LDI, STE, STI, CAL, INI, JMP, JMC};
typedef struct {
int code;
int opd;
} cmd;
cmd TCD[300];
Слайд 8

Коди операцій: OPR — виконати операцію а над вершиною стеку; LIT

Коди операцій:

OPR — виконати операцію а над вершиною стеку;
LIT —

завантажити в стек константу a;
LDE, LDI — записати в стек значення глобальної (локальної) змінної зі зміщенням a;
STE, STI — запам'ятати значення вершини стека в глобальній (локальній) змінній зі зміщенням а;
CAL — викликати функцію з точкою входу a;
INI — збільшити t на a (виділення пам'яті);
JMP — здійснити безумовний перехід на команду a;
JMC — виконати умовний перехід на команду a, якщо верхній елемент стека менший чи рівний нулю (цей елемент вилучається зі стека).
Слайд 9

У команді з кодом OPR допустимі операції: а = 1 –

У команді з кодом OPR допустимі операції:

а = 1 – ввести

в стек число з stdin;
а = 2 – вивести верхнє значення зі стека в stdout;
а = 3,…,7 – виконати над двома верхніми елементами стека операцію +, —, *, /, %;
а = 8 –змінити знак верхнього елемента стека;
а = 9 –повернутися в функції (результат розміщується у верхньому елементі стека);
а = 10 – зупинити виконання SPL-програми.
Слайд 10

2. Виконання SPL-програми interp() – починає та завершує виконання SPL-програми, а

2. Виконання SPL-програми

interp() – починає та завершує виконання SPL-програми, а також

здійснює загальне керування.
comman() – виконує поточну команду TCD[p];
operat (а) — виконує операцію OPR a;
push (а) – заносить значення a в стек;
read () – вводить число з stdin у стек.

Всі функції, що виконують SPL-програми, розміщуються у файлі inter.cpp:

Слайд 11

// interp - початок: основний цикл //та завершення iтерпретацiї void interp(void)

// interp - початок: основний цикл //та завершення iтерпретацiї

void interp(void)
{
int

i;
t=-1;
puts("SPL: iнтерпретацiя");
for(i=0;i if(cpnm) { printf("%d>",cpnm); for(i=0;i push(cpnm); push(-2); push(-1);
sp=t; p=adrnm;
do { comman(); p++; } while(p>=0);
if(p==-1) printf("%d\n",st[t]);
}

extern cmd TCD[];
extern int adrnm, cpnm, cgv;
int st[500], sp, t, p;

Слайд 12

// comman - виконання команди TCD[p] void comman(void) { int a=TCD[p].opd;

// comman - виконання команди TCD[p]

void comman(void)
{ int a=TCD[p].opd; switch(TCD[p].code)
{case

OPR: operat(a); break;
case LIT: push(a); break;
case LDE: push(st[a]); break;
case LDI: push(st[sp+a]); break;
case STE: st[a]=st[t--]; break;
case STI: st[sp+a]=st[t--]; break;
case CAL: push(p); push(sp); sp=t; p=a-1; break;
case INI: for(int i=0; i case JMP: p=a-1; break;
case JMC: if(st[t--]<=0) p=a-1; }
}
Слайд 13

// operat -виконання операцiї а // над вершиною стека void operat(

// operat -виконання операцiї а // над вершиною стека

void operat( int

a)
{ int j=t-1; switch(a)
{case 1: printf("1>"); push(read()); break;
case 2: printf("%d\n",st[t--]); break;
case 3: st[j]+=st[t--]; break;
case 4: st[j]-=st[t--]; break;
case 5: st[j]*=st[t--]; break;
case 6: if(st[t]==0) error1("/: дiльник = 0"); st[j]/=st[t--]; break;
case 7: if(st[t]<=0) error1("%%: дiльник = 0"); st[j]%=st[t--]; break;
case 8: st[t]=-st[t]; break;
case 9: j=st[sp-2]; st[sp-j-2]=st[t]; t=sp-j-2; p=st[sp-1]; sp=st[sp];break;
case 10: p=-3; }
}
Слайд 14

// push - занесення в стек значення a void push(int a)

// push - занесення в стек значення a
void push(int a)
{
if(t>=499)

error1("переповнення стеку st ");
st[++t]=a;
}
 // read - введення наступного цiлого
// значення iз stdin
int read(void)
{
int v,c;
do { c=getchar(); }
while(isspace(c));
if(!isdigit(c)) error1("помилка введення");
for(v=0;isdigit(c);c=getchar())
v=v*10+c-'0';
ungetc(c,stdin);
return v;
}
Слайд 15

3. Алгоритм створення SPL-програми Оператори мови SPL переводяться в проміжний код

3. Алгоритм створення SPL-програми

Оператори мови SPL переводяться в проміжний код за

таким принципом:
f(p1, p2,…,pk) begin DC spop end — b: {ini l} {opr 10}
константа або число v із значенням val — в {LIT val}
глобальна змінна d із зміщен­ням а — в {LDE a}
локальна змінна чи параметр d із зміщенням а — в {LDI a}
виклик функції f(e1,e2,...,en) з точкою входу b —
в послідовність команд ...{LIT n}{CAL b}
вираз -е перекладається в {OPR 8},
вираз e1 op e2 (де op — одна з операцій +, -, *, /, %) — в послідовність {OPR a}, де a = 3, 4, 5, 6, 7.
Слайд 16

Оператори мови SPL переводяться в проміжний код за таким принципом: Оператор

Оператори мови SPL переводяться в проміжний код за таким принципом:

Оператор присвоєння

d=е, де d — змінна із зміщенням а, перекладається в код
{STE a} — для глобальної змінної d <е>{SТІ а} — для локальної змінної
Оператор введення read d замінюється на
{OPR 1} {STE a} —для глобальної змінної
{OPR l}{STI a} —для локальної змінної
Оператор print е перекладається в — {OPR 2}
Оператор return e — {OPR 9}
Оператор if e then s end — {JMC l} l:
Оператор while е do s end —
lb: <е> {JMC l} {JMP lb} l:
Слайд 17

4. Приклад проміжного коду для SPL програми main ( ) begin

4. Приклад проміжного коду для SPL програми

main ( )
begin
int

x, у;
read x; read y; print exp(x, y)
end
exp (a, b)
begin int z;
z= 1;
while b do
if b % 2 then z = z * a end;
a = a * a; b = b/2
end;
return z
end
Слайд 18

main ( ) begin int x, у; read x; read y;

main ( )
begin
int x, у;
read x; read y; print

exp(x, y)
end
exp (a, b)
begin int z;
z= 1;
while b do
if b % 2 then z = z * a end;
a = a * a; b = b/2
end;
return z
end

while

Слайд 19

main ( ) begin int x, у; read x; read y;

main ( )
begin
int x, у;
read x; read y; print

exp(x, y)
end
exp (a, b)
begin int z;
z= 1;
while b do
if b % 2 then z = z * a end;
a = a * a; b = b/2
end;
return z
end

if

while

if

Слайд 20

5. Розробка компілятора SPL для платформи . NET

5. Розробка компілятора SPL для платформи . NET

Слайд 21

Програмна модель

Програмна модель

Слайд 22

Запуск і виконання програми > SimpleCompiler.exe test.spl > %Windir %/microsoft.net/Framework/v4.0.30319/ilasm test.il

Запуск і виконання програми

> SimpleCompiler.exe test.spl
> %Windir %/microsoft.net/Framework/v4.0.30319/ilasm test.il