Решил попробовать поковыряться с исходниками какого-нибудь большого опенсорсного проекта, выбор пал на CPython. У меня вообще нет опыта ковыряния больших исходников, и я, честно говоря, не знал даже, с чего начинать, поэтому методом тыка выбрал для начала
Parser/parser.c. Читаю код, а там стек. Ну окей, стек так стек, смотрю, например, функцию сброса стека:
static void
s_reset(stack *s)
{
s->s_top = &s->s_base[MAXSTACK];
}
Значит, при сбросе стека
s->top
, то есть указатель на вершину стека, указывает на элемент массива
s->s_base
под номером
MAXSTACK
. Даже из названия переменных становится ясно, что при сбросе указатель указывает не на нулевой элемент массива, а на последний. Из других функций для работы со стеком тоже видно, что при добавлении (push) элементов указатель
s->top
уменьшается, а при взятии (pop) -- увеличивается. Хотя более естественно выглядит, когда наоборот (т. е. при пустом стеке
s->s_top = s->s_base[0]
, как-то так). Есть ли какое-то логическое обоснование использования такого "обратного" стека, или это как кому нравится?
P. S. Си даётся тяжело, мог сказать какую-нибудь чушь, тапками не бейте
P. P. S. Как вообще читать такие большие исходники? Откуда начинать, например? Или все тоже берут рандомный файл, и дальше уже смотрят по include'ам что откуда пришло?