· Blog  · 17 min read

AQ虚拟机的类型定义 - AQ

由于不同的系统、硬件等外部条件对于内存有不同的支持和定义,因此为了使AQ虚拟机满足跨平台运行的要求,设计统一的类型标准是必不可少的。本文对于AQ虚拟机的类型进行了定义和规范,以确保在不同系统上的AQ虚拟机均能正常运行。

由于不同的系统、硬件等外部条件对于内存有不同的支持和定义,因此为了使AQ虚拟机满足跨平台运行的要求,设计统一的类型标准是必不可少的。本文对于AQ虚拟机的类型进行了定义和规范,以确保在不同系统上的AQ虚拟机均能正常运行。

简介

由于不同的系统硬件等外部条件对于内存有不同的支持和定义,因此为了使AQ虚拟机满足跨平台运行的要求,设计统一的类型标准是必不可少的。本文对于AQ虚拟机类型进行了定义和规范,以确保在不同系统上的AQ虚拟机均能正常运行。

设计思路

首先,为实现类型的精简和更高的运行效率,对于原生类型(不通过代码定义,虚拟机直接支持的类型)的设计应尽可能少。因此对于相关的复杂类型,如枚举结构体等,我们在编译器层面开发,减少虚拟机类型数量和复杂度

根据memory.h中对于AqvmMemory_Memorytype的定义,每一个uint8_t存储2类型,因此类型的数量应在0x00-0x0F(16个)之间。

其次,通过对于其它编程语言类型的研究,总结了常见的类型,我们设计了以下几种类型,以便于在虚拟机性能简洁达到平衡。

  1. null - 空类型
  2. byte - 1字节有符号整数类型
  3. int - 4字节有符号整数类型
  4. long - 8字节有符号整数类型
  5. float - 4字节单精度浮点类型
  6. double - 8字节双精度浮点类型

最后,我们为类型设计了详细的标准,以确保AQ虚拟机能够实现跨平台运行。

为了减少虚拟机的类型定义,无符号类型将在编译器层面被实现。

其它编程语言类型定义

为了使AQ类型更加广泛且易于被开发人员掌握,我们参考了现有的常见的编程语言类型定义。
此处定义下文中的基础类型为整数、浮点数、空类型等一般的数据类型。其承担基本的数据存储工作或具有特殊的意义。

C

现行的C标准是ISO/IEC 9899:2018 Information technology — Programming languages — C。由于该标准版权归属ISO(国际标准化组织)IEC(国际电工委员会),因此为避免版权纠纷,我们就其中的类型定义进行了归纳总结。下同。

官方网址:https://www.iso.org/standard/74528.html

  1. _Bool - 声明为_Bool类型的对象足够大以存储值01
  2. (unsigned) char - 字符类型。声明为类型char的对象足够大,可以存储基本执行字符集的任何成员。如果基本执行字符集的成员存储在char对象中,则其值保证为非负值。如果任何其他字符存储在一个字符对象中,则结果值为implementation-defned,但应在该类型中可以表示的值范围内。
  3. signed char - 有符号字符类型。
  4. short int - 扩展有符号整数类型。
  5. unsigned short int - 扩展无符号整数类型。
  6. int - 扩展标准有符号整数类型。
  7. unsigned int - 标准无符号整数类型。
  8. long int - 扩展有符号整数类型。
  9. unsigned long int - 扩展无符号整数类型。
  10. long long int - 扩展有符号整数类型。
  11. unsigned long long int - 扩展无符号整数类型。
  12. float - 浮点类型。float 类型的值集是double类型的一组值的子集。
  13. double - 浮点类型。double 类型的值集是long double类型的一组值的子集。
  14. long double - 浮点类型。
  15. void - void类型包含一组空值;它是一个不完整的对象类型,无法实现。

除此之外,C还有其它非基础类型,如枚举类型(enum类型),指针类型等。在虚拟机的设计中不作讨论。

C++ 及其它C变种

现行的C++标准是ISO/IEC 14882:2020 Programming languages — C++。由于C++及其它C变种与C的类型基本一致,因此不再列出。

Python

最新的Python正式版本是3.12.4。在Python 3.12.4 Documentation中的内置类型记载了Python解释器中内置的标准类型。
其中的主要内置类型有数字序列映射实例异常。由于篇幅原因,在此对于除基础类型外的内容不作讨论。

源链接:https://docs.python.org/zh-cn/3/library/stdtypes.html

  1. int - 整数 整数具有无限的精度。未经修饰的整数字面(包括十六进制、八进制和二进制数)产生整数。
  2. float - 浮点数 浮点数通常在C中使用double实现。包含小数点指数符号的数值字面产生浮点数
  3. complex - 复数 复数有实数部分虚数部分,每一部分都是浮点数。在数值字面后面加上jJ,可以得到一个虚数(实数部分为零的复数),将其与整数浮点数相加,可以得到一个包含实数部分虚数部分复数
  4. bool - 布尔型 布尔型也是整数的一种子类型。代表真值的布尔对象。bool类型只有两个常量实例:TrueFalse
  5. list - 列表 列表可变序列,通常用于存放同类项目的集合(其中精确的相似程度将根据应用而变化)。
  6. tuple - 元组 元组不可变序列,通常用于储存异构数据的多项集(例如由enumerate()内置函数所产生的二元组)。元组也被用于需要同构数据的不可变序列的情况(例如允许存储到setdict的实例)。
  7. range - range类型表示不可变数字序列,通常用于在for循环中循环指定的次数。
  8. str - 文本序列类型Python中处理文本数据是使用str对象,也称为字符串字符串是由Unicode码位构成的不可变序列
  9. bytes - bytes对象是由单个字节构成的不可变序列。由于许多主要二进制协议都基于ASCII文本编码,因此bytes对象提供了一些仅在处理ASCII兼容数据时可用,并且在许多特性上与字符串对象紧密相关的方法
  10. bytearray - bytearray对象是bytes对象的可变对应物。
  11. memoryview - 内存视图 memoryview对象允许Python代码访问一个对象的内部数据,只要该对象支持缓冲区协议而无需进行拷贝。
  12. set - 集合类型 set对象是由具有唯一性的hashable对象所组成的无序多项集。 常见的用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集并集差集对称差集等等。set类型是可变的,其内容可以使用add()remove()这样的方法来改变。由于是可变类型,它没有哈希值,且不能被用作字典或其他集合元素
  13. frozenset - 集合类型 frozenset类型是不可变并且为hashable,其内容在被创建后不能再改变,因此它可以被用作字典或其他集合元素
  14. dict - 映射类型 mapping对象会将hashable值映射到任意对象。映射属于可变对象。目前仅有一种标准映射类型字典
  15. GenericAlias - GenericAlias对象通常是通过抽取一个来创建的。它们最常被用于 容器类,如listdict。举例来说,list[int]这个GenericAlias对象是通过附带int参数抽取list类来创建的。GenericAlias对象的主要目的是用于类型标注
  16. union - 联合对象包含了在多个类型对象上执行| (按位或)运算后的值。 这些类型主要用于类型标注。与typing.Union相比,联合类型表达式可以实现更简洁的类型提示语法。

Java

JVM(Java虚拟机)规范The Java® Virtual Machine Specification,最新版本是Java SE 22 Edition,发布日期为2024-02-09。相较与其它语言的编译器层面的类型定义JVM的情况更符合虚拟机的设计。同时JVM类型分为基元类型引用类型,由于虚拟机开发需要,选择了基元类型进行讨论。
除此之外,Java还有一份规范The Java Language Specification, Java SE 22 EditionHTML链接: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

  1. byte - 整数类型 其值是8有符号二进制补码整数,其默认值为。从-128127-2727 - 1),包括在内。
  2. short - 整数类型 其值为16有符号二进制补码整数,其默认值为。从-3276832767-215215 - 1),包括在内。
  3. int - 整数类型 其值为32有符号二进制补码整数,其默认值为。从-21474836482147483647-231231 - 1),包括在内。
  4. long - 整数类型 其值为64有符号二进制补码整数,其默认值为。从 -92233720368547758089223372036854775807-263263 - 1),包括在内。
  5. char - 整数类型 其值为16无符号整数,表示基本多语言平面中的Unicode码位,编码为UTF-16,其默认值为null码位 (\u0000)。从065535
  6. float - 浮点类型 其值完全符合32IEEE 754 binary32格式,默认值为正零
  7. double - 浮点类型 其值与64IEEE 754 binary64格式的值完全一致,默认值为正零

详细标准

类型定义

复杂的类型会有编译器处理以保证虚拟机的简洁和效率,对于简单的类型,则会被虚拟机直接支持。
以下是AQ虚拟机定义的6种基本类型有:

未直接支持的类型包括无符号整数内存地址(指针)字符串等。这些类型将在编译器层面得到实现。对于虚拟机来说,这些类型被间接实现。

  1. null - 0x00 - 空类型
    空类型仅代表未知类型或无需使用的类型(例如:无返回)。没有长度。

  2. byte - 0x01 - 1字节(8位)有符号整数类型
    采用二进制补码存储。一般用于存储boolchar。从-128127-2727 - 1),包括在内。

  3. int - 0x02 - 4字节(32位)有符号整数类型
    采用二进制补码存储。从-21474836482147483647-231231 - 1),包括在内。

  4. long - 0x03 - 8字节(64位)有符号整数类型
    采用二进制补码存储。内存地址(指针)也用此存储。其值为64有符号二进制补码整数,其默认值为。从 -92233720368547758089223372036854775807-263263 - 1),包括在内。

  5. float - 0x04 - 4字节(32位)单精度浮点类型
    采用ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic标准。

  6. double - 0x05 - 8字节(64位)双精度浮点类型
    采用ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic标准。

补码

定义

补码计算机中有符号数的表示方法

方法

正数0补码就是该数字本身再补上最高比特0负数补码则是将其绝对值按位取反再加1

浮点数标准

定义

浮点数标准采用ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic标准。该标准又称IEEE二进制浮点数算术标准(IEEE 754)

官方网址:https://www.iso.org/standard/80985.html

方法

浮点数实际值,等于符号位乘以指数偏移值再乘以分数值。详细定义见ISO/IEC 60559 Information technology — Microprocessor Systems — Floating-Point arithmetic标准。

32浮点数
比特长度名称比特编号
1符号位31
8数字30至23偏正值(实际的指数大小+127)
23有效数字22至0位编号(从右边开始为0)
64浮点数
比特长度名称比特编号
1符号位63
11数字62至52偏正值(实际的指数大小+1023)
52有效数字51至0位编号(从右边开始为0)

types.h完整代码:

对于类型同样有相关代码。以下是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 License:https://github.com/aq-org/AQ/blob/main/LICENSE 发布,如有需要,请根据AQ License进行改编或转载。

Share:
Back to Blog

Related Posts

View All Posts »
一种优秀的虚拟机内存架构 - AQ

一种优秀的虚拟机内存架构 - AQ

虚拟机内存架构直接影响虚拟机的性能和占用。设计一个优秀的架构可以有效提升性能和效率。本文将介绍AQ虚拟机使用的内存架构。

如何从零设计一门编程语言? - AQ

如何从零设计一门编程语言? - AQ

如何从零设计一门编程语言?新型的编程语言应该包括那些部分?本文章将通过AQ语言的设计,详述开发一个编程语言的过程,从零开始设计、开发编译器和相关基础设施,最终完成一门编程语言的构建。

关于AQ官方网站多语言支持的公告 - AQ

关于AQ官方网站多语言支持的公告 - AQ

由于AQ的开发工作日益增加,缺少专业翻译人员以及对于翻译效果不理想等原因,即日起,AQ官方网站多语言版本将暂停实时维护。仅保留英语和中文两种语言支持。