【问题标题】:Is Swift the only (mainstream) language with overflow checking arithmetic?Swift 是唯一具有溢出检查算法的(主流)语言吗?
【发布时间】:2024-05-21 08:15:02
【问题描述】:
我今天开始学习 Swift 语言。我倾向于基本和高级操作员。
对我来说,Swift 中的所有默认算术运算都会针对上溢/下溢进行检查这一事实有点令人惊讶。
还有其他主流语言有这个功能吗?
Swift 运行时的算法是否会因此而成为次优(性能方面)?
为什么他们在语言中包含这个功能,如果它很好,为什么其他人还没有使用它?
【问题讨论】:
-
这取决于你所说的主流是什么意思,但Pascal 一直都有算术溢出检查(以及数组边界检查)。
标签:
performance
swift
language-agnostic
arithmetic-expressions
【解决方案1】:
性能
这种验证必然会产生成本。在最低级别,导致溢出的操作需要单个 CPU 操作。在此操作期间检查是否存在溢出需要至少再进行一次操作(例如,使用考虑溢出标志的jump operations(分支)。
请注意,根据实际代码,可能有很多优化可以在编译期间完成,以避免对每个操作进行耗时的检查(简单示例:32 位 0 + 任何短不能溢出) .
所以,是的,包含检查不是最佳选择。
为什么
一些语言包括这种检查来减轻程序员的负担。如果程序员不用自己检查,就不会犯不检查的错误。如果使用给定语言的程序员不能犯某种类型的错误,那么该语言的可靠性就会提高一点。
至于为什么其他一些语言不包括检查...不同的语言设计者有不同的理念。对于某些人来说,重要的是允许程序员创建与理论上一样快的程序。对于其他一些人来说,帮助程序员编写正确且健壮的程序更为重要。例如,C/C++ 以渲染超快程序而著称,而 Ada 甚至在您的程序很可能正确之前都不编译。
有时这是哲学问题,有时是需求问题。在小型微控制器(内存小、时钟慢)上,您不希望有太多的自动检查,因为它可能会显着减慢程序的执行速度。
其他语言
Here's a small table 关于语言处理(或不处理)整数溢出的不同方式。有些语言把它留给程序员。有些人提出了一个例外。有些会更改数据类型以无错误地接受结果(例如:int 为 long,long 为 BigInteger)。