Стандарт оставляет «определенное» поведение неопределенным, чтобы разрешить множество реализаций, не обременяя эти реализации накладными расходами на обнаружение «определенных» ситуаций или не обременяя программиста ограничениями, необходимыми для предотвращения возникновения таких ситуаций в первую очередь. .
Было время, когда избежание этих издержек было основным преимуществом C и C ++ для огромного числа проектов.
Компьютеры теперь в несколько тысяч раз быстрее, чем они были при изобретении C, и такие издержки, как постоянная проверка границ массивов или наличие нескольких мегабайт кода для реализации изолированной среды выполнения, не кажутся большое дело для большинства проектов. Кроме того, стоимость (например) переполнения буфера увеличилась на несколько факторов, теперь, когда наши программы обрабатывают много мегабайт потенциально вредоносных данных в секунду.
Поэтому несколько разочаровывает тот факт, что не существует языка, который обладает всеми полезными функциями C ++ и который, кроме того, обладает тем свойством, что определяется поведение каждой программы, которая компилируется (зависит от поведения конкретной реализации). Но только в некоторой степени - на самом деле в Java не так уж сложно написать код, поведение которого настолько запутанно, что из POV отладки, если не безопасности, он также может быть неопределенным. Также небезопасно писать небезопасный код Java - просто небезопасность обычно ограничивается утечкой конфиденциальной информации или предоставлением неправильных привилегий над приложением, а не передачей полного контроля над процессом ОС, в котором работает JVM.
Таким образом, я вижу, что хорошая программная инженерия требует дисциплины на всех языках, разница в том, что происходит, когда наша дисциплина терпит неудачу, и то, сколько нам платят другие языки (в производительности и занимаемой площади, а функции C ++ вам нравятся ) для страхования от этого. Если страховка, предоставленная другим языком, того стоит для вашего проекта, возьмите ее. Если за функции, предоставляемые C ++, стоит платить с риском неопределенного поведения, возьмите C ++. Я не думаю, что нужно много спорить, как если бы это было глобальное свойство, которое одинаково для всех, оправдывают ли преимущества C ++ затраты. Они оправданы в рамках технического задания для дизайна языка C ++, который заключается в том, что вы не платите за то, что не используете. Следовательно, правильные программы не должны выполняться медленнее, чтобы неправильные программы получали полезное сообщение об ошибке вместо UB, и большую часть времени поведение в необычных случаях (например, << 32
32-битного значения) не должно определяться (например, в результате 0), если это потребует явной проверки необычного случая на оборудовании, которое комитет хочет поддерживать C ++ «эффективно».
Посмотрите на другой пример: я не думаю, что преимущества производительности профессионального компилятора Intel C и C ++ оправдывают затраты на его покупку. Следовательно, я не купил это. Это не значит, что другие сделают те же вычисления, что и я, или что я всегда буду делать такие же вычисления в будущем.