Какие преимущества имеет современный Fortran перед современным C++? [закрытый]

Я пытаюсь выбрать между Fortran и C++ для приложения в научных вычислениях. Мне непонятно, имеет ли Fortran преимущества перед другими языками, когда дело доходит до производительности. Например, я считаю, что, поскольку Fortran обеспечивает строгое сглаживание, компилятор может сделать лучшую оптимизацию по сравнению с C до C99. Я не уверен, как C++ вписывается здесь.

каких-либо указаний?

10 ответов


Я взглянул на некоторые из вещей в последних стандартах Fortran, и, честно говоря, я впечатлен. Многое из того, что я ненавидел в языке 20 лет назад, теперь ушло. Нет больше номеров строк и специальных столбцов (пусть они горят в аду).

Fortran тяжело использовано в кругах инженерства на 50 лет теперь. Это дает вам два преимущества, если вы работаете в этих кругах. Во-первых, эти люди заботятся много об оптимизации. Это означает, что Фортран компиляторы, как правило, имеют лучшие оптимизаторы. Сам язык намного более оптимизирован, чем языки Cish, благодаря отсутствию псевдонимов.

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

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


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

  • 'DB Б matmul( matmul(transpose(B), D), B )
  • норма L2 вектора norm2(x)
  • SVD матрицы с использованием LAPACK is call gesvd(A,S,u,vt)

Fortran также имеет указатели, динамическую память, пользовательские типы данных и т. д.

он хорошо поддерживается основными поставщиками (Intel / Sun / IBM/Cray/PGI / NAG etc.), сообщества с открытым исходным кодом (gfortan/g95) и разработчики числовой библиотеки/API, такие как PETSc, MPI и т. д.

черт возьми, новый стандарт (Fortran 2008) даже имеет со-массивы для параллельного программирования без необходимости MPI / OpenMP, и некоторые компиляторы Fortran уже поддерживают его (g95 и Cray).

В основном он имеет все хорошие качества, необходимые для численных вычислений, проще, чем MATLAB, стандартизирован, бесплатный, масштабируемый (с MPI / OpenMP и co-массивы), производит пылающий быстрый / параллельный код.

для цифр ничто не бьет Fortran, но, к сожалению, для чего-либо еще все бьет Fortan. Поэтому, если вы ученый с безопасной работой и только делаете численные/HPC-вычисления, тогда придерживайтесь Fortran, иначе учитесь и используйте C++, поскольку он широко используется для не числового программного обеспечения.


Fortran позволяет выполнять операции всего массива, а также операции над разделами массива. Есть классы C++ для массивов,но я не думаю,что вы можете ссылаться на срез, такой как x (:, 2:, 1:N3:2) так же легко, как в Fortran. Это позволяет выразить некоторые алгоритмы довольно кратко.

удобство операций с массивами Fortran распространяется на массивы производных типов. Предположим, у вас есть массив дат:

типа
целое число :: месяц,день,год
дата окончания тип

тип (дата):: x(1000)

тогда x относится к массиву дат, x%month относится к массиву месяцев,а pack(x, x%month==1) относится ко всем датам января. Сколько других языков программирования предлагают это удобство?

некоторые из более ранних комментариев о Fortran - "старый и отвратительный" - предвзяты и должны быть дисконтированы соответственно. Позвольте мне утверждать обратное. На мой взгляд, свободный формат Fortran 90 выглядит лучше, чем синтаксис C и c++, с фигурными скобками и точкой с запятой. Оставляя их или неправильно помещая их может вызвать ошибки в C и C++, которые не имеют аналога в Fortran.


Fortran был высоко оптимизирован для математических (особенно матричных) операций.

C++ был оптимизирован для использования объекта.

Что для вас важнее.

Как отмечено ниже, C++ имеет оптимизированную библиотеку матриц.
Но вся цель Fortran-оптимизация математических процессов (особенно матричных операций). Тот факт, что эти оптимизации встроены в основание языка (а не библиотеки) и я сомневаюсь (но не знаю наверняка), что в этой области Fortran собирается выиграть руки вниз.


преимущества fortran95 и выше над c++(2003):

  1. как уже упоминалось ранее (user4562) короткая кривая обучения(мой первый язык был C , и я до сих пор не могу его освоить, аналогично для C++)
  2. (мое личное мнение) легко для перехода кода из Октавы(если на то пошло Matlab)аналогичный синтаксис,та же модульность[я использую Октаву для прототипа программы и переписываю в fortran95 для скорости],хотя u может напрямую использовать октавный код на C++.
  3. динамический распределение памяти довольно прямолинейно.(у f77 этого вообще не было!)
  4. поддержка библиотек (u может сделать это и на c++, но естественно использовать fortran)
  5. поддержка Co-array для параллельных вычислений (жаль, что только cray поддерживает их с февраля 2011 г. работа gfortran началась с gfortran4.6 но еще далеко идти)

короче говоря, если ваша программа или приложение является чисто научным вычислением, используйте fortran 95 и выше, если вычисляете несколько numbers-это просто часть истории использования C++ (или что бы вы ни чувствовали себя лучше)


мой опыт работы с Fortran заключается в том, что он прост в освоении, чист (будучи высоко модульным) и, следовательно, хорошо подходит для не программиста, чья главная забота-делать высоко оптимизированные численные вычисления. Хотя равная оптимизация может быть выполнена на c++ (даже, возможно, в большей степени), для достижения такого уровня оптимизации требуется много инструментального понимания. Когда дело доходит до матричных вычислений, вне коробки компилятор Fortran обычно будет выполнять компилятор c++. Я бы также добавил, что Fortran имеет ключевые слова, которые специально разработаны, чтобы помочь программисту выжать больше производительности из числовой процедуры. У C++ это тоже есть, но не в той степени, в какой это делает Fortran.

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

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

кроме того, лично мне очень понравились встроенные функции обработки файлов, которые позволяют читать файл данных и выполнять операции над ним почти мгновенно. Много других встроенных функций в Fortran конструированы для того чтобы позволить этому удобству. С++ предлагает в основном строительные блоки для этого, и для этого требуется немного потеть, чтобы просто прочитать файл данных b/c, вам нужно знать что-то о разделителях (где Fortran позволяет указать разделитель).

помимо этого, я не могу думать о преимуществах. Все остальное - это строковые манипуляции или алгоритмические операции, для которых c++ как язык, и в целом его компиляторы, лучше подходят и чаще всего будут работать лучше. Хороший знающий программист вероятно, предпочтет c++ , поскольку она / он поймет, как оптимизировать числовую процедуру таким образом, чтобы она могла работать лучше, чем скомпилированная процедура Fortran. Кроме того, хорошие надежные компиляторы Fortran не так легко получить, как хорошие надежные компиляторы C++.


Я новичок в программировании.Я программирую в области конечных элементов около года. После некоторых исследований в сети я решил использовать fortran 2003.Я научился программировать в модульном стиле примерно за десять дней, изучив книгу Чепмена. Это один год, и я написал около четырех тысяч строк кода в модульном формате (ремонтопригодные,многоразовые и аккуратные коды) и вообще не использовал никакой символьной переменной. Я не думаю, что изучая C++, matlab, python, java ... для через десять дней вы сможете писать числовые коды так же эффективно, как в Фортране. fortran 2003 также имеет все необходимые возможности ООП, которые я изучаю сейчас. Таким образом,с точки зрения силы языка в числовом аспекте fortan ничего не хватает(модульный стиль,стиль ООП,мощные возможности массива, мощные библиотеки,бесплатные и коммерческие до современных компиляторов, очень легко учиться, очень эффективно ...). Такие языки, как python/numpy, имеют большинство из этих возможностей, но им не хватает эффективности. Языки как и C++ , также имеет большинство возможностей fortran (хотя для вычисления массива, который является основным ядром численных вычислений, вам нужно импортировать некоторые библиотеки!!), но, возможно, программа, написанная кем-то вроде меня в fortran, будет более эффективной, чем программа, написанная каким-то программистом C++ с 10-летним опытом.
Наконец, я делаю свои тяжелые численные вычисления в fortran (модульный или формат ООП) и использую python\numpy для вычислений малого размера(например, создание графиков, малый размер вычисления массива ... ).


учитывая существование научных вычислительных пакетов, таких как LAPACK++, которые уже сильно оптимизированы, современный Fortran даже не имеет преимущества в производительности. C++ может иметь свои недостатки, но производительность не является одним из них.


IMHO, единственное преимущество, которое действительно имеет значение, - это то, что программирование FORTRAN позволяет вам легче повторно использовать много существующего кода и библиотек FORTRAN. И если у вас есть 50 программистов FORTRAN для проекта и ограниченные временные рамки, вы собираетесь сначала научить их всем C++, или вы примете, чтобы они использовали свой любимый язык?


с появлением шаблон мета-программирования (особенно шаблоны выражение), C++ достиг Лиги Фортрана в численных вычислениях, поэтому скорость не должна быть проблемой