· 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
tipo
enAqvmMemory_Memory
enmemory.h
, cadauint8_t
almacena2
tipos, por lo que el número de
tiposdebe estar entre
0x00-
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 -
1
byte tipo entero con signo - int -
4
bytes tipo entero con signo - long -
8
byte tipo entero con signo - float -
4
tipo de punto flotante de precisión simple - doble -
8
bytes 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 firmar
en 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_Bool
es lo suficientemente grande como para almacenar los valores0
y1
.(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 tipofloat
es un subconjunto de un conjunto de valores de tipodouble
.doble
- Tipo de coma flotante. Un conjunto de valores de tipodoble
es un subconjunto de un conjunto de valores de tipodoble largo
.long double
- Tipo de coma flotante.void
: el tipovoid
contiene 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
- integerint
tiene 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 flotante
generalmente se implementa enC
usandodoble
. 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 real
y unaparte imaginaria
, cada parte es unnúmero de punto flotante
. Al agregarj
oJ
después de un literal numérico, puede obtener unnúmero imaginario
(unnúmero complejo
con una parte real de cero. Agréguelo a unentero
onúmero de coma flotante
). obtenga unnúmero imaginario
. Unnúmero complejo
con parte real y parte imaginaria.bool
- BooleanBoolean
también es unsubtipo
deinteger
. Un objeto booleano que representa un valor verdadero. El tipobool
tiene solo dos instancias constantes:Verdadero
yFalso
.list
- ListList
es unasecuencia mutable
, generalmente utilizada para almacenarconjuntos
de elementos similares (donde el grado preciso de similitud variará dependiendo de la aplicación).tuple
- TupleTuple
es unasecuencia inmutable
, generalmente utilizada para almacenarconjuntos de elementos múltiples
de datos heterogéneos (como losbinarios
generados por la función incorporadaenumerate()
grupo). Las
tuplastambién se utilizan en situaciones en las que se requiere una
secuencia inmutablede datos homogéneos (por ejemplo, permitir el almacenamiento en instancias de
seto
dict`).rango
: el tiporango
representa unasecuencia numérica
inmutable
, 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
. Unacadena
es unasecuencia inmutable
de puntos de códigoUnicode
.bytes
: un objetobytes
es unasecuencia inmutable
de 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 objetobyteearray
es la contraparte mutable de un objetobytes
.memoryview
- Vista de memoria El objetomemoryview
permite que el códigoPython
acceda a los datos internos de un objeto, siempre que el objeto admita elprotocolo de búfer
sin realizar una copia.set
- tipo de conjunto El objetoset
es unconjunto desordenado de elementos múltiples
compuesto 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 tiposet
es 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 tipofrozenset
esinmutable
yhashable
. Su contenido no se puede cambiar después de su creación, por lo que se puede usar como unaclave
de undiccionario
o. otro Unelemento
de unconjunto
.dict
- Tipo de asignación El objetomapping
asignará el valorhashable
a cualquier objeto.Map
es unobjeto mutable
. Actualmente sólo existe un tipo de mapeo estándar,diccionario
.GenericAlias
- Los objetosGenericAlias
generalmente se creanextrayendo
unaclase
. Se utilizan más comúnmente conclases contenedoras
comolista
odict
. Por ejemplo, el objetoGenericAlias
list[int]
se crea extrayendo la claselist
con el parámetroint
. El objetivo principal de los objetosGenericAlias
es laanotación de tipo
.union
: unobjeto de unión
contiene 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 type
permiten 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-128
a127
(-27 a 27 - 1), inclusive.short
- tipo entero cuyo valor es un16
bit entero en complemento a dos con signo, y su valor predeterminado escero
. De-32768
a32767
(-215 a 215 - 1), inclusive.int
- tipo entero cuyo valor es un bit de32
entero en complemento a dos con signo y su valor predeterminado escero
. De-2147483648
a2147483647
(-231 a 231 - 1), inclusive.long
- tipo entero cuyo valor es un bit de64
entero en complemento a dos con signo y cuyo valor predeterminado escero
. De-9223372036854775808
a9223372036854775807
(-263 a 263 - 1), inclusive.char
- Tipo entero Su valor es un entero sin signo de16
bits, que representa el punto de códigoUnicode
en el plano multilingüe básico, codificado comoUTF-16
, y su valor predeterminado esnull
Punto de código(\u0000
). De0
a65535
.float
- Tipo de punto flotante Su valor se ajusta completamente al formato de32
bits IEEE 754 binario32, y el valor predeterminado escero positivo
.double
- Tipo de coma flotante Su valor es exactamente el mismo que el valor en formato64
bit 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
-1
byte (8
bit) tipo entero con signo
Almacenado en complemento a dos. Generalmente se usa para almacenarbool
ochar
. De-128
a127
(-27 a 27 - 1), inclusive.int
-0x02
-4
bytes (32
bits) tipo entero con signo
Almacenado en complemento a dos. De-2147483648
a2147483647
(-231 a 231 - 1), inclusive.long
-0x03
-8
bytes (64
bits) 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 de64
entero en complemento a dos con signo y su valor predeterminado escero
. De-9223372036854775808
a9223372036854775807
(-263 a 263 - 1), inclusive.float
-0x04
-4
bytes (32
bits) 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
-8
bytes (64
bit) 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.