第 1 部分。关于定义
首先,您将什么语言和实现称为“pascal”?如果您谈论的是ISO Pascal,那么它在很多年前就已经死了。如果您在谈论其他语言或实现,请提供更多信息。
其次(正如 Teun D 已经提到的),术语强类型没有定义。查看有关强类型的 Wikipedia 文章。
然而,在计算的短暂历史中,这些术语被赋予了如此广泛的含义,以至于通常很难脱离上下文了解单个作者在使用它们时的含义。
假设我们遵循 Luca Cardelli 的文章 Typeful Programming 在维基百科页面上描述的定义:
Luca Cardelli 的文章 Typeful Programming 将强类型简单地描述为没有未经检查的运行时类型错误。换句话说,没有未经检查的运行时错误被称为安全性或类型安全性;托尼霍尔的早期论文称这种财产安全。
无论如何,所描述的行为不能归类为静态(或安全)类型规则。我个人真的不喜欢这个嗯......嗯,这不是一个功能,这是一个错误。=)
第 2 部分。答案
我认为问题不在于这种弱类型,而在于某些语言中可用的多种整数类型。
除了著名的 C 和 C++ 之外,还有其他语言应用这种语法吗?
我认为几乎所有具有各种整数类型的静态类型语言都有这种行为。早年拥有这些 SHORTINT 和所有爵士乐以节省内存是个好主意。但是现在几乎每台 PC 都有大约 1 GB 和更多的 RAM...假设我们有 100 万个 4 字节整数而不是 2 字节 SHORTINT。它只有大约 4 MB 的 RAM,而不是 2 MB。我认为没有您描述的所有这些奇怪行为是合理的价格。
快速浏览一下 Wirth 的 Oberon-07(语言报告,PDF)。只有一种整数类型 - 32 位 INTEGER。
也可以提到具有 int 类型的 Python(或者可能是其他一些现代动态类型语言),它表示无限范围内的数字,仅受可用(虚拟)内存的影响。
所以你可以看到趋势——各种整数类型是 70 年代的生存之道。=)
这种语法有什么优点?
优点是(可能)减少了冗长。这种静态类型语言已经非常冗长,所以如果我们决定像 Wirth 在 Oberon-2 中所做的那样添加一些显式整数类型转换(看看 SHORT() 和 LONG() 函数),它们会变得更加冗长。作为一种折衷方案,可以允许隐式转换。同样在许多语言中,整数类型变量的实际大小并不固定,并且从一种实现到另一种实现不同。唯一可用的信息是 size(shortint) <= size(int)。在相等的情况下,显式转换看起来很奇怪。
第 3 部分。酒神颂到 Oberon-2 =)
顺便说一句,不要对帕斯卡过于警惕。它已经死了,但在Oberon-2 Niklaus Wirth 纠正了他的错误。
在语言报告的第 6 章中,您可以找到有关类型的信息。对于我们的讨论,重要的声明是:
类型 3 到 5 是整数类型,类型 6 和 7 是实类型,它们一起被称为数字类型。它们形成一个层次结构;较大的类型包括较小的类型(的值): LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINT
在第 9 章中,我们可以阅读有关作业的内容:
表达式必须与变量赋值兼容
最后在附录 A 中:
分配兼容
如果满足以下条件之一,则 Te 类型的表达式 e 是与 Tv 类型的变量 v 兼容的赋值:
Te和Tv是同一类型;
Te 和 Tv 是数字类型,Tv 包括 Te;
...
所以我们在这里。您不能将 INTEGER 表达式分配给 SHORTINT 变量。如果您有兴趣,还可以查看Component Pascal,Oberon-2 的次要变体和改进。BlackBox Component Builder是一个适用于 Windows 的 IDE。
回应贾斯汀史密斯的评论。
我很惊讶他说较大的类型包括较小的类型(的值):LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINT,因为有些 LONGINTS 不能表示为“REAL”。
我对你的说法有点困惑
有些 LONGINTS 不能表示为“REAL”
实际上在我上面提到的机器IDE上有
MAX(LONGINT) = 9223372036854775807
MAX(REAL) = 1.797693134862316E+308
因此,您可以将每个 LONGINT 表示为 REAL 数。但表示可能并不准确。我认为您实际上是在谈论它,但我们在这里谈论的是不同的整数类型转换。REAL 和 INTEGER 之间的转换是另一回事。糟糕而令人困惑的命名的故事。从数学的角度来看,REAL 数字实际上并不是实数。它们是一些近似表示。可以使用有理数逼近(将分子和分母存储为整数),但常用的方法是使用浮点逼近。IEEE 浮点算术标准(也称为 IEEE 754)是最广泛使用的浮点计算标准。
每个人都应该知道 REAL 数字不是实数,而是 IEEE 754 标准中描述的数字。每个人都应该阅读“每个计算机科学家应该知道的关于浮点运算的知识”以澄清一些观点。
但这是另一个故事... =)