为什么我们使用显式数据类型? (从低层次来看)

Why do we use explicit data types? (from a low level point of view)

当我们查看一些基本数据类型时,例如 char 和 int,我们知道 char 只是一个无符号字节(取决于语言),int 只是一个带符号的双字,bool 只是一个char 只能是 1 或 0 等。我的问题是,为什么我们在编译语言中使用这些类型,而不是仅仅声明一个类型为 byte、dword 等的变量,因为应用于上述类型的操作非常多都一样,一旦你区分有符号和无符号数据以及浮点数据?

延伸题意,在C语言中,if和while语句可以将boolean值作为输入,通常以char形式存储,这就需要显式的boolean类型。

实际上,这两段代码在二进制级别应该是等价的:

int main()
{
    int x = 5;
    char y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

-

signed dword main()
{
    signed dword x = 5;
    byte y = 'c';
    printf("%d %c\n", x - 8, y + 1);
    return 0;
}

//outputs: -3 d

My question is, why do we use these types in compiled languages

使代码与目标无关。某些平台只有高效的 16 位整数,强制您的变量始终为 32 位会使您的代码在为此类平台编译时无缘无故地变慢。或者您的目标可能是 36 位整数,而严格的 32 位类型需要额外的指令才能实现。

您的问题听起来非常以 x86 为中心。 x86 不是唯一的体系结构,对于大多数语言而言,这不是语言设计者所考虑的一种。

在 x86 时代设计的更新的语言在台式机和服务器上广泛使用,被设计为可移植到其他 ISA,例如 8 位 AVR,其中 32 位 int 需要 4 16 位寄存器与 2 int.

编程语言定义了一个 "abstract" 数据模型,计算机设计者可以自由地实现他的方式。例如,没有任何东西要求将布尔值存储在一个字节中,它可以 "packed" 作为一个位与其他位一起存储。如果你仔细阅读 C 标准,你会注意到 char 没有定义的大小。

[有趣的是,我记得以前 FORTRAN 变量(包括整数、浮点数和布尔值)存储在 IBM 机器上的 72 位上。]

语言设计者应该对机器架构施加一些限制,以便为漂亮的设计留出机会。事实上,语言没有"low level",它们隐含地描述了一个不依赖于特定硬件的虚拟机(它可以用齿轮和绳索来实现)。

据我所知,只有 ADA 语言详细说明了算术的所有特征,但没有达到每个字强制执行位数的程度。


忽略布尔类型是 C 语言中最可悲的设计决策之一。我迟到 C99 才整合它:-(

另一个可悲的决定是不再将 int 类型视为自然适合机器字的类型(并且在当前的 PC 中应该变成 64 位)。

高级语言的重点是提供一些与机器细节的隔离。所以,我们说的是 "integers",而不是一些特定数量的内存字节。然后,该实现将更高级别的类型映射到最适合目标硬件的任何内容上。

而且不同的 4 字节类型有不同的语义:对于整数,有符号与无符号对于某些 类 程序很重要。

我知道这是一道 C 题,关于 C 有多高级或多不高级是有争议的;但它至少可以跨机器架构移植。

并且,在您的示例中,您假设 'int' 是 32 位。语言中没有任何内容说明必须为真。它并不总是正确的,在最初的 PDP-11 实施中肯定不是正确的。现在,例如,在 64 位机器上 'int' 是 64 位可能是合适的。

请注意,语言具有 "integer" 等类型并非一成不变。BLISS 是一种与 C 处于同一概念级别的语言,其机器字是唯一的内置数据类型。