C1 INTRODUCCIÓN AL LENGUAJE C Fundamentos de Informática Departamento de Ingeniería de Sistemas y Automática. EII. Universidad de Valladolid Índice 1. Lenguajes de Programación 1. Definición. 2. Niveles de lenguajes de programación 3. Compiladores e intérpretes 2. El lenguaje C 1. Historia 2. Características. 3. 4. Compilación. Entorno de desarrollo. 5. Mi primer programa. Lenguajes de Programación: Definición Un Lenguaje de Programación es un conjunto de símbolos y reglas con los que expresar órdenes a un ordenador. Los símbolos que acepta un lenguaje de programación representan su léxico. Las reglas son sintácticas y semánticas: Sintaxis: establece qué construcciones son aceptables como instrucciones válidas. Semántica: establece el significado de dichas Instrucciones válidas. Lenguajes de Programación: Definición Lenguaje Natural (Humano) Lenguaje de Programación Léxico Palabras y signos de puntuación Símbolos del lenguaje. Sintaxis Oraciones correctas. Instrucciones bien formadas y válidas. Semántica Información que trasmite quien habla o escribe. Qué acciones debe ejecutar el ordenador para hacer lo que ordena el programa. Niveles de los lenguajes de programación Básicamente se pueden establecer tres categorías: Lenguaje máquina Lenguaje ensamblador Alto nivel • Lenguaje máquina Lenguaje directamente comprensible por el procesador. Representación bit a bit en '1's y '0's. Depende totalmente del hardware. Es definido por el conjunto de instrucciones que soporta un procesador. Ej: Un programa escrito en lenguaje de máquina del 68000 Motorola es completamente incomprensible por el Pentium Intel. Niveles de los lenguajes de programación • Lenguaje ensamblador Emplea palabras nemotécnicas para hacer referencia a las instrucciones del lenguaje de máquina. Ensamblador Lenguaje de máquina ADD AX,54 01000101 01010100 Incluye nombres simbólicos para hacer referencia a las variables o etiquetas para marcar el destino de los saltos en el flujo del programa. Ensamblador Lenguaje de máquina atras: 00000101 … … jmp atras 11010100 El programa escrito en lenguaje ensamblador debe ser traducido a lenguaje de máquina, ya que el procesador sólo entiende 0’s y 1’s. Programa Fuente en Ensamblador Programa Ensamblador Programa Objeto 1’s y 0’s en Lenguaje Máquina Niveles de los lenguajes de programación •Lenguaje Máquina y Ensamblador Son esencialmente iguales. Hay una correspondencia simple entra ambos y son considerados lenguajes de Bajo Nivel. Ambos están directamente ligados a la arquitectura del procesador y del ordenador que se utilice y requieren una alta especialización del programador. •Lenguajes de Alto Nivel Definen su sintaxis y sus estructuras al margen del procesador que se utilicen. Son independientes del procesador. Son portables (a priori). Una sola sentencia de alto nivel corresponde en general a muchas instrucciones de bajo nivel. La correspondencia entre las estructuras de alto nivel y el código de máquina es compleja. Las sentencias se escriben en un programa fuente utilizando un editor de texto (son legibles), en el que pueden aparecer comentarios. Las instrucciones son más abstractas y potentes. Necesitan ser traducidos al lenguaje del procesador (compilador). Compiladores e intérpretes El compilador •En la etapa de análisis, el compilador verifica que los símbolos son correctos (léxico), que las sentencias están bien construidas (sintaxis) y que las instrucciones tengan un significado coherente (semántica). •En la etapa de síntesis se genera código de máquina para el procesador específico y si es posible se optimiza el código atendiendo, por ejemplo, a criterios como: •Tamaño del programa •Velocidad de ejecución. Compiladores e intérpretes Tras la compilación se genera un fichero con el programa ejecutable. Al ejecutarse puede dar lugar a varios procesos. El Intérprete En contraposición a un compilador, un intérprete es un programa que sólo realiza la traducción del programa fuente a medida que sea necesario y, normalmente, no guardan el resultado de dicha traducción. Los programas interpretados suelen ser más lentos que los compilados debido a la necesidad de traducir el programa mientras se ejecuta, pero a cambio son más flexibles como entornos de programación y depuración. Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito Historia del Lenguaje C •Creado por Dennis Ritchie entre el año 1970-73. •En 1973 la mayor parte del kernel de Unix fue reescrito en C. •En 1978, Ritchie junto a Brian Kerninghan publicaron The C Programming Language (K&R) donde se hicieron nuevas aportaciones al lenguaje y se estableció el conjunto mínimo de carácterísticas que debía cumplir un compilador de C. Estándar de Facto •Durante los 70 empezó progresivamente a reemplazar a BASIC en microcomputadoras. •1980 Stroustroup desarrolla C++ como una extensión orientada a objetos del C. •El ANSI crea una comisión para estandarizar el lenguaje. 19831989. El lenguaje C que cumple con la especificación se le llama ANSI C. Soportado por la mayoría de los compiladores. Incluye el K&R pero con nuevas características. Si se escribe en ANSI C se garantiza la portabilidad. Características del Lenguaje C •Lenguaje de alto nivel con posibilidad de bajo nivel. Independiente del hardware aunque si el programador quiere puede "bajar" al hardware. •El núcleo del lenguaje es relativamente pequeño. Se apoya en bibliotecas o librerías externas para realizar funciones esenciales (como la entrada /salida). Dado que las librerías están también estandarizadas (ANSI) se puede considerar que forman parte del lenguaje. •El paradigma de programación que mejor se aviene al lenguaje C es el de Programación Estructurada: •Escritura de programas mediante módulos que necesitan sólo tres estructuras: secuencia, selección e iteracción (sin necesidad de saltos incondicionales de tipo goto, exit o múltiples return) •El flujo del programa en C está definido por secuencia, decisiones condicionales, bucles y llamadas a funciones. •Conjunto de operadores aritmético-lógicos muy poderoso. Cuidado, porque puede fácilmente crear programas casi imposibles de entender o crípticos. •Valores almacenados en variables, con diferentes tipos. •Los programas grandes se subdividen en funciones: procedimientos con parámetros de entrada y de salida bien definidos. Compilación •El Programa Fuente es un fichero texto que contiene las instrucciones y comentarios escritos por el programador. •Puede incluir sentencias del tipo: # include <stdio.h> Indica que se incluya un archivo de cabecera.(.h) .Estos archivos contienen definiciones y declaraciones útiles y utilizadas por las librerías. •Antes de compilar se crea otro programa fuente mediante un preprocesamiento: •incluyendo los archivos de cabecera •quita comentarios •reemplaza definiciones (#define PI 3.14) •se obtiene programa fuente intermedio (texto) extendido (.i) Compilación El programa fuente intermedio es compilado y se obtiene un programa objeto en código de máquina del procesador (.o). Este programa objeto todavía no es directamente ejecutable, dado que falta por integrar el código ejecutable de las Librerías (.a) o de otros prgramas (.o). Compilación El enlazador (Linker) une todos los archivos que contengan código objeto para el programa, así como las librerías a las que éstos hacen referencia. Se resuelven las referencias cruzadas entre las distintas partes del código. Ejemplo: •Una instrucción en objeto1.o puede hacer referencia a una variable en objeto2.o •En objeto1.o y objeto2.o se invocan funciones de la librería estándar. Como resultado se obtiene el programa directamente ejecutable por el S.O. Entorno de desarrollo integrado (IDE) Un entorno de desarrollo integrado , (IDE: integrated development environment), es un programa informático compuesto por un conjunto de herramientas para facilitar las tareas de programación. Normalmente constan de: • un editor de textos donde escribimos el código • un compilador, que generará el código ejecutable • un depurador, que nos permite buscar errores • herramientas para elaborar interfaces gráficas (GUI: graphical user interface) Entorno de desarrollo integrado (IDE) CODE::BLOCKS • Es un IDE de uso libre y multiplataforma para el desarrollo de programas en C y C++. • Permite el uso de diferentes compiladores. En nuestro caso usaremos el compilador gcc en su versión para Windows MinGW • Dispone de multitud de posibilidades de configuración en lo que respecta a las características del editor, opciones de compilación, depuración, etc. • • Durante el curso, nosotros nos centraremos sólo en los aspectos relacionados con la programación en C Más información en: • http://www.codeblocks.org/ • http://es.wikipedia.org/wiki/Code::Blocks Entorno de desarrollo integrado (IDE) CODE::BLOCKS Mi primer programa en C #include <stdio.h> /*Cabecera E/S estandar*/ main() /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Mi primer programa en C Todo programa debe tener una función main, donde comienza la ejecución del programa #include <stdio.h> /*Cabecera E/S estandar*/ main() /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Mi primer programa en C #include <stdio.h> /*Cabecera E/S estandar*/ main() /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Las llaves {} delimitan las sentencias incluidas en el bloque de definición de la función main. Mi primer programa en C #include <stdio.h> /*Cabecera E/S estandar*/ main() /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Comentarios aclaratorios delimitados por /* */. Son ignorados por el compilador y eliminados en la etapa de preprocesamiento Mi primer programa en C Se ordena la inclusión (durante el etapa de preprocesamiento) del archivo de cabecera de E/S estándar. Es necesario porque se va a utilizar una función de E/S. #include <stdio.h> /*Cabecera E/S estandar*/ main() /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Mi primer programa en C Dentro de función main se invoca la función printf de la librería de E/S estándar. #include <stdio.h> main() { printf muestra por la salida estándar (la pantalla normalmente) el contenido de la cadena de caracteres que se le pasa como argumento. /*Cabecera E/S estandar*/ El carácter especial representado por \n /*Función principal main*/ significa un cambio de línea. /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Llamada función main*/ /*Fin bloque main*/ Mi primer programa en C #include <stdio.h> main() Las sentencias en C terminan con el carácter ; /*Función principal main*/ { /*Inicio bloque main*/ printf("¡Hola mundo!\n"); } /*Cabecera E/S estandar*/ /*Llamada función main*/ /*Fin bloque main*/