Fortran tiene un lugar especial en la programación numérica. Ciertamente, puede hacer un software bueno y rápido en otros idiomas, pero Fortran sigue funcionando muy bien a pesar de su antigüedad. Además, es más fácil hacer programas rápidos en Fortran. He hecho programas rápidos en C ++, pero debes tener más cuidado con cosas como el alias de puntero. Entonces, tiene que haber una razón para esto, y una muy técnica. ¿Es porque el compilador puede optimizar más? Realmente me gustaría conocer detalles técnicos, por lo que si uso otro idioma puedo tener en cuenta estas cosas.
Por ejemplo, sé, o eso creo, que una cosa es que el estándar especifica que los punteros son contiguos en la memoria siempre, lo que significa un acceso más rápido a la memoria. Creo que puedes hacer esto en C ++ dando una bandera al compilador. De esta manera, ayuda saber qué hace Fortran bien, de modo que si usamos otro idioma podemos imitarlo.
fuente
Respuestas:
Los diseñadores de idiomas enfrentan muchas opciones. Ken Kennedy enfatizó dos: (1) mejores abstracciones y (2) código de nivel superior o inferior (menos o más parecido a una máquina). Mientras que los lenguajes funcionales como Haskell y Scheme se enfocan en el primero, los lenguajes tradicionales de computación científica como Fortran y C / C ++ se enfocan en el segundo. Decir que un idioma es más rápido que otro suele ser bastante engañoso: cada idioma tiene un dominio problemático por el que sobresale. Fortran tiene mejores resultados en el dominio de los códigos numéricos basados en matrices que en otros idiomas por dos razones básicas: su modelo de matriz y su carácter explícito.
Modelo de matriz
Los programadores de Fortran realizan en gran medida manipulaciones de matriz. Para eso, Fortran facilita varias optimizaciones del compilador que no están disponibles en otros idiomas. El mejor ejemplo es la vectorización: conocer el diseño de los datos permite al compilador invocar intrínsecos a nivel de ensamblado sobre la matriz.
Lenguaje explícito
Si bien parece que un lenguaje más simple debería compilar "mejor" que uno más complejo, ese no es realmente el caso. Cuando uno escribe en un lenguaje ensamblador , no hay mucho que un compilador pueda hacer: todo lo que ve son instrucciones muy detalladas. Fortran requiere de forma explícita (por lo tanto, más trabajo por parte del programador) solo en casos que producen recompensas reales para la informática basada en matrices. Fortran utiliza tipos de datos simples, flujo de control básico y espacios de nombres limitados; por el contrario, no le dice a la computadora cómo cargar registros (lo que podría ser necesario en tiempo real ). Cuando Fortran es explícito, permite cosas como la inferencia de tipos completa, lo que ayuda a los principiantes a comenzar. También evita una cosa que a menudo hace que C sea lenta:punteros opacos .
Fortran puede ser lento
Fortran no es rápido para todas las tareas: es por eso que no muchas personas lo usan para construir interfaces gráficas de usuario o incluso para computación científica altamente desestructurada. Una vez que abandona el mundo de los arreglos para gráficos, árboles de decisión y otros reinos, esta ventaja de velocidad desaparece rápidamente. Consulte los puntos de referencia del lenguaje informático para ver algunos ejemplos y números.
fuente
El diseño de Fortran permite al compilador realizar optimizaciones más fuertes en algunos casos, optimizaciones que generalmente no están disponibles para C.
Un ejemplo famoso es el manejo del alias . En Fortran, puede acceder a un área de memoria específica solo a través del símbolo específico asociado con esa área de memoria. Este conocimiento permite al compilador emplear trucos inteligentes cuando es hora de almacenar en caché: sabe si un valor ha cambiado potencialmente o no. Hasta F90, esto se verificó fácilmente. Cuando se introdujo Fortran 90
pointers
, la suposición ya no era cierta: se podía acceder a la misma área de memoria a través de dos (o más) símbolos. Esta es la razón por la que debe especificar lastarget
matrices que desea abordar mediante punteros.Otro hecho interesante es que muchas construcciones permiten que el compilador realice paralelización sin intervención del usuario. Tal lujo es posible debido al relativo "agnosticismo de plataforma" de Fortran como lenguaje.
Hay muchos otros trucos sutiles como este. Además, recuerde que nadie usa Fortran hoy, a excepción de los cálculos numéricos, lo que significa que la característica principal y el punto de venta de los compiladores de Fortran es la velocidad del código resultante. Como resultado, los proveedores se centraron en esto.
Sin embargo, puede producir código de rendimiento también con otros idiomas. Sin embargo, puede requerir cuidados especiales o intervención humana. El punto general, sin embargo, es que el rendimiento no es un problema hasta que hay un problema, y el tiempo del hombre es mucho más costoso que el tiempo de la computadora. Por lo tanto, las prácticas de codificación deberían centrarse en ahorrar tiempo humano, en lugar de tiempo de computadora.
fuente
No creo que Fortran esté tan cerca del metal (ver otra respuesta) pero tiende a optimizarse muy fácilmente. Los bucles son simples, y el lenguaje admite fácilmente extensiones de vectorización (está bien cuando lo usé en mi primer trabajo estábamos apuntando a una amplia gama de vectores de hierro grande).
También existe el gran factor de inercia. Existe una gran cantidad de código numérico en Fortran, por lo que los creadores de servidores de alta gama y supercomputadoras se aseguran de que escriban bien los compiladores de Fortran. Los compiladores son buenos (incluso en máquinas con una relativa falta de compiladores de alta calidad) por lo que los usuarios continúan usando el Fortran e incluso escriben código nuevo en él. Entonces los constructores se aseguran de que su próxima generación tenga buenos compiladores, etc.
fuente
Tenga cuidado con los mitos urbanos aquí. Si dos compiladores generan el mismo código de ensamblaje, los programas resultantes tendrán el mismo rendimiento.
Para cualquier pieza lógica, hay un programa en lenguaje ensamblador que minimiza su tiempo de ejecución. A ese programa no le importa qué compilador lo generó.
Dicho esto, existen lenguajes compilados para facilitar la vida del programador. Parte del costo de esto es que pueden tentar al usuario a usar funciones que no resultan en un tiempo de ejecución mínimo. El mejor ejemplo de esto está
new
en C ++. (¿Qué tan lento puede ser, son solo tres caracteres?) Prácticamente le ruega que asigne memoria dinámicamente y no preste atención al costo de tiempo de ejecución. Si eso es lo que quieres hacer, es genial, pero Fortran podría ser más rápido solo porque no te atrapó para hacerlo.Pero mucho más allá de eso, nunca he visto un programa que, como se escribió por primera vez, no tuviera mayor margen para mejorar el rendimiento del tipo que el compilador nunca podría limpiar para usted. Como un ejemplo, pasar una gran fracción de tiempo llamando
exp
y / olog
repetidamente con el mismo argumento. Como otro ejemplo, llamar a DGEMM para multiplicar matrices y descubrir que una gran fracción de tiempo se usa para llamar a LSAME solo para descifrar sus argumentos de caracteres de entrada.Esto es al mismo tiempo que la gente dice que Fortran es más rápido debido al alias del puntero o al desenrollamiento del bucle. Eso es como decir que un autobús hecho por Porsche ciertamente sería más rápido que un autobús hecho por Chevrolet. Tiene que haber un poco de sentido común.
fuente