это значительно упростило бы синтаксический анализ и компиляцию языка.
Я не понимаю, как. Почему проще разобрать и скомпилировать i < i > i
, если вам требуется выдать диагностику, чем разобрать ее, если вам разрешено делать все, что вы чертовски хорошо, пожалуйста, при условии, что сгенерированный код никаких побочных эффектов?
Компилятор Java запрещает недостижимый код (в отличие от кода без эффекта), что является смешанным благом для программиста и требует от компилятора немного дополнительной работы по сравнению с тем, что на самом деле требуется компилятору C++ (базовая зависимость блоков анализ). Должен ли C++ запрещать недостижимый код? Возможно нет. Несмотря на то, что компиляторы C++, безусловно, выполняют достаточную оптимизацию для выявления недостижимых базовых блоков, в некоторых случаях они могут делать слишком много. Должен ли if (foo) { ...}
быть недопустимым недостижимым блоком, если foo
является ложной константой времени компиляции? Что, если это не константа времени компиляции, но оптимизатор понял, как вычислить значение, должно ли оно быть допустимым, и компилятор должен понимать, что причина, по которой он удаляет ее, зависит от реализации, чтобы не выдать ошибку ? Еще частные случаи.
на самом деле ни у кого нет текущих программ, в которых есть выражения без побочных эффектов.
Нагрузки. Например, если NDEBUG
истинно, то assert
преобразуется в пустое выражение без какого-либо эффекта. Таким образом, в компиляторе требуется еще больше особых случаев, чтобы разрешить некоторые бесполезные выражения, но не другие.
Обоснование, я считаю, заключается в том, что если бы он расширялся до нуля, то (а) компиляторы в конечном итоге выдавали бы предупреждения для таких вещей, как if (foo) assert(bar);
, и (б) подобный код был бы легальным в выпуске, но не в отладке, что просто сбивает с толку:
assert(foo) // oops, forgot the semi-colon
foo.bar();
такие вещи, как самый неприятный разбор
Вот почему это называется «раздражать». На самом деле это проблема обратной совместимости. Если бы C++ теперь изменил значение этих надоедливых синтаксических анализов, значение существующего кода изменилось бы. Как вы указываете, существующего кода не так много, но комитет C++ занимает довольно сильную позицию в отношении обратной совместимости. Если вам нужен язык, который меняется каждые пять минут, используйте Perl ;-)
В любом случае, теперь уже слишком поздно. Даже если бы у нас было какое-то прекрасное понимание, которое пропустил комитет C++0x, почему некоторые функции должны быть удалены или изменены несовместимо, они не собираются ничего ломать в FCD, если только FCD не является окончательно ошибочным.
Обратите внимание, что для всех ваших предложений любой компилятор может выдать предупреждение для них (на самом деле, я не понимаю, в чем ваша проблема со вторым примером, но, конечно, для бесполезных выражений и для раздражающих синтаксических анализов в телах функций). Если вы правы в том, что никто не делает этого преднамеренно, предупреждения не причинят вреда. Если вы ошибаетесь в том, что никто не делает этого преднамеренно, указанный вами случай их удаления неверен. Предупреждения в популярных компиляторах могут проложить путь к удалению функции, тем более что авторами стандарта в основном являются разработчики компиляторов. Тот факт, что мы не всегда получаем предупреждения об этих вещах, наводит меня на мысль, что это нечто большее, чем вы думаете.
person
Steve Jessop
schedule
10.11.2010