You are on page 1of 4

APUNTES DE PRÁCTICAS DE LABORATORIO

AMPLIACIÓN DE CÁLCULO NUMÉRICO

PRIMEROS PASOS COMPILANDO

CONCEPTOS BÁSICOS.
ESQUEMA BÁSICO DE TRABAJO
CONFIGURACIÓN DE LA CUENTA PARA TRABAJAR CON EL COMPILADOR DE
FORTRAN90
COMPILACIÓN y EJECUCIÓN DE PROGRAMAS FORTRAN: Primeros Pasos
COMPILACIÓN Y EJECUCIÓN DE PROGRAMAS FORTRAN: Primeros errores

CONCEPTOS BÁSICOS

Lenguaje máquina: es el lenguaje que "entiende" el ordenador. Sólo se pueden describir instrucciones muy
simples, como
Copiar el contenido de una dirección de memoria en un registro de la UAL (unidad aritmético-lógica)
Sumar el contenido de una dirección de memoria al contenido de un registro de la UAL
Guardar el contenido del registro de la UAL en una dirección de memoria
etc.
Las instrucciones-máquina están codificadas ("escritas") en binario (en términos de 0 y 1). Los programas en
lenguaje máquina son tediosos de escribir/entender y NO son portables de una máquina a otra.

Lenguaje ensamblador: es muy próximo al lenguaje máquina, pero los códigos binarios de operaciones se
sustituyen por nemónicos (nombres-código que recuerdan la operación) y las referencias a direcciones de
memoria se sustituyen por nombres simbólicos (variables).
Por ejemplo, se podría usar el nemónico ADDREC para referirse a la operación de sumar un número
al contenido del registro de la UAL y STOREC para designar la operacion de guardar en Memoria
Central el contenido del registro de operaciones. Asimismo, en vez de referirse a la dirección de
Memoria número 101110100 se haría referencia a la variable SUMA.
Los programas escritos en ensamblador deben ser traducidos a lenguaje máquina: esto lo hace un programa
especial que se llama también ensamblador. Al programa escrito en ensamblador se le llama programa o código
fuente, mientras que al resultado de traducirlo al lenguaje máquina se le llama programa o código objeto.
Los programas escritos en ensamblador, aunque no tanto como los programas-máquina (objeto), siguen siendo
tediosos y requiriendo del programador un profundo conocimiento del funcionamiento interno del ordenador. Y
además siguen sin ser portables: cada máquina tiene su propio lenguaje ensamblador.

Lenguajes de alto nivel: permiten liberar al programador del tedio de escribir programas como los descritos
anteriormente y, sobre todo, permiten que los programas sean portables: que sirvan para muchas máquinas
distintas. En un lenguaje de alto nivel se pueden escribir operaciones de más complejidad y en un lenguaje más
próximo al "humano". A los programas escritos en lenguajes de alto nivel también se les llama programas o
códigos fuente.
Los programas fuente también deben ser traducidos a lenguaje máquina. Generalmente, cada instrucción del
código fuente dará lugar a varias instrucciones-máquina.
La traducción a lenguaje máquina se puede hacer de dos formas (normalmente, dependiendo del lenguaje):
Mediante un intérprete: un programa especial que traduce a lenguaje máquina instrucción a
instrucción, y las va ejecutando.
Mediante un compilador: un programa especial que traduce a lenguaje máquina un programa
completo y, sólo una vez traducido todo, se puede ejecutar.
Así, un programa fuente escrito en un lenguaje de alto nivel es independiente de la máquina. Se puede llevar de
una máquina a otra y traducirlo. LO QUE ES DEPENDIENTE DE LA MÁQUINA ES EL COMPILADOR O INTÉRPRETE.
FORTRAN90 es un lenguaje de compilador.

Programas ejecutables: un programa objeto procedente de la compilación de un programa fuente escrito, por
ejemplo, en FORTRAN, no se puede ejecutar tal cual. Es necesario "añadirle" determinadas "herramientas" del
sistema que puede necesitar, como por ejemplo pequeños programas para calcular una raiz cuadrada, o un
logaritmo, o para escribir mensajes en la pantalla, ...
Esta fase se denomina edición de enlaces (link) y es la que genera, verdaderamente, el programa o código
ejecutable.

ESQUEMA BÁSICO DE TRABAJO

Las fases en el desarrollo de un proyecto de programación pueden resumirse de la siguiente forma:
Planificación del proyecto, dividiéndolo, si es complicado, en una secuencia de etapas más simples, que
correspondan a partes lógicas del desarrollo. Esta fase se lleva a cabo EN UN PAPEL, estableciendo lo más
claramente posible la finalidad de cada etapa, los datos que se necesitan de entrada, los datos que producirán en
salida, los algoritmos que se utilizarán, etc. En esta etapa suele ser útil escribir los algoritmos en forma de
pseudo-códigos: escribir esquemáticamente la secuencia de operaciones a realizar en un lenguaje que nos resulte
cómodo, pero intentando reproducir las operaciones que se realizarán en el ordenador.

1.
Edición del código fuente, es decir, escritura del mismo utilizando un editor de texto simple (sin formato). Los
programas fuente serán almacenados en ficheros de texto, normalmente en el disco duro del ordenador.

2.
Compilación del programa fuente, para traducirlo a código máquina. Para ello se darán las órdenes oportunas al
sistema operativo a través de la linea de comandos de un terminal.

3.
Corrección de errores de compilación: si el compilador nos informa de que ha detectado errores, se analizarán
para averiguar qué errores nuestros los han producido. Los errores se corregirán en el código fuente, repitiendo los
pasos 2 (de edición) y 3 (de compilación) hasta que no se produzcan errores de compilación.

4.
Generación del programa ejecutable, normalmente utilizando (con otras opciones) el mismo comando que para
compilar. En esta fase también se pueden detectar errores, normalmente debidos a que no se han suministrado de
forma adecuada todas las "herramientas complementarias" que se necesitan para producir un ejecutable. Si se
detectan hay que repetir, de nuevo, los pasos anteriores desde 2.

5.
Ejecución del programa. Lo normal, sobre todo con programadores novatos, es que no funcione correctamente.
Esta es la fase más difícil, porque los errores a este nivel no son de sintaxis. Suelen ser errores lógicos en la
concepción del programa: el programa "funciona" pero no hace lo que se esperaba.

6.
Depuración del programa, analizando las posibles causas de los errores de ejecución. Una vez encontradas las
causas, será necesario repetir todos los pasos desde 2.

7.
Cuando el programa funcione correctamente, suele ser conveniente revisar de nuevo el código fuente para incluir
los comentarios adecuados para documentarlo, así como para ordenarlo, ya que con mucha frecuencia el proceso
de depuración lo ha "desordenado".
8.

CONFIGURACIÓN DE LA CUENTA PARA TRABAJAR CON EL COMPILADOR DE FORTRAN90
Para trabajar más cómodamente con el compilador, conviene hacer los siguientes cambios en la configuración de nuestra
cuenta de usuario:
Editar el fichero .bash_profile (oculto) de nuestro directorio personal, añadir :. (dos puntos, punto) al final de
la linea que comienza por PATH= ... etc de forma que quede:
PATH=$PATH:$HOME/bin:.
y añadir, a continuación de esta, la linea siguiente:
source /opt/intel/fc/9.1.036/bin/ifortvars.sh
Salvar el fichero.

1.
Salir de la cuenta (terminar sesión) y volver a entrar. En el futuro no habrá que volver a realizar estas operaciones. 2.

COMPILACIÓN y EJECUCIÓN DE PROGRAMAS FORTRAN: Primeros Pasos
Suponemos que ya está escrito nuestro programa fuente y almacenado en un fichero de nombre file.f90
Abrir un terminal y elegir, como directorio de trabajo, el directorio en donde esté el fichero file.f90
En la linea de comandos escribir:
ifort -c file.f90
para compilar el programa. Si ésta es satisfactoria, se generará un fichero conteniendo el programa objeto de
nombre
file.o
Una vez creado un programa objeto sin errores, escribir en la línea de comandos
ifort -o file.out file.o
para editar enlaces. Si todo va bien, se generará un fichero de nombre
file.out
conteniendo el programa ejecutable. Si se escribe sólo ifort file.o se producirá un ejecutable de nombre a.out
También pueden llevarse a cabo ambas etapas mediante una sóla orden, escribiendo
ifort -o file.out file.f90
En este caso no se creará el fichero objeto file.o
Para ejecutar el programa bastará escribir, en la linea de comandos del terminal
file.out

Ejemplo 1
Realizar un programa ejecutable que imprima en la pantalla la palabra HOLA.

Escribir con un editor de textos el siguiente programa fuente:
program hola
print*
print*, "¡¡¡ HOLA !!!"
print*
end program hola
Guardar dicho programa en un fichero con el nombre hola.f90
Abrir un terminal
Compilar el programa: ifort -c hola.f90
Comprobar, tanto por linea de comandos como con el administrador de archivos, que se
ha generado el programa objeto hola.o
Generación del ejecutable: ifort -o hola.out hola.o
Comprobar que se ha generado el fichero ejecutable hola.out
Ejecución: hola.out provoca que imprima en pantalla la palabra HOLA
Eliminar los ficheros hola.o y hola.out
Generación de otro ejecutable: ifort -o hola.out hola.f90
Comprobar que se ha generado el fichero hola.out y que no se ha creado el fichero
hola.o

COMPILACIÓN Y EJECUCIÓN DE PROGRAMAS FORTRAN: Primeros errores
Observaciones previas:
El fichero ejecutable es autosuficiente, es decir, no necesita ninguno de los demás ficheros para funcionar. Además,
se puede ejecutar en cualquier máquina que tenga el mismo sistema operativo que aquel en que fue generado. En
nuestro caso, en cualquier máquina con Linux.
1.
Para poder modificar el funcionamiento de un ejecutable hay que modificar el fuente, guardar las modificaciones, y
realizar todo el proceso completo de compilación y generación de ejecutable.
2.
Cada vez que se realiza una nueva compilación, sin errores de sintaxis, de un fuente, se "machaca" el fichero
objeto correspondiente (a menos, claro está, que expresamente le demos un nombre distinto). Si hay errores de
sintaxis, el objeto no se modifica y por tanto no recoge las posibles modificaciones que se hayan introducido en el
fuente.

3.
Cada vez que se realiza una nueva generación de un ejecutable usando el mismo nombre y sin errores de enlace,
se "machaca" el anterior ejecutable. Si hay errores de enlace, el ejecutable no se modifica y por tanto no recoge las
posibles modificaciones que se hayan introducido en los objetos.
4.
Ejemplo2
Modificar el programa del ejemplo1 para que también se imprima en pantalla la palabra ADIOS
Añadir en el fichero hola.f90 dos nuevas líneas, de forma que quede
program hola
print*
print*, "¡¡¡ HOLA !!!"
print*
print*,"¡¡¡ ADIOS !!!"
print*
end program hola
Guardar el fichero con el mismo nombre.
Compilar el fichero y generar un nuevo ejecutable.
Comprobar por línea de comandos y por el administrador de ficheros las fechas y horas
de modificación de los distintos ficheros.
Ejecutar el nuevo ejecutable.

Modificar el programa anterior cometiendo algún error de sintaxis.
Borrar los ficheros hola.o y hola.out
Modificar el fichero hola.f90, escribiendo mal alguna instrucción, por ejemplo:
program hola
pritn*
print* "¡¡¡ HOLA !!!"
print*
print*,"¡¡¡ ADIOS !!!"
print*
end program hola
Guardar el fichero con el mismo nombre
Compilar el fichero con la orden ifort -c hola.f90
Se obtendrá la siguiente salida, describiendo los errores de compilación que se han
encontrado
fortcom: Error: hola.f90, line 2: Syntax error, found '*' when expecting
one of: => = . ( : %
pritn*
------------^
fortcom: Error: hola.f90, line 3: Syntax error, found
CHARACTER_CONSTANT '¡¡¡ HOLA !!!' when expecting one of: ,
<END-OF-STATEMENT> ;
print* "¡¡¡ HOLA !!!"
--------------^
compilation aborted for hola.f90 (code 1)