Fundamentos de Informática Tema 3 Programación de Ordenadores 1 Contenidos Introducción Metodología de la programación. Resolución de problemas con el ordenador. Análisis de requerimientos. Etapa de diseño. Implementación, validación y mantenimiento. Descripción de algoritmos. Lenguaje algorítmico. Pasos para diseñar un algoritmo sobre un problema. Programación modular. Programación estructurada. Lenguajes de programación. Elementos básicos de la programación. Estructura de los programas. Lenguajes de programación. Evolución. Traductores. 2 Introducción 3 Para trabajar con un sistema informático nos hace falta un ordenador (Hardware) y unos programas (Software). Se aplican técnicas ingeniería a ambos: Arquitectura Comp. , Ingeniería de Software (incluye Metodología Programación) Un programa se puede ver como la solución a un problema, en términos de una secuencia de pasos computacionales. Programación: “Planificación y/o ejecución de una tarea". Programación de ordenadores: Proceso de planificación de secuencias de las instrucciones para realizar una acción o tarea. Existen metodologías que permiten que la programación sea los más eficaz en cuanto a desarrollo y mantenimiento. Introducción 4 Los ordenadores ejecutan rápida y de forma precisa operaciones lógicas y matemáticas. Son “tontos”: Sólo saben hacer lo que se les dice. Lo que no siempre es igual a lo que se les debe decir, por tanto, el programa ha de estar perfectamente definido (preciso, simple y sin ambigüedades). Errores pequeños pueden provocar fallos graves. Para resolver un problema con un programa, es necesario desmenuzar la solución, en pasos concretos, cortos y perfectamente definidos. Un algoritmo es una secuencia ordenada de pasos claros, concretos, precisos, sin ambigüedades, que lleva a la solución genérica de un problema. Metodología de la programación Estudio de procedimientos y/o métodos para resolver problemas con computadoras, independientemente de un lenguaje de programación concreto y del ordenador donde se va a implementar. Es fundamental que los programas cumplan: 5 Legibles: Comprensibles para cualquier programador. Modificables: Su estructura debe permitir modificaciones. Depurables: Debe ser fácil la localización y corrección de errores. Metodología de la programación Si no seguimos un método de programación riguroso: • Los programas son rígidos y difíciles de adaptar a nuevos requerimientos. – Los programadores gastan mucho tiempo corrigiendo sus errores. – La comunicación entre programadores es muy difícil. – Los programas y módulos son poco reusables. – Existen deficiencias en la documentación. – 6 Resolución de problemas con el ordenador Análisis de requerimientos Diseño Implementación Validación Mantenimiento El ciclo de vida del Software 7 Análisis de requerimientos 8 Esta fase consta de dos partes orientadas a responder QUÉ es lo que hay que hacer: 1. Definición del problema: Identificar claramente que es lo que se quiere resolver. 2. Análisis del problema: se basa en identificar: Entrada de datos: La fuente y los tipos de datos para las entradas. Listar variables y su tipo Resultados: Destino y formato de salida (variables y tipo) 5. Procesamiento: Interacción entre datos y resultados. Etapa de diseño En esta fase resolvemos CÓMO se hace lo especificado en el análisis de requerimientos. 1. Obtener una solución (estructurar la información y los pasos ) Programar es tarea difícil (mezcla muchos procesos mentales) Descomponer el problema en varios más sencillos. con técnicas “divide y vencerás”, diseño descendente o modular, … dividiendo el problema en subproblemas más sencillos. 2. Hacer un esquema de la solución, es decir, Idear y explicitar un algoritmo que describa la solución paso a paso. El diseño del algoritmo debe ser independiente del lenguaje de programación en el que se vaya a programar. En problemas sencillos, los dos pasos se reducen a uno solo 9 Implementación, validación y mantenimiento Implementación: se pasa el diseño obtenido en la etapa anterior, a una descripción escrita en un lenguaje de programación (un lenguaje que puede comprender el ordenador). Se implanta en un ordenador, y se ejecuta. Validación: es el proceso de identificar y eliminar errores. Mantenimiento: Correctivo, adaptativo y perfectivo. 10 DESCRIPCIÓN DE ALGORITMOS SE SUELE HACER CON: Descripción narrada en lenguaje natural. A veces es impreciso y farragoso, pero muy descriptivo (receta cocina). Diagramas de flujo: Organigramas. Diagramas de Nassi. Tablas de Decisión, .... . Son precisos y de fácil traslado al L. de programación, pero en general son poco descriptivos. Lenguaje algorítmico. Toma la descripción fácil de la narrativa, elimina lo superfluo del lenguaje, y coge lo conciso de los diagramas de flujo (pseudocódigo en inglés, especificaciones formales, ...). 11 EJEMPLO: TEOREMA DE PITÁGORAS. a) Lenguaje Natural: Se introducen los catetos, después se eleva cada uno al cuadrado y se suman estos cuadrados. Se obtiene la raíz cuadrada y este será el valor de la hipotenusa. b) Diagramas de flujo: Inicio Fin b, c "h = ", h c) Lenguaje Algorítmico 1) [Entrar longitudes catetos] 2) [Calcula cuadrados catetos] 3) [Calculo la hipotenusa] 4) [Salida de resultados] 5) [Final lógico y/o físico] 12 s = b2 + c2 h=√s LEE (cat1, cat2) cu1 cat1**2 ; cu2 cat2**2 hip RaizCuad (cu1 + cu2) Escribe ("Lados: ", cat1, cat2, hip) FINAL (SALIDA). Lenguaje algorítmico La idea es usar una forma de escribir las instrucciones, bastante simple y cercana al lenguaje habitual: (ESCRIBE, ESCRIBIR), (LEE) ,.... Un aspecto muy importante es La PRUEBA . Se ejecuta con papel y lápiz, poniendo en un cuadro los valores que a cada variable se le asigna en cada paso, a partir de datos de entrada cuyo resultado es conocido. Gastar tiempo en diseñar bien un algoritmo, lleva a una solución de mayor calidad y un ahorro de tiempo en el proceso completo. 13 Pasos para diseñar un algoritmo sobre un problema 1. 2. 3. 4. 5. 6. 7. 14 Tener seguridad de entender completamente las especificaciones del problema (Una forma es indicar la salida que se espera de algunos ejemplos de entrada) Formular a grosso modo un algoritmo para resolver el problema. (Hay que probarlo con algunos ejemplos). Identificar y listar las variables representativas, junto con el tipo de variable y una indicación de su propósito. Analizar cada paso para detallarlo en 2/3 pasos nuevos cada vez (los nuevos pasos hacen lo mismo). Repetir 3. y 4. hasta nivel de detalle suficiente, y entonces probar de nuevo el algoritmo completo. Si da errores, revisar pasos 2, 3, 4 y 5, hasta no errores. Traspasar a un lenguaje programación (casi inmediato). Programación modular La programación modular consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable. Un problema complejo se divide en subproblemas más simples, y estos a su vez en otros más simples. Cada módulo realiza tareas únicas y es reutilizable. El nivel de detalle depende de criterios de claridad. Ésta técnica se llama refinamiento sucesivo, divide y vencerás ó análisis descendente. El módulo principal produce y controla la ejecución de los demás. 15 Programación modular Ejemplo: Cambiar la rueda de un coche por pinchazo. Fase 1 Fase 2 1. Bajar del coche y abrir maletero. 2. Sacar ruedaR y Herramientas. 3. Cambiar la rueda. 4. Guardar ruedaP, seguir marcha 1.1 Bajarse Coche 1.2. Abrir Maletero 2.1 Sacar rueda repuesto y herramientas 3.1 Levantar coche con gato. 3.2 Poner ruedaR y atornillar 4.1 Guardar ruedaP, seguir marcha. Fase 3 Fase 4 3.1.1 Colocar gato en su sitio 3.1.2 Calzar bien el coche 3.1.3 Girar manivela hasta ruedaP en el aire. (**) Podría detallarse más: (los tornillos se van apretando poco a poco, primero uno y luego el opuesto, …) 16 Programación estructurada Es un conjunto de técnicas que incorporan: Recursos abstractos: Lenguaje algorítmico, diagramas de flujo,… Diseño descendente: Programación modular. Estructuras básicas: Con sólo una entrada y una salida: 17 Secuencial: Acciones simples (asignación), con flujo lineal continuado. Selección: Toma de decisión o alternativas, simples o múltiples, en función de una condición. Repetitivas: Bucles. Se repiten una serie de acciones mientras (hasta) se verifica una condición. Programación estructurada Teorema de Bohm-Jacopini:Todo programa se puede escribir usando sólo 3 tipos de estructuras de control: Secuenciales, Selectivas y Repetitivas. La PE permite escribir programas fáciles de leer y de modificar, con un orden y estructura al escribir sentencias. Se estructuran además los datos. El estilo se reduce a aspectos de claridad y a optimizar diseño/estructura del programa. Se prohíben saltos a otras partes del programa (GOTO). 18 Elementos básicos de la programación Necesidad de Lenguaje (alfabeto y reglas de sintaxis y semántica, pocas, concretas, precisas) para comunicarnos con el ordenador: 19 Caracteres: Elementos del alfabeto. Palabras: Instrucciones básicas. Palabras Reservadas (Diccionario) + Identificadores (Usuario). Frases: Instrucciones y acciones más complejas. Sintaxis: Reglas para construir sentencias válidas. Semántica: Reglas que dan significado a las “frases” del lenguaje Elementos básicos de la programación TIPOS DE DATOS: Los datos son la representación de la información que existe en el mundo real. Numéricos: Enteros y reales. Caracteres: Permiten letras, dígitos, signos de puntuación, etc. Lógicos: Verdadero/Falso. Datos enumerados: Son nuevos tipos de datos para los que especificamos el dominio en el que están definidos. Datos estructurados: Se consiguen mediante una agrupación de otros tipos de datos. 20 Escalares. Se operan directamente: Entero, Real, Carácter, Lógico. Estructurados. Agrupaciones de escalares. Cadenas, Matrices, .... Estándares (los incorpora el lenguaje). F90: E, R, C, L, Comp, Cad. Definidos por Usuario. En Fortran, Registros (Type) Datos Estándares Datos Definidos por el Usuario D. Escalares o Simples D. Estructurados Estáticos Homogéneos DATOS Dinámicos Heterogéneos Organiza. Lógica (como los ve el usuario): Campo Registro Fichero. (Ficha Alumno). Dirección lógica y física Organiz. Física. (como se almacena/usa en Ordenador). Bit Byte (Palabra) Bloque (128-256 bits) Fichero (coincide fichero lógico). SO Gestiona la identificación entre direcciones físicas y lógicas 21 Elementos básicos de la programación Los datos pueden ser constantes o variables Variables.- Poseen un valor (puede cambiar a lo largo del programa). Se nombran con Identificadores, según reglas: Empiezan con letra, sin espacios blancos, y sin símbolos que puedan confundir (+, -, *, /, ,... ). Constantes. Con nombre (PI), o Valor literal (3.1416). Operaciones Elementales. Operadores Relacionales. Con números: + , - , * , / , ** . Carácter: No hay. Cadenas: concatenación. Lógicos: Operadores lógicas: Y, O, NO. Comparar datos (mismo tipo): <, <=, = , <>, >=, >. 22 Estructura de los programas Cabecera: Identifica el programa con un nombre. Declaraciones (constantes, variables y su tipo). Señalar la información necesaria de entrada y salida. Programa Principal (Cuerpo): Acciones a realizar. Declaración (funciones, procedimientos): Módulos. Salida del programa. Comentarios aclarativos en todo momento. Mantener un cierto Estilo 23 Lenguajes de programación. SOPORTE LÓGICO : Es la parte lógica o SOFTWARE: Programas y Utilidades que hacen funcionar al ordenador PROGRAMA: Conjunto ordenado de instrucciones que representa las operaciones a realizar y su secuencialidad. INSTRUCCIÓN: Cjto. símbolos que indican al ordenador una acción de tratamiento, operación o transferencia. Clara (No ambigua), Concreta y Sencilla. [Etiqueta] CódigoInstrucción Argumentos Tipos: Transf.. Datos, Tratamiento (operación), Transf. Control, Interrupción. Sintaxis y semántica clara y rígida LENGUAJE: Conjunto de reglas semánticas y de sintaxis para redactar las instrucciones y construir programas. Los programas escritos en Lenguaje de usuario se traducen (codifican) a Leng. Máquina, o leng. Intermedios, Ensambladores. 24 Lenguajes de programación. Evolución. • Programas en Circuitos (No hay lenguaje como tal) Con Von Newmann nacen lenguajes específicos para cada computadora, en formato binario; son instrucciones simples (0001101011101011010). Lenguaje Máquina (o código máquina). Las instrucciones propias de cada máquina están codificadas con ceros y unos. Dependen del procesador. Son incomprensibles y engorrosos de usar. Es dificil escribir en binario, se usan nemotécnicos (SUM, MUL,....). Lenguaje Ensamblador. Nemotécnico del código máquina. Sigue ligado al ordenador, pero menos engorroso. Se traduce a lenguaje máquina, con un programa Ensamblador. Permiten variables, macros y comentarios. Al código máquina y al ensamblador se les conoce como lenguajes de bajo nivel. 25 Lenguajes de programación. Evolución. Lenguajes de alto nivel: Cercanos al lenguaje natural y matemático. Mas fáciles de leer y escribir. Se permiten operaciones más complejas. Ej.: raíz cuadrada. Existe el concepto de subprograma. Son menos eficientes. Son más portables (casi independientes del ordenador). Se pueden usar sin conocer los entresijos de los ordenadores. Algunos son: Fortran, Algol, Pl/I, Ada, Basic, Simula, Pascal, Apl, Modula, Logo, C, Lisp, Prolog, Java, Perl, Python, .... Necesidad de un Traductor que pase de lenguaje de alto nivel a código máquina. Lenguajes de cuarta generación: Herramientas que permiten construir aplicaciones sencillas combinando piezas prefabricadas. 26 Fases de ejecución de programas: FASE Escritura o Introducción “mecanografiada” del Programa (Programa fuente). Traducción a ensamblador y de aquí a Len. Maquina, o directamente a Leng. Máquina (Programa objeto) Montar fichero ejecutable, enlazando todos los módulos (“Linkaje”) adecuadamente. (Programa ejecutable) Cargar el Programa en Memoria Principal Ejecutar el Programa Rastreo y Depuración de Errores 27 UTILIDAD (Programa) Editor de Textos (Text Editor) Compilador (Compiler) + Ensamblador (Assembler) Compilador /Intérprete (Interpreter) Montador, Enlazador Encuadernador (Linker) Cargador (Louder) Sistema Operativo (OS) Rastreador, Depurador (Tracer, Debbuger) Fases de ejecución de programas: Traducción En los lenguajes de alto nivel surge la necesidad de un Traductor que pase de lenguaje de alto nivel a código máquina. El traductor es un programa. Tipos: Compilador: Traducen el programa completo (Programa Fuente) a un Programa Objeto (lenguaje máquina). El Programa Ejecutable se obtiene tras la fase de enlazado (link). Si en cualquier fase se detecta un error, hay que corregirlo (con editor) y volver a realizar todo el proceso de traducción global. Una vez obtenido el programa ejecutable, se ejecutará todas las veces que queramos, sin nuevas traducciones. Intérprete: Traducen el programa instrucción a instrucción. Interpreta una instrucción y la ejecuta directamente (si se detecta un error en la instrucción, se puede corregir sobre la marcha, y continúa la ejecución del programa). La traducción se repite en cada ejecución del programa, pero las siguientes veces ya no habrá errores. Los programas son más portables pero más difíciles de optimizar. Cuando la traducción se hace en una máquina distinta a la de ejecución del programa, se utiliza un traductor cruzado. En una computadora se puede simular otra distinta, con programas llamados emuladores. 28