Роль указателей в C и Fortran в определении скорости программы - PullRequest
0 голосов
/ 10 мая 2018

Насколько я понимаю, Fortran (до 90) чрезвычайно быстр, отчасти потому, что не допускает наложение указателей (и, следовательно, позволяет лучше оптимизировать компилятор).Однако я также знаю, что указатели на языках семейства C позволяют программистам писать чрезвычайно быстрый код.

Я не понимаю, почему два языка быстры по разным причинам.Кто-нибудь может пролить свет на то, что происходит?

Заранее спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

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

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

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

Практические примеры можно увидеть, рассматривая семейства рассеянных компиляторов mos как GCC https://gcc.gnu.org/, LLVM https://llvm.org/, или даже .net https://en.wikipedia.org/wiki/.NET_Framework.

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

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

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

Fortran и C находятся на очень разных уровнях абстракции, первый достаточно жесткий, чтобы подразумевать стандартный, и по этой причине хорошо известный и предварительно оптимизированный код, второй широко распространенный язык, который может касаться очень низких уровней, используя указатели и даже встроенный ассемблер, или высокий уровень при использовании без злоупотребления каким-либо побочным эффектом.

Так или иначе, последние стандарты C99-C11 ввели гораздо больше языковых классификаторов, которые позволяют выравнивать также некоторые хорошо известные недостатки, такие как непрозрачные указатели (https://en.wikipedia.org/wiki/Opaque_pointer) с использованием квалификатора restrict. В современных компиляторах также векторизация, использование инструкций потоковой передачи, доступных на современных процессорах (SIMD, SSE2 и т. д.), широко распространены. Т.е. для платформы X86-64 компилятор Intel C / C ++ является наиболее эффективным компилятором / оптимизатором.

Тогда чего нам ожидать в будущем? С развитием технологий компилятора мы должны ожидать асимптотического обнуления любой разницы.

Для дальнейшего чтения вы также можете найти отличный ответ по обмену стека информатики: https://scicomp.stackexchange.com/questions/203/what-makes-fortran-fast

...