Визуализируем man-or-boy
2024-08-23 17:32![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Каждый пиксел на этой картинке - один вызов функции или возврат из функции. По вертикали время, по горизонтали глубина стека. Кликайте чтобы увеличить.

Покажу, как получена эта картинка.
(1) Берём исходник теста Man-or-boy с сайта Rosetta для языка Algol W.
(2) Устанавливаем компилятор Algol W с исходников на Гитхабе.
(3) Почему именно Algol W - он позволяет кастомную трассировку. Создаём файл tracing.c:

Покажу, как получена эта картинка.
(1) Берём исходник теста Man-or-boy с сайта Rosetta для языка Algol W.
(2) Устанавливаем компилятор Algol W с исходников на Гитхабе.
(3) Почему именно Algol W - он позволяет кастомную трассировку. Создаём файл tracing.c:
(4) Компилируем тест с трассировкой:#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);
}
(5) Запускаем тест и записываем данные трассировки в файл: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
(6) С помощью скрипта на Питоне превращаем данные в картинку:./man_or_boy10 2> man_or_boy10.dat
Любуемся.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")