Unidad III El lenguaje de programación C 1. Introducción. 2. Breve historia del C. 3. Lenguajes de programación de alto nivel, bajo nivel y nivel medio. 4. Compiladores e intérpretes. 5. Compilación, enlace y generación de un programa ejecutable. 6. Instalación de un compilador de C. 7. Estructura básica de un programa en C y programa “Hola mundo”. 8. Transformación de un algoritmo en un programa ejecutable. Página 1 Unidad II El lenguaje de programación C En este capítulo se hablará de programas y lenguajes de programación. Cuando se habla de un programa es importante tener en cuenta que se hace referencia a un programa informático y básicamente es una secuencia de instrucciones finitas que son ejecutadas por la computadora. Para aprovechar la velocidad de cálculo de las primeras computadoras era necesario alimentarlas con programas. Esta tarea se realizaba directamente por medio de series de instrucciones que estaban formadas por secuencias de ceros y unos, por ejemplo, 0100011010011101 representaba una instrucción. Con varias de estas instrucciones se implementaba un programa para que sea ejecutado por la computadora. Esta primera forma de especificar programas para una computadora se la denomina lenguaje máquina ó lenguaje binario y era una tarea muy difícil de realizar y altamente sensible a los errores. La necesidad de recordar secuencias de programación para las acciones usuales llevó al desarrollo de neumónicos que dispongan nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. Los neumónicos eran las instrucciones y este conjunto de instrucciones para especificar un programa se denominó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de programación de alto nivel y de medio nivel. Reciben esta denominación porque son más cercanos a los lenguajes naturales de los humanos y tienen una estructura sintáctica similar. 1. Introducción C es un lenguaje de programación estructurado, débilmente tipado y relativamente minimalista. Uno de los objetivos de diseño de este lenguaje fue que sólo fueran necesarias unas pocas instrucciones en lenguaje de máquina para traducir cada elemento del lenguaje, sin que hiciera falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo nivel de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes. En parte, a causa de ser relativamente de bajo nivel y de tener un modesto conjunto de características, se pueden desarrollar compiladores de C fácilmente. En consecuencia, el lenguaje C está disponible en un amplio abanico de plataformas (seguramente más que cualquier otro lenguaje). Además, a pesar de su naturaleza de bajo nivel, el lenguaje se desarrolló para incentivar la programación independiente de las máquinas. Un programa escrito cumpliendo los estándares e intentando que sea portable puede compilarse en varias computadoras de diferentes tipos (microcomputadoras, minicomputadoras, mainframes, etc.). C se desarrolló originalmente por programadores para programadores. Sin embargo, ha alcanzado una popularidad enorme y se ha usado en contextos muy alejados de la programación de sistemas para la que se diseñó originalmente. En la actualidad es empleado por los programadores de élite a nivel mundial. Página 2 Computación para Ingenierías I Ing. Franz Mercado Lorberg 2. Breve historia del C C es un lenguaje de programación que fue creado en 1972 por Dennis Ritchie y Ken Thompson en los laboratorios Bell (AT&T) en una minicomputadora DEC PDP-11 y es el resultado de la evolución del lenguaje B (B a su vez deriva del BCPL). Fue ampliamente usado en el desarrollo de sistemas operativos, concretamente UNIX. Durante muchos años el estándar del lenguaje C era el que venía proporcionado en la versión V del sistema operativo UNIX. Pero con la creciente popularidad de las microcomputadoras empezaron a aparecer muchas variantes del lenguaje C. El problema principal fue que comenzaron a aparecer discrepancias entre las diferentes versiones del C. Para remediar esta situación, el Instituto Nacional de Estándares Americano (ANSI – American National Standarts Institute) estableció un comité que se encargó de crear un estándar que definiera de una vez por todas el lenguaje C (denominado ANSI C ó C89). En 1999 salió a la luz el último estándar de C vigente y se conoce como C99. 3. Lenguajes de programación de alto nivel, bajo nivel y nivel medio Los humanos nos expresamos por medio del lenguaje natural, pero las computadoras comprenden las instrucciones en lenguaje binario. Para subsanar este hecho, se han creado diferentes lenguajes de programación que pueden ser de diferentes niveles y sirven como lenguaje intermedio entre el lenguaje natural y el binario. Lenguaje natural (Español) Lenguajes alto nivel (Pascal, Basic, ADA, COBOL, FORTRAN) Lenguajes de nivel medio (C, C++, FORTH) Lenguajes de bajo nivel (Assembler) Lenguaje binario Los lenguajes de alto nivel son lentos pero más fáciles de aprender. Los lenguajes de bajo nivel son muy rápidos pero tienen un alto grado de complejidad. Lenguajes de alto nivel Son más cercanos al lenguaje natural que empleamos los humanos. Están compuestos por construcciones similares al inglés (parecidos al pseudocódigo de la unidad 2 vista anteriormente). Página 3 Unidad II El lenguaje de programación C Ej. En lenguaje Pascal: if ( Contador = 5 ) then writeln('La suma de los primeros 5 enteros es: ', Sumatoria); else writeln('No se ha podido calcular el resultado'); En este ejemplo las instrucciones dicen: “Si el contador es igual a 5 mostrar en la pantalla La suma de los primeros 5 enteros es: (el contenido de Sumatoria), sino mostrar en la pantalla No se ha podido calcular el resultado”. Lenguajes de bajo nivel Son más cercanos al lenguaje binario que emplea la computadora. Las instrucciones hacen referencia a los componentes internos de la computadora (registros del microprocesador, direcciones de memoria). Ej. En lenguaje Assembler: MOV AX, 0F79 ADD AX, 1 MOV DS, AX En este ejemplo las instrucciones dicen: “Cargar el registro AX con el valor contenido en la dirección 0F79 (AX es el registro del acumulador donde se realizan las operaciones aritméticas). Adicionar 1 al contenido del registro AX. Mover el contenido del registro AX al registro DS (Data Segment)”. Como puede apreciar, Assembler es difícil de entender porque se deben conocer: La estructura interna del microprocesador, la manera como se acceden a los datos, la forma como se almacenan los datos en la memoria. Otra gran desventaja del Assembler es que el código es dependiente de la plataforma para la cual se desarrolla el programa. Lenguajes de medio nivel C es un lenguaje de nivel medio pero esto no significa que sea mediocre. En realidad significa que aprovecha las características de los lenguajes de alto nivel (similares al lenguaje natural) y también las características del bajo nivel (acceso a direcciones de memoria, manejo de datos a nivel de bits), entonces el lenguaje C aplica lo mejor de ambos mundos. Ej. En lenguaje C: Contador = 1; printf("La tabla del 7 es:\n"); while( Contador <= 10 ) { printf("%i por %i es %i", 7, Contador, 7 * Contador ); Contador = Contador + 1; } En este ejemplo las instrucciones dicen: “Asignar 1 a Contador. Mostrar en la pantalla La tabla del 7 es:. Mientras el Contador sea menor o igual a 10 repetir: Mostrar en la pantalla 7 por (el contenido de Contador) es (calcular 7 * el contenido de Contador)”. Incrementar el contador en 1 unidad. Página 4 Computación para Ingenierías I Ing. Franz Mercado Lorberg 4. Compiladores e intérpretes Un compilador (compiler) es un programa especial que se encarga de traducir el código fuente escrito en un lenguaje de programación y convertirlo en código binario para la computadora. El proceso de compilación en dos etapas se encarga de revisar todo el código fuente y revisa que no contenga errores léxicos, sintácticos ni semánticos. Si todo se encuentra en orden genera un código intermedio que se denomina código objeto que aún no es ejecutable. Un intérprete (interpreter) es otro programa que tiene el mismo propósito que el compilador: Traducir las instrucciones escritas en un lenguaje de programación a binario. El intérprete va interpretando cada instrucción a medida que se la va introduciendo y no requiere de dos etapas, sin embargo es más lento que el compilador en la generación del ejecutable. 5. Compilación, enlace y generación de un programa ejecutable Después de compilar el código fuente se obtiene un producto intermedio que es el código objeto. En este punto es necesario realizar una etapa más para generar el programa ejecutable y este paso lo lleva adelante el enlazador. Un enlazador (linker) es un programa que se encarga de unir el código objeto generado por el compilador con las librerías ó bibliotecas del lenguaje de programación. El resultado de este enlace es el programa ejecutable. Las librerías ó bibliotecas de un lenguaje de programación son funciones y procedimientos que se pueden emplear para desarrollar los programas más rápidamente. Por lo general contienen instrucciones que permiten realizar las tareas más comunes de programación (introducir datos desde teclado, mostrar datos en la pantalla, realizar cálculos por medio de funciones, etc.). 6. Instalación de un compilador de C En este curso se desarrollarán las habilidades básicas e intermedias de programación con el lenguaje C. No es necesario que se utilice un compilador de C específico, puede emplear cualquier compilador de C que pueda conseguir. Importante: Acceda al sitio www.programacionupb.freeservers.com y descargue de la página Principal el compilador Turbo C++ y el Tutorial de instalación del Turbo C++. Siga las instrucciones del tutorial para instalar este pequeño pero potente entorno de desarrollo integrado (IDE). Página 5 Unidad II El lenguaje de programación C 7. Estructura básica de un programa en C y programa “Hola mundo” El programa “Hola mundo” es el código fuente mínimo que se aprende para empezar a programar y se utiliza para entender cuáles son los elementos fundamentales para escribir un programa básico. #include <stdio.h> int main( ) { printf("Hola mundo…"); return 0; } Recuerde que para empezar a desarrollar un programa en C se requiere de una ó más funciones, siendo obligatoria la función denominada main( ). La llave de apertura significa inicio y la llave de cierre significa fin. int main( ) { } Es posible que vea diferentes variaciones en la manera en la que se escribe la función main( ), el significado real de estas variaciones se discutirá en la próxima unidad: Ej. Variantes de main( ): void main( ) { } int main( ) { return 0; } int main( int argc, char *argv[] ) { return 0; } La función printf( ) se emplea para mostrar un texto en la pantalla. El texto debe estar entre comillas dobles. Para utilizar printf( ) es necesario incluir el archivo de cabecera stdio.h que se encargará de enlazarse con la biblioteca correspondiente. Página 6 Computación para Ingenierías I Ing. Franz Mercado Lorberg 8. Transformación de un algoritmo en un programa ejecutable El proceso completo para la creación de un programa ejecutable se puede resumir en la siguiente imagen que consta de una serie de etapas: Problema Algoritmo Flujograma Pseudocódigo Lenguaje de programación Código fuente Compilación (compiler) Código objeto Bibliotecas Enlace (linker) Programa ejecutable Al igual que en los flujogramas y pseudocódigos, el lenguaje de programación C tiene palabras reservadas que se encargan de controlar el flujo de los datos. También consta de un conjunto de funciones para introducir datos dentro de variables, mostrar el contenido de las variables, mostrar textos. Ejecutar operaciones aritméticas, lógicas y de comparación. Por lo tanto, es posible migrar los algoritmos desarrollados en la unidad 2 y transformarlos en código fuente. Este código fuente después de ser compilado y enlazado producirá un programa ejecutable. Página 7