· Blog · 14 min read
Définition du type de machine virtuelle AQ - AQ
Étant donné que différents systèmes, matériels et autres conditions externes ont une prise en charge et des définitions différentes pour la mémoire, pour que la machine virtuelle AQ réponde aux exigences de fonctionnement multiplateforme, il est essentiel de concevoir une norme de type unifiée. Cet article définit et standardise les types de machines virtuelles AQ pour garantir que les machines virtuelles AQ sur différents systèmes peuvent fonctionner normalement.
Introduction
Étant donné que différents systèmes
, matériels
et autres conditions externes ont une prise en charge et des définitions différentes pour la mémoire
, afin que la machine virtuelle AQ
réponde aux exigences du fonctionnement multiplateforme, il est nécessaire de concevoir un norme de type
unifiée Indispensable. Cet article définit et standardise les types de machines virtuelles AQ pour garantir que les machines virtuelles AQ sur différents systèmes peuvent fonctionner normalement.
Idées de conception
Tout d’abord, afin de simplifier les types
et d’obtenir une efficacité d’exécution plus élevée, la conception des types natifs
(les types
qui sont directement pris en charge par la machine virtuelle sans être définis par le code) doit être aussi simple que possible. le moins possible. Par conséquent, pour les types complexes associés, tels que énumération
, structure
, etc., nous les développons au niveau du compilateur
pour réduire le nombre de types
et la complexité
de la machine virtuelle
.
Selon la définition du
type
dansAqvmMemory_Memory
dansmemory.h
, chaqueuint8_t
stocke2
types, donc le nombre de
typesdoit être compris entre
0x00-
0x0F` (16 ) entre.
Deuxièmement, grâce à la recherche sur les types
d’autres langages de programmation
, nous avons résumé les types
courants. Nous avons conçu les types
suivants afin d’obtenir les performances et la simplicité de la machine virtuelle
. `équilibre.
- null - type vide
- octet -
1
octet de type entier signé - int - Type entier signé de
4
octets - long -
Type entier signé de
8`octets - float -
4
type à virgule flottante simple précision - double -
Type à virgule flottante double précision de
8`octets
Enfin, nous avons conçu des normes
détaillées pour les types
afin de garantir que la machine virtuelle AQ
puisse réaliser un fonctionnement multiplateforme
.
Afin de réduire la définition de type de
machine virtuelle
, lestypes non signés
seront implémentés au niveau ducompilateur
.
Définitions de Type
pour d’autres langages de programmation
Afin de rendre les types
d’AQ
plus étendus et plus faciles à comprendre pour les développeurs, nous nous référons aux définitions de type
des langages de programmation
courants existants.
Les types de base
définis ci-dessous sont des types de données
généraux tels que des entiers, des nombres à virgule flottante et des types vides. Il entreprend des travaux de stockage de données de base ou revêt une importance particulière.
###C La norme C
actuelle est ISO/IEC 9899 :2018 Technologies de l'information – Langages de programmation – C
. Étant donné que le droit d’auteur de cette norme appartient à ISO (Organisation internationale de normalisation)
et à CEI (Commission électrotechnique internationale)
, afin d’éviter les litiges en matière de droits d’auteur, nous avons résumé les définitions de type
. Le même ci-dessous.
Site officiel : https://www.iso.org/standard/74528.html
_Bool
- Un objet déclaré comme type_Bool
est suffisamment grand pour stocker les valeurs0
et1
.(non signé) char
- type de caractère. Un objet déclaré comme type char est suffisamment grand pour stocker n’importe quel membre du jeu de caractères d’exécution de base. Si un membre du jeu de caractères d’exécution de base est stocké dans un objetchar
, sa valeur est garantie comme étant non négative. Si d’autres caractères sont stockés dans un objet caractère, la valeur résultante estdéfinie par l'implémentation
, mais doit se situer dans la plage de valeurs qui peuvent être représentées dans ce type.signed char
- Type de caractère signé.short int
- type entier signé étendu.unsigned short int
- Type entier non signé étendu.int
- Type entier signé standard étendu.unsigned int
– Type entier non signé standard.long int
- Type entier signé étendu.unsigned long int
– Type entier non signé étendu.long long int
– Type entier signé étendu.unsigned long long int
- Type entier non signé étendu.float
- Type à virgule flottante. Un ensemble de valeurs de typefloat
est un sous-ensemble d’un ensemble de valeurs de typedouble
.double
- Type à virgule flottante. Un ensemble de valeurs de typedouble
est un sous-ensemble d’un ensemble de valeurs de typelong double
.long double
- Type à virgule flottante.void
- Le typevoid
contient un ensemble de valeurs nulles ; c’est un type d’objet incomplet et ne peut pas être implémenté.
De plus, C
a également d’autres types non basiques
, tels que les types énumération
(types enum
), les types pointeur, etc. Cela ne sera pas abordé dans la conception de la machine virtuelle
.
C++
et autres variantes C
La norme C++
actuelle est ISO/IEC 14882 :2020 Langages de programmation — C++
. Puisque C++
et les autres variantes de C
sont fondamentalement les mêmes types que C
, ils ne sont plus répertoriés.
###Python La dernière version officielle de Python
est 3.12.4
. Les types intégrés dans la documentation Python 3.12.4 documentent les types standard intégrés à l’interpréteur Python.
Les principaux types intégrés sont Number
, Sequence
, Map
, Class
, Instance
et Exception
. Pour des raisons d’espace, les contenus autres que les types de base
ne seront pas abordés ici.
Lien source : https://docs.python.org/zh-cn/3/library/stdtypes.html
int
- integerint
a une précision infinie. Les littéraux entiers non modifiés (y compris les nombres hexadécimaux, octaux et binaires) produisent des entiers.float
- Numéro à virgule flottante Lavirgule flottante
est généralement implémentée enC
en utilisantdouble
. Les littéraux numériques contenant un point décimal ou un signe exposant produisent un nombre à virgule flottante.complexe
- Nombre complexe Un nombre complexe a unepartie réelle
et unepartie imaginaire
, chaque partie est unnombre à virgule flottante
. En ajoutantj
ouJ
après un littéral numérique, vous pouvez obtenir unnombre imaginaire
(unnombre complexe
avec une partie réelle de zéro). Ajoutez-le à unnombre entier
ou à unnombre à virgule flottante
. obtenir unnombre imaginaire
Unnombre complexe
avec une partie réelle et une partie imaginaire.bool
- BooleanBoolean
est également unsous-type
deinteger
. Un objet booléen représentant une vraie valeur. Le typebool
n’a que deux instances constantes :True
etFalse
.list
- ListList
est uneséquence mutable
, généralement utilisée pour stocker desensembles
d’éléments similaires (où le degré précis de similarité variera en fonction de l’application).tuple
- TupleTuple
est uneséquence immuable
, généralement utilisée pour stocker desensembles multi-éléments
de données hétérogènes (telles quebinaire
généré par la fonction intégréeenumerate()
groupe). Les
Tuplessont également utilisés dans les situations où une
séquence immuablede données homogènes est requise (par exemple, permettre le stockage d'instances de
setou
dict`).range
- Le typerange
représente uneséquence de nombres
immuable
, généralement utilisée pour boucler un nombre spécifié de fois dans une bouclefor
.str
- Type de séquence de texte Pour traiter les données texte dansPython
, vous utilisez l’objetstr
, également appeléstring
. Unechaîne
est uneséquence immuable
de points de codeUnicode
.bytes
- Un objetbytes
est uneséquence immuable
d’octets simples. Étant donné que de nombreux protocoles binaires majeurs sont basés sur le codage de texte ASCII, l’objet bytes fournit certaines méthodes qui ne sont disponibles que lorsque vous travaillez avec des données compatibles ASCII et qui sont étroitement liées aux objets chaîne dans de nombreuses fonctionnalités.byteearray
- Un objetbyteearray
est la contrepartie mutable d’un objetbytes
.memoryview
- Memoryview L’objetmemoryview
permet au codePython
d’accéder aux données internes d’un objet, tant que l’objet prend en charge lebuffer protocol
sans faire de copie.set
- set type L’objetset
est unensemble multi-éléments non ordonné
composé d’objetshashables
uniques. Les utilisations courantes incluent la détection d’appartenance, la suppression des doublons des séquences et la définition de calculs mathématiques, tels que l’intersection, l’union, la différence et la différence symétrique, etc. Le typeset
est mutable et son contenu peut être modifié à l’aide de méthodes telles queadd()
etremove()
. Comme il s’agit d’un type mutable, il n’a pas de valeur de hachage et ne peut pas être utilisé comme clé dans un dictionnaire ou comme élément dans une collection.frozenset
- Type de collection Le typefrozenset
estimmuable
ethashable
. Son contenu ne peut pas être modifié après sa création, il peut donc être utilisé commeclé
d’undictionnaire
ou. autre Unélément
d’unensemble
.dict
- Type de mappage L’objetmapping
mappera la valeurhashable
à n’importe quel objet.Map
est unobjet mutable
. Actuellement, il n’existe qu’un seul type de mappage standard « dictionnaire ».GenericAlias
- Les objetsGenericAlias
sont généralement créés enextrayant
uneclasse
. Ils sont le plus souvent utilisés avec desclasses de conteneurs
telles quelist
oudict
. Par exemple, l’objetGenericAlias
list[int]
est créé en extrayant la classelist
avec le paramètreint
. L’objectif principal des objetsGenericAlias
est l’annotation de type
.union
- Unobjet union
contient la valeur d’effectuer l’opération| (OU au niveau du bit)
sur plusieursobjets de type
. Ces types sont principalement utilisés pour les « annotations de type ». Par rapport à typing.Union, les expressionsunion type
permettent une syntaxe d’indication de type plus concise.
###Java La spécification
de JVM (Java Virtual Machine)
est La spécification de la machine virtuelle Java®
, la dernière version est Java SE 22 Edition
et la date de sortie est le 2024-02-09
. Par rapport à la définition de type
au niveau du compilateur
d’autres langages, la situation de JVM
est plus conforme à la conception d’une machine virtuelle
. Dans le même temps, les types de JVM sont divisés en types primitifs et types de référence. En raison des besoins de développement des machines virtuelles, nous avons choisi les types primitifs pour la discussion.
De plus, Java
a également une spécification
qui est The Java Language Spécification, Java SE 22 Edition
, lien HTML
: https://docs.oracle.com/javase/specs/jls/se22/ html /index.html Lien PDF
: https://docs.oracle.com/javase/specs/jls/se22/jls22.pdf. En raison des besoins particuliers du développement de machines virtuelles
, cet article choisit d’étudier la définition de type
de JVM
au lieu de la définition de type
du langage Java
.
Lien source (HTML) : https://docs.oracle.com/javase/specs/jvms/se22/html/jvms-2.html#jvms-2.3
Lien source (PDF) : https://docs.oracle.com/javase/specs/jvms/se22/jvms22.pdf
byte
- type entier dont la valeur est un entier complément à deux signé de8
bits, et sa valeur par défaut estzéro
. De-128
à127
(-27 à 27 - 1), inclus.short
- type entier dont la valeur est un bit16
entier complémentaire à deux signé, et sa valeur par défaut estzéro
. De-32768
à32767
(-215 à 215 - 1), inclus.int
- type entier dont la valeur est un bit32
entier complémentaire à deux signé et sa valeur par défaut estzéro
. De-2147483648
à2147483647
(-231 à 231 - 1), inclus.long
- type entier dont la valeur est un bit64
entier complémentaire à deux signé et dont la valeur par défaut estzéro
. De-9223372036854775808
à9223372036854775807
(-263 à 263 - 1), inclus.char
- Type entier Sa valeur est un entier non signé de16
bits, représentant le point de codeUnicode
dans le plan multilingue de base, codé enUTF-16
, et sa valeur par défaut estnull
Point de code(\u0000
). De0
à65535
.float
- Type à virgule flottante Sa valeur est entièrement conforme au format32
bits IEEE 754 binaire32, et la valeur par défaut estzéro positif
.double
- Type à virgule flottante Sa valeur est exactement la même que la valeur au format64
bits IEEE 754 binaire64, et la valeur par défaut estzéro positif
.
Normes détaillées
Définition du type
Les types complexes seront traités par le compilateur pour garantir la simplicité et l’efficacité de la machine virtuelle. Les types simples seront directement pris en charge par la machine virtuelle.
Voici les 6
types de base définis par la machine virtuelle AQ
:
Les types non directement pris en charge incluent
entier non signé
,adresse mémoire (pointeur)
,chaîne
, etc. Ces types seront implémentés au niveau ducompilateur
. Pour lesmachines virtuelles
, ces types sont implémentés indirectement.
null
-0x00
- type vide
Les types vides représentent uniquement des types inconnus ou des types qui n’ont pas besoin d’être utilisés (par exemple : pas de retour). Aucune longueur.byte
-0x01
-1
octet (8
bit) type entier signé
Stocké dans le complément à deux. Généralement utilisé pour stockerbool
ouchar
. De-128
à127
(-27 à 27 - 1), inclus.int
-0x02
-4
octets (32
bits) de type entier signé
Stocké dans le complément à deux. De-2147483648
à2147483647
(-231 à 231 - 1), inclus.long
-0x03
-8
octets (64
bits) type entier signé
Stocké dans le complément à deux. « L’adresse mémoire (pointeur) » est également stockée à l’aide de ceci. Sa valeur est un bit64
entier complémentaire à deux signé et sa valeur par défaut estzéro
. De-9223372036854775808
à9223372036854775807
(-263 à 263 - 1), inclus.float
-0x04
-4
octets (32
bits) type à virgule flottante simple précision
Adopte la norme « ISO/IEC 60559 Technologies de l’information – Systèmes à microprocesseurs – Arithmétique à virgule flottante ».double
-0x05
-8
octets (64
bits) type à virgule flottante double précision
Adopte la norme « ISO/IEC 60559 Technologies de l’information – Systèmes à microprocesseurs – Arithmétique à virgule flottante ».
Code complémentaire
Définition
Le « complément » est la représentation des nombres signés dans les ordinateurs.
méthode
Le code complémentaire
des nombres positifs
et 0
est le nombre lui-même plus le bit le plus élevé 0. Le complément
d’un nombre négatif
consiste à inverser sa valeur absolue au niveau du bit et à ajouter 1.
Norme à virgule flottante
Définition
La Norme sur les nombres à virgule flottante
adopte la norme ISO/IEC 60559 Technologies de l'information — Systèmes à microprocesseurs — Arithmétique à virgule flottante
. Cette norme est également appelée « Norme arithmétique binaire à virgule flottante IEEE (IEEE 754) »
Site officiel : https://www.iso.org/standard/80985.html
méthode
La valeur réelle
d’un nombre à virgule flottante
est égale au bit de signe
multiplié par la valeur de décalage de l'exposant
multipliée par la valeur fractionnaire
. Pour des définitions détaillées, voir la norme ISO/IEC 60559 Technologies de l'information — Systèmes à microprocesseurs — Arithmétique à virgule flottante
.
32
bits numéro à virgule flottante
| Longueur de bit | Nom | Numéro de bit | | ------ | ------ | | 1 | Bit de signe | | 8 | Nombre | 30 à 23 valeur positive (taille réelle de l’exposant + 127) | | 23 | Chiffres valides | Numéro de 22 à 0 chiffres (en commençant par 0 en partant de la droite) |
64
bits numéro à virgule flottante
| Longueur de bit | Nom | Numéro de bit | | ------ | ------ | | 1 | Bit de signe | | 11 | Nombre | 62 à 52 valeur positive (taille réelle de l’exposant + 1023) | | 52 | Chiffres valides | Nombres de 51 à 0 (en commençant par 0 en partant de la droite) |
Code complet de types.h
:
Il existe également des codes associés pour le « type ». Voici le code 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
Nous travaillons plus dur pour développer
AQ Virtual Machine
. Si vous souhaitez en savoir plus ou participer aux travaux de développement, veuillez suivre notre site officiel : https://www.axa6.com et Github : https://github.com/aq-org/AQ.
Cet article est publié sur la base de la licence AQ : https://github.com/aq-org/AQ/blob/main/LICENSE Si nécessaire, veuillez l’adapter ou le réimprimer selon la licence AQ.