Термин "контекст" в языках программирования и как контекст влияет на загрузку и обновление?
Что означает термин контекст в контекстно-свободных и контекстно-зависимых языках? Может ли переменная иметь несколько контекстов? Если мне нужно сохранить определенное значение в определенном адресе памяти, как это влияет на контекст адреса памяти? И если я хочу обновить переменную, как меняется контекст переменной?
2 ответа
Контекстно-зависимая грамматика, произведения имеют общую форму
aBc -> ab'c
где символы в верхнем регистре не являются терминалами, а символы в нижнем регистре являются последовательностями терминалов и нетерминалов.
В приведенном выше примере a
а также b
будет контекст нетерминала B
и указать, что B
может "расшириться" до b'
только в окружении a
а также c
,
В контекстно-свободной грамматике производство может выглядеть так:
B -> b'
т.е. B
"расширяется" до b'
другими словами, независимо от контекста.
Рассмотрим следующую программу на C:
#include <stdio.h>
unsigned int my_value = 0;
void print_value(void)
{
printf("My value: %d\n", my_value);
}
int main(void)
{
int my_value = 5;
printf("My main value: %d\n", my_value);
print_value();
return 0;
}
Эта программа напечатает:
My main value: 5
My Value: 0
Причина в том, что переменная my_value
связан с определенным в main
функция в контексте main
и к тому, который определен как глобальная переменная в контексте print_value
функция. Большинство языков, таких как C, имеют контекст для определения переменных, что позволяет hiding
переменных: переменная, определенная внутри блока (область между {
а также }
признаки) не отменяет предыдущие определения имени переменной, а скорее "скрывает" их для контекста блока.
Есть языки, которые не зависят от контекста, где имя существует с момента определения и до выхода из программы. Обновление переменной на этих языках обновит ее значение для всей программы.