Причина в том, что компилятору уже есть над чем поработать, и при этом он не является полноценным интерпретатором, способным вычислять произвольный код C ++.
Если они придерживаются одного выражения, они ограничивают количество падежейрассмотреть резко.Проще говоря, это сильно упрощает то, что, в частности, нет точек с запятой.
Каждый раз, когда встречается ;
, это означает, что компилятору приходится иметь дело с побочными эффектами.Это означает, что некоторое предыдущее состояние было изменено в предыдущем выражении, на которое будет опираться следующее.Это означает, что оцениваемый код больше не является просто серией простых операций, каждая из которых принимает в качестве входных данных вывод предыдущей операции, но также требует доступа к памяти, о чем гораздо сложнее рассуждать.
ВКороче говоря, это:
7 * 2 + 4 * 3
просто вычислить.Вы можете построить синтаксическое дерево, которое выглядит следующим образом:
+
/\
/ \
* *
/\ /\
7 2 4 3
, и компилятор может просто пройти по этому дереву, выполняя эти примитивные операции на каждом узле, и корневой узел неявно является возвращаемым значением выражения.
Если бы мы должны были написать одно и то же вычисление, используя несколько строк, мы могли бы сделать это так:
int i0 = 7;
int i1 = 2;
int i2 = 4;
int i3 = 3;
int i4 = i0 * i1;
int i5 = i2 * i3;
int i6 = i4 + i5;
return i6;
, что гораздо сложнее интерпретировать.Нам нужно обрабатывать чтение и запись в память, а также обрабатывать операторы возврата.Наше синтаксическое дерево стало намного сложнее.Нам нужно обрабатывать объявления переменных.Нам нужно обрабатывать операторы, которые не имеют возвращаемого значения (скажем, цикл или запись в память), но которые просто где-то модифицируют память.Какая память?Куда?Что если он случайно перезапишет часть собственной памяти компилятора?Что, если он segfaults?
Даже без всяких мерзких «что, если», код, который должен интерпретировать компилятор, только на намного усложнился.Теперь синтаксическое дерево может выглядеть примерно так: (LD
и ST
- операции загрузки и хранения соответственно)
;
/\
ST \
/\ \
i0 3 \
;
/\
ST \
/\ \
i1 4 \
;
/\
ST \
/ \ \
i2 2 \
;
/\
ST \
/\ \
i3 7 \
;
/\
ST \
/\ \
i4 * \
/\ \
LD LD \
| | \
i0 i1 \
;
/\
ST \
/\ \
i5 * \
/\ \
LD LD \
| | \
i2 i3 \
;
/\
ST \
/\ \
i6 + \
/\ \
LD LD \
| | \
i4 i5 \
LD
|
i6
Мало того, что выглядит намного сложнее,это также теперь требует государства.Раньше каждое поддерево можно было интерпретировать отдельно.Теперь все они зависят от остальной части программы.Одна из конечных операций LD не имеет смысла , если она не размещена в дереве, так что операция ST
была выполнена ранее в том же месте .