He creado un intérprete en C++ para un idioma creado por mí.C++ intérprete problema conceptual
Un problema principal en el diseño fue que tenía dos tipos diferentes en el lenguaje: número y cadena. Así que tengo que pasar alrededor de una estructura como:
class myInterpreterValue
{
myInterpreterType type;
int intValue;
string strValue;
}
objetos de esta clase se pasan alrededor de un millón de veces por segundo durante ej .: un bucle de cuenta atrás en mi idioma.
Perfil señalado: el 85% del rendimiento lo consume la función de asignación de la plantilla de cadena.
Esto es bastante claro para mí: mi intérprete tiene un diseño incorrecto y no utiliza punteros suficientes. Sin embargo, no tengo una opción: no puedo usar punteros en la mayoría de los casos ya que solo tengo que hacer copias.
¿Cómo hacer algo para evitar esto? ¿Es una clase como esta una mejor idea?
vector<string> strTable;
vector<int> intTable;
class myInterpreterValue
{
myInterpreterType type;
int locationInTable;
}
Así que la clase sólo sabe de qué tipo representa y la posición en la tabla
Sin embargo, esto tiene más desventajas: tendría que agregar valores temporales a la tabla de cadenas int/vector y luego eliminarlos de nuevo, esto comería mucho rendimiento nuevamente.
- Ayuda, ¿cómo lo hacen los intérpretes de idiomas como Python o Ruby? De alguna manera necesitan una estructura que represente un valor en el lenguaje como algo que puede ser int o string.
¿Son sus cadenas mutables? –
Ellos y la clase en general se usan para todo: identificadores, valores, etc. Así que sí. –