Los números de Ershov , llamados así por Andrey Petrovich Yershov , [1] se utilizan en la optimización de código para minimizar la cantidad de asignaciones de registros . Los números de Ershov se pueden utilizar en métodos para seleccionar registros de manera óptima cuando solo hay una expresión en un bloque de código. Dada una expresión E = E 1 op E 2 el objetivo es generar código de manera que se minimice la cantidad de registros utilizados o, si no hay una cantidad suficiente de registros disponibles, se minimice la cantidad de registros temporales que no sean registros necesarios.
El número de Ershov n de un nodo en un árbol de expresión dado se define de la siguiente manera: [2] [3]
El número de Ershov de un nodo representa la cantidad mínima de registros necesarios para evaluar la subexpresión cuya raíz es ese nodo. La idea es que primero evaluemos el hijo con el número de Ershov más grande, luego el otro hijo y luego realicemos la operación en la raíz.
Supongamos que tenemos un árbol de expresión con una operación '+' en la raíz, y los subárboles izquierdo y derecho tienen números de Ershov de 3 y 4, respectivamente. El número de Ershov de este nodo es 4, por lo que deberíamos poder generar código para la expresión utilizando 4 registros.
ADD r1, r1, r2
, que suma r1 y r2 y almacena el resultado en r1.El procedimiento general para generar código utilizando un número mínimo de cargas y almacenamientos desde la memoria es el siguiente:
En el caso ideal, si hay n registros y la primera subexpresión requiere n registros y la siguiente subexpresión requiere n - 1 registros, se puede usar un solo registro para almacenar el resultado de la primera expresión, y todavía habrá n - 1 registros disponibles para calcular la siguiente subexpresión, por lo que no se requieren cargas ni almacenamientos desde la memoria en absoluto. [1]
Si el número de Ershov de la raíz del árbol de expresión es mayor que el número de registros disponibles, el número de Ershov también se puede utilizar para determinar la cantidad de espacio de memoria temporal adicional requerido, por ejemplo en la pila . [1]