· Blog · 11 min read
Определение типа виртуальной машины AQ — AQ
Поскольку разные системы, оборудование и другие внешние условия имеют разную поддержку и определения памяти, чтобы виртуальная машина AQ соответствовала требованиям кроссплатформенной работы, важно разработать единый стандарт типа. В этой статье определяются и стандартизируются типы виртуальных машин AQ, чтобы гарантировать нормальную работу виртуальных машин AQ в разных системах.

Введение
Поскольку разные «системы», «аппаратное обеспечение» и другие внешние условия имеют разную поддержку и определения «памяти», для того, чтобы «виртуальная машина AQ» отвечала требованиям кроссплатформенной работы, необходимо разработать унифицированный стандарт «типа». В этой статье определяются и стандартизируются типы виртуальных машин AQ, чтобы гарантировать нормальную работу виртуальных машин AQ в разных системах.
Идеи дизайна
Прежде всего, чтобы добиться упрощения «типов» и повышения эффективности работы, конструкция «родных типов» («типов», которые напрямую поддерживаются виртуальной машиной без определения через код) должна быть такой: как можно меньше. Поэтому для связанных сложных типов, таких как «перечисление», «структура» и т. д., мы разрабатываем их на уровне «компилятора», чтобы уменьшить количество «типов» и «сложность» «виртуальной машины».
Согласно определению
type
вAqvmMemory_Memory
вmemory.h
, каждыйuint8_t
хранит2
типа, поэтому количество
typesдолжно быть между
0x00-
0x0F` (16 ) между.
Во-вторых, исследуя «типы» других «языков программирования», мы обобщили общие «типы». Мы разработали следующие «типы» для достижения производительности и простоты «виртуальной машины». `баланс.
- ноль - пустой тип
- байт -
1
байтовый целочисленный тип со знаком - int -
4
-байтовый целочисленный тип со знаком - long - 8-байтовый целочисленный тип со знаком
- float -
4
тип с плавающей запятой одинарной точности - double -
8
байтовый тип с плавающей запятой двойной точности
Наконец, мы разработали подробные «стандарты» для «типов», чтобы гарантировать, что «виртуальная машина AQ» может обеспечить «кроссплатформенную» работу.
Чтобы сократить определение типа «виртуальной машины», «беззнаковые типы» будут реализованы на уровне «компилятора».
Определения типов для других языков программирования
Чтобы сделать «типы» AQ более обширными и простыми для понимания разработчиками, мы обращаемся к определениям «типов» существующих распространенных «языков программирования».
Определенные ниже «базовые типы» представляют собой общие типы «данных», такие как целые числа, числа с плавающей запятой и пустые типы. Он выполняет базовую работу по хранению данных или имеет особое значение.
С
Текущий стандарт «C» — «ISO/IEC 9899:2018 Информационные технологии. Языки программирования — C». Поскольку авторские права на этот стандарт принадлежат ISO (Международной организации по стандартизации) и IEC (Международной электротехнической комиссии), во избежание споров об авторских правах мы суммировали определения «типов». То же самое ниже.
Официальный сайт: https://www.iso.org/standard/74528.html
_Bool
— объект, объявленный как тип_Bool
, достаточно велик для хранения значений0
и1
.(unsigned) char
— тип символа. Объект, объявленный как тип char, достаточно велик для хранения любого члена базового набора символов выполнения. Если член базового набора символов выполнения хранится в объекте char, его значение гарантированно будет неотрицательным. Если в символьном объекте хранятся какие-либо другие символы, результирующее значение определяется реализацией, но должно находиться в диапазоне значений, которые могут быть представлены в этом типе.signed char
— тип знакового символа.short int
- расширенный целочисленный тип со знаком.unsigned short int
— расширенный беззнаковый целочисленный тип.int
— расширенный стандартный целочисленный тип со знаком.unsigned int
– стандартный беззнаковый целочисленный тип.long int
— расширенный целочисленный тип со знаком.unsigned long int
– расширенный целочисленный тип без знака.long long int
– расширенный целочисленный тип со знаком.unsigned long long int
— расширенный беззнаковый целочисленный тип.float
- Тип с плавающей запятой. Набор значений типа float является подмножеством набора значений типа double.double
- тип с плавающей запятой. Набор значений типа double — это подмножество набора значений типа long double.long double
— тип с плавающей запятой.void
. Типvoid
содержит набор нулевых значений. Это неполный тип объекта, который не может быть реализован.
Кроме того, в C есть и другие небазовые типы, такие как типы перечисления (типы enum), типы указателей и т. д. Это не будет обсуждаться при проектировании «виртуальной машины».
C++
и другие варианты C
Текущий стандарт C++ — ISO/IEC 14882:2020 Языки программирования — C++. Поскольку C++
и другие варианты C
по сути являются теми же типами, что и C
, они больше не указаны.
###Питон Последняя официальная версия Python — 3.12.4. Встроенные типы в документации Python 3.12.4 документируют стандартные типы, встроенные в интерпретатор Python.
Основными встроенными типами являются «Число», «Последовательность», «Карта», «Класс», «Экземпляр» и «Исключение». Из-за нехватки места контент, отличный от «базовых типов», здесь обсуждаться не будет.
Ссылка на источник: https://docs.python.org/zh-cn/3/library/stdtypes.html
int
- integerint
имеет бесконечную точность. Немодифицированные целочисленные литералы (включая шестнадцатеричные, восьмеричные и двоичные числа) создают целые числа.float
— число с плавающей запятойFloat
запятаяобычно реализуется в
Cс использованием
double`. Числовые литералы, содержащие десятичную точку или знак степени, создают число с плавающей запятой.комплекс
- Комплексное число Комплексное число состоит из “действительной части” и “мнимой части”, каждая часть представляет собой “число с плавающей запятой”. Добавляя «j» или «J» после числового литерала, вы можете получить «мнимое число» (комплексное число с действительной частью нуля). Добавьте его к «целому» или «числу с плавающей запятой». получить «мнимое число» «комплексное число» с действительной и мнимой частью.bool
- BooleanBoolean
также являетсяподтипом
integer
. Логический объект, представляющий истинное значение. Тип bool имеет только два экземпляра констант: True и False.list
- ListList
— этоизменяемая последовательность
, обычно используемая для хранениянаборов
похожих элементов (где точная степень сходства будет варьироваться в зависимости от приложения).tuple
- TupleTuple
— этонеизменяемая последовательность
, обычно используемая для хранениянаборов из нескольких элементов
разнородных данных (например,binary
, генерируемых встроенной функциейenumerate()
). группа`). «Кортежи» также используются в ситуациях, когда требуется «неизменяемая последовательность» однородных данных (например, позволяющая хранить экземпляры «set» или «dict»).range
. Типrange
представляет собойнеизменяемую
числовую последовательность
, обычно используемую для повторения заданного количества раз в циклеfor
.str
- Тип текстовой последовательности Для обработки текстовых данных вPython
вы используете объектstr
, также называемыйstring
. «Строка» — это «неизменяемая последовательность» кодовых точек Unicode.bytes
. Объектbytes
представляет собойнеизменяемую последовательность
отдельных байтов. Поскольку многие основные двоичные протоколы основаны на текстовой кодировке ASCII, объект bytes предоставляет некоторые методы, которые доступны только при работе с ASCII-совместимыми данными и во многих функциях тесно связаны со строковыми объектами.byteearray
. Объектbyteearray
является изменяемым аналогом объектаbytes
.memoryview
- Memory view Объектmemoryview
позволяет коду Python получать доступ к внутренним данным объекта, если объект поддерживаетбуферный протокол
без создания копии.set
- set type Объектset
представляет собойнеупорядоченный набор из нескольких элементов
, состоящий из уникальныххешируемых
объектов. Обычное использование включает обнаружение членства, удаление дубликатов из последовательностей и математические вычисления множеств, такие как пересечение, объединение, разность, симметричная разность и т. д. Типset
является изменчивым, и его содержимое можно изменить с помощью таких методов, какadd()
иremove()
. Поскольку это изменяемый тип, он не имеет хеш-значения и не может использоваться в качестве ключа в словаре или элемента в коллекции.frozenset
- Тип коллекции Типfrozenset
являетсянеизменяемым
ихэшируемым
. Его содержимое не может быть изменено после его создания, поэтому его можно использовать какключ
словаря
или другоеЭлемент
набора
.dict
- Тип сопоставления Объектmapping
сопоставляет хешируемое значение с любым объектом. «Карта» — это «изменяемый объект». В настоящее время существует только один стандартный тип отображения «словарь».GenericAlias
. ОбъектыGenericAlias
обычно создаются путёмизвлечения
класса
. Чаще всего они используются с «классами-контейнерами», такими как «list» или «dict». Например, объект GenericAlias list[int] создается путем извлечения класса list с параметром int. Основное назначение объектов GenericAlias — аннотация типа.union
.union
объектсодержит значение выполнения операции
| (побитовое ИЛИ)для нескольких
типовых объектов. Эти типы в основном используются для «аннотаций типов». По сравнению с typing.Union, выражения
union type` обеспечивают более краткий синтаксис подсказки типа.
###Джава «Спецификация» «JVM (виртуальная машина Java)» — это «Спецификация виртуальной машины Java®», последняя версия — «Java SE 22 Edition», а дата выпуска — «2024-02-09». По сравнению с «определением типа» на уровне «компилятора» других языков ситуация с «JVM» больше соответствует конструкции «виртуальной машины». При этом типы JVM делятся на примитивные типы и ссылочные типы. В связи с потребностями разработки виртуальной машины мы выбрали для обсуждения примитивные типы.
Кроме того, у Java также есть спецификация, которая называется «Спецификация языка Java, Java SE 22 Edition», ссылка на HTML: https://docs.oracle.com/javase/specs/jls/se22/ html. /index.html Ссылка PDF
: https://docs.oracle.com/javase/specs/jls/se22/jls22.pdf. Из-за особых потребностей разработки «виртуальных машин» в этой статье мы решили изучить «определение типа» в «JVM», а не «определение типа» в языке «Java».
Ссылка на источник (HTML): https://docs.oracle.com/javase/specs/jvms/se22/html/jvms-2.html#jvms-2.3
Ссылка на источник (PDF): https://docs.oracle.com/javase/specs/jvms/se22/jvms22.pdf
byte
— целочисленный тип, значение которого представляет собой8
-битное знаковое целое число с дополнением до двух, а его значение по умолчанию равнонолю
. От-128
до127
(от -27 до 27 – 1) включительно.short
— целочисленный тип, значение которого представляет собой16
-битное знаковое дополнение до двух, а его значение по умолчанию —ноль
. От-32768
до32767
(от -215 до 215 – 1) включительно.int
- целочисленный тип, значение которого представляет собой32
битное знаковое дополнение до двух, а его значение по умолчанию равнонолю
. От-2147483648
до2147483647
(от -231 до 231 – 1) включительно.long
— целочисленный тип, значение которого представляет собой64
битное знаковое дополнение до двух и чье значение по умолчанию равнонолю
. От-9223372036854775808
до9223372036854775807
(от -263 до 263 – 1) включительно.char
- Целочисленный тип Его значение представляет собой 16-битное целое число без знака, представляющее кодовую точку Unicode в базовой многоязычной плоскости, закодированное какUTF-16
, а его значение по умолчанию —null
Кодовая точка(\u0000
). От «0» до «65535».float
- Тип с плавающей запятой Его значение полностью соответствует32
-битному формату IEEE 754binary32, а значением по умолчанию являетсяположительный ноль
.double
— Тип с плавающей запятой Его значение точно такое же, как значение в64
-битном формате IEEE 754binary64, а значение по умолчанию —положительный ноль
.
Подробные стандарты
Определение типа
Сложные типы будут обрабатываться компилятором, чтобы обеспечить простоту и эффективность виртуальной машины. Простые типы будут напрямую поддерживаться виртуальной машиной.
Ниже приведены 6
базовых типов, определенных виртуальной машиной AQ
:
Типы, которые не поддерживаются напрямую, включают «целое число без знака», «адрес памяти (указатель)», «строку» и т. д. Эти типы будут реализованы на уровне компилятора. Для «виртуальных машин» эти типы реализуются косвенно.
null
-0x00
- пустой тип
Пустые типы представляют только неизвестные типы или типы, которые не нужно использовать (например: нет возврата). Никакой длины.byte
-0x01
-1
байт (8
бит) целочисленный тип со знаком
Хранится в двойном дополнении. Обычно используется для храненияbool
илиchar
. От-128
до127
(от -27 до 27 – 1) включительно.int
-0x02
-4
байт (32
бит) целочисленный тип со знаком
Хранится в двойном дополнении. От-2147483648
до2147483647
(от -231 до 231 – 1) включительно.long
-0x03
-8
байт (64
бит) целочисленный тип со знаком
Хранится в двойном дополнении.Адрес памяти (указатель)
также сохраняется с использованием этого параметра. Его значение представляет собой64
битное целое число со знаком, дополняемое до двух*, а его значение по умолчанию –ноль
. От-9223372036854775808
до9223372036854775807
(от -263 до 263 – 1) включительно.float
-0x04
-4
байт (32
бит) тип с плавающей запятой одинарной точности
Принимает стандарт ISO/IEC 60559 «Информационные технологии. Микропроцессорные системы. Арифметика с плавающей запятой».double
-0x05
-8
байт (64
бит) тип двойной точности с плавающей запятой
Принимает стандарт ISO/IEC 60559 «Информационные технологии. Микропроцессорные системы. Арифметика с плавающей запятой».
Дополняющий код
Определение
«Дополнение» — это представление чисел со знаком в компьютерах.
метод
«Дополнительный код» для «положительных чисел» и «0» — это само число плюс старший бит 0. «Дополнением» к «отрицательному числу» является поразрядное изменение его абсолютного значения и добавление 1.
Стандарт с плавающей запятой
Определение
«Стандарт чисел с плавающей запятой» соответствует стандарту «ISO/IEC 60559 «Информационные технологии — микропроцессорные системы — арифметика с плавающей запятой». Этот стандарт также называется «Стандарт IEEE двоичной арифметики с плавающей запятой (IEEE 754)»
Официальный сайт: https://www.iso.org/standard/80985.html
метод
«Фактическое значение» «числа с плавающей запятой» равно «биту знака», умноженному на «значение смещения экспоненты», умноженное на «дробное значение». Подробные определения см. в стандарте «ISO/IEC 60559 Информационные технологии. Микропроцессорные системы. Арифметика с плавающей запятой».
32
бит число с плавающей запятой
Длина бита | Имя бита |
---|---|
1 | Знаковый бит 31 |
8 | Число |
23 | Допустимые цифры |
64
бит число с плавающей запятой
Длина бита | Имя бита |
---|---|
1 | Знаковый бит |
11 | Число |
52 | Допустимые цифры |
types.h
полный код:
Существуют также соответствующие коды для type
. Ниже приведен код 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
Мы усердно работаем над разработкой «Виртуальной машины AQ». Если вы хотите получить дополнительную информацию или принять участие в разработке, посетите наш официальный сайт: https://www.axa6.com и Github: https://github.com/aq-org/AQ.
Эта статья опубликована на основе лицензии AQ: https://github.com/aq-org/AQ/blob/main/LICENSE. При необходимости адаптируйте или перепечатайте ее в соответствии с лицензией AQ.