1. Concepto de Programa Informático

Un programa informático es un conjunto de instrucciones que, una vez ejecutadas, realizarán una o varias tareas en una computadora.

Características:

  • El lenguaje debe estar representado en un lenguaje compatible con el procesador.
  • Deben terminar en un tiempo finito.

2. Obtención de Programas Ejecutables

Herramientas Implicadas:

  • Preprocesador: Quita espacios, líneas, espacios de macros, etc.
  • Compilador: Traduce el código fuente al código máquina.
  • Linker: Combina el código objeto con las bibliotecas necesarias para crear un programa ejecutable.

Todo esto se hacía en g++ (C++) o gcc (C).

Representación de Programas:

  • Código fuente: El código escrito por el programador.
  • Código objeto: El código traducido por el compilador.
  • Código máquina: El código ejecutable por la computadora.

Modelo de Compilación C o C++:

  • Comandos, opciones y ficheros implicados.
  • Ejecución en Linux (funcionamiento de la variable path). Para configurar la variable path de forma permanente, se usa $home/.bashrc, donde se cambia el valor de la variable.

Creación y Uso de Bibliotecas de Funciones:

Una biblioteca está formada por:

  • .h (Interfaz)
  • .cpp (Implementación)
  • .c (Implementación)
  • .o (Código objeto)

3. Modelo de Compilación y Ejecución de Java

  • Comandos y tipos de ficheros implicados.
  • Máquinas virtuales: Entorno de ejecución que permite ejecutar el código Java en diferentes plataformas.

4. Taxonomía de los Lenguajes de Programación

Definición de Lenguaje de Programación:

  • Conjunto de símbolos y normas.
  • Lenguaje artificial.
  • Usados para comunicar la solución a un problema, entre programadores o a un procesador.
  • No contienen ambigüedades.

Los lenguajes de programación están formados por una serie de elementos:

Sintaxis:

Determina el conjunto de símbolos que pueden considerarse programas correctos en el lenguaje de programación objeto de estudio.

Semántica:

Conjunto de normas que se utilizan para interpretar la sintaxis dándole un significado. Podemos distinguir dos partes:

  • Estática: Se puede comprobar en tiempo de compilación. Ejemplo: que no hayamos definido una variable y la estemos usando en algún punto del programa.
  • Dinámica: Puede comprobarse en tiempo de ejecución. Ejemplo: la división por cero.

Sistema de Tipos:

Define cómo los lenguajes de programación clasifican los datos. Esta clasificación suele utilizarse para imponer cierto nivel de corrección en el programa. Dependiendo de cuántos controles haga el lenguaje con respecto a los tipos, los lenguajes se clasifican en:

  • Débilmente tipados: Quita una parte de las restricciones frente a los fuertemente tipados. Ejemplo: PHP.
  • Fuertemente tipados: Definen estrictamente los tipos válidos en el lenguaje, y las operaciones que se pueden realizar en los datos de esos tipos. Ejemplo: C/C++.
  • No tipados: No hay reglas. Ejemplo: LISP.

Librería Estándar (Runtime Environment):

Son un conjunto de funciones que incluyen algoritmos utilizados frecuentemente, estructuras de datos y mecanismos de entradas/salidas (funciones que permiten que el programa recoja datos de los periféricos de entrada y permita salidas a dichos periféricos).

Clasificación de los Lenguajes de Programación:

Según la Generación a la que Pertenece:

  • Primera generación (1GL): Son los lenguajes máquina. No es necesario ningún tipo de compilación o interpretación del código fuente. Solo usa binario.
  • Segunda generación (2GL): Son los ensambladores. Los ensambladores son lenguajes simbólicos, pero la correspondencia entre las instrucciones entre lenguaje ensamblador y lenguaje máquina sigue siendo uno a uno. Un programa escrito en una arquitectura en concreto solo sirve para esa arquitectura (dependiente de la arquitectura). Es extremadamente rápido, se usan en programas de tiempo real, también en el descifrado de keygen y validaciones de Windows. Exige elevados conocimientos de la arquitectura. Ejemplo: Ensamblador 8086.
  • Tercera generación (3GL): Lenguajes de programación de alto nivel (de abstracción). Son más amigables para el programador. Surgidos alrededor de 1950. Es más rápido y mantenible el desarrollo del programa, es más fácil de aprender, hace que los programadores sean más productivos más rápido, son independientes de la máquina, pueden compilar en cualquier arquitectura. Ejemplo: C, Cobol.
  • Cuarta generación (4GL): Lenguajes no imperativos. Son de más alto nivel, más próximos al lenguaje natural. Ejemplo: SQL.
  • Quinta generación (5GL): Lenguajes basados en restricciones (constraint-based programming language). Se establecen los requisitos que se quieren obtener y el procesador se encarga de hacerlo. Lenguajes de investigación en informática, sin uso en la vida práctica. Se describe el enunciado del problema. Ejemplo: Prolog.

Según el Paradigma de Programación en que se Encuadra:

  • Paradigma imperativo: Se le dan instrucciones al ordenador para que sepa cómo debe cambiar el estado. Para ello se necesitan:
    • Acceso a la memoria y posibilidad de modificarla.
    • Expresiones numéricas y sus operadores.
    • Sentencias condicionales.
    • Bifurcaciones: Permite modificar el flujo del programa. Ejemplo: goto (distinto al gotoxy). Si se usa goto a un sitio que no existe, da error de compilación.

Con estos elementos, un programa se dice que es Turing completo, ya que la máquina de Turing es capaz de resolver un problema. Para asignar una etiqueta en C, ponemos la etiqueta seguido de : por ejemplo condición:

Programación imperativa estructurada: Mejorar la visibilidad, legibilidad y manejabilidad de los programas haciendo uso de mecanismos como:
  • Definición de bloques.
  • Subrutinas.
  • Bucles.
  • Un único punto de entrada y otro de salida.
  • No goto, no saltos.
Programación modular (procedure call, llamada a procedimientos). Los procedimientos son bloques de código cuya funcionalidad se aísla permitiendo su reutilización.
  • Patrón de diseño “refinamiento sucesivo”
    • Interfaz
    • Implementación
Paradigma declarativo: No se ocupa de expresar el flujo de control que soluciona el problema. No se dan los pasos a seguir para encontrar la solución al problema, sino que se describe el problema y la solución.
  • Subparadigma funcional: Se trata de evitar los efectos colaterales mediante la declaración de funciones que no dependen del estado de la memoria. Por ejemplo, Haskell.
  • Subparadigma lógico: Solo se describen los hechos y luego el o los predicados que permiten deducir más conocimientos. Ejemplo: Prolog.
Paradigma de programación orientada a objetos: Está basado en clases. Una clase se utiliza para mostrar un elemento del problema que queremos hacer. Se almacena además de la información asociada (en los atributos), se almacena su comportamiento (en los métodos). Cada objeto hecho con la clase se llama instancia. Características:
  • Encapsulación: Dentro de una clase está englobada toda la información y controlamos quién accede a la información.
Paradigma de programación orientada a aspectos: Se encarga de separar las distintas tareas o facetas que se repiten en muchos programas y tratar cada tarea individualmente y de forma más consistente, mantenible y legible. Algunos aspectos son la generación de logs, control de errores.Paradigma de programación dirigida por eventos (Event-Driven-Programming): Qué cosas ocurren detrás de otras, vienen determinados por eventos o sucesos (mensajes recibidos por la interfaz de usuario, desde sensores, por ejemplo calefacción).

Según su Finalidad o Propósito:

  • Lenguajes de propósito general (General Purpose Language): Aquellos que son buenos para hacer muchas tareas distintas. Ejemplo: C/C++, JAVA.
  • Lenguajes de propósito específico: Con mayor frecuencia se utilizan para cierta finalidad. Ejemplo: VHDL (descripción de hardware), JavaScript, PERL, YACC y LEX (usados para construcción de lenguajes de programación).

Según el Modelo de Ejecución:

  • Compilados: Aquellos en los que se generan usando un compilador códigos máquina. Ejemplo: C/C++, FORTRAN.
  • Bytecompilados: Generan mediante un compilador código máquina de una máquina virtual. En el caso de Java se genera un bytecode. Ejemplo: JAVA, C#.
  • Interpretados: Un intérprete traduce a la máquina objetivo las acciones que tiene que realizar, siempre en tiempo de ejecución. Ejemplo: PERL, PHP, PL-SQL, Haskell, PROLOG, JavaScript.

Velocidad y portabilidad son características de estos lenguajes de programación. Los más rápidos serán los compilados, pero a su vez los interpretados son más portables.

Casos de Uso

Funcionalidades que presta el sistema desde el punto de vista del usuario.

Identificar los Factores:

  • Personas / otros sistemas que interactúan con el que estamos analizando (se representa con un hombre). Se llaman actores.
    • Los actores son entidades externas al sistema.
    • Si un actor extiende a otro, el primero interviene implícitamente en todos los casos de uso del primero.
    • Los casos de uso se expresan desde el punto de vista de los actores.

Para Hacer un Caso de Uso:

  • Hacemos el diagrama.
  • Especificación de actores.
  • Especificación de casos de uso.