Я знаю, что интерпретация кода C ++ может не иметь практической ценности, и этот вопрос только для развлечения и в целях обучения.
Можно ли интерпретировать оператор кода C ++ оператором вместо его компиляции? Пожалуйста, также объясните причину ответа.
Если это невозможно, есть ли подмножество языка, который можно интерпретировать?
Это зависит от того, что вы подразумеваете под «утверждение за утверждением». В большинстве случаев C ++ — это язык строго сверху вниз: если вы хотите что-либо использовать, вы должны были объявить или определить его ранее. Так что нет проблем здесь.
Однако есть исключения из подхода сверху вниз. Например, тело функции-члена класса видит объявления членов-данных класса, которые лексически следуют за ним в исходном коде. Можно позвонить inline
функция, которая была объявлена, но еще не определена в модуле перевода (хотя определение должно появиться до окончания TU).
Они могут или не могут нарушать ваше понятие «заявление за заявлением», в зависимости от того, что именно это понятие.
РЕДАКТИРОВАТЬ основываясь на вашем комментарии:
Если интерпретатор не имеет перспективы за пределами текущего оператора, то он не может надеяться интерпретировать код C ++. Контрпримеры с использованием проблемных точек, указанных выше:
#include <iostream>
struct C
{
void foo() { std::cout << i << '\n'; }
int i;
};
int main()
{
C c;
c.i = 0;
c.foo();
}
Или же
#include <iostream>
inline void foo();
int main()
{
foo();
}
inline void foo()
{
std::cout << "x\n";
}
Он даже не должен включать встроенные функции:
extern int i;
int main()
{
return i;
}
int i = 0;
Нет четкой границы между компиляцией и интерпретацией. Большинство языков, которые обычно воспринимаются как интерпретируемые, на самом деле скомпилированы для некоторой виртуальной машины. То же самое можно сделать для C ++.