vak: (Default)
[personal profile] vak
Каждый пиксел на этой картинке - один вызов функции или возврат из функции. По вертикали время, по горизонтали глубина стека. Кликайте чтобы увеличить.



Покажу, как получена эта картинка.

(1) Берём исходник теста Man-or-boy с сайта Rosetta для языка Algol W.

(2) Устанавливаем компилятор Algol W с исходников на Гитхабе.

(3) Почему именно Algol W - он позволяет кастомную трассировку. Создаём файл tracing.c:
#include <awe.h>
#include <stdio.h>

int nesting = 0;

void _awe_trace_procedure_called (_awe_loc call_loc, const char *procedure_name)
{
nesting += 1;
fprintf(stderr, "%d\n", nesting);
}

void _awe_trace_procedure_entered (_awe_loc procedure_loc, const char *procedure_name)
{
// Empty.
}

void _awe_trace_procedure_exited (_awe_loc call_loc, const char *procedure_name)
{
nesting -= 1;
fprintf(stderr, "%d\n", nesting);
}
(4) Компилируем тест с трассировкой:
awe -t man_or_boy10.alw -c man_or_boy10.c
gcc -I/usr/local/include tracing.c man_or_boy10.c -L/usr/local/lib -lawe -lm -lgc -o man_or_boy10
(5) Запускаем тест и записываем данные трассировки в файл:
./man_or_boy10 2> man_or_boy10.dat
(6) С помощью скрипта на Питоне превращаем данные в картинку:
from PIL import Image, ImageDraw

image = Image.new("RGB", (1025, 3500), "white")
draw = ImageDraw.Draw(image)

with open("man_or_boy10.dat") as file:
y = 0
for line in file:
x = int(line)
draw.point((x, y), fill="blue")
y += 1

image.save("output.png")
Любуемся.