Волшебство компилятора: почему?

Спасибо за Вашу справку, управляемую для сортировки его следующим образом:

<ItemGroup>
     <LibraryFiles Include="$(LibrariesReleaseDir)\**\*.*" 
                   Exclude="$(LibrariesReleaseDir)\**\.svn\**" />
</ItemGroup>

Оказывается, что сопоставление с образцом в основном работает на файлах, таким образом, необходимо исключить все НИЖЕ эти .svn каталоги (.svn\\**) для MSBuild для исключения .svn сам каталог.

11
задан Johannes Rudolph 3 November 2009 в 22:13
поделиться

3 ответа

Конечно, компилятор C # не генерирует эквивалентный код C # для вашего фрагмента . Он скомпилирован до IL. По сути, то, что вы видите (я полагаю, из Reflector) - это эквивалентный код C #, который декомпилятор выплевывает для этого IL.

  1. В спецификации языка не сказано, что такое «неоптимизированный» код. Компилятору C # разрешено генерировать любой действительный, функционально эквивалентный код. Даже без включения оптимизации компилятор может выполнять базовые оптимизации. Кроме того, вы не можете сказать , что естественно для компилятора и , оптимизировал ли компилятор намеренно или нет .

  2. Оператор if в целом оценивается как последовательность условных переходов на основе значений каждого отдельного выражения, указанного в разделе «and». Выражение не вычисляется в одном блоке кода с инструкциями «и». Результат декомпилятора определяется этими ветвями. Декомпилятор не всегда может вывести исходное выражение, которое вы написали. Он просто выводит что-то эквивалентное.

Точно так же разница между этим фрагментом:

if (a) { something(); }
else { somethingElse(); }

и этим фрагментом:

if (!a) { somethingElse(); }
else { something(); }

не является чем-то, что можно отличить, просмотрев скомпилированный код.

Результат декомпилятора определяется этими ветвями. Декомпилятор не всегда может вывести исходное выражение, которое вы написали. Он просто выводит что-то эквивалентное.

Точно так же разница между этим фрагментом:

if (a) { something(); }
else { somethingElse(); }

и этим фрагментом:

if (!a) { somethingElse(); }
else { something(); }

не является чем-то, что можно отличить, просмотрев скомпилированный код.

Результат декомпилятора определяется этими ветвями. Декомпилятор не всегда может вывести исходное выражение, которое вы написали. Он просто выводит что-то эквивалентное.

Точно так же разница между этим фрагментом:

if (a) { something(); }
else { somethingElse(); }

и этим фрагментом:

if (!a) { somethingElse(); }
else { something(); }

не является чем-то, что можно отличить, просмотрев скомпилированный код.

49
ответ дан 3 December 2019 в 00:45
поделиться

Операция if компилируется в код операции условного перехода. Удаление отрицания из выражения позволяет его оптимизировать, заменив условную цель перехода на блок провала.

6
ответ дан 3 December 2019 в 00:45
поделиться

Я думаю, что эти два выражения в точности эквивалентны с точки зрения семантики языка. Оба способа включают короткое замыкание.

Я немного ошеломлен тем, что ответ Эндрю уже получил десять голосов; для меня это звучит чепухой, но, возможно, мне действительно здесь не хватает чего-то тонкого.

РЕДАКТИРОВАТЬ

Итак, чтобы подвести итог:

Вопрос ОП спрашивает: «Почему происходит такая оптимизация?»

Фактически никакой «оптимизации» не происходит. Два исходных кода C # логически эквивалентны. ".Net Reflector" или любой другой инструмент дизассемблирования, возможно, с такой же вероятностью декомпилирует тот же IL в тот или иной. На уровне IL существует просто набор условных переходов, поэтому не обязательно есть способ узнать, «какой путь - если, а какой - иначе». или другие подобные эквиваленты ДеМоргана.

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

К счастью, в конце концов мудрость толпы (и умных людей, таких как @Mehrdad) возобладает. Ура StackOverflow!

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

в конце концов мудрость толпы (и умных людей, таких как @Mehrdad) возобладает. Ура StackOverflow!

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

в конце концов мудрость толпы (и умных людей, таких как @Mehrdad) возобладает. Ура StackOverflow!

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

8
ответ дан 3 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: