@ Справедливость верна. Чтобы немного углубиться в это, в C единственная сложная часть заключается в том, чтобы отличать типы от переменных. В частности, когда вы видите это:
T t;
Вы должны знать, что T
является типом для этого, чтобы быть законным анализом. Это то, что вы должны посмотреть в таблице символов. Это относительно просто выяснить, если типы добавляются в таблицу символов по мере продолжения анализа. Вам не нужно выполнять дополнительную работу в компиляторе: либо T
присутствует в таблице, либо нет.
В C ++ все намного, намного сложнее. Существует огромное количество неоднозначных или потенциально неоднозначных конструкций. Наиболее очевидным является следующий:
B::C (c);
Помимо того, что неясно, является ли B
class
, typedef
или namespace
, также неясно, является ли C
типом и c
объектом этот тип, или если C
является функцией (или конструктором), принимающей c
в качестве аргумента (или даже если C является объектом с перегруженной operator()
). Вам нужна таблица символов для продолжения анализа, хотя все еще возможно продолжить достаточно быстро, так как тип символа указан в таблице символов.
Все становится намного, намного, намного хуже, чем когда шаблоны попадают в смесь. Если C (c)
находится в шаблоне, вы можете не знать в фактическом определении шаблона, является ли C типом или функцией / объектом. Это потому, что шаблон может объявить C
как типом или переменной . Это означает, что вам нужна таблица символов, но у вас нет единицы - и вы не можете , пока таблица не будет объявлена. Хуже того, необязательно иметь только тип символа: вы можете столкнуться с ситуациями, когда требуется полная информация о типе символа, включая размер, выравнивание и другую информацию, специфичную для машины.
Все это имеет несколько практических эффектов. Два самых значительных из них, которые я бы сказал:
- Компиляция намного быстрее. Я предполагаю, что Go быстрее компилируется, чем C, а C ++ имеет классное медленное время компиляции для ситуаций, связанных с большим количеством шаблонов.
- Вы можете писать парсеры, которые не зависят от наличия полного компилятора. Это очень полезно для анализа кода и рефакторинга.