c++ fortran language-comparisons

¿Qué ventajas tiene Fortran moderno sobre C++ moderno?



language-comparisons (10)

Estoy tratando de decidir entre Fortran y C ++ para una aplicación en informática científica. No tengo claro si Fortran aún tiene ventajas sobre otros idiomas en lo que respecta al rendimiento. Por ejemplo, creo que debido a que Fortran impone aliasing estrictos, el compilador podría hacer mejores optimizaciones en comparación con C antes de C99. No estoy seguro de cómo C ++ encaja aquí.

¿Alguna guía?


Con la aparición de la programación de plantilla-meta (especialmente plantillas de expresión ), C ++ alcanzó la liga de FORTRAN en cálculos numéricos, por lo que la velocidad ya no debería ser un problema . Sin embargo, todavía hay algunas cosas que decir sobre otros problemas:

Pro FORTRAN : las personas mayores podrían conocerlo mejor que C ++.
Contra FORTRAN : Es un lenguaje repugnante, viejo y en su mayoría abandonado, que ya está desactualizado en el momento en que comienzas tu proyecto. Quien aprende la programación ahora, es muy poco probable que aprenda FORTRAN, por lo que podría tener problemas para encontrar programadores para el proyecto más adelante.

Pro C ++ : es relativamente moderno, con compiladores que aún mejoran en grandes avances. Le permite escribir un código bastante expresivo .
Contra C ++ : algunos de esos mensajes de error de la plantilla te harán llorar.


Dada la existencia de paquetes informáticos científicos como LAPACK ++, que ya están altamente optimizados, Fortran moderno ni siquiera tiene una ventaja de rendimiento. C ++ puede tener sus fallas, pero el rendimiento no es uno de ellos.


Eché un vistazo a algunas de las cosas en los últimos estándares de Fortran , y francamente estoy impresionado. Mucho de lo que odié sobre el lenguaje hace 20 años se ha ido ahora. No más números de línea y columnas especiales (pueden arder en el infierno).

Fortran ha sido muy utilizado en los círculos de ingeniería durante 50 años. Eso te da dos ventajas si trabajas en esos círculos. En primer lugar, estas personas se preocupan mucho por la optimización. Eso significa que los compiladores Fortran tienden a tener los mejores optimizadores. El lenguaje en sí mismo es mucho más optimizable que los lenguajes Cish también, gracias a su falta de aliasing.

La segunda ventaja es que el soporte de biblioteca de Fortran para el cálculo de números simplemente no tiene parangón. El mejor código casi siempre será el código bien depurado que no tiene que escribir .

Si su aplicación no está sujeta a análisis científicos, de ingeniería o numéricos en general, ninguno de los anteriores será un gran problema para usted, por lo que será mejor que busque en otro lado.


El otro problema importante es la curva de aprendizaje que es muy grande para C ++ y excepcionalmente pequeña para Fortran (90 y más adelante). Fortran es como MATLAB con operaciones como ...

  • B''DB es matmul( matmul(transpose(B), D), B )
  • La norma L2 de un vector es norm2(x)
  • La SVD de una matriz que usa LAPACK es call gesvd(A,S,u,vt)

Fortran también tiene punteros, memoria dinámica, tipos de datos definidos por el usuario, etc.

Cuenta con el respaldo de los principales proveedores (Intel / Sun / IBM / Cray / PGI / NAG, etc.), las comunidades de código abierto (gfortan / g95) y los desarrolladores de bibliotecas / API numéricas como PETSc, MPI, etc.

Diablos el nuevo estándar (Fortran 2008) incluso tiene co-arreglos para hacer programación paralela sin la necesidad de MPI / OpenMP y algunos compiladores Fortran ya lo soportan (g95 y Cray).

Básicamente tiene todas las buenas cualidades requeridas para la computación numérica, es más fácil que MATLAB, está estandarizado, es gratis, escalable (con MPI / OpenMP y co-arrays), produce un código ultra rápido / paralelo.

Para los numéricos, nada supera a Fortran, pero desafortunadamente para cualquier otra cosa, todo es mejor que Fortan. Por lo tanto, si usted es un científico con un trabajo seguro y solo utiliza computación numérica / HPC, apóyese con Fortran; de lo contrario, aprenda y use C ++, ya que es ampliamente utilizado para software no numérico.


En mi humilde opinión, la única ventaja que realmente importa es que la programación de FORTRAN le permite una reutilización más fácil de muchos de los códigos y bibliotecas FORTRAN existentes. Y si tiene 50 programadores de FORTRAN a mano para un proyecto y un marco de tiempo limitado, ¿primero va a enseñarles C ++, o aceptará que usen su idioma favorito?


Fortran ha sido altamente optimizado para operaciones matemáticas (especialmente matriciales).

C ++ ha sido altamente optimizado para el uso de objetos.

Qué es más importante para ti.

Como se indica a continuación, C ++ tiene una biblioteca de matriz optimizada.
Pero todo el propósito de Fortran es la optimización de los procesos matemáticos (especialmente las operaciones de matriz). El hecho de que estas optimizaciones estén incorporadas en la base del lenguaje (en lugar de una biblioteca) y tengan una ventaja de dos décadas en la investigación sobre C ++ Dudo (pero no lo sé con certeza) que en esta área Fortran se va ganar sin límites


Fortran permite operaciones de matriz completa y también operaciones en secciones de matriz. Hay clases de C ++ para arreglos, pero no creo que pueda referirse a una porción como x (:, 2:, 1: N3: 2) tan fácilmente como en Fortran. Esto permite expresar algunos algoritmos de manera concisa.

La conveniencia de las operaciones de matriz de Fortran se extiende a las matrices de tipos derivados. Supongamos que tiene una variedad de fechas:

tipo fecha
entero :: mes, día, año
tipo de fecha final

tipo (fecha) :: x (1000)

Entonces x se refiere a la matriz de fechas, x% mes se refiere a la matriz de meses, y paquete (x, x% mes == 1) se refiere a todas las fechas en enero. ¿Cuántos otros lenguajes de programación ofrecen esta conveniencia?

Algunos de los comentarios anteriores acerca de Fortran - "viejos y desagradables" - son parciales y deben ser descartados en consecuencia. Déjame argumentar lo contrario. En mi opinión, el formato libre de Fortran 90 se ve mejor que la sintaxis de C y C ++, con las llaves y los puntos y comas. Dejarlos o colocarlos incorrectamente puede causar errores en C y C ++ que no tienen contrapartida en Fortran.


Mi experiencia con Fortran es que es fácil de aprender, limpia (con una gran modularidad) y, por lo tanto, adecuada para un programador no especializado cuya principal preocupación es realizar cálculos numéricos altamente optimizados. Aunque la optimización igual se puede realizar en c ++, (incluso tal vez en mayor medida), se necesita mucha comprensión intrínseca para lograr ese nivel de optimizaciones. Cuando se trata de cálculos matriciales, un compilador Fortran normalmente superará un compilador de c ++. También agregaría que Fortran tiene palabras clave específicamente diseñadas para ayudar al programador a obtener más rendimiento de una rutina numérica. C ++ tiene esto también, pero no en la medida en que lo haga Fortran.

Otra ventaja es que Fortran no es un sistema operativo o arquitectura específica. En otras palabras, el código de Fortran que escriba en un sistema operativo o arquitectura debería fácilmente transferirse a otro donde haya un compilador de Fortran.

Otra ventaja es que el Fortran moderno es normalmente compatible con versiones anteriores de Fortran. Y la base de código que se ha construido a lo largo de los años en Fortran es enorme y extremadamente sofisticada (principalmente realizada por científicos y matemáticos).

Además, personalmente, realmente disfruté las funciones integradas de manejo de archivos que permiten leer un archivo de datos y realizar operaciones en él casi al instante. Muchas otras funciones incorporadas en Fortran están diseñadas para permitir esta conveniencia. C ++ ofrece principalmente bloques de construcción para hacer esto y esto requiere un poco de sudoración solo para leer un archivo de datos b / c. Usted necesita saber algo acerca de los delimitadores (donde Fortran le permite especificar el delimitador).

Más allá de esto, no puedo pensar en las ventajas. Casi todo lo demás serían manipulaciones de cadenas o operaciones algorítmicas basadas en c ++ como lenguaje, y en general son compiladores, se adaptan mejor y con mayor frecuencia funcionarán mejor. Un buen programador bien informado probablemente preferirá c ++ ya que él / ella entendería cómo optimizar una rutina numérica de una manera que probablemente funcionaría mejor que una rutina compilada por Fortran. Además, los buenos compiladores de Fortran confiables no son tan fáciles de obtener como los buenos compiladores confiables de C ++.


Soy nuevo en la programación. He estado programando en el campo de elementos finitos durante aproximadamente un año. Después de algunas investigaciones en la red, decidí utilizar Fortran 2003. Aprendí a programar en el estilo modular en aproximadamente diez días estudiando el libro de Chapman. Ya pasó un año y he escrito cerca de cuatro mil líneas de código en formato modular (códigos mantenibles, reutilizables y limpios) y no he utilizado ninguna variable de caracteres en absoluto. No creo que al estudiar C ++, matlab, python, java ... durante diez días puedas escribir códigos numéricos tan eficientemente como en fortran. fortran 2003 también tiene todas las capacidades necesarias de OOP que estoy aprendiendo ahora. Por lo tanto, en términos de fortaleza del lenguaje en el aspecto numérico, fortan no le falta nada (estilo modular, estilo OOP, poderosas capacidades de matriz, potentes bibliotecas, compiladores gratuitos y comerciales actualizados, muy fáciles de aprender, muy eficientes ...). Los lenguajes como python / numpy tienen la mayoría de estas capacidades, pero carecen de eficiencia. Los lenguajes como C ++ también tienen la mayoría de las capacidades de fortran (aunque para el cálculo de matriz, que es el núcleo principal de la computación numérica, debes importar algunas bibliotecas), pero tal vez un programa escrito por alguien como yo en fortran sería más eficiente que uno escrito por un programador de C ++ con más de 10 años de experiencia.
Finalmente hago mis cálculos numéricos pesados ​​en fortran (formato modular o OOP) y uso python / numpy para cálculos de pequeño tamaño (como creación de gráficos, cálculos de matriz de pequeño tamaño ...).


Ventajas de fortran95 y superior sobre c ++ (2003):

  1. Como anteriormente (por user4562) mencioné la curva de aprendizaje corta (mi primer idioma era C y aún no puedo dominarlo, lo mismo es cierto para C ++)
  2. (Mi opinión personal) Fácil para la transición de código de Octave (para el caso Matlab) sintaxis similar, misma modularidad [Uso Octave para prototipar un programa y reescribir en fortran95 para velocidad], aunque puede usar directamente el código de octava en C ++.
  3. La asignación de la memoria dinámica es bastante sencilla. (¡F77 no tenía esto en absoluto!)
  4. soporte de librerías (puede hacer esto en c ++ también, pero es natural usar fortran)
  5. Compatibilidad con conjuntos de matrices para informática paralela (la compasión solamente los apoya a partir de febrero de 2011 El trabajo de Gfortran comenzó a partir de gfortran4.6 pero aún queda un largo camino por recorrer)

en resumen, si su programa o aplicación es de computación puramente científica use fortran 95 y superior si el cálculo de algunos números es solo parte de la historia use C ++ (o lo que sea que sienta que es mejor)