Entorno de ejecución del principio de compilación

Entorno de ejecución del principio de compilación

Descripción general de la organización del almacenamiento en tiempo de ejecución

El compilador traduce la parte de descripción del algoritmo y la parte de descripción de datos del programa fuente acódigo objeto de máquinayunidad de almacenamiento de datosy finalmente obtener el programa de destino.

El programa objetivo está enEntorno de la máquina de destinoAl correr, todos están en uno solo.Espacio de almacenamiento en tiempo de ejecución. Cuando se ejecuta en un sistema operativo, el programa de destinoEjecute y almacene datos dentro de su propio espacio de direcciones lógicas.. Cuando el compilador genera código, es responsable de aclarar cómo se almacenan varios objetos en el espacio de direcciones lógicas y cómo utilizar el espacio de direcciones lógicas cuando se ejecuta el código de destino .

Durante el proceso de compilación,La asignación de la dirección del objeto del programa fuente es a menudo un desplazamiento relativo al espacio de almacenamiento en ejecución. El acceso al objeto se realiza mediante el método de direccionamiento "dirección base + desplazamiento", de modo que cualquier área disponible de la memoria se puede seleccionar como área de almacenamiento cuando el programa de destino se está ejecutando.. El código objeto generado de esta manera se llamacódigo de dirección flotante

Nota:
"Dirección base" se refiere a la primera dirección del espacio de almacenamiento en ejecución

Ejecutar política de asignación de almacenamiento

Durante el trabajo del compilador, debeLos objetos de datos asignan espacio de almacenamiento en tiempo de ejecución

  • Para aquellos objetos de datos cuyo tamaño se puede determinar en el momento de la compilación, se les puede asignar espacio de almacenamiento en el momento de la compilación. Esta estrategia de asignación se denominaasignación de almacenamiento estático
  • Por otro lado, si el tamaño del objeto de datos no se puede determinar completamente en el momento de la compilación, utiliceAsignación de almacenamiento dinámicoestrategia. Es decir, solo se genera diversa información necesaria durante la compilación, ytiempo de ejecucióny luego asignar dinámicamente el espacio de almacenamiento del objeto de datos
    • asignación de almacenamiento de pila
    • Asignación de almacenamiento dinámico
  • en,estáticoydinámicacorrespondiente respectivamentetiempo de compilaciónytiempo de ejecución

La misión y el papel de la organización de almacenamiento en tiempo de ejecución.

El tamaño del código generado por el compilador suele ser fijo., generalmente almacenado en un área dedicada, a saberárea de código;
Durante la ejecución del programa objetivo, es necesarioLos objetos de datos creados y a los que se accede se almacenan en el área de datos.

El diseño del espacio de almacenamiento cuando el programa se está ejecutando.Insertar descripción de la imagen aquí

Registro de actividad

usarUn lenguaje en el que los procedimientos (o funciones, métodos) sirven como unidad de acciones definidas por el usuario, y su compilador generalmente asigna espacio de almacenamiento en unidades de procedimientos.
Cada ejecución del cuerpo del procedimiento se denominaactividad
Cada vez que se ejecuta un proceso, se le asigna un área de almacenamiento continuo para administrar la información requerida para una ejecución del proceso. Esta área de almacenamiento continuo se llamaregistro de activación

Modelo general de registro de actividades.

Los registros de actividad generalmente incluyen el siguiente contenido

  • Argumentos
  • valor de retorno
  • Cadena de control: registro de actividad apuntando a la persona que llama
  • Cadena de acceso: se utiliza para acceder a datos no locales almacenados en otros registros de actividad.
  • Estado de la máquina guardado
  • datos locales
  • Variables temporales

asignación de almacenamiento de pila

algunos idiomas usanProcedimiento, función o método como unidad de acción definida por el usuario., casi todos los compiladores para estos lenguajes incluyen (al menos parte de) susEl almacenamiento en tiempo de ejecución se gestiona en forma de pila, lo que se denomina asignación de almacenamiento de pila.

  • Cuando se llama a un procedimiento, el registro de actividad del procedimiento seempujar sobre la pila; Cuando finaliza el proceso, se registra el registro de actividad.pila de pop
  • Este arreglo no es sóloPermite compartir espacio entre múltiples llamadas a procedimientos con períodos activos que no se superponen,yPermite compilar código para un procedimiento de la siguiente manera:
    • La dirección relativa de las variables no locales siempre es fija.
    • Secuencia de llamada a procedimiento independiente

árbol de actividades

El árbol utilizado para describir el control de entrada y salida de diversas actividades durante la ejecución del programa se denomina árbol de actividades.

  • cada uno en el arbolNodocorresponde a unActividadnodo raízEs ejecutado por el programa de inicio.principales actividades del proceso
  • En un nodo que representa una actividad del proceso p, sunodo hijoCorrespondiente a esta actividad siendo ptransferiractividades de cada proceso. sigue estosEl orden en que se llaman las actividades., mostrándolos de izquierda a derecha.Un nodo hijo debe finalizar antes de que comience la actividad de su nodo hermano derecho.

pila de control

  • cadaactividades activasHay uno ubicado enpila de controlneutralRegistro de actividad
  • árbol de actividadesraízLa actividad de se sitúa enparte inferior de la pila
  • El registro de la actividad donde se encuentra el control del programa (es decir, la actividad actual) está en la parte superior de la pila.
  • en pilaSecuencia de todos los registros de actividad.Corresponde al árbol de actividades.La ruta al nodo activo donde se encuentra el control actual.

Algunos principios para diseñar registros de actividad

Los valores pasados ​​​​entre la persona que llama y la persona que llama generalmente se colocan al comienzo del registro de actividad de la persona que llama para que estén lo más cerca posible del registro de actividad de la persona que llama. Los
elementos de longitud fija se colocan en el medio:Eslabón de control, cadena de acceso, palabra de estado de la máquina
Los elementos cuyo tamaño no se conoce desde el principio se colocan al final del registro activo en la parte superior
del registro de puntero de la pila.top_spApunta a la ubicación donde comienzan los datos locales en el registro activo, utilizando esta ubicación como dirección base
Insertar descripción de la imagen aquí

Secuencia de llamada y secuencia de retorno.

Tanto las llamadas a procedimientos como los retornos de procedimientos requieren la ejecución de algún código.Administre la pila de registros de actividad, guarde o restaure el estado de la máquinaesperar

  • Secuencia de llamadas: una sección de código que implementa llamadas a procedimientos. Asigne espacio en la pila para un registro activo y complete la información en los campos de este registro
  • Secuencia de retorno: restaura el estado de la máquina para que el proceso de llamada pueda continuar ejecutándose después de que finalice la llamada.
  • El código en una secuencia de código de llamada generalmente se divide en el proceso que llama (llamante) y el proceso llamado (llamado). Lo mismo ocurre con la secuencia de retorno.
    imagen

secuencia de llamada

  • llamadorCalcular el valor del parámetro real.
  • llamadorVoluntaddirección del remitente(el valor del contador del programa) se coloca en el campo de estado de la máquina del destinatario. VoluntadValor original de máxima velocidadPóngalo en la cadena de control de la persona que llama. Entonces,Aumentar el valor de top-sp, haciendo que apunte al destinatario de la llamadaLa posición donde comienzan los datos locales.
  • destinatariomantenerValor de registroyOtra información de estado
  • destinatarioInicialice sus datos locales y comience la ejecución.

secuencia de retorno

  • destinatarioVoluntadvalor de retornoColóquelo junto al parámetro.
  • Usando la información en el campo de estado de la máquina,destinatarioVoluntadRestaurar top-spyOtros registros,Entoncesredirigir aLa dirección del remitente colocada por la persona que llama en el campo de estado de la máquina.
  • Aunque top-sp se ha reducido (restaurado),llamadorAún conozco la posición del valor de retorno en relación con el valor top-sp actual (ubicado en el siguiente registro activo,Aunque ha aparecido en este momento, los datos siguen siendo válidos.). Por lo tanto, la persona que llama puede usar ese valor de retorno.

Asignación de almacenamiento de datos de longitud variable

existirlenguaje de programación modernoen enObjeto cuyo tamaño no se puede determinar en tiempo de compilaciónserá asignado enárea de montón. Sin embargo, si sonobjeto local del procedimiento, o se pueden asignar enpila de tiempo de ejecuciónmedio. Razones para colocar objetos en el área de la pila tanto como sea posible: Síevitara sus espaciosRecolección de basura, lo que reduce el correspondientegastos generales

Solo hay un objeto de datos.local a un proceso,yCuando este proceso finaliza se vuelve inaccesible., puedes usar la pila para asignar espacio para este objeto

Acceso a datos no locales

Además de utilizar el proceso en sí, un proceso puede utilizardatos localesAdemás, también puede utilizar procedimientos definidos fuera deldatos no locales

Los idiomas se pueden dividir en dos tipos

  • Idiomas que admiten declaraciones de procedimientos anidadas
    • Un procedimiento puede declararse dentro de otro procedimiento.
    • Un proceso no se define por sí mismodatos localesydefinición globalAdemás de los datos, también puedes utilizarproceso periféricoObjeto declarado en
      Ejemplo: Pascal
  • Idiomas que no admiten declaraciones de procedimientos anidados
    • No se puede declarar un trámite dentro de otro trámite
    • Los datos utilizados en el proceso son datos locales definidos por sí mismos o datos globales definidos fuera de todos los procesos.
      Ejemplo: C

Acceso a datos sin declaraciones de procedimientos anidadas

Asignación de almacenamiento y acceso a variables.

  • Las variables globales se asignan enárea estática,usardirección determinada estáticamenteacceder a ellos
  • Otras variables deben serVariables locales activas en la parte superior de la pila.. capaz de pasarEl puntero top_sp de la pila en tiempo de ejecución accede a ellos.

Acceso a datos cuando hay declaraciones de procedimientos anidadas

Profundidad de anidación

  • Profundidad de anidamiento de procedimientos.
    • Un procedimiento que no está integrado en ningún otro procedimiento, establezca su profundidad de anidamiento en 1
    • Si un procedimiento p se define dentro de un procedimiento con profundidad de anidamiento i, establezca la profundidad de anidamiento de p en i + 1
  • Profundidad de anidamiento de variables
    • Utilice la profundidad de anidamiento del procedimiento en el que se declara la variable como profundidad de anidamiento de la variable.
      imagen

Enlaces de acceso

Regla de alcance estático: el procedimiento b puede acceder a objetos declarados en el procedimiento a siempre que la declaración del procedimiento b esté anidada dentro de la declaración del procedimiento a.

Puedes establecer un proceso llamadoPuntero de enlace de acceso, para que el procedimiento incrustado pueda acceder al objeto declarado en el procedimiento externo

  • Si el procedimiento b está directamente anidado dentro del procedimiento a en el código fuente (la profundidad de anidamiento de b es 1 más que la profundidad de anidamiento de a), entonces la cadena de acceso en cualquier actividad de b apunta a la actividad más cercana de a.

Establecimiento de la cadena de acceso.

El código que establece la cadena de acceso pertenece asecuencia de llamadauna parte de

Supongamos que un procedimiento x con una profundidad de anidamiento de nx llama a un procedimiento y(x->y) con una profundidad de anidamiento de ny.

  • El caso de nx <ny (la capa exterior llama a la capa interior)
    • y debe definirse directamente en x (por ejemplo: s->q, q->p), por lo que ny=nx+1,
    • Agregue un paso a la secuencia del código de llamada: coloque un puntero al registro activo de x en la cadena de acceso de y
  • El caso de nx = ny (esta capa llama a esta capa)
    • Llamada recursiva (por ejemplo: q->p)
    • La cadena de acceso al registro de actividad de la persona que llama es la misma que la cadena de acceso del registro de actividad de la persona que llama y se puede copiar directamente.
  • El caso de nx > ny (la capa interna llama a la capa externa, como: p->e)
    • El proceso x debe estar anidado en un determinado proceso z, y z define directamente el proceso y
    • A partir del registro de actividad de x, puede encontrar el registro de actividad de z más cercano a la parte superior de la pila a través de los pasos nx-ny+1 a lo largo de la cadena de acceso. La cadena de acceso de y debe apuntar al registro de actividad de z

Asignación de almacenamiento dinámico

La asignación de almacenamiento en montón consiste en dividir el área de almacenamiento continuo en bloques, que se asignan cuando lo requieren los registros activos u otros objetos. La
liberación de bloques se puede realizar en cualquier orden, por lo que después de un período de tiempo, el área puede contener áreas intercaladas que están en uso y han sido liberados.
imagen

Aplicar

Suponga que la longitud total del bloque libre actual es M y la longitud a solicitar es n.

  • Si hay varios bloques de almacenamiento con una longitud mayor o igual a n, la asignación de almacenamiento se puede realizar de acuerdo con una de las siguientes estrategias
    • Tome el primer bloque libre con una longitud m que cumpla con los requisitos y coloque la parte restante con una longitud mn en la cadena libre.
    • Encuentre el bloque libre más pequeño de longitud m que cumpla con los requisitos
    • Encuentre el bloque libre más grande con longitud m que cumpla con los requisitos
  • Si no hay ningún bloque de almacenamiento con una longitud mayor o igual a n
    • Si M>=n, mueva y reorganice los bloques libres en el montón (todas las partes relevantes deben modificarse en consecuencia, lo cual es una tarea muy complicada y difícil)
    • Si M <n, se deberían adoptar estrategias más complejas para resolver el problema de gestión del montón.

liberado

Simplemente inserte el bloque de almacenamiento liberado en la cadena libre como un nuevo bloque libre y elimine el registro correspondiente en la tabla de registros de bloques ocupados.

resumen

Para implementar la gestión del almacenamiento dinámico, se deben completar una gran cantidad de operaciones auxiliares. Como clasificación, búsqueda de tablas, llenado de tablas, inserción, eliminación,... Su sobrecarga de espacio y tiempo es relativamente grande.

Referencias

"Principios de compilación" Segunda edición

Supongo que te gusta

Origin blog.csdn.net/u010523811/article/details/124859256
Recomendado
Clasificación