3

Сегодня я начал изучать язык Swift. Я склонялся к основным и продвинутым операторам.Является ли Swift единственным (основным) языком с арифметикой проверки переполнения?

Для меня факт, что все арифметические операции по умолчанию в Swift отмечены от overflow/underflow, несколько удивительно.

Есть ли какой-либо другой основной язык с этой функцией?

Возможно ли, что из-за этого может быть субоптимальным (быстродействующим) время от времени?

Почему они включили эту функцию в язык, и если это хорошо, почему другие ее еще не используют?

+3

Это зависит от того, что вы подразумеваете под основной темой, но [Pascal] (http://en.wikipedia.org/wiki/Pascal_ (programming_language)) всегда выполнял арифметическую проверку переполнения (и проверку границ массива тоже). –

ответ

4

Performance

Там же обязательно стоимость такого рода проверки. На самом низком уровне операция, которая вызывает переполнение, выполняет одну операцию ЦП. Проверка наличия или отсутствия переполнения во время этой операции требует, по меньшей мере, еще одной операции (например, с использованием jump operations (разветвление), которые рассматривают флаг переполнения).

Обратите внимание, что в зависимости от фактического кода существует, вероятно, большое количество оптимизаций, которые могут быть выполнены во время компиляции, чтобы избежать временной проверки при каждой операции (простой пример: 32-разрядный 0 + любой короткий не может переполняться).

Итак, да, это неоптимально, чтобы включить проверку.

Почему

Некоторые языки включают этот вид проверки, чтобы снять бремя с программиста. Если программисту не нужно проверять себя, он не может совершить ошибку, не проверяя. Если программисты на определенном языке не могут совершить определенный класс ошибок, репутация языка немного повышается в отношении его надежности.

Что касается того, почему некоторые другие языки не включают проверки ... У разных разработчиков языка есть разные философии. Для некоторых важно, чтобы программисты могли создавать программы, которые так же быстро, как теоретически. Для некоторых других важно, чтобы программисты правильно программировали правильные и надежные программы. Например, C/C++ имеет репутацию рендеринга супер быстрых программ, в то время как Ada имеет репутацию даже не компиляции, пока ваша программа, скорее всего, не верна.

Иногда это вопрос философии, иногда это вопрос потребностей. На небольших микроконтроллерах (небольшая память, медленные часы) вы не хотите иметь слишком много автоматических проверок, потому что это может значительно замедлить выполнение программы.

Другие языки

Here's a small table о сделке по-разному языков (или нет) с целочисленным переполнением. Некоторые языки оставляют это программисту. Некоторые создают исключение. Некоторые из них изменят тип данных, чтобы принять результат без ошибок (например: int to long, long to BigInteger).

Смежные вопросы