Equipos Programas Media Internet Telecomunicaciones Seguridad Base de Datos Programación Calidad Desarrollo Empresa

Ruta: >Programación

Principios Ingeniería Software

Tabla de Contenido

  1. Historia
  2. Historia de arquitectura de ordenadores
  3. Sistemas distribuidos y redes
  4. Sistemas operativos
  5. Paradigmas de la programación
  6. Programación estructurada
  7. Tipos de datos
    1. Tipos de datos
    2. Clases de tipos
    3. Tipos compuestos
    4. Definición de tipos
  8. Variables
  9. Ámbito
  10. Clase
  11. Objeto
  12. Excepciones
  13. Instrucciones
  14. Función
  15. Programación orientada a objetos
  16. Programación por objetos
    1. Programación por objetos
    2. Modularidad
    3. Componentes en software
    4. Métodos
    5. Clases de relaciones
    6. Ventajas
    7. Inconvenientes
  17. Programación por eventos
    1. Programación por eventos
    2. Eventos
  18. Comentarios en el código
  19. Compilación
  20. Construcción
  21. Tipos de comunicación
    1. Tipos de Comunicacion
    2. Mensajes
  22. APIs
  23. Puntos de vista de un programa
  24. Inteligencia artificial

Contenido

  • Historia

    Historia

    • Inicialmente únicamente había ordenadores analógicos.
    • Al principio no existia la había BIOS, sino que habría que meter un programa cargador.
    • En los 50 se inventó el Fortran (formule translator). Es el primer lenguaje de alto nivel. La programación era puramente algorítmica.
    • Cobol. usado en aplicaciones de gestión. Lo que no podían hacer con estos lenguajes se hacía con ensamblador.
    • Los lenguajes de alto nivel consumen más recursos.
    • Argol. Interesante por sus conceptos.
    • Lisp, Fortran, Cobol, etc. son procedurales, es decir, se introducen datos y devuelven varios o ningún dato. No son entonces una función. Ya había bucles, secuencia, etc. Pero Lisp funcionaba con listas.
    • También había lenguajes lógicos, que son aquellos usados para inteligencia artificial.
    • Con el tiempo, la parte de control del programa se volvió muy compleja.
    • En los 70 aparece la programación estructurada: consecuencias, bucles, y decisiones. Se eliminó el GO TO y aparecieron metodologías.
    • Por entonces los datos eran estáticos, es decir, los declaraban al programar y luego no podían cambiarse.
    • Había un exceso de variables. Sólo había tipos entero, coma flotante, números complejos y matrices. No podían definirse tipos, tenían que ser mapeados con esos.. No existia el tipo string.
    • Pascal. Para enseñar conceptos de programación. Fue el primer lenguaje en el cual podías definir tus propios tipos. hizo más legible los programa.Podían definirse los conjuntos por propiedades ( español: de España) o por extensión ( de _ a _ valor).
    • Se definió un tipo llamado 'estructura', en la que se podían hacer datos compuestos de otros tipos. pudieron hacerse entonces matrices, no sólo de números, sino también de listas, otras matrices, etc.
    • Luego vino Unix y C. Teníanlas estructuras del Pastal, programación estructurada, el GO TO, instrucciones para trabajar a bajo nivel o a alto nivel.
    • Smalltalk. Srimer lenguaje orientado a objetos. Se apoyaron en el concepto de tipo, para que pudieran crear o destruir o editar el objeto en tiempo de ejecución.
    • A la variable se le empezaron a 'pegar' sus operaciones. Haciendo abstracción de objetos llegamos al concepto de clase.
    • C++ y Objetive C. Son mejoras del C.
    • En Los 80 y 90 se desarrolló mucho la inteligencia artificial. Se desarrollaron mucho los lenguajes lógicos (Pro Log).
    • Antes en el ordenador sólo se ejecutaba un programa. Luego aparecieron programas que ejecutaba varios programas 'a la vez'. El operativo empezó a incluir drivers.
    • Con la llegada de los terminales pudieron trabajar varios usuario contra el mismo ordenador (el ordenador central de ITT tenía por entonces 256K).
    • La concurrencia complicó mucho el panorama en programación. Iba muy ligada con el concepto de tiempo real ( muy usado en industria para cadenas de montaje, semáforo, etc). Trabajan con datos obtenidos a partir de sensores. (Ej: servidor web, trabaja en tiempo real y además en concurrencia).
    • La concurrencia se asocia con el tiempo.
    • Luego llegaron los sistemas distribuidos, llamados así porque distribuían las tareas en el espacio.
    • En la actualidad los sistemas distribuidos son concurrentes y en tiempo real. Hay lenguajes para sistemas distribuidos, como el Java.
    • Mac Lisa. Fué el primer ordenador en incorporar un sistema operativo con un interfaz de ventanas. Incorporaban eventos.
  • Historia de arquitectura de ordenadores

    Historia de arquitectura de ordenadores

    • Von Neuman. Maquinas con 'program counter'. Las máquinas actuales son en su mayoría de este tipo, aunque empiezan a incorporar cierta concurrencia (por ejemplo, la cache del procesador).
    • Data flow. No tenían 'program counter', pues eran concurrentes. Las tareas se realizan cuando la anterior ha terminado, etc.
  • Sistemas distribuidos y redes

    Sistemas distribuidos y redes

    • En ellos, los datos y la ejecución no tiene porque estar en el mismo ordenador.
    • Aparecen las arquitecturas de cliente/servidor.
    • Agente manager.

    Entornos:

    • Java
  • Sistemas operativos

    Sistemas operativos

    Al principio no se adquirían, sino que se hacían en las propias empresas.

  • Paradigmas de la programación

    Paradigmas de la programación

    • Invariantes. Es algo que siempre se cumple en un programa. Ej: podemos repartir dinero entre varias personas de muchas maneras distintas, pero la cantidad de dinero repartida es siempre la misma.
    • En Fortran había un área de datos llamada COMMON, donde accedían las rutinas para obtener los datos. Esto suponía un problema, ya que con la instrucción EQUIVALENCE una variable podía ser usada por más de una rutina.
    • También estaba el GO TO. Te podías escapar en medio del código a otra zona, lo cual generaba problemas.
  • Programación estructurada

    Programación estructurada

    • En ella, cada bloque tiene una entrada y una salida.
    • Programa = control + datos.
    • Se elimina el GO TO. Se utilizó un grafo matemático para demostrar que no hacía falta. Ni que tampoco hacía falta tener más de una entrada y una salida. Esto facilitaba el entendimiento del programa.
    • Aparece la corrección de errores, utilizada para tratar los errores que aparecen durante la ejecución del programa.
    • Se deseaba identificar unas estructuras de control mínimas, para simplificar el proceso.
    • Podía sustituirse una cadena de IF con un IF y una proposición más compleja.
    • Se estudiaron las propiedades de un programa: cuando estaba completo, etc.
    • Nodos fundamentales: secuencia, selección e iteración. Con estos puede hacerse cualquier algoritmo.

    Imagen: Imagenes/ProgEstruct.gif

    • Se creó una sentencia para cerrar los IF. Todas las estructuras debían tener entrada y salida, pero no podía salirse en medio del código.

    • Además de esas tres estructuras, se añadieron otras para facilitar la vida al programador. IF ... THEN ... ELSE

    • SWICH (es como varios IF anidados).

    • Iteración (bucle):

      • Por contador: 'Haz X de el valor de A a la Z'.
        FOR (Inicialización, Actualización, Terminación)

      • Por condición: 'Haz el bucle hasta que X valga A'.
        WHILE X < 1 DO ...

      • DO ... WHILE X > 1

    • En Fortran solo había un bucle.

  • Tipos de datos

    • Tipos de datos

      Tipos de datos

      A pesar del avance que supuso la programación estructurada, aún había que mejorar el tratamiento de datos.

      • Se hizo una equivalencia entre CONTROL y DATOS.
      • El DATO es la representación física de una abstracción.
      • El TIPO DE DATO es el nombre del conjunto al que pertenece el dato. Es el conjunto de valores que puede tomar ese dato. Ej: Color = {rojo, azul}
      • Tiene las propiedades de los conjuntos: pueden ser finitos o 'infinitos' (porque no hay memoria infinita que poder reservar).
        int pepe -> declaración
        pepe = 5 -> inicialización (tomar el valor 5 y almacenarlo en pepe)
      • Los tipos básicos o estandar (los que vienen predefinidos con el lenguaje) son: INT, BOOLEAN, INTEGER y CHAR.
      • Se pueden definir secuencias, árboles, pilas y colas.
      • Formas de representar datos:
        • Enteros. 16 o 32 bits.
        • Booleanos. Se representa como el subconjunto (0, -1) de los enteros.
        • Las cadenas como arrays de caracteres (si no tienen tipo STRING).
      • Una operación puede representarse con símbolos (x, - ...), pueden ser operaciones también el IF, el FOR, etc. pero en lugar de en datos operan sobre el control de flujo. También pueden representarse operaciones como funciones: A = SUMA (C, B).
      • Operaciones:
        • Símbolos
        • Funciones
        • Sentencias o instrucciones (IF, ADD... )
      • Puedo definir datos por:
        • Enumeración.
        • Rango.
        • Mediante estructuras que combinan tipos.
      • Pueden definirse las operaciones por:
        • Enumeración. De los valores de salida para cada uno de los valores de entrada --> tabla
          Suma 1 2 3
          1 2 3 4
          2 3 4 5
          3 4 5 6
        • Reglas que representan una secuencia finita de operaciones.
        • Ecuaciones.
      • Dualidad estructuras de control y datos.
      • En Java se eliminó el pointer, que es el equivalente en datos al GO TO en control, y la unión de datos (equivalencia en Fortran).
      • Tipo abstracto de datos: tipo y sus operaciones. Hay que definir las operaciones, ya que en tipos complejos no son obvias.
      • Pila. El último en entrar es el primero en salir.
      • Fila. El primero en entrar es el primero en salir.
      • La operación podía definirse en dos partes:
        • Signatura. Parámetros uqe entrar y salen. Es decir, su invocación. y = x + z
        • Ecuaciones. También se llaman aserciones (algo que no siempre se cumple).
    • Clases de tipos

      Clases de tipos

      • Tipos:
        • No estructuradas:
          • Estandard. CHAR, INT
          • Definida por el usuario. Colores
        • Estructuradas:
          • Estandard. STRING ARRAY
          • Definido por el usuario. Pilas, colas, secuencias.
    • Tipos compuestos

      Tipos compuestos

      • También pueden hacerse conjuntos y subconjuntos, por lo que podemos hacer tipos compuestos.
        Tipo Ignacio -> Caracter y Cadena
      • Un valor de tipo compuesto = { tipo 1, tipo 2, tipo 3} Los elementos de este conjunto serían los resultantes de hacer el producto cartesiano de sus elementos. Ej: un elemento del tipo Laura sería una tupla de Ignacio (Fruta, Peces) con Jaime: Elemento de Laura = ((Disco), (Fruta1, Pez1)).
        Imagen:ProdCartesiano.gif
      • El array es también un tipo de datos. Un valor de un array de enteros sería una de sus columnas. Todos los subconjuntos del array son del mismo tipo. Para ir a un determinado elemento del array se usa un índice.
      • Los tipos complejos los define el propio programador.
      • Tipos compuestos estructurados. Todos sus componentes son iguales. Array.
    • Definición de tipos

      Definición de tipos

      • Puedo definir tipos por:
        • Enumeración. Tipo color = rojo, azul
        • Rango. Tipo enteroJaime: range 5...14
        • Estructuras. Pueden hacerse estructuras en las que alguno de sus elementos sea un array, y viceversa.
  • Variables

    Variables

    • La variable tiene vida y ámbito.
    • Según su vida, las variables pueden ser:
      • Estáticas. Nacen y mueren con el programa.
      • Dinámicas. Nacen y mueren cuando lo indica el programador.
      • Automáticas. El programa crea y mata las variables.
    • En C las variables solo pueden definirse al comienzo del programa o de las funciones.
    • En C++, Java y Visual Basic pueden definirse las variables prácticamente desde cualquier lugar.
    • En Fortran todas la variables eran globales.
  • Ámbito

    Ámbito

    • Tanto las funciones, como las variables, módulos, etc. poseen un ámbito.
    • Mediante el ámbito se indica desde donde se puede 'llamar' o donde tiene validez esa variable, módulo, etc.
    • Si intento acceder a una variable, función, etc. desde fuera de su ámbito el compilador da un error.
    • El ámbito puede ser de: programa, de función, de bloque.
  • Clase

    Es una plantilla para crear objetos. En el lenguaje natural son los nombres comunes.

    Clase Coche
    Descripción Suministra transporte
    Superclase Vehículo
    Subclase Ranchera
    Atributos Potencia, color, etc.
    Operaciones Arrancar, acelerar, parar, etc.
    Mensaje saliente Sonido del claxon.
    Excepciones Sin gasolina
    Comentarios Vehículo de motor

    Inicialmente solo se declaran las clases (solo su nombre y parámetros) y posteriormente se definen (se añade el contenido de su cuerpo).

  • Objeto

    Objeto

    • Instanciación de la clase, es decir, dar valor a la clase. El objeto tiene las operaciones de la clase.
    • También tienen relaciones, eventos y excepciones.
  • Excepciones

    Excepciones

    • Se crearon para tratar los errores que aparecen durante la ejecución del programa. Ej: dividir un entero por cero.
    • Se incluyen en la clase.
    • La mayoría de las veces devuelven un mensajes de error o toman un valor por defecto.
  • Instrucciones

    Instrucciones

    • Pueden ser:
      • Declarativas. Las sentencias declarativas no se ejecutan, sirven para establecer correspondencias entre posiciones físicas de memoria con lógicas de tu programa.
      • Ejecutivas. Son :
        • de control.
        • de asignación.
        • de llamada a otras funciones.
  • Función

    Función

    La función posee:

    • Nombre
    • Argumento (declaración de su nombre y sus tipos)
    • Valores devueltos (Ej: void, no devuelve ninguno..)

    Los tres componen la signatura de la función.

    Además de la función, hay que declarar las variables (nombre y tipo) y las constantes. También hay que especificar las sentencias (de control, de asignación...). También invoca a otras funciones.

    Hay dos maneras de pasar parámetros a una función:

    • por referencia. Se le pasa la variable en sí. Si la función es modifica esa variable, al salir de dicha función conserva el cambio.
    • por valor. Se lee el valor de la variable, y una copia de ese valor se pasa como parámetro. Así, si la función cambia ese valor, la variable original no se ve afectada. Es como si esa variable tuviera la propiedad de solo lectura.

    Antes solo existía la posibilidad de pasar parámetros por referencia. En los lenguajes de programación, los tipos estandard (a excepción de string, array y las estructuras) se pasan por valor, el resto por referencia. Esto se debe a que hacer copias de un array, string o de una estructura ocupa mucha memoria.

    Prototipo de una función = Signatura + Nombre de los parámetros de entrada

    Ej: Entero = Suma (Entero Variable A, Entero Variable B)

    En la función puedo declarar los parámetros de manera:

    • explícita.
    • implícita. No declaro los tipos. El compilador 'deduce' de que tipo se trata.

    Al invocar una función no tienes porque pasar todos los parámetros, el compilador puede meter parámetros por defecto.

    Los valores de vuelta de una función pueden ser también por referencia o por valor.

    Esto nos sirve para poder verificar los tipos y minimizar los errores. Se detectan en tiempo de compilación.

    Puntero. Se utiliza para que una variable apunte a otra.

    • Declaración de una función. Solo se da su nombre y el tipo de sus parámetros (son sus interfaces).
    • Definición de una función. Es la declaración + el cuerpo de la función.
    • Invocación. Llamada a una función para que se ejecute.
  • Programación orientada a objetos

    Programación orientada a objetos

    • En el lenguaje de programación no hay estructuras para definir clases, no esta ese concepto.
    • En ellos puede trabajarse de manera similar a como se hace en programación por objetos, pero no está incluido en el propio lenguaje. Ej:C
    • Las clases no tienen herencia.
    • No pueden establecerse relaciones.
    • Había un orden en control y datos.
  • Programación por objetos

    • Programación por objetos

      Programación por objetos

      • En el lenguaje existe el concepto de clase, etc. En la propia clase pueden incluirse las relaciones.
      • Si podemos usar clases y objetos tenemos modularidad, es decir, podemos reutilizar componentes.
      • Además, existen librerías de funciones y de clases. Ej: ventanas.
      • El primer componente que se hizo reutilizable fue la función.
      • Implica compiladores complejos.
      • Existen diversos modelos de programación por objetos (Java, UML), que son similares conceptualmente, pero su terminología no está estandarizada.
      • Todos tienen:
        • Atributos (propiedades).
        • Funciones (operaciones o métodos)
      • Tampoco está estandarizada la clase.
      • Para acceder a los datos de un objeto o clase solo puedo usar funciones (el interfaz), ya que se encuentran encapsulados.
    • Modularidad

      Modularidad

      Los módulos son puezas de un programa en el que se declaran variables, constantes y funciones. Puede ser un único archivo o varios.

      Hay que decir cual es el módulo principal del programa (llamado main en Java). Este invoca a otros módulos. Después se compilan esos módulos para que funcione el programa.

      Si podemos usar clases y objetos tenemos modularidad, es decir, podemos reutilizar componentes.

      La modularidad se consigue ocultando información. Para ello, los distintos componentes deben comunicarse solo lo estrictamente necesario. Para comunicarse utilizan un interfaz.

    • Componentes en software

      Componentes en software

      • Los primeros que aparecieron fueron las librerías de funciones estáticas.
      • Posteriormente aparecieron las librerías de funciones dinámicas, que son las que se cargan en tiempo de ejecución (DLLs, NLMs...). Se cargan y descargan según se usan.
    • Métodos

      Métodos

      • Se usan para acceder a los objetos y clases. Son sus operaciones.
      • Tras crear el objeto, el resto de métodos sirven para acceder al objeto.
      • Pueden ser:
        • Públicos. Pueden ser usados por ti.
        • Privados. No pueden ser usados por ti.
    • Clases de relaciones

      Clases de relaciones

      • Colección. Conjunto de objetos.
      • Instancia. Hacer un objeto a partir de una clase.
      • Herencia. Simple, múltiple, todo, nada... Una clase hereda atributos y operaciones de su padre.
      • Polimorfismo. Herencia de varios padres.
      • Binding dinámico. Reasignar un objeto a otra clase en tiempo de ejecución.
      • Comunicación o interacción.
      • otros...
    • Ventajas

      Ventajas

      • Mejor correspondencia ante la vida real y el modelo de software (en la vida real no todo son funciones).
      • Hay un mejor entendimiento y mantenibilidad debido a que objetos y operaciones están localizados.
      • Fuerte interconexión o acoplamiento (cohesión) dentro de un objeto y débil entre objetos.
      • Mejora la rehusabilidad del objeto.
    • Inconvenientes

      Inconvenientes

      • Los conceptos y la metodología están en evolución.
      • Hay que cambiar la manera de pensar, ya que usa conceptos no habituales.
      • Herramientas asociadas de reciente aparición.
  • Programación por eventos

    • Programación por eventos

      Programación por eventos

      • Llegó cuando se quiso que el ordenador controlara los procesos, que hubiera programas que funcionaran en tiempo real..
      • En concurrencia puede haber objetos activos o congelados.
      • Había sistemas operativos en tiempo real (como ocurría con el RTX11) y otros que no lo eran.
      • Hay eventos de reloj, desencadenados por operador, o bien por sensores.
      • La programación por eventos se aplica a la interfaz de usuario.
      • Podía establecerse prioridad para los eventos.
    • Eventos

      Eventos

      • Ocurrencia de algo en el tiempo.
      • Se concreta con un nombre, parámetros, etc.
      • Los mensajes se almacenan en colas gestionadas por el sistema operativo (así se sincronizan).
      • Los mensajes suelen tener parámetros.
  • Comentarios en el código

    Comentarios en el código

    • Es una manera de documentar el código del programa.
    • Los comentarios que el programador incluye en el código son omitidos durante la compilación.
    • Pueden ser de documentación. Los genera automáticamente el entorno de programación.
    • Pueden ser de una o más líneas.
  • Compilación

    Compilación

    A partir del módulo fuente, y tras compilarlo obtenemos un módulo objeto.

    El módulo objeto es:

    • código máquina (traduce variables, etc. en direcciones de memoria, etc.) en lenguajes de programación como C.
    • código intermedio en un lenguaje de programación interpretado, como Java (la máquina virtual lo traduce a código máquina).

    La compilación la realiza el compilador. El compilador se compone de un scanner, un parser, un tratamiento de errores y un generador de código.

  • Construcción

    Construcción o build

    • Tras la compilación se enlazan los módulos en memoria, estableciendo direcciones absolutas.
    • También se cargan las librerías que son invocadas por el programa.
    • Como resultado de ello se produce un módulo ejecutable.
  • Tipos de comunicación

    • Tipos de Comunicacion

      Tipos de comunicación

      • Si un recurso vital está bloqueado, el resto no puede usarlo. Aparecen conflictos
      • Se crean semáforos para controlar los recursos.
      • Otro tipo de comunicación es compartir un recurso. Para ello, el receptor debe estar en alerta para recibirlo. Los mensajes requieren de un protocolo, por una parte hay control (hacer una llamada o dar señal de 'a la escucha') y parte en el mensaje.
      • En un programa hay más control que datos.
      • Por llamada de función.
      • Por eventos.
    • Mensajes

      Mensajes

      • Comunicación o interacción entre objetos. El objeto cliente envía (el jefe) envía un mensaje a un objeto servidor (trabajador), que realiza la operación que porta el mensaje. Uno puede entrar por encima del otro o estar al mismo nivel.
  • APIs

    APIs

    • Son Application Program Interfaces.
    • Por ejemplo, el interfaz del usuario (librerías VBX, OCX, etc.) o las librerías de comunicaciones.
    • Las librerías de clase: OLE, C++, Java.
  • Puntos de vista de un programa

    Puntos de vista de un programa

    Una aplicación o programa puede verse desde varios puntos de vista:

    • Programador. Para él, el programa son módulos (archivos) que no tienen porque estar en el mismo lenguaje de programación. En C: los archivos .c son de código fuente, .h define los interfaces entre módulos,.i como los .c, pero más pequeños, para que sean más manejables. Son partes de un mismo módulo.
    • Programa en ejecución.
  • Inteligencia artificial

    Inteligencia artificial

    • La inteligencia artificial se basa en el uso de programas para manejar robots: robots mecánicos, programas de ajedrez, etc.
    • Lisp. Lenguaje de programación por listas.
    • Sistemas expertos. Programación por reglas.
    • Programación lógica. Prolog.
    • Especificación textual. 'El editor de texto tiene botones para avanzar páginas, etc'. Definían de manera textual las operaciones y las excepciones.
    • Especificación lógica. Usando AND, OR, etc. No es bueno para definir problemas no lógicos.
    • Especificación algebráica.

Página generada automáticamente desde la Base de Datos: Tecnologias/ el 27/3/2008 17:32:46