vak: (Default)
[personal profile] vak
Сравнение трёх компиляторов разных алголов, конспективно. В качестве примера взято вычисление чисел Фибоначчи. Для каждого алгола приведены:
  • местонахождение компилятора на Гитхабе
  • текст программы вычисления 30-го числа Фибоначчи
  • команды компиляции
  • результат вычисления
  • размер бинарного кода
  • список требуемых разделяемых библиотек

Algol 60

Компилятор написан на языке Си. Исходный текст компилятора: algol-60-compiler.git
begin
integer procedure fibonacci(n);
value n;
integer n;
begin
integer i, fn, fn1, fn2;
fn2 := 1;
fn1 := 0;
fn := 0;
for i := 1 step 1 until n do begin
fn := fn1 + fn2;
fn2 := fn1;
fn1 := fn
end;
fibonacci := fn
end fibonacci;

outinteger(1, fibonacci(30));
outstring(1, "\n")
end
Компиляция и запуск:
jff-algol fib.alg
./fib
Результат:
832040
Размер кода и зависимости:
$ size fib
text data bss dec hex filename
15703 736 360 16799 419f fib
$ ldd fib
linux-vdso.so.1 (0x00007ffc35fb7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5bd68e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5bd66f4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5bd6a56000)

Algol W

Компилятор написан на языке OCaml. Исходный текст компилятора: algol-w-compiler
begin
integer procedure fibonacci(integer value n);
begin
integer fn, fn1, fn2;
fn2 := 1;
fn1 := 0;
fn := 0;
for i := 1 until n do begin
fn := fn1 + fn2;
fn2 := fn1;
fn1 := fn
end;
fn
end fibonacci;

writeon(fibonacci(30))
end.
Компиляция примера и запуск:
awe fib.alw
./fib
Результат:
832040
Размер кода и зависимости:
$ size fib
text data bss dec hex filename
43338 1504 2072 46914 b742 fib
$ ldd fib
linux-vdso.so.1 (0x00007ffd3a5bb000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7e69b0d000)
libgc.so.1 => /lib/x86_64-linux-gnu/libgc.so.1 (0x00007f7e69a98000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e698ac000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7e69c8a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7e6988a000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7e69883000)

Algol 68

Компилятор написан на языке Алгол 68. Исходный текст компилятора: Algol-68RS-Source.git
PROGRAM fib CONTEXT VOID
USE standard
BEGIN
PROC iterative fibonacci = (INT n) INT:
CASE n+1 IN
0, 1, 1, 2, 3, 5
OUT
INT even:=3, odd:=5;
FOR i FROM odd+1 TO n DO
(ODD i|odd|even) := odd + even
OD;
(ODD n|odd|even)
ESAC;

print(iterative fibonacci(30));
print(new line)
END
FINISH
Компиляция примера и запуск:
ca fib.a68
./fib
Результат:
+832040
Размер кода и зависимости:
Code size:
$ size fib
text data bss dec hex filename
239118 3820 282256 525194 8038a fib
$ ldd fib
linux-vdso.so.1 (0x00007fffdd5db000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fc4b7738000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc4b754c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc4b7929000)
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org