Tutorial de Compilacion en Fortran

Este tutorial ensena los rudimentos de la compilacion de programas en lenguaje Fortran.

Programa de Ejemplo en Fortran: Rutina main y dos subrutinas

Existen varias convenciones para usar el compilador de Fortran. Estas son:

  1. El nombre del fichero que contiene el codigo fuente en fortran debe terminar con .f
  2. El compilador se invoca con gfortran o f95.
  3. El compilador tiene varias opciones disponibles (-c, -o, -p, -S)
  4. Se hacen preconexiones para stdin y stdout

Este es el ejemplo hola.f de codigo fuente de Fortran que se utilizara:

      program llamando
      write(6,100)
100   format (' Hola desde rutina main!',/)
      write(6,110)
110   format(' Llamando a subrutina1!',/)
      call sub1
      write(6,120)
120   format(t15' Volviendo desde subrutina1!',/)
      write(6,130)
130   format(' Llamando a subrutina2!',/)
      call sub2
      write(6,140)
140   format(t15' Volviendo desde subrutina2!',/)
      write(6,150)
150   format(' Eso es todo, amigos!')
      end
      subroutine sub1
      write(6,200)
200   format(t20,' Hola desde subrutina1!',/)
      end
      subroutine sub2
      write(6,210)
210   format(t20,' Hola desde subrutina2!',/)
      end

Compilar un programa

Para compilar el programa hola.f en un programa ejecutable, invoque el compilador de Fortran con:

gfortran hola.f

Si no provee opciones, gfortran aceptara codigo fuente Fortran o programas en lenguaje ensamblador que sigan las convenciones delineadas anteriormente. Compilara, ensamblara, y cargara dichos programas produciendo un ejecutable denominado convencionalmente a.out (lo que significa "salida de ensamblador"). El compilador gfortran da como salida el codigo objeto en ficheros con el nombre del fichero de base, pero recurriendo a la extension .o.

$ gfortran hola.f
$ ./a.out
Hola desde rutina main!

Llamando a subrutina1!

             Hola desde subrutina1!

        Volviendo desde subrutina1!

Llamando a subrutina2!

             Hola desde subrutina2!

        Volviendo desde subrutina2!

Eso es todo, amigos!
$

El fichero a.out que crea el compilador tendra los siguientes permisos

usuario leer, escribir, y ejecutar
grupo leer y ejecutar
otro Leer y ejecutar

No le sera necesario cambiar los permisos con chmod, debido a que el compilador gfortran otorgara el permiso de ejecucion automaticamente.

Renombrar el modulo ejecutable

Podra renombrar el modulo ejecutable usando el comando mv. Los permisos de fichero quedaran igual que antes de renombrar el fichero.

$ mv a.out hola
$ ./hola
Hola desde rutina main!

Llamando a subrutina1!

             Hola desde subrutina1!

        Volviendo desde subrutina1!

Llamando a subrutina2!

             Hola desde subrutina2!

        Volviendo desde subrutina2!

Eso es todo, amigos!
$

Otorgar nombre al fichero de salida

Es posible otorgarle al compilador gfortran un nombre para fichero de salida, en lugar de hacerlo por defecto a a.out por defecto, usando la opcion -o.

La opcion -o solicita al compilador gfortran que le informe al editor de enlaces el uso de un nombre distintivo para la salida.

No es necesario que la opcion -o aparezca despues del comando gfortran. El nombre de archivo que aparece despues de -o sera el nombre del fichero de salida. Por ejemplo, gfortran fuente -o salida es lo mismo que gfortran -o salida fuente-

$ gfortran -o hola.f
$ ./hola
Hola desde rutina main!

Llamando a subrutina1!

             Hola desde subrutina1!

        Volviendo desde subrutina1!

Llamando a subrutina2!

             Hola desde subrutina2!

        Volviendo desde subrutina2!

Eso es todo, amigos!
$

Producir un listado de Ensamblador

Esta opcion hace que gfortran compile programas de Fortran y disponga los programas de codigo ensamblador en un ficherode extension .s.

Por ejemplo

$ gfortran -S  hola.f
$ ls -c
ejemplo.f         hola      hex.c     octal.c
hola.c            hola.s    multiplo.c
$

El fichero hola.s contendra el listado de ensamblado del programa.

Rutina Principal y Dos subrutinas en tres ficheros fuente separados

Ahora lograremos lo mismo, pero dividiendo el programa en sus componentes individuales. Introduce los ficheros de codigo fuente main.f, y sub1.f y sub2.f en ficheros separados.

Compilar pero no producir un modulo ejecutable

Para compilar los tres ficheros del ejemplo anterior (sin producir aun un ejecutable), debera utilizar el siguiente comando:

gfortran -c main.f sub1.f sub2.f

La opcion -c compila, pero no carga los ficheros de codigo objeto. Esta opcion hace que gfortran compile y/o ensable los programas de codigo fuente, pero deje los programas de codigo objeto correspondiente con la extension de fichero .o.

Como vemos, el resultado sera:

$ gfortran -c main.f sub1.f sub2.f
main.f:
     MAIN: llamando:
sub1.f:
     sub1:
sub2.f:
     sub2:
$ ls a.out *.o
a.out no encontrado
main.o
sub1.o
sub2.o
$                                                             3

La opcion -c provoca que el sistema de compilacion suprima la fase de edicion de enlace. Esto produce un fichero o ficheros objeto, en este ejemplo, main.o, sub1.o y sub2.o) que podran ser enlazados posteriormente ingresando gfortran o f95 (sin opciones).

Compilar ficheros objeto para producir un modulo ejecutable

El comando para producir un modulo ejecutable a partir de varios ficheros objeto en este caso seria:

$ gfortran main.o sub1.o sub2.o
$ ls -C
main.o sub1.o sub2.o a.out
$

Ver Tambien: Tutorial de Compilacion en COBOL