2021-08-01

vak: (Default)
Сравнение трёх компиляторов разных алголов, конспективно. В качестве примера взято вычисление чисел Фибоначчи. Для каждого алгола приведены:
  • местонахождение компилятора на Гитхабе
  • текст программы вычисления 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)