Compilando en Pascal Gonzalo Soriano [email protected] 28 de marzo de 2009 Resumen Este apunte no tiene la intensión de enseñarles a usar un compilador, sino mostrales como compilar y algunas herramientas como el debugger y los breakpoints que pueden serles útiles al momento de realizar un TP o un programa extenso. 1. 1.1. Turbo Pascal 7.0 Compilar un programa Para mostrar cómo se compila un programa, primero tendremos que tener el programa. Motivo por el cual se eligió uno sencillo y que tiene como único propósito la suma de dos números. El código es el siguiente: Program ejemplo; Uses CRT; { Bloque de declaración de unidades. } Var { Bloque de declaración de variables. } num1, num2, resultado: integer; Begin { Comienzo del Programa Principal. } { Limpio la pantalla. } ClrScr; { Pido que ingrese un número y lo leo por pantalla. } write (’Ingrese un numero entero: ’); readln (num1); writeln; write (’Ingrese el segundo numero entero: ’); readln (num2); writeln; { Hago la suma de num1 + num2. } resultado := num1 + num2; { Imprimo por pantalla el resultado de la suma. } writeln (’El resultado de la suma es: ’,resultado); writeln; { Hago la resta sin guardarla en ninguna variable e imprimo el resultado. } 1 writeln (’La resta del primero menos el segundo es de: ’, num1-num2); writeln; { Espero hasta que el usuario apriete una tecla para salir del programa. } writeln (’Presione una tecla para continuar.’); readkey; End. { Fin del Programa Principal. } Ahora que tenemos el programa, debemos compilarlo, pero antes tenemos que asegurarnos que lo compilaremos en disco. Razón por la cual vamos al menú Compile y, en caso de que no diga Disk en Destination le hacemos clic. Una vez que nos aseguramos de esto, volvemos a ir al menú Compile, pero esta vez elegimos Compile; o presionamos las teclas Alt+F9, como lo indica al costado. 2 Y ahora ya se compilo el programa, solo queda buscarlo en la PC y ejecutarlo cuando desee. A continuación veremos el uso de una herramienta muy útil, que se utiliza para encontrar y solucionar problemas en códigos largos. Esta herramienta consiste en ir ejecutando el código paso a paso, y ver en un cuadro de texto como se van modificando las variables; y recibe el nombre de debugger. Lo primero que tenemos que hacer es poner las variables que queremos ver como varı́an; para esto debemos ir al menú Debug, y dentro de él, a Add match... ó presionar las teclas Ctr+F7. Al hacer esto, les aparecerá un cuadro de texto donde ustedes deben ingresar el nombre de la variable. Para observar más variables deben repetir el procedimiento anterior para cada una. 3 Después pueden presionar la tecla F7 o F8 para que el programa se valla ejecutando de a un solo paso. Empezara desde el begin donde empieza el programa y seguirá hacia abajo. Pinta de verde lı́nea la próxima lı́nea a ser ejecutada. En las siguientes dos imágenes se puede ver cómo varia el valor de num1 cuando el usuario ingresa el número 5. 4 Cuando tenemos códigos largos y no encontramos un error, puede ser muy molesto tener que ejecutar todo el programa lı́nea por lı́nea; y más si sabemos que en las primeras 200 (por decir un número) no se encuentra el error. Y acá es donde aparecen los breakpoints. Lo que tenemos que hacer es decir ’supongo que de acá para atrás no esta el error, ası́ que voy a correr el programa hasta este punto y de acá en adelante lo seguiré paso a paso’. ¿Como hacemos para decirle eso al compilador?, muy sencillo, agregamos un breakpoint. Para lo cual tenemos que ir a ’Debugg’ y luego a ’Add breakpoint...’. Al hacer esto, les aparecerá cuadro de texto que les preguntara si desean poner alguna condición para que el compilador detenga la corrida. En caso de que deseen, pueden modificar ese campo, y aceptar con ’OK’. Una vez que aceptan, la lı́nea sobre la cual ustedes estaban parados se coloreará de rojo, indicando que ahı́ hay un breakpoint. 5 Después hay que correr el programa, para lo cual debemos ir al menú ’Run’ y nuevamente a ’Run’, como indica la figura, o presionando las teclas Ctrl+F9. De esta manera, el programa se ejecutara hasta ese punto, y a partir de allı́, correrá como si lo hubiéramos hecho paso a paso. Obviamente que si deseamos, también podemos empezar a ejecutar el programa paso a paso y terminar corriéndolo como recién. 2. 2.1. Free Pascal y GDB Compilando en Linux Para compilar un programa en Linux, al igual que en cualquier plataforma, necesitamos un código fuente y un compilador. El compilador que vamos a usar es el Free Pascal, el cual tiene la ventaja de ser multiplataforma y lo podemos obtener de http://www.freepascal.org/download.var. Ahora lo que nos falta es el programa, de lo cual nos tenemos que encargar 6 nosotros :). Para escribirlo podemos usar una IDE1 como el Anjuta cualquier editor de texto. Usaremos como ejemplo el siguiente programa: [4]; o Programa ejemplo.pas program ej1; uses crt; var int : integer; begin writeln(’Funciona!!!!’); readln(int); writeln(’ingresastes el ’,int); readkey; end. Ahora que tenemos el código fuente del programa a compilar (ejemplo.pas) y el compilador (Free Pascal), simplemente tenemos que abrir una terminal, lı́nea de comandos o consula y pararnos en el directorio donde esta guardado el archivo ejemplo.pas. Una vez ubicados en la posición correcta, escribimos: user$ fpc ejemplo.pas Si no tubimos problemas al momento de compilar, la salida será de la forma: Free Pascal Compiler version 2.0.0 [2005/09/09] for i386 Copyright (c) 1993-2005 by Florian Klaempfl Target OS: Linux for i386 Compiling ejemplo.pas Linking ejemplo 10 Lines compiled, 0.6 sec Si al mismo programa le agregamos una variable que no se usa, por ejemplo: int, aux : integer; Free Pascal nos lo informará de la siguiente forma (ver lı́nea 5): Free Pascal Compiler version 2.0.0 [2005/09/09] for i386 Copyright (c) 1993-2005 by Florian Klaempfl Target OS: Linux for i386 Compiling ejemplo.pas ejemplo.pas(4,7) Note: Local variable "aux" not used Linking ejemplo 10 Lines compiled, 0.2 sec Si ahora cambiamos el programa usando una variable sin inicializar de la forma: program ej1; uses crt; 1 Integrated Development Environment, o Entorno de Desarrollo Integrado 7 var int : integer; begin writeln(’Funciona!!!!, de entrada int vale’, int); readln(int); writeln(’ingresastes el ’,int); readkey; end. Free Pascal nos lo informará de la siguiente forma (ver lı́nea 5): Free Pascal Compiler version 2.0.0 [2005/09/09] for i386 Copyright (c) 1993-2005 by Florian Klaempfl Target OS: Linux for i386 Compiling ejemplo.pas ejemplo.pas(6,2) Warning: Variable "int" does not seem to be initialized Linking ejemplo 10 Lines compiled, 0.1 sec Si nos hubieramos olvidado de declarar la variable int, Free Pascal de la siguiente forma: Free Pascal Compiler version 2.0.0 [2005/09/09] for i386 Copyright (c) 1993-2005 by Florian Klaempfl Target OS: Linux for i386 Compiling ejemplo.pas ejemplo.pas(7,9) Error: Wrong number of parameters specified ejemplo.pas(7,13) Error: Illegal expression ejemplo.pas(8,28) Error: Wrong number of parameters specified ejemplo.pas(8,32) Error: Illegal expression ejemplo.pas(11) Fatal: There were 4 errors compiling module, stopping ejemplo.pas(11) Error: Compilation aborted Error: /usr/bin/ppc386 returned an error exitcode (normal if you did not specifiy a source file to be compiled) Notar que en la última lı́nea nos indica que el programa no fue compilado. 2.2. 2.2.1. Primeros pasos con el GDB Compilar el fuente Si suponemos que nuestro programa se llama ejemplo.pas entonces usualmente lo compiları́amos de la forma: user$ fpc ejemplo.pas Pero para informarle ahora tenemos que informarle al compilador que lo tiene que compilar de una forma particular para que después podamos usar el GDB; y eso lo hacemos con el flag -g antes del nombre del programa. user$ fpc -g ejemplo.pas 8 2.2.2. Iniciar el GDB Como dijimos en el resumen, el GDB se usa por lı́nea de comandos, y una vez parados en ella con solo poner user$ gdb ejemplo.pas 2 iniciamos el GDB. Si queremos pasarle parámetros al programa que vamos a ejecutar, éste es el momento de pasarlos con el comando set args param1 param2 ... paramN Para empezar a ejecutar el código fuente del programa que queremos depurar, tenemos que usar el comando start. Una vez que empezamos a debuggear tenemos distintos comandos, que usaremos en función de nuestras necesidades; los más comunes son: start: Inicia la ejecución del programa, pero no ejecuta ninguna sentencia. Su llamada es (gdb) start. step: Ejecuta la próxima instrucción (equivalente al Trace into [F7] de Pascal). Su llamada es (gdb) step n. Donde n es la cantidad de pasos que tiene que seguir, si no se lo next: Ejecuta la próxima instrucción, pero si es un procedimiento o una función la ejecuta en un solo paso. Equivalente al Step over [F8] de Pascal. Su llamada es simplemente (gdb) next. list: Muestra la próxima instrucción a ejecutarse y su contexto. Su llamada es simplemente (gdb) list. print: Muestra el valor de una variable, una expresión lógica, o la llamada a una función. Su llamada es (gdb) print param, donde param es el nombre variable a observar, la llamada a la función o la expresión. break: Es el equivalente a los breakpoints del Turbo Pascal. Su función es de detener la corrida del programa en una lı́nea en particular; pero sin terminar la ejecución. El break puede llamarse de las siguientes formas: • (gdb) break n. Inserta un breakpoint en la n-esima lı́nea del fuente que estamos ejecutando. • (gdb) break fuente.pas:n. Inserta un breakpoint en la n-esima lı́nea del archvio fuente.pas. • (gdb) break funcion. Inserta un breakpoint al comienzo de la función indicada. delete N : Borra el breakpoint N. Su llamada es simplemente (gdb) delete N. continue: Continúa la ejecución del programa hasta el próximo breakpoint o el fin del programa. Su llamada es simplemente (gdb) continue. run: Corre, desde el principio, el programa hasta encontrar un breakpoint o el fin del programa. Su llamada es simplemente (gdb) run. help: Muestra la ayuda del GDB. Su llamada es simplemente (gdb) help. 2 Siendo ejemplo.pas el nombre del programa a debuggear. 9 help running: Muestra los comandos básicos de GDB para debuggear un programa. Su llamada es simplemente (gdb) help running. help command: Muestra una breve descripción del comando. Su llamada es simplemente (gdb) help command. q/quit: Sale del GDB. Su llamada es simplemente (gdb) q. Referencias [1] http://sourceware.org/gdb/ [2] http://www.gnu.org/software/ddd/ [3] http://www.freepascal.org/ [4] http://www.anjuta.org/ 10 Índice 1. Turbo Pascal 7.0 2. Free Pascal y GDB 2.1. Compilando en Linux . . . 2.2. Primeros pasos con el GDB 2.2.1. Compilar el fuente . 2.2.2. Iniciar el GDB . . . 1 . . . . . . . . 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 8 8 9