· Blog · 14 min read
Definición de tipo de máquina virtual AQ - AQ
Dado que diferentes sistemas, hardware y otras condiciones externas tienen diferentes soportes y definiciones de memoria, para que la máquina virtual AQ cumpla con los requisitos para la operación multiplataforma, es esencial diseñar un estándar de tipo unificado. Este artículo define y estandariza los tipos de máquinas virtuales AQ para garantizar que las máquinas virtuales AQ en diferentes sistemas puedan ejecutarse normalmente.

Introducción
Dado que diferentes sistemas, hardware y otras condiciones externas tienen diferentes soportes y definiciones para memoria, para que la máquina virtual AQ cumpla con los requisitos de operación multiplataforma, es necesario diseñar un Estándar unificado de tipo. Este artículo define y estandariza los tipos de máquinas virtuales AQ para garantizar que las máquinas virtuales AQ en diferentes sistemas puedan ejecutarse normalmente.
Ideas de diseño
En primer lugar, para lograr la simplificación de los tipos y una mayor eficiencia de ejecución, el diseño de los tipos nativos (los tipos que son directamente soportados por la máquina virtual sin estar definidos mediante código) debe ser lo más lo menos posible. Por lo tanto, para tipos complejos relacionados, como enumeración, estructura, etc., los desarrollamos en el nivel de compilador para reducir el número de tipos y la complejidad de la máquina virtual.
De acuerdo con la definición de
tipoenAqvmMemory_Memoryenmemory.h, cadauint8_talmacena2tipos, por lo que el número detiposdebe estar entre0x00-0x0F` (16 ) entre.
En segundo lugar, a través de la investigación sobre tipos de otros lenguajes de programación, hemos resumido los tipos comunes. Hemos diseñado los siguientes tipos para lograr el rendimiento y la simplicidad de la máquina virtual. `equilibrio.
- nulo - tipo vacío
- byte -
1byte tipo entero con signo - int -
4bytes tipo entero con signo - long -
8byte tipo entero con signo - float -
4tipo de punto flotante de precisión simple - doble -
8bytes tipo coma flotante de doble precisión
Finalmente, diseñamos estándares detallados para tipos para garantizar que la máquina virtual AQ pueda lograr una operación multiplataforma.
Para reducir la definición de tipo de
máquina virtual, se implementarántipos sin firmaren el nivel delcompilador.
Definiciones de tipo para otros lenguajes de programación
Para que los tipos de AQ sean más extensos y más fáciles de entender para los desarrolladores, nos referimos a las definiciones de tipos de los lenguajes de programación comunes existentes.
Los tipos básicos definidos a continuación son tipos de datos generales, como números enteros, números de punto flotante y tipos vacíos. Realiza trabajos básicos de almacenamiento de datos o tiene un significado especial.
C
El estándar C actual es ISO/IEC 9899:2018 Tecnología de la información - Lenguajes de programación - C. Dado que los derechos de autor de esta norma pertenecen a ISO (Organización Internacional de Normalización) e IEC (Comisión Electrotécnica Internacional), para evitar disputas sobre derechos de autor, hemos resumido las definiciones de tipo. Lo mismo a continuación.
Sitio web oficial: https://www.iso.org/standard/74528.html
_Bool: un objeto declarado como tipo_Booles lo suficientemente grande como para almacenar los valores0y1.(sin firmar) char- tipo de carácter. Un objeto declarado como tipo char es lo suficientemente grande como para almacenar cualquier miembro del conjunto de caracteres de ejecución básico. Si un miembro del conjunto de caracteres de ejecución base se almacena en un objetochar, se garantiza que su valor no será negativo. Si se almacenan otros caracteres en un objeto de carácter, el valor resultante esdefinido por implementación, pero debe estar dentro del rango de valores que se pueden representar en ese tipo.signed char: tipo de carácter firmado.short int: tipo entero extendido con signo.unsigned short int: tipo entero extendido sin signo.int: tipo entero con signo estándar extendido.unsigned int: tipo entero estándar sin signo.long int: tipo entero con signo extendido.unsigned long int: tipo entero extendido sin signo.long long int: tipo entero extendido con signo.unsigned long long int: tipo entero extendido sin signo.float- Tipo de punto flotante. Un conjunto de valores de tipofloates un subconjunto de un conjunto de valores de tipodouble.doble- Tipo de coma flotante. Un conjunto de valores de tipodoblees un subconjunto de un conjunto de valores de tipodoble largo.long double- Tipo de coma flotante.void: el tipovoidcontiene un conjunto de valores nulos; es un tipo de objeto incompleto y no se puede implementar.
Además, C también tiene otros tipos no básicos, como tipos de enumeración (tipos enum), tipos de puntero, etc. No se discutirá en el diseño de la máquina virtual.
C++ y otras variantes de C
El estándar actual C++ es ISO/IEC 14882:2020 Lenguajes de programación — C++. Dado que C++ y otras variantes de C son básicamente los mismos tipos que C, ya no aparecen en la lista.
###Pitón La última versión oficial de Python es 3.12.4. Los tipos integrados en la documentación de Python 3.12.4 documentan los tipos estándar integrados en el intérprete de Python.
Los principales tipos integrados son Número, Secuencia, Mapa, Clase, Instancia y Excepción. Por razones de espacio, aquí no se analizará ningún contenido que no sea tipos básicos.
Enlace fuente: https://docs.python.org/zh-cn/3/library/stdtypes.html
int- integerinttiene una precisión infinita. Los literales enteros no modificados (incluidos los números hexadecimales, octales y binarios) producen números enteros.float- Número de punto flotante Elpunto flotantegeneralmente se implementa enCusandodoble. Los literales numéricos que contienen un punto decimal o un signo de exponente producen un número de punto flotante.complejo- Número complejo Un número complejo tiene unaparte realy unaparte imaginaria, cada parte es unnúmero de punto flotante. Al agregarjoJdespués de un literal numérico, puede obtener unnúmero imaginario(unnúmero complejocon una parte real de cero. Agréguelo a unenteroonúmero de coma flotante). obtenga unnúmero imaginario. Unnúmero complejocon parte real y parte imaginaria.bool- BooleanBooleantambién es unsubtipodeinteger. Un objeto booleano que representa un valor verdadero. El tipobooltiene solo dos instancias constantes:VerdaderoyFalso.list- ListListes unasecuencia mutable, generalmente utilizada para almacenarconjuntosde elementos similares (donde el grado preciso de similitud variará dependiendo de la aplicación).tuple- TupleTuplees unasecuencia inmutable, generalmente utilizada para almacenarconjuntos de elementos múltiplesde datos heterogéneos (como losbinariosgenerados por la función incorporadaenumerate()grupo). Lastuplastambién se utilizan en situaciones en las que se requiere unasecuencia inmutablede datos homogéneos (por ejemplo, permitir el almacenamiento en instancias desetodict`).rango: el tiporangorepresenta unasecuencia numéricainmutable, generalmente utilizada para realizar un bucle un número específico de veces en un buclefor.str- Tipo de secuencia de texto Para procesar datos de texto enPython, se utiliza el objetostr, también llamadostring. Unacadenaes unasecuencia inmutablede puntos de códigoUnicode.bytes: un objetobyteses unasecuencia inmutablede bytes individuales. Dado que muchos de los principales protocolos binarios se basan en la codificación de texto ASCII, el objeto bytes proporciona algunos métodos que sólo están disponibles cuando se trabaja con datos compatibles con ASCII y están estrechamente relacionados con los objetos de cadena en muchas características.byteearray: un objetobyteearrayes la contraparte mutable de un objetobytes.memoryview- Vista de memoria El objetomemoryviewpermite que el códigoPythonacceda a los datos internos de un objeto, siempre que el objeto admita elprotocolo de búfersin realizar una copia.set- tipo de conjunto El objetosetes unconjunto desordenado de elementos múltiplescompuesto por objetos únicoshashable. Los usos comunes incluyen detección de membresía, eliminación de duplicados de secuencias y cálculos de conjuntos en matemáticas, como intersección, unión, diferencia y diferencia simétrica, etc. El tiposetes mutable y su contenido se puede cambiar usando métodos comoadd()yremove(). Debido a que es un tipo mutable, no tiene un valor hash y no se puede usar como clave en un diccionario o elemento en una colección.frozenset- Tipo de colección El tipofrozensetesinmutableyhashable. Su contenido no se puede cambiar después de su creación, por lo que se puede usar como unaclavede undiccionarioo. otro Unelementode unconjunto.dict- Tipo de asignación El objetomappingasignará el valorhashablea cualquier objeto.Mapes unobjeto mutable. Actualmente sólo existe un tipo de mapeo estándar,diccionario.GenericAlias- Los objetosGenericAliasgeneralmente se creanextrayendounaclase. Se utilizan más comúnmente conclases contenedorascomolistaodict. Por ejemplo, el objetoGenericAliaslist[int]se crea extrayendo la claselistcon el parámetroint. El objetivo principal de los objetosGenericAliases laanotación de tipo.union: unobjeto de unióncontiene el valor de realizar la operación| (bit a bit OR)en múltiplestipos de objetos. Estos tipos se utilizan principalmente paraanotaciones de tipo. En comparación con escribir.Union, las expresionesunion typepermiten una sintaxis de sugerencia de tipo más concisa.
###Java La especificación de JVM (Java Virtual Machine) es La especificación de la máquina virtual Java®, la última versión es Java SE 22 Edition y la fecha de lanzamiento es 2024-02-09. En comparación con la definición de tipo en el nivel de compilador de otros lenguajes, la situación de JVM está más en línea con el diseño de la máquina virtual. Al mismo tiempo, los tipos de JVM se dividen en tipos primitivos y tipos de referencia. Debido a las necesidades de desarrollo de las máquinas virtuales, elegimos los tipos primitivos para la discusión.
Además, Java también tiene una especificación que es La especificación del lenguaje Java, edición Java SE 22, enlace HTML: https://docs.oracle.com/javase/specs/jls/se22/html /index.html enlace PDF: https://docs.oracle.com/javase/specs/jls/se22/jls22.pdf. Debido a las necesidades especiales del desarrollo de máquinas virtuales, este artículo elige estudiar la definición de tipo de JVM en lugar de la definición de tipo del lenguaje Java.
Enlace fuente (HTML): https://docs.oracle.com/javase/specs/jvms/se22/html/jvms-2.html#jvms-2.3
Enlace fuente (PDF): https://docs.oracle.com/javase/specs/jvms/se22/jvms22.pdf
byte- tipo entero cuyo valor es un8-bit entero en complemento a dos con signo, y su valor predeterminado escero. De-128a127(-27 a 27 - 1), inclusive.short- tipo entero cuyo valor es un16bit entero en complemento a dos con signo, y su valor predeterminado escero. De-32768a32767(-215 a 215 - 1), inclusive.int- tipo entero cuyo valor es un bit de32entero en complemento a dos con signo y su valor predeterminado escero. De-2147483648a2147483647(-231 a 231 - 1), inclusive.long- tipo entero cuyo valor es un bit de64entero en complemento a dos con signo y cuyo valor predeterminado escero. De-9223372036854775808a9223372036854775807(-263 a 263 - 1), inclusive.char- Tipo entero Su valor es un entero sin signo de16bits, que representa el punto de códigoUnicodeen el plano multilingüe básico, codificado comoUTF-16, y su valor predeterminado esnullPunto de código(\u0000). De0a65535.float- Tipo de punto flotante Su valor se ajusta completamente al formato de32bits IEEE 754 binario32, y el valor predeterminado escero positivo.double- Tipo de coma flotante Su valor es exactamente el mismo que el valor en formato64bit IEEE 754 binario64, y el valor predeterminado escero positivo.
Estándares detallados
Definición de tipo
El compilador procesará los tipos complejos para garantizar la simplicidad y eficiencia de la máquina virtual. Los tipos simples serán compatibles directamente con la máquina virtual.
Los siguientes son los 6 tipos básicos definidos por la máquina virtual AQ:
Los tipos que no se admiten directamente incluyen
entero sin signo,dirección de memoria (puntero),cadena, etc. Estos tipos se implementarán en el nivel decompilador. Para lasmáquinas virtuales, estos tipos se implementan indirectamente.
nulo-0x00- tipo vacío
Los tipos vacíos solo representan tipos desconocidos o tipos que no necesitan usarse (por ejemplo: sin retorno). Sin longitud.byte-0x01-1byte (8bit) tipo entero con signo
Almacenado en complemento a dos. Generalmente se usa para almacenarboolochar. De-128a127(-27 a 27 - 1), inclusive.int-0x02-4bytes (32bits) tipo entero con signo
Almacenado en complemento a dos. De-2147483648a2147483647(-231 a 231 - 1), inclusive.long-0x03-8bytes (64bits) tipo entero con signo
Almacenado en complemento a dos. Ladirección de memoria (puntero)también se almacena usando esto. Su valor es un bit de64entero en complemento a dos con signo y su valor predeterminado escero. De-9223372036854775808a9223372036854775807(-263 a 263 - 1), inclusive.float-0x04-4bytes (32bits) tipo de punto flotante de precisión simple
Adopta el estándarISO/IEC 60559 Tecnología de la información - Sistemas de microprocesadores - Aritmética de punto flotante.double-0x05-8bytes (64bit) tipo de coma flotante de doble precisión
Adopta el estándarISO/IEC 60559 Tecnología de la información - Sistemas de microprocesadores - Aritmética de punto flotante.
Código complemento
Definición
’Complemento’ es la representación de números con signo en las computadoras.
método
El código complementario de los números positivos y el 0 es el número en sí más el bit más alto 0. El complemento de un número negativo es invertir su valor absoluto bit a bit y sumar 1.
Estándar de coma flotante
Definición
El Estándar de números de coma flotante adopta el estándar ISO/IEC 60559 Tecnología de la información - Sistemas de microprocesadores - Aritmética de coma flotante. Este estándar también se denomina Estándar aritmético de coma flotante binaria IEEE (IEEE 754)
Sitio web oficial: https://www.iso.org/standard/80985.html
método
El valor real de un número de coma flotante es igual al bit de signo multiplicado por el valor de compensación del exponente multiplicado por el valor fraccionario. Para obtener definiciones detalladas, consulte el estándar ISO/IEC 60559 Tecnología de la información - Sistemas de microprocesadores - Aritmética de punto flotante.
32 bit número de punto flotante
| Longitud de bits | Nombre | Número de bits | | ------ | ------ | | 1 | Bit de signo | | 8 | Número | 30 a 23 valor positivo (tamaño de exponente real + 127) | | 23 | Dígitos válidos | Número de 22 a 0 dígitos (comenzando con 0 desde la derecha) |
64 bit número de punto flotante
| Longitud de bits | Nombre | Número de bits | | ------ | ------ | | 1 | Bit de signo | | 11 | Número | 62 a 52 valor positivo (tamaño de exponente real + 1023) | | 52 | Dígitos válidos | Números del 51 al 0 (empezando por 0 desde la derecha) |
types.h código completo:
También hay códigos relacionados para tipo. El siguiente es el código de types.h:
// Copyright 2024 AQ author, All Rights Reserved.
// This program is licensed under the AQ License. You can find the AQ license in
// the root directory.
#ifndef AQ_AQVM_MEMORY_TYPES_H_
#define AQ_AQVM_MEMORY_TYPES_H_
#include <stdint.h>
// null - 0x00 - null type
// The null type simply represents an unknown type or a type that is not needed
// (e.g., returns nothing). Has no length.
typedef void aqnull;
// byte - 0x01 - 1 byte (8-bit) signed integer type
// Using two's complement storage. Generally used to store bool or char. From
// -128 to 127 (-2^7 to 2^7 - 1), inclusive.
typedef int8_t aqbyte;
// int - 0x02 - 4-byte (32-bit) signed integer type
// Stored in two's complement notation. From -2147483648 to 2147483647 (-2^31 to
// 2^31 - 1), inclusive.
typedef int aqint;
// long - 0x03 - 8-byte (64-bit) signed integer type
// Stored in two's complement notation. From -9223372036854775808 to
// 9223372036854775807 (-2^63 to 2^63 - 1), inclusive.
typedef int64_t aqlong;
// float - 0x04 - 4-byte (32-bit) single-precision floating point type
// Using ISO/IEC 60559 Information technology — Microprocessor Systems —
// Floating-Point arithmetic standard.
typedef float aqfloat;
// double - 0x05 - 8-byte (64-bit) double-precision floating point type
// Using ISO/IEC 60559 Information technology — Microprocessor Systems —
// Floating-Point arithmetic standard.
typedef double aqdouble;
// The part beyond 0x05 and within 0x0F is currently designated as a reserved
// type. The part beyond 0x0F cannot be used because it exceeds the 4-bit size
// limit.
#endif
Estamos trabajando más duro para desarrollar la
Máquina Virtual AQ. Si desea obtener más información o participar en el trabajo de desarrollo, siga nuestro sitio web oficial: https://www.axa6.com y Github: https://github.com/aq-org/AQ.
Este artículo está publicado según la licencia AQ: https://github.com/aq-org/AQ/blob/main/LICENSE Si es necesario, adáptelo o reimprima según la licencia AQ.