编程模型

过去几年来,FPC 开始支持越来越多使用 Unix 特定 RTL 部件的平台。某种形式的重组是必要的,并且 FPC 正在为更多处理器平台做准备,我决定研究可移植性问题,特别是创建 64 干净的代码,以及对齐和字节顺序。研究 Object Pascal 可移植性的主要原因是 Free Pascal 计划移植到64位平台,如 x86_64,Sparc64 和 PowerPC G5。

创建64位干净代码有点误导,因为它不仅限于64位架构,它是以多种处理器上运行为目的而编写代码的原则。基本原则是只允许某个整数类型和指针之间转换,并且始终具有整数类型(PtrInt),并保证按指针大小缩放。

在 C 中,是标准长度,或者使用新 long 类型。由于指针通常被认为是无符号的,选择与指针兼容的无符号类型似乎是合乎逻辑的。有符号或无符合与 C 语言的兼容性无关紧要,只要整数是用二进制的补码形式编码,并且因为 C 语言和另外一种语言之间的接口是无类型化的。

定义新的 long long 类型原因很简单,允许遗留代码中整数和 long 类型大小相等,以便代码在没有修改的情况下继续工作。

选择一组类型在 C 常见问题中称为编程模型,并命名为 ILP-x, LLP-x 或 LP-x,x为处理器的字大小,通常为32或64。ILP-x 表示整数,long 和指针是 x位宽,LP-x long 和指针是 x 位宽,LLP 是 long long 类型 和 x 指针位宽。

下表列出了一些典型的编程模型:

c类型

objpas

模型大小

ILP32

LP32

LP64

ILP64

LLP64

char

byte/char/smallint

8

8

8

8

8

short

shortint

16

16

16

16

16

int

integer/longint

32

16

32

64

32

long

32

32

64

64

64

long long

32

-(32)

-(64)

-(64)

64

pointer

pointer types

32

32

64

64

64

表中的一点需要解释:

  • 当前(intel系列)PC 处理器的标准编程模型是 ILP32。所有32位操作系统都使用它。

  • long 在 C 语言中的问题是,既有期望指针和 long 具有相同大小程序,也有期望 int 和 long 具有相同大小的程序。兼容性模型 LLP64 旨在通过引入一种与指针(long long)保持兼容的新类型来保持长整型兼容性。

  • long long 类型不存在,除了在 LLP64 中,long long类型在 Object Pascal 中没有等效的类型,必须创建一个新类型,就像 C 一样,由于 Pascal 没有建立 long <-> ptr 等价关系,所以对 long long 的讨论是不成立的,然而,决定创建一个带符号(PtrInt)和无符号(PtrUint)指针类型。

  • LP32 用作 Windows 3.1 的 win-16 API 的模型。

  • 大多数 *nix使用 LP64,主要是为了节省与 ILP64 相比的内存空间,因为使用完整的64位整数几乎不需要并浪费内存。示例:64位 Linux,FreeBSD,NetBSD,OpenBSD。

  • Win64 使用 LLP64 模型,也称为 P64。这个模型保留了 long 和 int 之间的类型兼容性,但在 long 和指针类型之间失去类型兼容性。指针和现有类型之间的任何转换都需要修改。

  • ILP64 是最容易使用的模型,因为它保留了所使用的 ILP32 模型的所有兼容性,除了特定的假设,核心类型是32位。然而这个模型非常耗费内存,并且代码和数据大小都显着增加。通常由商业设备使用,如 IBM AIX。

  • 表中没有 dos 模型,因为 dos 没有内存模型。(在这些模型中,指针不能用单个值表示。尽管 DJGPP 扩展器模型是 ILP32。