Под стэковую машину гораздо проще написать компилятор, особенно если не выдумать всякие продвинутые оптимизации.
А откуда берется множество DUP/DROP?
function fib(@n)
{
if (@n = 0) return 0;
if (@n = 1) return 1;
return fib(@n-1) + fib(@n-2);
}
function fib2(@n) : @n1, @n2, @tmp
{
if (@n = 0) return 0;
if (@n = 1) return 1;
@n1 := 0;
@n2 := 1;
while (@n) {
@tmp := @n2;
@n2 := @n1 + @n2;
@n1 := @tmp;
@n := @n - 1;
}
return @n2;
}
fib: L_LOAD 0
CONST_0
EQ
BRF 9
CONST_0
RET_POP_0
9: L_LOAD 0
CONST_1
EQ
BRF 18
CONST_1
RET_POP_0
18: L_LOAD 0
CONST_1
MINUS
CALL fib
L_LOAD 0
CONST_2
MINUS
CALL fib
PLUS
RET_POP_0
fib2: LOCALS 3
L_LOAD 0
CONST_0
EQ
BRF 46
CONST_0
RET_POP 3
46: L_LOAD 0
CONST_1
EQ
BRF 56
CONST_1
RET_POP 3
56: CONST_0
L_STORE 1
CONST_1
L_STORE 2
62: L_LOAD 0
BRF 91
L_LOAD 2
L_STORE 3
L_LOAD 1
L_LOAD 2
PLUS
L_STORE 2
L_LOAD 3
L_STORE 1
L_LOAD 0
CONST_1
MINUS
L_STORE 0
BR 62
91: L_LOAD 2
RET_POP 3
Michael_K писал(а):входной язык не понравился
fib(n)
if (n = 0) return 0
if (n = 1) return 1
return fib(n-1) + fib(n-2)
fib2(n)
if (n = 0) return 0
if (n = 1) return 1
n1 = 0
n2 = 1
while (n)
tmp = n2
n2 = n1 + n2
n1 = tmp
n = n - 1
return n2
в самом языке - только копирующее присваивание.
def fib(n):
if n == 0: return 0
if n == 1: return 1
return fib(n-1) + fib(n-2)
def fib2(n)
if n == 0: return 0
if n == 1: return 1
n1 = 0
n2 = 1
while n:
tmp = n2
n2 = n1 + n2
n1 = tmp
n = n - 1
return n2
Michael_K писал(а):Мне кажется, что нужно думать о красоте и юзабилити...
(Ну вот такое у меня представление о том, как работает этот мир)
угу, а у брейнф*ка грамматика еще короче.
Сейчас этот форум просматривают: Google [Bot] и гости: 19