@Justice es correcto. Para ampliar un poco eso, en C, la única parte realmente difícil es distinguir los tipos de las variables. Específicamente cuando vea esto:
T t;
lo que necesita saber que T
es un tipo para que para ser un análisis sintáctico legal. Eso es algo que tienes que buscar en una tabla de símbolos. Esto es relativamente simple de entender siempre y cuando los tipos se agreguen a la tabla de símbolos a medida que continúa el análisis. No necesita hacer mucho trabajo adicional en el compilador: T
está presente en la tabla o no lo está.
En C++ las cosas son mucho, mucho más complicado. Hay un enorme número de constructos ambiguos o potencialmente ambiguos. La más obvia es ésta:
B::C (c);
Aparte del hecho de que no está claro si B
es una class
, un typedef
, o una namespace
, tampoco es claro si C
es un tipo y c
un objeto de esa tipo, o si C
es una función (o constructor) que toma c
como argumento (o incluso si C es un objeto con operator()
sobrecargado). Necesita la tabla de símbolos para continuar con el análisis sintáctico, aunque aún es posible continuar lo suficientemente rápido, ya que el tipo del símbolo se encuentra en la tabla de símbolos.
Las cosas se ponen mucho, mucho, mucho peor que cuando las plantillas entran en la mezcla. Si C (c)
está en una plantilla, es posible que no conozca la definición real de la plantilla, si C es un tipo o una función/objeto.Esto se debe a que la plantilla puede declarar C
como ya sea un tipo o una variable. Lo que esto significa es que necesita la tabla de símbolos, pero usted no tiene tiene uno - y usted no puede tener uno hasta que la plantilla se declare realmente. Peor aún, no es necesariamente suficiente tener solo el tipo del símbolo: puede encontrar situaciones que requieren la información completa del tipo que representa el símbolo, incluido el tamaño, la alineación y otra información específica de la máquina.
Todo esto tiene varios efectos prácticos. Los dos más significativos que diría son:
- La compilación es mucho más rápida. Supongo que Go es más rápido de compilar que C, y C++ tiene tiempos de recopilación famosos lentos para situaciones que involucran muchas plantillas.
- Puede escribir analizadores que no dependen de tener un compilador completo. Esto es muy útil para hacer análisis de código y refactorizar.
Esa es una excelente referencia. –
Honestamente, fue solo el primer (o segundo) resultado de Google – hasen
Tenga en cuenta también las respuestas a esa publicación; también contienen muy buenas razones por las que es imposible. – MSalters