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