También estoy arrojando mis dos centavos en los últimos tiempos, pero acabo de ver este hilo y siento que, para la posteridad, hay algunos puntos que necesitan desesperadamente hacerse.
Tenga en cuenta a continuación que hablaré sobre C y no sobre C ++. ¿Por qué? Bueno, de lo contrario son manzanas y naranjas comparar un lenguaje orientado a objetos dinámicamente desarrollado con algo tan estático como Fortran. Sí, algunas implementaciones modernas de los últimos estándares de Fortran pueden hacer más que eso, pero muy pocas personas los usan, por lo que cuando hablamos de Fortran, pensamos en un lenguaje simple, estático e imperativo. Ahí es donde también está C, así que reemplazaré C con C ++ para lo siguiente.
En primer lugar, cualquier discusión sobre Fortran / C con mejores compiladores es discutible. Los compiladores dedicados de C / Fortran son cosa del pasado. Tanto gcc / gfortran como icc / ifc son solo front-end diferentes para el mismo back-end, es decir, su programa se transformará en una descripción abstracta por el front-end y luego será optimizado y ensamblado por el back-end. Si escribe, semánticamente, el mismo código en Fortran o en C, el compilador, en ambos casos, producirá el mismo ensamblaje que se ejecutará igual de rápido.
Esto ahora lleva a mi segundo punto: ¿por qué todavía vemos diferencias? El problema es que la mayoría de las comparaciones son hechas por programadores de Fortran que intentan algo en C o viceversa. ¿Alguna vez notaste cómo la mayoría de los autores o poetas prefieren escribir en sus idiomas nativos? ¿Te gustaría escribir poesía en un idioma en el que no te sientas completamente seguro o en casa? Por supuesto que no ... yo mismo considero que C es mi lenguaje de programación "nativo". Sin embargo, también pasé tres años trabajando en un grupo que usaba solo Fortran, en el que había alcanzado un cierto nivel de fluidez. Sin embargo, nunca escribiría nada por mi cuenta en Fortran ya que me siento más cómodo con C y, como consecuencia, el código resultante será mejor , independientemente de lo que defina como.
Entonces, la principal diferencia está en el programador, no en el lenguaje. ¿Entonces no hay diferencias? Bueno, no del todo. Aquí están algunos ejemplos:
SIMD: Ya sea SSE, SSE3 o AltiVec, si desea usarlos en Fortran, es mejor que espere y ore para que el compilador adivine exactamente lo que quiere y lo haga. Buena suerte. En C, generalmente tiene funciones intrínsecas para cada arquitectura o, más recientemente, tipos de vectores SIMD generales en gcc . La mayoría de los compiladores de Fortran solo usarán instrucciones SIMD para desenrollar bucles, pero si tiene un núcleo que funciona en vectores cortos de datos de una manera no obvia, el compilador probablemente no lo verá.
Diferentes arquitecturas de hardware: toda la arquitectura CUDA está construida alrededor de los núcleos en C. Sí, el Grupo Portland ahora también tiene un compilador fortran compatible con CUDA , pero es comercial, y lo más importante, no es de NVIDIA. Lo mismo ocurre con OpenCL, para el cual lo mejor que pude encontrar es un proyecto reciente que solo admite algunas llamadas básicas.
Programación en paralelo: Sí, tanto MPI como OpenMP funcionan bien tanto con C como con Fortran. Sin embargo, si desea un control real de sus subprocesos, es decir, si tiene un cálculo de memoria compartida totalmente dinámico, estará fuera de combate con Fortran. En C tienes los hilos estándar que, aunque no son cálidos y difusos, aún te ayudarán a superar la tormenta. En general, la mayoría de los cálculos que dependen del acceso al sistema operativo, por ejemplo, subprocesos, procesos, sistema de archivos, etc., se sirven mejor con C. Oh, y no intentes hacer tu propia red con Fortran.
Facilidad de uso: Fortran está más cerca de Matlab que C. Una vez que haya superado todas las diferentes palabras clave y cómo declarar variables, el resto del código se parece a Matlab, lo que lo hace más accesible para los usuarios con experiencia de programación limitada.
Interoperabilidad: cuando crea una estructura en C, el diseño de los datos reales es directo y determinista. En Fortran, si utiliza matrices de punteros o datos estructurados, el diseño real de los datos depende en gran medida del compilador, no es sencillo y, por lo general, no está documentado. Puede llamar a C desde Fortran y viceversa, pero no empiece a pensar que puede ser tan fácil pasar algo más que una matriz estática de uno a otro y viceversa.
Todo esto es algo geek, de bajo nivel, pero estamos hablando de computación de alto rendimiento, ¿verdad? Si no está interesado en cómo explotar mejor los paradigmas de hardware subyacentes, es decir, implementar y / o desarrollar algoritmos que sean mejores para memoria compartida / distribuida, subprocesos, vectorización SIMD, GPU que usan SIMT, etc., entonces está solo haciendo matemáticas en una computadora.
Esto se ha vuelto mucho más largo de lo que entendí, así que aquí hay un resumen: un conjunto de mensajes para llevar a casa:
- Usted tendrá que escribir el mejor código que puede en el lenguaje que usted sabe mejor.
- No hay diferencia en la calidad del código producido por dos compiladores que usan el mismo back-end: somos nosotros quienes escribimos el código incorrecto en un idioma u otro.
- A pesar de sentirse más de bajo nivel, Fortran es una abstracción de alto nivel y no le permitirá acceder a ciertas funciones de hardware / sistema operativo directamente, por ejemplo, SIMD, hilos, redes, etc.