59 votos

¿Por qué se utiliza FORTRAN con tanta frecuencia en la química computacional?

He estado usando Ruby para escribir scripts para la investigación, pero quiero entrar en algunas cosas más pesadas para las que Ruby es demasiado lento. Me he dado cuenta de que hay algunas cosas escritas en C y C++, pero hay una proporción extrañamente grande de software utilizado en la química computacional que está escrito en FORTRAN (en el que tengo cero experiencia.)

¿Por qué se utiliza FORTRAN en la química computacional? Por lo que tengo entendido, FORTRAN es un poco antiguo ("tarjeta perforada"). Me sorprendió un poco encontrar tutoriales escritos recientemente para FORTRAN.

¿Es una especie de "así es como siempre lo hemos hecho" o hay un aspecto de eficiencia en FORTRAN que estoy pasando por alto?

Nota: Puede que haya confundido FORTRAN con lenguajes de programación posteriores con nombres similares.

7 votos

Porque la gente empezó a escribir código hace mucho tiempo, y Fortran estaba (y sigue estando) muy optimizado para la traducción de fórmulas (por ejemplo, cálculos).

21 votos

Tenga en cuenta que el Fortran moderno (95, 2003, 2008) es muy diferente del FORTRAN 66 o 77.

5 votos

Sí, se te pasa algo por alto. 1) Fortran tiene una semántica ligeramente diferente. No tiene verdaderos punteros, por lo que el compilador puede ser un poco más liberal en las optimizaciones. 2) hay mucho código fortran heredado 3) fortran es mucho más simple, que C y especialmente los lenguajes "orientados a objetos".

45voto

Dylan Beattie Puntos 23222

Creo que eso ya no es cierto.

Parte del uso de Fortran es histórico (es decir, los primeros códigos se desarrollaron en FORTRAN porque era el mejor lenguaje de programación para el cálculo de números en los años 70 y 80). Además, el nombre significa "traducción de fórmulas".

Algunos Fortran uso es por el rendimiento. El lenguaje fue diseñado para ser:

especialmente adecuado para el cálculo numérico y la computación científica.

Muchas veces, me encuentro con codificadores de química que se aferran a Fortran porque lo conocen y tienen bases de código numérico muy optimizadas.

Creo que el lado del rendimiento ya no es necesariamente cierto cuando se utilizan compiladores C y C++ modernos y altamente optimizados.

Escribo mucho código en C y C++ por rendimiento y pego muchas cosas con Python. Sé que algunos programas cuánticos están escritos exclusiva o principalmente en C++. Aquí hay algunos ejemplos de código abierto:

  • Psi4 - Escrito en C++ y Python
  • MPQC - Escrito en C++
  • LibInt - Escrito en C++ para realizar integrales cuánticas eficientes.
  • LibXC - Escrito en C con "bindings" Fortran para los funcionales de intercambio-correlación DFT

Esta es mi opinión, pero mi recomendación para un rendimiento más rápido en química sería Python con algo de C o C++ mezclado.

Encuentro que soy más eficiente codificando en Python, en parte por el lenguaje, en parte por los muchos paquetes, en parte porque no tengo que compilar, y todo eso es importante.

Además, puedes ejecutar scripts y funciones de Python en paralelo, en la GPU, e incluso compilarlos, por ejemplo, con Numba . Como he dicho, si creo que el rendimiento es crucial, escribiré piezas en C o normalmente en C++ y enlazaré con Python cuando sea necesario.

8 votos

Basado en el puro uso, yo altamente recomiendan Python para la programación científica en este momento. Algunas piezas para un proyecto reciente ya estaban disponibles como funciones eficientes de NumPy o SciPy. :-)

2 votos

Estoy seriamente convencido de Python. No he escrito mucho en Python, pero he encontrado un montón de scripts realmente útiles escritos en él. Cuando se trata de C o C++, ¿cuál recomiendas? Sólo he usado Ruby y Perl (y un poco de Python) y realmente no me gustó Perl.

1 votos

Mi sugerencia para aprender idiomas es tener un proyecto en el que lo necesites. Hace poco me enseñé Python simplemente para utilizar el procesamiento de imágenes con NumPy. Yo sugeriría usar Python durante un tiempo, y luego, si hay una parte crítica para el rendimiento, intentar reescribir en C o C++. Existen muchas guías para "aprender el lenguaje X" en línea y en forma de libro.

32voto

Swinders Puntos 1042

Creo que tiene sentido ofrecer un punto de vista algo alternativo y aclarar el asunto.

FORTRAN vs. Fortran

En primer lugar, hay que distinguir el antiguo FORTRAN del nuevo Fortran, donde, por convención, el nombre del antiguo lenguaje se escribe normalmente en mayúsculas. El antiguo FORTRAN (hasta el FORTRAN 77) se sigue utilizando debido a las toneladas de código heredado, pero el nuevo Fortran (a partir del Fortran 90) se utiliza principalmente porque es un lenguaje muy elegante y sencillo, pero potente y eficazmente implementado. para el cálculo de números .

DSL vs. GPL en general

Nótese específicamente, que incluso el Fortran moderno, en mi opinión, es _lenguaje específico del dominio_ (DSL) y aquí radica su relativa debilidad en comparación con algunos lenguajes de uso general (GPL) como el mencionado C++: Fortran está especializado en una tarea concreta (el cálculo de números) y podría no ser tan adecuado para algunas tareas relacionadas (por ejemplo, el análisis automatizado de los resultados finales, su representación gráfica, etc.)

Los lenguajes de propósito general, como C++, le dan más flexibilidad (en las características del lenguaje, en las bibliotecas de terceros, etc.) para que pueda resolver no sólo la tarea principal (el cálculo de números) sino también la tarea relacionada utilizando la misma lengua . Sin embargo, si elige Fortran para el cálculo de números, a menudo tendrá que utilizar una lengua más (por ejemplo, Python) para estas tareas relacionadas. Piénsalo como si usaras dos DSLs diferentes: uno para la tarea principal, otro para las tareas relacionadas. Por supuesto, también podrías usar Python junto con C++, pero un desarrollador experimentado en C++ (que se supone que eres si eliges hacer algunos cálculos numéricos en él) no necesariamente aprovecharía las ventajas de usar otro lenguaje en lugar de su bestia C++.

Fortran vs. C++ específicamente

Todo esto es algo subjetivo, pero de todos modos, aquí están mis 5 centavos. En general, Fortran es más sencillo que C++, pero (y porque) C++ tiene más funciones . Básicamente, porque Fortran es DSL, mientras que C++ es GPL. Y como he dicho, esto es subjetivo hasta cierto punto, y además, la complejidad es una de las cosas más complejas del universo, por lo que podríamos iniciar un debate al respecto, pero bueno, una sola palabra: plantillas y la discusión está en principio terminada. Las plantillas hacen de C++ la bestia, pero todo tiene su precio.

Tenga en cuenta que no he dicho que C++ sea más potente, ya que, en mi opinión, "más funcional" no siempre significa "más potente". Depende, en primer lugar, de si realmente necesitas esas características adicionales o no. En serio, ¿necesitas el nivel de generosidad (y metaprogramación) que ofrecen las plantillas de C++ para el cálculo de números? No necesariamente. Y si es así, C++ no será más potente que Fortran, aunque sí tendrá más funciones.

Las plantillas no son la única característica de C++ que no tiene Fortran. Las excepciones y la biblioteca estándar son otras dos características notables que Fortran no tiene. De nuevo, no es probable que se beneficie mucho de estas características para el cálculo de números. Pero en otras tareas pueden ser muy útiles, por lo que C++ como GPL las incluye mientras que Fortran como DSL para el cálculo de números no lo hace. Piense en Fortran como un "lenguaje de maleta" sólo para el cálculo de números y en C++ como un "lenguaje de maletero" para todo.

También hay una gran característica del lenguaje Fortran que C++ aún no ha podido alcanzar: los módulos. Es decir, módulos reales y no la antigua maquinaria del preprocesador que me irrita más que todo lo demás.

1 votos

C++ tiene módulos reales; si no te gustan los detalles de la implementación, entonces sólo usa #pragma una vez.

17voto

Aron Rotteveel Puntos 27894

FORTRAN solía tener una ventaja en cuanto a la velocidad debido a que contaba con compiladores mucho más optimizados, en parte debido a su relativa simplicidad. Ahora que los compiladores de C y C++ están casi a la par (y a veces son mejores), entran en juego otros factores como la programabilidad. Sin embargo, también hay mucho código heredado.

Trabajo en química cuántica, y muchos de los programas con los que trabajo tienen una mezcla pero están empezando a incorporar más C++. El paquete PSI4 incluso mezcla Python y C++ para obtener las ventajas de velocidad y usabilidad de cada uno.

A continuación se presenta una lista de varios programas y el o los idiomas que utilizan.

  • ORCA - C++
  • MPQC - C++
  • PSI4 - C++, Python
  • PySCF - Python
  • Q-Chem - FORTRAN, C++
  • CFour/ACES - FORTRAN, recientemente algo de C++
  • NWChem - FORTRAN, C
  • GAMESS(US) y GAMESS(UK) - FORTRAN
  • Gaussian - FORTRAN
  • Molpro - FORTRAN
  • Dalton - FORTRAN, algo de C
  • MRCC - FORTRAN
  • MOLCAS/OpenMOLCAS - FORTRAN
  • DIRAC - FORTRAN
  • ADF - FORTRAN
  • CASINO - FORTRAN
  • COLUMBUS - FORTRAN
  • CP2K - FORTRAN
  • TURBOMOL - FORTRAN

Paquetes de química cuántica

3 votos

El código C/C++ en el Juego de Benchmarks de Lenguaje Informático está escrito de una manera muy "hacky". Nadie lo hará "en producción" ya que dicho código es casi imposible de mantener. El C/C++ mantenible no superaría al Fortran.

0 votos

Lamentablemente, a veces es así. Sin embargo, desde que los compiladores optimizadores de C y C++ se han puesto al día, hay otras consideraciones como la usabilidad.

0 votos

@Wildcat No estoy de acuerdo; las librerías como Blitz++ que utilizan plantillas de expresión no son ni hacky ni no mantenibles; son muy fáciles de usar y mantener, y regularmente superan a FORTRAN en álgebra lineal.

14voto

phelix Puntos 116

FORTRAN es un lenguaje menos expresivo que C++, y eso permitía a los antiguos compiladores optimizar de forma mucho más eficiente. En los compiladores modernos, la diferencia de rendimiento es mínima o nula. Sólo hay algunos lugares donde las garantías de seguridad más débiles de FORTRAN permiten optimizaciones más extremas. Probablemente no notará la diferencia a menos que pase 6-10 años desarrollando FORTRAN.

En general, es más fácil desarrollar en los nuevos lenguajes porque aprovechan mejor las capacidades informáticas modernas. FORTRAN es muy estricto en su formato porque tuvo que ser compilado por ordenadores de mediados de los años 70. Le dices al ordenador exactamente lo que tiene que hacer en su lenguaje, en lugar de decirle lo que quieres hacer en un lenguaje más legible para los humanos.

FORTRAN se sigue utilizando por dos razones principales que puedo descubrir:

  • Algunos problemas son lo suficientemente simples como para desperdiciar la expresividad de C++, y en realidad se puede hacer un programa más claro con el más simple FORTRAN.
  • Muchos programas están hechos por la generación anterior. FORTRAN era, en el pasado, simplemente mejor para el trabajo computacional.

5 votos

En mi opinión, como desarrollador que ha trabajado en una docena de lenguajes, no hay ninguna razón para recomendar el uso de FORTRAN a ningún desarrollador para ninguna tarea, a menos que haya una base de código FORTRAN con la que interactuar. La gente simplemente ya no aprende el lenguaje, lo que significa que tendrás que mantener cualquier código que escribas para siempre. Será difícil de entregar a alguien.

4 votos

@CortAmmon Esto está tan lejos de ser cierto que es intelectualmente deshonesto. El FORTRAN moderno se utiliza en el CERN en el LHC por el amor de Dios, y tampoco es código nuevo que utilice una base heredada; muchas cosas se han reescrito ampliamente o se han escrito desde cero. FORTRAN no es ni de lejos menos expresivo que C++, como demuestran las innumerables bibliotecas y tareas en las que se ha utilizado. Además, mucha gente sigue aprendiéndolo; es un lenguaje de programación obligatorio en algunos entornos (sobre todo científicos).

2 votos

Esto recibió un upvote, lo que atrajo mi atención de nuevo. Me pareció que sería útil publicar un enlace a la Encuesta a los programadores de StackExchange de 2019 . A favor de Alice, puede haber pequeñas poblaciones muy unidas que desarrollen FORTRAN, y en esas poblaciones, puede ser un lenguaje mantenible. Pero en la población de desarrolladores más grande, es tan impopular que ni siquiera llegó a la lista de lenguajes con los que la gente desarrolla (el más bajo de la lista fue WebAssembly, con un 1,1%)

12voto

jmfsg Puntos 18246

Me encontré con un artículo en J. Appl. Cryst. que está parcialmente relacionado con la pregunta original. Al comparar Fortran con otros lenguajes de programación en el contexto de los algoritmos cristalográficos en un marco de software reutilizable se obtiene este diagrama condensado:

enter image description here

( doi 10.1107/S0021889801017824 )

Hay que añadir que el artículo se refiere a paquetes de software escritos en el antiguo dialecto Fortran 77.

4 votos

Aunque lenguajes como Python no son especialmente rápidos (es básicamente interpretado, no compilado) esto es engañoso. Python facilita el acceso a bibliotecas compiladas altamente optimizadas para tareas computacionales específicas. De este modo, se puede combinar la facilidad de programación con la alta velocidad de cálculo. Esta es una de las razones de su creciente popularidad.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X