конструкция компилятора — Может ли C ++ также интерпретироваться вместо компиляции?

Я знаю, что интерпретация кода C ++ может не иметь практической ценности, и этот вопрос только для развлечения и в целях обучения.

Можно ли интерпретировать оператор кода C ++ оператором вместо его компиляции? Пожалуйста, также объясните причину ответа.

Если это невозможно, есть ли подмножество языка, который можно интерпретировать?

4

Решение

Это зависит от того, что вы подразумеваете под «утверждение за утверждением». В большинстве случаев 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;
4

Другие решения

Нет четкой границы между компиляцией и интерпретацией. Большинство языков, которые обычно воспринимаются как интерпретируемые, на самом деле скомпилированы для некоторой виртуальной машины. То же самое можно сделать для C ++.

3

По вопросам рекламы [email protected]