La Red de Conocimientos Pedagógicos - Aprendizaje de redacción de artículos/tesis - ¡Acerca de las máquinas virtuales! !

¡Acerca de las máquinas virtuales! !

¿Qué es una máquina virtual?

El concepto de máquina virtual es relativamente amplio. Por lo general, las personas están expuestas al concepto de máquinas virtuales, incluido el software de emulación de hardware como VMware y el software como JVM que se encuentra entre el hardware y los compiladores. Esto se refiere a este último.

Una máquina virtual es una computadora abstracta que tiene un conjunto de instrucciones y utiliza diferentes áreas de almacenamiento como una computadora real. Se encarga de ejecutar instrucciones y gestionar datos, memoria y registros. Esta máquina virtual proporciona una interfaz pública para compiladores en cualquier plataforma. El compilador solo necesita enfrentarse a la máquina virtual y generar código que la máquina virtual pueda entender, y luego el intérprete convierte el código de la máquina virtual en código de máquina para que un sistema específico lo ejecute.

máquina virtual Java

En primer lugar, ¿qué es una máquina virtual Java?

La máquina virtual Java es una máquina virtual que se implementa mediante simulación de software en un computadora real. La máquina virtual Java tiene su propio hardware imaginario, como procesadores, pilas, registros, etc. , y también tiene un sistema de comando correspondiente.

1. ¿Por qué utilizar la máquina virtual Java?

Una característica muy importante del lenguaje Java es que es independiente de la plataforma. Usar la máquina virtual Java es la clave para lograr esta funcionalidad. Si un lenguaje de alto nivel de propósito general se va a ejecutar en diferentes plataformas, al menos debe compilarse en diferentes códigos de destino. Después de la introducción de la máquina virtual Java, no es necesario volver a compilar el lenguaje Java cuando se ejecuta en diferentes plataformas. Modelo de uso del lenguaje Java La máquina virtual Java protege la información relacionada con plataformas específicas, de modo que el compilador del lenguaje Java solo necesita generar el código de destino (código de bytes) que se ejecuta en la máquina virtual Java y puede ejecutarse en varias plataformas sin modificaciones. Cuando la máquina virtual Java ejecuta código de bytes, lo interpreta como instrucciones de máquina para su ejecución en una plataforma específica.

2. ¿Quién necesita saber sobre la Máquina Virtual Java?

La máquina virtual Java es la base para la implementación subyacente del lenguaje Java. Cualquier persona interesada en el lenguaje Java debe tener un conocimiento general de la máquina virtual Java. Esto ayuda a comprender algunas propiedades del lenguaje Java y utilizarlo. Para el personal de software que desea implementar la máquina virtual Java en una plataforma específica, los autores del compilador del lenguaje Java y las personas que desean utilizar chips de hardware para implementar la máquina virtual Java, deben tener un conocimiento profundo de las especificaciones de Java. máquina virtual. Además, si desea ampliar el lenguaje Java o compilar otros lenguajes en el código de bytes del lenguaje Java, también debe tener un conocimiento profundo de la máquina virtual Java.

3. Tipos de datos soportados por la máquina virtual Java.

Los tipos de datos básicos del lenguaje Java admitidos por la máquina virtual Java son los siguientes:

Byte://Complemento de entero con signo de 1 byte

corto : //2/El código complementario de un entero con signo de doble byte

int://El código complementario de un entero con signo de 4/4 bytes

long://8 /8 palabras Complemento de la sección dos de entero con signo

Float://Número de punto flotante de precisión simple IEEE754 de 4 bytes

Double://Flotante de precisión doble IEEE754 de 8 bytes -número de punto

Char://carácter Unicode sin firmar de 2 bytes

Casi toda la verificación de tipos de Java se realiza en tiempo de compilación. Los datos de los tipos de datos primitivos enumerados anteriormente no necesitan estar etiquetados por hardware cuando los ejecuta Java. Los códigos de bytes (instrucciones) que operan en estos tipos de datos primitivos ya indican el tipo de datos de los operandos. Por ejemplo, las instrucciones iadd, ladd, fadd y dadd suman dos números y los tipos de operandos son int, long, float y double. La máquina virtual no configura instrucciones separadas para tipos booleanos. Los datos booleanos se manejan mediante instrucciones de números enteros, incluidos los retornos de números enteros. Las matrices booleanas se manejan con matrices de bytes. La máquina virtual utiliza números de punto flotante en formato IEEE754. Las computadoras más antiguas que no admiten el formato IEEE pueden funcionar muy lentamente cuando ejecutan programas de cálculo numérico Java.

Otros tipos de datos admitidos por la máquina virtual incluyen:

Objeto//Referencia de 4 bytes a Javaobjeto (objeto)

Dirección de retorno//4 bytes, Usado para directivas jsr/ret/jsr-w/ret-w.

Nota: Las matrices Java se tratan como objetos.

La especificación de la máquina virtual no tiene requisitos especiales sobre la estructura interna del objeto. En la implementación de Sun, una referencia a un objeto es un identificador, que contiene un par de punteros: un puntero apunta a la tabla de métodos del objeto y el otro apunta a los datos del objeto. Los programas representados por el código de bytes de la máquina virtual Java deben ajustarse a las reglas de tipo. Las implementaciones de máquinas virtuales Java deben negarse a ejecutar programas de código de bytes que violen las convenciones de tipos. Debido a las limitaciones en la definición del código de bytes, la máquina virtual Java parece ejecutarse sólo en máquinas con un espacio de direcciones de 32 bits. Pero puedes crear una máquina virtual Java que convierta automáticamente el código de bytes a un formato de 64 bits. De los tipos de datos admitidos por la máquina virtual Java se puede ver que Java estipula estrictamente el formato interno del tipo de datos, de modo que la interpretación de los datos sea consistente en varias implementaciones de la máquina virtual Java, asegurando así la independencia y compatibilidad de la plataforma Java.

Portabilidad.

2. Arquitectura de la máquina virtual Java

La máquina virtual Java consta de cinco partes: un conjunto de instrucciones, un conjunto de registros, una pila, un montón de recolección de basura y un área de método. . Estas cinco partes son componentes lógicos de la máquina virtual Java y no dependen de ninguna tecnología u organización de implementación, pero sus funciones deben implementarse en la máquina real de alguna manera.

1.Conjunto de instrucciones Java

La máquina virtual Java admite aproximadamente 248 códigos de bytes. Cada código de bytes realiza una operación básica de la CPU, como agregar un número entero a un registro, transferencia de subrutina, etc. El conjunto de instrucciones de Java es equivalente al lenguaje ensamblador de los programas Java.

Las instrucciones del conjunto de instrucciones de Java contienen un operador de un solo byte para especificar la operación a realizar y cero o más operandos para proporcionar los parámetros o datos necesarios para la operación. Muchas instrucciones no tienen operandos y contienen sólo un operador de un solo byte.

El proceso de ejecución del bucle interno de la máquina virtual es el siguiente:

Hacer {

Obtener un byte de operador;

Según el operador Operación de ejecución de valor;

}mientras (el programa no está completo)

Debido a la simplicidad del sistema de instrucciones, el proceso de ejecución de la máquina virtual es muy simple, lo cual es beneficioso para mejorar la eficiencia de la ejecución. El número y tamaño de los operandos en una instrucción lo determina el operador. Si el operando tiene más de un byte, se almacena primero en el byte grande. Por ejemplo, un parámetro de 16 bits ocupa dos bytes cuando se almacena y su valor es:

Primer byte * 256 + segundo byte Los flujos de instrucciones de código de bytes generalmente están alineados en bytes. Las excepciones son las instrucciones tabltch y lookup, en las que se requiere una alineación forzada en un límite de 4 bytes.

2. Registro

Los registros de la máquina virtual Java se utilizan para guardar el estado de ejecución de la máquina, similar a algunos registros especiales en los microprocesadores.

La máquina virtual Java tiene cuatro registros:

Pc: contador de programas Java.

Optop: Puntero a la parte superior de la pila de operandos.

Marco: Puntero al entorno de ejecución del método de ejecución actual.

Vars: Puntero a la primera variable en el área de variables locales del método que se está ejecutando actualmente.

máquina virtual Java

Las máquinas virtuales Java están apiladas. No define ni utiliza registros para pasar o aceptar parámetros. Su propósito es garantizar la simplicidad del conjunto de instrucciones y la eficiencia de la implementación (especialmente para procesadores con una pequeña cantidad de registros).

Todos los registros son de 32 bits.

3. Montón

La pila de la máquina virtual Java tiene tres áreas: área de variable local, área de entorno de ejecución y área de operandos.

(1) Área de variables locales Cada método Java utiliza un conjunto de variables locales de tamaño fijo. Se direccionan según el desplazamiento de palabras del registro vars. Las variables locales son todas de 32 bits. Los números enteros largos y los números de coma flotante de doble precisión ocupan el espacio de dos variables locales, pero se abordan según el índice de la primera variable local. (Por ejemplo, si una variable local en el índice n es un número de coma flotante de doble precisión, en realidad ocupa el espacio de almacenamiento representado por los índices n y n+1. La especificación de la máquina virtual no requiere que los valores de 64 bits en las variables locales deben estar alineadas con 64 bits.

La máquina virtual proporciona instrucciones para cargar valores de variables locales en la pila de operandos y también proporciona instrucciones para escribir valores de la pila de operandos en variables locales.

(2) La información contenida en el área del entorno de ejecución se utiliza para enlaces dinámicos, retorno de métodos normales y propagación de excepciones.

Enlace dinámico

El entorno de ejecución incluye punteros a las tablas de símbolos del intérprete para la clase actual y el método actual para admitir el enlace dinámico del código del método. El código del archivo de clase para un método utiliza símbolos al hacer referencia al método que se llamará y a las variables a las que se accederá. Los enlaces dinámicos traducen llamadas a métodos simbólicos en llamadas a métodos reales, cargan las clases necesarias para interpretar símbolos indefinidos y traducen accesos a variables en direcciones de desplazamiento correspondientes a las estructuras de almacenamiento en tiempo de ejecución de esas variables. Vincular dinámicamente métodos y variables permite que los cambios en otras clases utilizadas en los métodos no afecten el código del programa.

Retorno de método normal

Si el método actual finaliza normalmente, el método llamado obtendrá el valor de retorno cuando se ejecute el tipo correcto de instrucción de retorno. El entorno de ejecución se utiliza para restaurar los registros de la persona que llama cuando la persona que llama regresa normalmente, incrementa el contador del programa de la persona que llama en un valor apropiado para omitir las instrucciones de llamada del método ejecutado y luego continúa la ejecución en el entorno de ejecución de la persona que llama.

Excepción y propagación de errores

La excepción se llama Error o excepción en Java y es una subclase de la clase Throwable. Los motivos en el programa son: ①Error de enlace dinámico, como que no se puede encontrar el archivo de clase requerido. ②Errores en tiempo de ejecución, como hacer referencia a un puntero nulo.

El programa utiliza la sentencia throw.

Cuando se produce una excepción, la máquina virtual Java realiza las siguientes acciones:

Comprueba la tabla de cláusulas catch asociada con el método actual. Cada cláusula catch contiene su rango de instrucciones válidas, los tipos de excepciones que puede manejar y la dirección del bloque de código que maneja la excepción.

Una cláusula catch que coincide con una excepción debe cumplir las siguientes condiciones: la instrucción que causó la excepción está dentro del alcance de su instrucción y el tipo de excepción que ocurrió es un subtipo del tipo de excepción que puede manejar. Si se encuentra una cláusula catch coincidente, el sistema pasa al bloque de manejo de excepciones especificado para su ejecución; si no se encuentra ningún bloque de manejo de excepciones, el proceso de encontrar cláusulas catch coincidentes se repite hasta que se verifiquen todas las cláusulas catch anidadas del método actual.

Debido a que la máquina virtual continúa la ejecución a partir de la primera cláusula catch coincidente, el orden en la tabla de cláusulas catch es muy importante. Debido a que el código Java está estructurado, todos los controladores de excepciones para un método siempre se pueden organizar en una tabla en orden, y para cualquier valor posible del contador del programa, el bloque de manejo de excepciones apropiado se puede encontrar en orden lineal para manejar el contador del programa. valor.

Si no se encuentra ninguna cláusula catch coincidente, el método actual obtendrá un resultado de "excepción no detectada" y se lo devolverá a la persona que llama del método actual como si la excepción acabara de ocurrir en su mismo lugar. . Si el bloque de manejo de excepciones correspondiente aún no se encuentra en la persona que llama, esta propagación de errores continuará. Si el error se propaga al nivel superior, el sistema llamará al bloque de manejo de excepciones predeterminado.

(3) Las instrucciones de la máquina en el área de la pila de operandos solo extraen los operandos de la pila de operandos, realizan operaciones y devuelven los resultados a la pila. Se eligió la estructura de pila porque puede simular eficazmente el comportamiento de una máquina virtual en máquinas con solo una pequeña cantidad de registros o registros de propósito no general (como Intel486). La pila de operandos es de 32 bits. Se utiliza para pasar parámetros a métodos y recibir resultados de métodos. También se utiliza para admitir parámetros de operaciones y guardar los resultados de las operaciones. Por ejemplo, la instrucción iadd suma dos números enteros. Los dos números enteros que se suman deben ser las dos primeras palabras de la pila de operandos. Estas dos palabras fueron colocadas en la pila mediante la instrucción anterior. Los dos números enteros se sacan de la pila, se suman y el resultado se devuelve a la pila de operandos.

Cada tipo de datos primitivo tiene instrucciones especiales para realizar las operaciones necesarias sobre ellos. Cada operando requiere una ubicación de almacenamiento en la pila, excepto los tipos largo y doble, que requieren dos ubicaciones. Los operandos sólo pueden ser operados por operadores apropiados a su tipo. Por ejemplo, es ilegal enviar dos números de tipo int y tratarlos como números de tipo long. En la implementación de la máquina virtual de Sun, esta restricción la aplica el verificador de código de bytes.

Sin embargo, hay algunas operaciones (operadores engañar e intercambiar) que operan en áreas de datos en tiempo de ejecución independientemente de su tipo.

4. Montón de recolección de basura

El montón de Java es un área de datos en tiempo de ejecución, y las instancias de clase (objetos) asignan espacio desde aquí. El lenguaje Java tiene la capacidad de recopilar unidades inútiles: no brinda a los programadores la capacidad de liberar objetos explícitamente. Java no estipula un algoritmo de recolección de basura específico y se pueden usar varios algoritmos según los requisitos del sistema.

5. Área de métodos

El área de métodos es similar al código compilado en un lenguaje tradicional o a la sección del cuerpo en un proceso Unix. Guarda el código del método (código java compilado) y la tabla de símbolos. En la implementación actual de Java, el código del método no se incluye en el montón de basura recolectada, pero esto está planificado para una versión futura. Cada archivo de clase contiene código compilado para una clase Java o una interfaz Java. Se puede decir que el archivo de clase es el archivo de código de ejecución del lenguaje Java. Para garantizar la independencia de plataforma de los archivos de clase, el formato de los archivos de clase también se detalla en la especificación de la máquina virtual Java. Para obtener más información, consulte la Especificación de máquina virtual Java de Sun.

Entrevistado: Riéndose de los avatares de la vida - Juren Nivel 4 12-15 22:27

-

¿Crees que la mejor respuesta es la buena? ? Actualmente hay 0 comentarios.

50% (0)

50% (0)

Hay otras dos respuestas.

El concepto de máquina virtual es relativamente amplio. Por lo general, las personas están expuestas al concepto de máquinas virtuales, incluido el software de emulación de hardware como VMware y el software como JVM que se encuentra entre el hardware y los compiladores. Esto se refiere a este último.

Una máquina virtual es una computadora abstracta que tiene un conjunto de instrucciones y utiliza diferentes áreas de almacenamiento como una computadora real. Se encarga de ejecutar instrucciones y gestionar datos, memoria y registros. Esta máquina virtual proporciona una interfaz pública para compiladores en cualquier plataforma. El compilador solo necesita enfrentarse a la máquina virtual y generar código que la máquina virtual pueda entender, y luego el intérprete convierte el código de la máquina virtual en código de máquina para que un sistema específico lo ejecute.

máquina virtual Java

En primer lugar, ¿qué es una máquina virtual Java?

La máquina virtual Java es una máquina virtual que se implementa mediante simulación de software en un computadora real. La máquina virtual Java tiene su propio hardware imaginario, como procesadores, pilas, registros, etc. , y también tiene un sistema de comando correspondiente.

1. ¿Por qué utilizar la máquina virtual Java?

Una característica muy importante del lenguaje Java es que es independiente de la plataforma. Usar la máquina virtual Java es la clave para lograr esta funcionalidad. Si un lenguaje de alto nivel de propósito general se va a ejecutar en diferentes plataformas, al menos debe compilarse en diferentes códigos de destino. Después de la introducción de la máquina virtual Java, no es necesario volver a compilar el lenguaje Java cuando se ejecuta en diferentes plataformas. Modelo de uso del lenguaje Java La máquina virtual Java protege la información relacionada con plataformas específicas, de modo que el compilador del lenguaje Java solo necesita generar el código de destino (código de bytes) que se ejecuta en la máquina virtual Java y puede ejecutarse en varias plataformas sin modificaciones. Cuando la máquina virtual Java ejecuta código de bytes, lo interpreta como instrucciones de máquina para su ejecución en una plataforma específica.

2. ¿Quién necesita saber sobre la Máquina Virtual Java?

La máquina virtual Java es la base para la implementación subyacente del lenguaje Java. Cualquier persona interesada en el lenguaje Java debe tener un conocimiento general de la máquina virtual Java. Esto ayuda a comprender algunas propiedades del lenguaje Java y utilizarlo. Para el personal de software que desea implementar la máquina virtual Java en una plataforma específica, los autores del compilador del lenguaje Java y las personas que desean utilizar chips de hardware para implementar la máquina virtual Java, deben tener un conocimiento profundo de las especificaciones de Java. máquina virtual. Además, si desea ampliar el lenguaje Java o compilar otros lenguajes en el código de bytes del lenguaje Java, también debe tener un conocimiento profundo de la máquina virtual Java.

3. Tipos de datos soportados por la máquina virtual Java.

Los tipos de datos básicos del lenguaje Java admitidos por la máquina virtual Java son los siguientes:

Byte://Complemento de entero con signo de 1 byte

corto : //2/El código complementario de un entero con signo de doble byte

int://El código complementario de un entero con signo de 4/4 bytes

long://8 /8 palabras Complemento de la sección dos de entero con signo

Float://Número de punto flotante de precisión simple IEEE754 de 4 bytes

Double://Flotante de precisión doble IEEE754 de 8 bytes -número de punto

Char://carácter Unicode sin firmar de 2 bytes

Casi toda la verificación de tipos de Java se realiza en tiempo de compilación. Los datos de los tipos de datos primitivos enumerados anteriormente no necesitan estar etiquetados por hardware cuando los ejecuta Java. Los códigos de bytes (instrucciones) que operan en estos tipos de datos primitivos ya indican el tipo de datos de los operandos. Por ejemplo, las instrucciones iadd, ladd, fadd y dadd suman dos números y los tipos de operandos son int, long, float y double. La máquina virtual no configura instrucciones separadas para tipos booleanos. Los datos booleanos se manejan mediante instrucciones de números enteros, incluidos los retornos de números enteros. Las matrices booleanas se manejan con matrices de bytes. La máquina virtual utiliza números de punto flotante en formato IEEE754. Las computadoras más antiguas que no admiten el formato IEEE pueden funcionar muy lentamente cuando ejecutan programas de cálculo numérico Java.

Otros tipos de datos admitidos por la máquina virtual incluyen:

Objeto//Referencia de 4 bytes a Javaobjeto (objeto)

Dirección de retorno//4 bytes, Usado para directivas jsr/ret/jsr-w/ret-w.

Nota: Las matrices Java se tratan como objetos.

La especificación de la máquina virtual no tiene requisitos especiales sobre la estructura interna del objeto. En la implementación de Sun, una referencia a un objeto es un identificador, que contiene un par de punteros: un puntero apunta a la tabla de métodos del objeto y el otro apunta a los datos del objeto. Los programas representados por el código de bytes de la máquina virtual Java deben ajustarse a las reglas de tipo. Las implementaciones de máquinas virtuales Java deben negarse a ejecutar programas de código de bytes que violen las especificaciones de tipo. Debido a las limitaciones en la definición del código de bytes, la máquina virtual Java parece ejecutarse sólo en máquinas con un espacio de direcciones de 32 bits. Pero puedes crear una máquina virtual Java que convierta automáticamente el código de bytes a un formato de 64 bits. Se puede ver en los tipos de datos admitidos por la máquina virtual Java que Java estipula estrictamente el formato interno del tipo de datos, de modo que la interpretación de los datos sea consistente en varias implementaciones de la máquina virtual Java, asegurando así la independencia de la plataforma y la compatibilidad de Java. sexo.

Portabilidad.

2. Arquitectura de la máquina virtual Java

La máquina virtual Java consta de cinco partes: un conjunto de instrucciones, un conjunto de registros, una pila, un montón de recolección de basura y un área de método. . Estas cinco partes son componentes lógicos de la máquina virtual Java y no dependen de ninguna tecnología u organización de implementación, pero sus funciones deben implementarse en la máquina real de alguna manera.

1.Conjunto de instrucciones Java

La máquina virtual Java admite aproximadamente 248 códigos de bytes. Cada código de bytes realiza una operación básica de la CPU, como agregar un número entero a un registro, transferencia de subrutina, etc. El conjunto de instrucciones de Java es equivalente al lenguaje ensamblador de los programas Java.

Las instrucciones del conjunto de instrucciones de Java contienen un operador de un solo byte para especificar la operación a realizar y cero o más operandos para proporcionar los parámetros o datos necesarios para la operación. Muchas instrucciones no tienen operandos y contienen sólo un operador de un solo byte.

El proceso de ejecución del bucle interno de la máquina virtual es el siguiente:

Hacer {

Obtener un byte de operador;

Según el operador Operación de ejecución de valor;

}mientras (el programa no está completo)

Debido a la simplicidad del sistema de instrucciones, el proceso de ejecución de la máquina virtual es muy simple, lo cual es beneficioso para mejorar la eficiencia de la ejecución. El número y tamaño de los operandos en una instrucción lo determina el operador. Si el operando tiene más de un byte, se almacena primero en el byte grande. Por ejemplo, un parámetro de 16 bits ocupa dos bytes cuando se almacena y su valor es:

Primer byte * 256 + segundo byte Los flujos de instrucciones de código de bytes generalmente están alineados en bytes.

Las excepciones son las instrucciones tabltch y lookup, en las que se requiere una alineación forzada en un límite de 4 bytes.

2. Registro

Los registros de la máquina virtual Java se utilizan para guardar el estado de ejecución de la máquina, similar a algunos registros especiales en los microprocesadores.

La máquina virtual Java tiene cuatro registros:

Pc: contador de programas Java.

Optop: Puntero a la parte superior de la pila de operandos.

Marco: Puntero al entorno de ejecución del método de ejecución actual.

Vars: Puntero a la primera variable en el área de variables locales del método que se está ejecutando actualmente.

máquina virtual Java

Las máquinas virtuales Java están apiladas. No define ni utiliza registros para pasar o aceptar parámetros. Su propósito es garantizar la simplicidad del conjunto de instrucciones y la eficiencia de la implementación (especialmente para procesadores con una pequeña cantidad de registros).

Todos los registros son de 32 bits.

3. Montón

La pila de la máquina virtual Java tiene tres áreas: área de variables locales, área del entorno de ejecución y área de operandos.

(1) Área de variables locales Cada método Java utiliza un conjunto de variables locales de tamaño fijo. Se direccionan según el desplazamiento de palabras del registro vars. Las variables locales son todas de 32 bits. Los números enteros largos y los números de punto flotante de doble precisión ocupan el espacio de dos variables locales, pero se abordan según el índice de la primera variable local. (Por ejemplo, si una variable local en el índice n es un número de coma flotante de doble precisión, en realidad ocupa el espacio de almacenamiento representado por los índices n y n+1. La especificación de la máquina virtual no requiere que los valores de 64 bits en las variables locales están alineadas en 64 bits. La máquina virtual proporciona instrucciones para cargar valores de variables locales en la pila de operandos y también proporciona instrucciones para escribir valores de la pila de operandos en variables locales. (2) Ejecutar El área de entorno contiene información utilizada para enlaces dinámicos, retornos de métodos normales y propagación de excepciones.

Enlaces dinámicos

El entorno de ejecución incluye punteros a las tablas de símbolos del intérprete. la clase actual y el método actual. , para admitir el enlace dinámico del código del método. El código del archivo de clase del método utiliza símbolos al hacer referencia a los métodos a los que se llamará y a las variables a las que se accederá. El enlace dinámico traduce las llamadas a métodos simbólicos en llamadas a métodos reales, cargando lo necesario. clases para interpretar símbolos indefinidos y traducir el acceso a variables en las direcciones de desplazamiento correspondientes a las estructuras de almacenamiento en tiempo de ejecución de estas variables. La vinculación dinámica de métodos y variables garantiza que los cambios en otras clases utilizadas en el método no afectarán el código de este programa.

Retorno del método normal

Si el método actual finaliza normalmente, el método llamado obtendrá el valor de retorno cuando se ejecute el tipo correcto de instrucción de retorno. El entorno de ejecución se utiliza para restaurar el. Los registros de la persona que llama cuando la persona que llama regresa normalmente e incrementa el contador del programa de la persona que llama en un valor apropiado para omitir las instrucciones de llamada del método ejecutado y luego continuar la ejecución en el entorno de ejecución de la persona que llama.

Propagación de excepciones y errores

La excepción se llama Error o excepción en Java y es una subclase de la clase Throwable. Las razones en el programa son: ①Error de enlace dinámico, como que no se puede encontrar el archivo de clase requerido ②Error en tiempo de ejecución, como hacer referencia a un valor nulo. pointer.p>

El programa utiliza la instrucción throw.

Cuando se produce una excepción, la máquina virtual Java realiza las siguientes acciones:

Comprueba la tabla de cláusulas catch asociada con el método actual. Cada cláusula contiene su rango de instrucciones válidas, el tipo de excepción que se puede manejar y la dirección del bloque de código que maneja la excepción.

La cláusula catch que coincide con la excepción debe cumplir las siguientes condiciones. : la instrucción que causó la excepción está dentro de su instrucción dentro del alcance, y el tipo de excepción que ocurre es un subtipo del tipo de excepción que puede manejar. Si se encuentra una cláusula catch coincidente, el sistema pasa al manejo de excepciones especificado. bloque para ejecución; si no se encuentra ningún bloque de manejo de excepciones, la cláusula catch coincidente se repite hasta que se verifiquen todas las cláusulas catch anidadas del método actual

Dado que la máquina virtual continúa la ejecución desde la primera captura coincidente. cláusula, el orden en la tabla de cláusulas catch es muy importante.

Debido a que el código Java está estructurado, todos los controladores de excepciones para un método siempre se pueden organizar en una tabla en orden, y para cualquier valor posible del contador del programa, el bloque de manejo de excepciones apropiado se puede encontrar en orden lineal para manejar el contador del programa. valor.

Si no se encuentra ninguna cláusula catch coincidente, el método actual obtendrá un resultado de "excepción no detectada" y se lo devolverá a la persona que llama del método actual como si la excepción acabara de ocurrir en su mismo lugar. . Si el bloque de manejo de excepciones correspondiente aún no se encuentra en la persona que llama, esta propagación de errores continuará. Si el error se propaga al nivel superior, el sistema llamará al bloque de manejo de excepciones predeterminado.

(3) Las instrucciones de la máquina en el área de la pila de operandos solo extraen los operandos de la pila de operandos, realizan operaciones y devuelven los resultados a la pila. Se eligió la estructura de pila porque puede simular eficazmente el comportamiento de una máquina virtual en máquinas con solo una pequeña cantidad de registros o registros de propósito no general (como Intel486). La pila de operandos es de 32 bits. Se utiliza para pasar parámetros y recibir resultados de métodos, y también se utiliza para admitir parámetros para operaciones y guardar los resultados de las operaciones. Por ejemplo, la instrucción iadd suma dos números enteros. Los dos números enteros que se suman deben ser las dos primeras palabras de la pila de operandos. Estas dos palabras fueron colocadas en la pila mediante la instrucción anterior. Los dos números enteros se sacan de la pila, se suman y el resultado se devuelve a la pila de operandos.

Cada tipo de datos primitivo tiene instrucciones especiales para realizar las operaciones necesarias sobre ellos. Cada operando requiere una ubicación de almacenamiento en la pila, excepto los tipos largo y doble, que requieren dos ubicaciones. Los operandos sólo pueden ser operados por operadores apropiados a su tipo. Por ejemplo, es ilegal enviar dos números de tipo int y tratarlos como números de tipo long. En la implementación de la máquina virtual de Sun, esta restricción la aplica el verificador de código de bytes. Sin embargo, hay algunas operaciones (operadores engañar e intercambiar) que operan en áreas de datos en tiempo de ejecución independientemente de su tipo.

4. Montón de recolección de basura

El montón de Java es un área de datos en tiempo de ejecución, y las instancias de clase (objetos) asignan espacio desde aquí. El lenguaje Java tiene la capacidad de recopilar unidades inútiles: no brinda a los programadores la capacidad de liberar objetos explícitamente. Java no especifica un algoritmo de recolección de basura específico y se pueden usar varios algoritmos según los requisitos del sistema.

5. Área de métodos

El área de métodos es similar al código compilado en un lenguaje tradicional o a la sección del cuerpo en un proceso Unix. Guarda el código del método (código java compilado) y la tabla de símbolos. En la implementación actual de Java, el código del método no se incluye en el montón de basura recolectada, pero esto está planificado para una versión futura. Cada archivo de clase contiene código compilado para una clase Java o una interfaz Java. Se puede decir que el archivo de clase es el archivo de código de ejecución del lenguaje Java. Para garantizar la independencia de plataforma de los archivos de clase, el formato de los archivos de clase también se detalla en la especificación de la máquina virtual Java. Consulte a Sun para obtener más detalles.