No sé cómo se verá el lenguaje de programación en 2000, pero sé que se llamará FORTRAN.
- Charles Anthony Richard Hoar, aprox. 1982
En la industria, Fortran rara vez se usa hoy en día: en una de las listas de idiomas populares, estaba en el puesto 28 . Pero Fortran sigue siendo el idioma principal para simulaciones a gran escala de sistemas físicos, es decir, para cosas como el modelado astrofísico de estrellas y galaxias (por ejemplo, Flash ), dinámica molecular a gran escala, códigos de conteo de estructuras electrónicas ( SIESTA ), modelos climáticos, etc. En el campo de la informática de alto rendimiento, un subconjunto de los cuales son simulaciones numéricas a gran escala, hoy en día solo se utilizan dos lenguajes: C / C ++ y “Fortran moderno” (Fortran 90/95/03/08). Bibliotecas populares abiertas de MPISe han desarrollado herramientas de paralelización de código para estos dos idiomas. En general, si necesita un código rápido que se ejecute en múltiples procesadores, solo tiene dos opciones. En Fortran moderno existe una característica como " coarray ", que permite trabajar directamente con el lenguaje en programación paralela. Coarray apareció en la extensión Fortran 95 y luego se incluyó en Fortran 2008.El uso activo de Fortran por parte de los físicos a menudo confunde a los científicos informáticos y a otras personas no relacionadas con esta área que piensan que Fortran es un anacronismo histórico.Me gustaría explicar por qué Fortran sigue siendo útil. No animo a los estudiantes que estudian física a que enseñen a Fortran, ya que la mayoría de ellos investigarán, deberían estudiar C / C ++ (o detenerse en Matlab / Octave / Python). Me gustaría explicar por qué Fortran todavía se usa, y demostrar que esto no es solo porque los físicos están "atrasados" (aunque a veces esto es así: el año pasado vi a un estudiante de física trabajando con código Fortran 77, mientras que ni él ni su manager escucharon nada sobre Fortran 90). Los informáticos deberían ver el dominio de Fortran en computación numérica como un desafío.Antes de profundizar en el tema, quiero discutir la historia, porque cuando la gente escucha la palabra "Fortran", inmediatamente imaginan tarjetas perforadas y códigos con líneas numeradas. La primera especificación de Fortran fue escrita en 1954. El primer Fortran (entonces su nombre estaba escrito en mayúsculas, FORTRAN) era, para los estándares modernos, un lenguaje infernal, pero fue un increíble paso adelante de la programación previa de ensambladores. FORTRAN a menudo se programaba con tarjetas perforadas, como recuerda la profesora Miriam Forman de la Universidad Stony Brook sin placer. Fortran tenía muchas versiones, la más famosa de las cuales son las normas 66, 77, 90, 95, 03 y 08.A menudo se dice que Fortran todavía se usa debido a su velocidad. ¿Pero es el más rápido? En benchmarksgame.alioth.debian.orghay una comparación de C y Fortranen varias pruebas entre muchos idiomas. En la mayoría de los casos, Fortran y C / C ++ son los más rápidos. Los programadores favoritos de Python a menudo se retrasan 100 veces en velocidad, pero esto está en el orden de las cosas para el código interpretado. Python no es adecuado para cálculos numéricos complejos, pero es adecuado para otro. Curiosamente, C / C ++ supera a Fortran en todas menos dos pruebas, aunque en general difieren poco en los resultados. Las pruebas donde gana Fortran, las más "físicas" son la simulación de un sistema de n cuerpos y el cálculo del espectro. Los resultados dependen de la cantidad de núcleos de procesador, por ejemplo, Fortran va a la zaga de C / C ++ en el núcleo cuádruple. Las pruebas, en las que Fortran va muy por detrás de C / C ++, leen y escriben datos la mayor parte del tiempo, y a este respecto se conoce la lentitud de Fortran.Entonces C / C ++ es tan rápido como Fortran, y algunas veces un poco más rápido. Estamos interesados en "¿por qué los profesores de física continúan aconsejando a sus estudiantes que usen Fortran en lugar de C / C ++?"Fortran tiene código heredado
Gracias a la larga historia de Fortran, no es sorprendente que montañas de código físico estén escritos en él. Los físicos están tratando de minimizar el tiempo de programación, por lo que si encuentran un código anterior, lo usarán. Incluso si el código antiguo es ilegible, está mal documentado y no es el más eficiente, es más probable que use el código probado anterior que escribir uno nuevo. La tarea de los físicos no es escribir código, están tratando de entender la naturaleza de la realidad. Los profesores siempre tienen a mano el código heredado (a menudo lo escribieron hace décadas) y se lo pasan a sus alumnos. Esto les ahorra tiempo y elimina las incertidumbres del proceso de corrección de errores.Los estudiantes de física aprenden Fortran más fácilmente que C / C ++
Creo que Fortran es más fácil de aprender que C / C ++. Fortran 90 y C son muy similares, pero Fortran es más fácil de escribir. C es un lenguaje relativamente primitivo, por lo que los físicos que eligen C / C ++ se dedican a la programación orientada a objetos. OOP puede ser útil, especialmente en grandes proyectos de software, pero estudie mucho más tiempo. Necesitas estudiar abstracciones como clases y herencia. El paradigma OOP es muy diferente del procedimiento utilizado por Fortran. Fortran se basa en un paradigma de procedimiento simple que está más cerca de lo que sucede bajo el capó de una computadora. Cuando optimiza / vectoriza el código para aumentar la velocidad, es más fácil trabajar con el paradigma de procedimiento. Los físicos generalmente comprenden cómo funcionan las computadoras y piensan en términos de procesos físicos, por ejemplo, la transferencia de datos del disco a la RAM y de la RAM a la caché del procesador.Se diferencian de los matemáticos que prefieren pensar en términos de funciones abstractas y lógica. Además, este pensamiento es diferente de orientado a objetos. La optimización del código OOP es más complicada desde mi punto de vista que el procedimiento. Los objetos son estructuras muy voluminosas en comparación con las estructuras de datos preferidas por los físicos: matrices.Lightness One: Fortran Array Work
Las matrices, o, como las llaman los físicos, las matrices, están en el corazón de toda la computación física. En Fortran 90+, puede encontrar muchas oportunidades para trabajar con ellos, de forma similar a APL y Matlab / Octave. Las matrices se pueden copiar, multiplicar por un escalar, multiplicar entre sí de una manera muy intuitiva:A = B
A = 3.24*B
C = A*B
B = exp(A)
norm = sqrt(sum(A**2))
Aquí, A, B, C son matrices de alguna dimensión (por ejemplo, 10x10x10). C = A * B nos da la multiplicación de matrices por elementos si A y B son del mismo tamaño. Para la multiplicación de matrices, se usa C = matmul (A, B). Casi todas las funciones internas de Fortran (Sin (), Exp (), Abs (), Floor (), etc.) toman matrices como argumentos, lo que conduce a un código simple y limpio. Simplemente no hay un código similar en C / C ++. En una implementación básica de C / C ++, simplemente copiar una matriz requiere ejecutar bucles en todos los elementos o llamar a una función de biblioteca. Si alimenta una matriz de la función de biblioteca incorrecta en C, se producirá un error. La necesidad de usar bibliotecas en lugar de funciones internas significa que el código resultante no será limpio y portátil, ni fácil de aprender.En Fortran, el acceso a los elementos de una matriz funciona a través de la sintaxis simple A [x, y, z], cuando en C / C ++ necesita escribir A [x] [y] [z]. Los elementos de las matrices comienzan con 1, que corresponde a la comprensión de los físicos de las matrices, y en las matrices C / C ++, la numeración comienza desde cero. Aquí hay algunas características más para trabajar con matrices en Fortran.A = (/ i , i = 1,100 /)
B = A(1:100:10)
C(10:) = B
Primero, el vector A se crea a través de un bucle do implícito, también conocido como un constructor de matrices. Luego se crea un vector B, que consta de cada décimo elemento de A, utilizando un paso de 10. Y, finalmente, la matriz B se copia en la matriz C, comenzando desde el décimo elemento. Fortran admite declarar matrices con índices cero o negativos:double precision, dimension(-1:10) :: myArray
Al principio, un índice negativo parece tonto, pero escuché acerca de su utilidad; por ejemplo, imagine que esta es un área adicional para publicar cualquier aclaración. Fortran también admite índices vectoriales . Por ejemplo, puede transferir elementos 1,5 y 7 desde una matriz A de dimensión N x 1 a una matriz B de dimensión 3 x 1:subscripts = (/ 1, 5, 7 /)
B = A(subscripts)
Fortran admite máscaras de matriz en todas las funciones internas. Por ejemplo, si necesitamos calcular el logaritmo de todos los elementos de la matriz mayores que cero, usamos:log_of_A = log(A, mask= A .gt. 0)
O podemos anular todos los elementos negativos de la matriz en una línea:where(my_array .lt. 0.0) my_array = 0.0
Fortran hace que sea fácil asignar dinámicamente y liberar matrices. Por ejemplo, para colocar una matriz bidimensional:real, dimension(:,:), allocatable :: name_of_array
allocate(name_of_array(xdim, ydim))
En C / C ++, esto requiere la siguiente entrada :int **array;
array = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++){
array[i] = malloc(ncolumns * sizeof(double));
}
Para liberar una matriz en Fortrandeallocate(name_of_array)
En C / C ++ para estofor(i = 0; i < nrows; i++){
free(array[i]);
}
free(array);
:
En lenguajes como C / C ++, todas las variables se pasan por valor, con la excepción de las matrices que se pasan por referencia. Pero en muchos casos, pasar una matriz por valor tiene más sentido. Por ejemplo, dejemos que los datos consistan en posiciones de 100 moléculas en diferentes períodos de tiempo. Necesitamos analizar el movimiento de una molécula. Tomamos una porción de la matriz (submatriz) correspondiente a las coordenadas de los átomos en esta molécula y la pasamos a la función. En él, trataremos con un análisis complejo de la submatriz transmitida. Si lo pasamos por referencia, los datos transferidos no se ubicarían en la memoria en una fila. Debido a la naturaleza del acceso a la memoria, trabajar con una matriz de este tipo sería lento. Si lo pasamos por valor, crearemos en la memoria una nueva matriz organizada en una fila. Para deleite de los físicos, el compilador asume todo el trabajo sucio de optimizar la memoria.En Fortran, las variables generalmente se pasan por referencia, no por valor. Debajo del capó, el compilador Fortran optimiza automáticamente su transmisión para una mayor eficiencia. ¡Desde el punto de vista del profesor en el campo de la optimización del uso de la memoria, se debe confiar más en el compilador que en el estudiante! Como resultado, los físicos rara vez utilizan punteros, aunque Fortran-90 + Han .Algunos ejemplos más de las diferencias entre Fortran y C
Fortran tiene varias opciones para administrar el compilador al solucionar problemas y optimizar. Los errores en el código pueden detectarse en la etapa de compilación y no durante la ejecución. Por ejemplo, cualquier variable puede declararse como un parámetro, es decir, una constante.double precision, parameter :: hbar = 6.63e-34
Si el parámetro en el código cambia, el compilador devuelve un error. En C esto se llama constdouble const hbar = 6.63e-34
El problema es que const real es diferente de simple real. Si una función que acepta real se vuelve constante, devolverá un error. Es fácil imaginar cómo esto puede conducir a problemas de interoperabilidad en el código.Fortran también tiene una especificación de intención que le dice al compilador si el argumento pasado a la función es una entrada, una salida o tanto una entrada como un parámetro de salida. Esto ayuda al compilador a optimizar el código y aumenta su legibilidad y confiabilidad.Fortran tiene otras características que se utilizan en diferentes frecuencias. Por ejemplo, Fortran 95 tiene la capacidad de declarar funciones con el modificador puro. Dicha función no tiene efectos secundarios: solo cambia sus argumentos y no cambia las variables globales. Un caso especial de dicha función es la función elemental, que acepta y devuelve escalares. Se utiliza para procesar elementos de matriz. La información de que la función es pura o elemental permite que el compilador realice una optimización adicional, especialmente cuando se paraleliza el código.¿Qué esperar en el futuro?
En los cálculos científicos, Fortran sigue siendo el idioma principal y no va a desaparecer en el futuro cercano. En la encuestaEntre los visitantes de la conferencia de la Convención de Supercomputación de 2014 que usaban este lenguaje, el 100% de ellos dijeron que iban a usarlo en los próximos 5 años. También se deduce de la encuesta que el 90% usó una mezcla de Fortran y C. Anticipando un aumento en la mezcla de estos idiomas, los creadores de la especificación Fortran 2015 incluyen más funciones para la interoperabilidad del código. El código Fortran se llama cada vez más desde el código Python. Los informáticos que critican el uso de Fortran no entienden que este lenguaje sigue siendo especialmente adecuado para su nombre: FOrmula TRANslation, traducción de fórmulas, es decir, conversión de fórmulas físicas en código. Muchos de ellos no son conscientes de que el lenguaje está evolucionando y constantemente incluye nuevas características.Llamar al Fortran 90+ moderno es lo mismo que llamar al antiguo C ++ porque C se desarrolló en 1973. Por otro lado, incluso el estándar Fortran 2008 más nuevo tiene compatibilidad con Fortran 77 y la mayoría de Fortran 66. Por lo tanto, el desarrollo del lenguaje está asociado con ciertas dificultades. Recientemente, los investigadores del MIT decidieron superar estas dificultades desarrollando desde cero un lenguaje para HPC llamado Julia , lanzado por primera vez en 2012. Queda por ver si Julia tomará el lugar de Fortran. En cualquier caso, sospecho que esto llevará mucho tiempo.