¿Por qué?

Matemática Ingeniería
  • Los Modelos de Computación estudian qué se puede calcular, saber, conocer, computar (latín putare, pensar)

    • Su origen parte de Euclides griego del siglo IV A.E.C., …​, Al-Khwarizmi persa del siglo IX (Algorithmi, latinizado)

      • Algoritmo: conjunto ordenado y finito de operaciones que permite hallar la solución de un problema en un tiempo finito

    • Rama de la Lógica: Aritóteles, Leibniz, …​, Hilbert, Russel, Gödel, Wittgenstein, …​

    • Alan Turing, formalizó el concepto de algoritmo y computación: Maquina Universal de Turing, origen de la computadora actual, capaz de computar todo lo computable

    • Alonzo Church, formalizó el Cálculo Lambda siendo equivalente a la Máquina de Turing

    • Alfred Horn, formalizó las clausulas lógicas como disyunción de literales con uno positvio como máxmio que también es equivalente a las Máquina de Turing

    • …​ el Juego de la Vida de Conway, Computación de Membranas de Paun, …​

  • transformación para la aplicación práctica

  • von Neumann y otros …​ con juicio!

    • polímata, la persona más inteligente del mundo …​ o Gauss?!?

  • Shanon

    • recupera el Algebra de Boole y la funde con el Sistema Binario formalizado por Leibniz.

    • Posterior autor de la Teoria de la Información: Entropía

Arquitectura de von Neumann:
  • Unidad Central de Proceso (CPU), el procesador

    • Registros, donde almacena los datos en proceso

    • Unidad Aritmético-lógico, donde se procesan los operadores aritmético-lógios, que conduce directamente a muchas instrucciones de ensamblador

    • Unidad de control, donde se procesa el flujo de ejecución secuencial, que conduce directamente a instrucciones de salto condicional e incondicional

  • Reloj, que establece el ritmo de las operaciones

  • Memorias de palabras (bytes) limitadas indexables:

    • ROM (Read Only Memory) para la información de las instrucciones del microprograma (interprete)

    • RAM (Random Access Memory) para la información de los datos del usuario

  • Unidad de Entrada/Salida de información de/a los dispositivos

  • Buses, canales de comunicación que interconectan los elementos anteriores

vonNeumann2

dispositivos

¿Qué?

Programa Proceso
  • algoritmo escrito en un lenguaje de programación

    • Programación: acto de programar

  • ejecución / interpretación de un programa en una máquina mediante un control de flujo/hilo de las instrucciones durante un intervalo de tiempo

Lenguaje Lenguaje de Programación
  • conjunto de reglas léxicas, sintáticas y semánticas para la corrección en la comunicación

    • Natural: español, latín, …​

  • lenguaje que permite programar una computadora/ ordenador:

    • Tecnología: java, javascript, ASM, Haskell, …​

Lexicografía Lenguaje Natural Lenguaje de Programación
  • reglas para la correcta formación de las palabras y signos de puntuación, piezas léxicas (token)

  • signo de puntuación: "!", ",", "`", …​

  • preposiciones: "a", "ante", "bajo", …​ "to", …​

  • nombres: "alumno", "alumnote", …​, "Juan", …​, "Jhon", …​

  • símbolos, para operadores, signos de puntuación, …​: "+", "/", "(", "[", "{", ";"…​

  • palabras reservadas para la estructura de las proposiciones / frases /sentencias, …​: "if"/"else", "function", "package"/"module"/"unit"/"namespace", …​

  • identificadores para los conceptos del dominio del problema: "customer", "date", "board", "interval" …​

Sintáxis Lenguaje Natural Lenguaje de Programación
  • reglas para el correcto orden y estructura de las piezas léxicas en las proposiciones /frases /sentencias

  • copulativa/ atributiva: "el niño está sentado", "Puer sedet"

  • activas vs pasivas: "el gato salta el mueble", "el mueble es saltado por el gato", …​

  • subordinadas: "el gato salta al niño que esta sentado"

  • sentencias de definición de

    • datos variables y/o constantes

    • primitivos / atómicos (enteros, reales, lógicos y caracteres, con distintos operadores) o

    • compuestos

      • heterogénea (clases, tuplas, estructuras, registros, …​) u

      • homogeneamente (vectores (array), listas, estrucutras de datos, …​)

    • procesos

      • compuestos (funciones, procedimientos, métodos, …​) de

      • acciones simples (sentencias de control de flujo de ejecución, llamadas a otro proceso, …​)

    • contenedoras de expresiones (en inicialización, condición, asignación, argumentos de la llamada a funciones, …​) que son

      • combinaciones de operandos, operadores y procesos

Semántica Lenguaje Natural Lenguaje de Programación
  • Reglas para el correcto significado de las proposiciones/ frases/ sentencias

  • sentido figurado vs literal: "comerse los cocos", "comerse los mocos", …​

  • sentido denotativo vs connotativo: "el alumno está en el aula", "el alumno está en la luna", …​

  • …​ con mucha subjetividad!

  • se puede mencionar / referenciar en una expresión una variable previamente declarada, o no?!?

  • se debe invocar a una función con un número de argumentos igual a su número de parámetros, o no?!?

  • …​ con mucha objetividad!

¿Para qué?

Objeto Capacidad cualitativa Capacidad cuantitativa

Ser humano

Muy buena: reconocimiento de patrones, asociaciones, recursividad, …​

Muy mala: pequeña, errores por cansancio, desmotivación, …​ y muy lentos

Hardware

Muy mala: ningún computador superó la prueba de Turing

Muy buena: sin errores y a toda velocidad

  • Efectividad en la gestión de sistemas de información, requeridos por clientes para diferentes usuarios, con

    • Eficacia, sin errores en cálculos, filtrados, secuencias de acciones, …​

    • Eficiencia, con escaso consumo de recuros:

      • hardware y energía eléctrica

      • tiempo de los usuarios para aprender y explotar el producto software

software
Sistema Información Gestión de un Sistema de Información
  • conjunto de elementos orientados al tratamiento y administración de datos e información, organizados y listos para su uso posterior, generados para cubrir una necesidad o un objetivo

  • es el tratamiento de la información, Informática (CRUD)

    • altas (Create), incorporación de información en el sistema

    • bajas (Delete), elminación de información en el sistema

    • modificaciones (Update) cambio de información en el sistema

    • consultas (Read) filtros, detalles, resúmenes de información del sistema

crud

¿Cómo?

Historia de los Lenguajes de Programación

lenguajesProgramacion

No confundir popularidad actual de cada lenguaje y su evolución en el tiempo tiempo con su relevancia, número de proyectos, tipos de proyectos, …​

Paradigmas de Programación

…​'ciencia normal' significa investigación basada firmemente en una o más realizaciones científicas pasadas, realizaciones que alguna comunidad científica particular reconoce, durante cierto tiempo, como fundamento para su práctica posterior. […​] Voy a llamar, de ahora en adelante, a las realizaciones que comparten esas dos características, 'paradigmas', término que se relaciona estrechamente con 'ciencia normal'. Paradigma es un conjunto de prácticas y saberes que definen una disciplina científica durante un período específico
— Thomas S. Kuhn
La estructura de las revoluciones científicas (1962)
En su famoso libro The Structure of Scientific Revolutions de 1970, el historiador Thomas Khun extendió la definición de la plabra para abarcar un conjunto de teorías, estándares, métodos que juntos representan una forma de organizar el conocimiento, esto es, una forma de ver el mundo
— Budd
Programación Orientada a Objetos (1994)

paradigma

hippyYuppy

Según el Nivel Semántico

Lenguajes de Bajo nivel: Lenguajes de Medio nivel: Lenguajes de Alto nivel:
  • enfocados a la máquina

  • código binario, ensamblador (ASM), …​

  • enfocados a la máquina y al desarrollador

  • C, C++, …​

ensamblador

c

javascript

Lenguajes de Bajo Nivel
  • Lenguaje máquina es un lenguaje directamente interpretable por la máquina, microprograma (ROM)

    • Origen de que codificar sea sinónimo de programar

  • Lenguaje ensamblador es una traducción directa, "legible" por humanos, de los código binarios de las instrucciones del procesador

ensamblador

Según la Traducción para la Ejecución

Compilado Interpretado Hibrido Transpilado
compilador
interprete
hibrido
transpilado
  • Tiempo de desarrollo: Bajo

  • Tiempo de ejecución: Alto

  • Portabilidad: Baja

  • Tiempo de desarrollo: Alto

  • Tiempo de ejecución: Bajo

  • Portabilidad: Alta

  • Tiempo de desarrollo: Medio

  • Tiempo de ejecución: Medio

  • Portabilidad: Alta

  • Tiempo de desarrollo: Alto

  • Tiempo de ejecución: Según destino

  • Portabilidad: Según destino

  • Ensamblador, C/C++, …​

  • LISP, Javascript, …​

  • Java, Ruby, …​

  • 8080-8086, Typescript, …​

Tiempo de compilación Tiempo de ejecución
  • intervalo de tiempo durante la compilación de un programa

    • En lenguajes interpretados no existe

  • intervalo de tiempo durante la ejecución de un programa

    • En lenguajes interpretado, el análisis léxico, sintático y semántico se realiza durante cada ejecución del programa

Según el Sistema de Tipos

Tipo Sistema de Tipos
  • conjunto de valores que comparten un conjunto de operaciones

    • valores primitivos con operadores

    • objetos con métodos, funciones miembro

    • …​

  • conjunto de reglas que determinan la compatibilidad del tipo de una expresión con la ubicación de dicha expresión

    • derecha de la asignación,

    • argumento en la llamada a una función,

    • condición de sentencia alternativa o iterativa,

    • …​

Lenguajes Fuertemente Tipados Lenguajes Debilmente Tipados Lenguajes con Inferencia de Tipos
fuerte
debil
inferencia

Java, …​

final int z = 0;
int x = 0;

Javascript, …​

const z = 0;
let x = 0;

Typescript, …​

const z = 0;
let x: number = 0;
let y = x + 1;
Inferencia de tipos Programación parametrizada
  • lengujes que deducen automáticamente en tiempo de compilación, sin información adicional del programador o bien con anotaciones parciales del programador, el tipo asociado con un uso de un elemento del programa: variable, constante, objetos, …​

  • lenguajes con plantillas de código basadas en variables de tipo que permiten la encarnación con infinitos tipos concretos: estructuras de datos, …​, distribuidor tareas, , …​

Evitan la verbosidad y/o duplicidad del software en lenguajes fuertemente tipados

Originarios de la programación funcional que nación con tipado dinámico y evolucionó a tipado estático

Según el Fundamento Matemático

Modelo Matemático Paradigma de Programación

Máquina de Turing

maquinaTuring

  • Paradigma Imperativo, basado en la secuencia, alternancia (salto hacia adelante, repetición salto hacia detrás) de asignaciones de valores a variables para cambios de estado del autómata

    • Lenguajes: Cobol, Fortran, C, Ada, …​

lambdaCalculus

  • Paradigma Funcional, basado en funciones puras como reglas de correspondencia matemáticas (inyectivas, biyectivas, suprayectivas) entre valores del conjunto origen y valores del conjunto imagen

    • Lenguajes: Lisp, FP, Scheme, ML, Haskell, …​

prolog

  • Paradigma Lógico, basado en hechos y predicados lógicos con el algoritmo de Unificacion para las reglas de sustitución

    • Lenguajes: Prolog, …​

Pardigma Declarativo
  • es la unión del Paradigma Funcional y Lógico,

  • enfrentado al Paradigma Imperativo, porque acoge variables con cambios de estado a través de asignaciones en secuencia, alternancia y/o iteración de forma secuencial en el tiempo de ejecución

Elementos
  • optativamente se dispone de el algoritmo de correspondencia de patrones (paradigma funcional) y el algoritmo de unificacion (paradigma lógico) que aplican reglas de reescritura sobre símbolos ligados a constantes hasta llegar a una expresión irreducible

  • son soluciones eminentemente recursivas

  • mónadas para los efectos laterales: cambio en base de datos, enviar un correo, modificar la interfaz de usuario, …​

Paradigma Imperativo

Año Autor Publicación Referencia

1966

Bohm, C., Giuseppe J

Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules

Communications of the ACM 9 (5): 366-371

1968

E. Dijkstra

Go To Statement Considered Harmful

Communications of the ACM 11 (3): 147-148

1972

O.J. Dahl, E.W. Dijkstra, C.A.R.Hoare

Structured Programming

Academic Press

1974

D. Knuth

Structured Programming with go to Statements

Computing Surveys, Volume 6, Number 4, pages 261-301

  • Programación spaguetti goto

  • Programación Estructurada

    • Con el objetivo de la demostración de la correccion del software mediante la precondiciones, postcondiciones e invariantes de los bucles

    • Algoritmos como bloques de sentencias recursivamente anidados con sentencias simples, secuenciales, alternativas e iterativas, sin sentencia GOTO!!!

  • con los conceptos de la programación estructurada

{
  int key;
  int values[];

  int i = 0;
  while (i<values.length-1 && values[i]!=key){
      i++;
  }
  String found = "no";
  if (values[i]==key){
      found = "si";
  System.out.println("La clave buscada " + found + " se encuentra en los valores")
}
  • sin los fundamentos de la programación estructurada

{
  int key;
  int values[];

  int i = 0;
  boolean exit = false;
  String found = "no";
  while (!exit) {
    if (values[i] == key) {
        exit = true;
        found = "si";
    } else if (i == values.length)
      exit = true;
    } else {
      i++;
    }
  }
  System.out.println("La clave buscada " + found + " se encuentra en los valores")
}

Paradigma Funcional

Matemática
  • Dados un conjunto origen y conjunto imagen

    • Relación, cuando un elemento del origen le pueden corresponder varios elementos de la imagen

funciones
  • Función, cuando a un elemento del origen le corresponde un elemento de la imagen

  • Función inyectiva, cuando a un elemento de la imagen le corresponde 0 o 1 elemento del origen

  • Función suprayectiva, cuando a un elemento de la imagen le corresponde 1 o más elementos del origen

  • Función biyectiva, cuando a un elemento de la imagen le corresponde con un elmento del origen

Función "Pura"? Función Procedimiento
  • no contempla efectos laterales

    • mediante una expresión con la regla de correspondencia de los valores de salida (imagen) a unos valores de entrada (origen) y de nada más

  • contempla efectos laterales

    • secuencia de sentencias con asignaciones para obtener los valores de salida correspondiente a los valores de entrada

    • dependendiendo y/o modificando el estado de variables locales y globales

  • no produce ningún valor del conjunto imagen

    • con "funciones" void, sin retorno!!!

Haskell, …​, paradigma funcional

C, Java, Javascript, …​, paradigma tradicional, imperativo orientado a procesos

Paradigma Imperativo

Paradigma Funcional

  • órdenes directas con sentencias de asignación (evalúa y guarda) de forma secuencial, alternativa, iterativa y/o recursivas

    • operación destructiva donde se pierde el valor previo a la asignación

  • cambiando el estado de las variables y siendo un programa un conjunto de variables que parten de un estado inicial y con el tiempo alcanzan el estado final deseado

  • abstracción de la máquina de von Neumann, …​ orientado a la máquina

  • opacidad referencial, aquella notación en que el valor de una expresión compuesta no depende únicamente de sus componentes, de la historia del programa en ejecución o de otros componentes que no estén inmersos en la expresión

    • efectos laterales, con acoplamientos en el tiempo accediendo a variables globales

  • produce soluciones incorrectas, con miles de pruebas …​ y, por tanto, bajas cotas de productividad

  • soluciones eficientes: consumo de recursos, …​

  • la solución a una entrada de datos es un regla de correspondencia para devolver la salida de datos, sin cambios.

    • Añadir un ficha a un tablero, sería obtener el tablero resultante a partir de un tablero dado, un color dado y una coordenada dada

    • Un tratamiento de textos es una correspondencia entre una secuencia de pulsaciones dadas y una secuencia de caracteres resultante: "ano←a" retorna "ana"

    • no hay variables, no hay bucles, no hay sentencias, no hay tiempo, no hay historia de ejecución, …​ hay constantes (símbolos) con valores y operadores (if, ternario) y mucha recursividad

    • mayor abstracción, orientada al hombre y no a la máquina

    • transparencia referencial, aquella notación en que el valor de una expresión compuesta depende únicamente de sus componentes y de nada más, no de la historia del programa en ejecución o de otros componentes que no estén inmersos en la expresión

  • soluciones correctas, "sin pruebas" …​​ y, por tanto, altas cotas de productividad

  • soluciones "ineficientes": técnicas parámetros de acumulación para convertir cualquier función en una función con recursividad de cola, cuya ejecución interna permite resolverse con un bucle

Programación imperativa Programación funcional
  • Sentencia if/else

    • con 1 o 2 ramas opcionalmente

    • dentro de una sentencia secuencial siendo previa y/o posterior opcionalmente a otras sentencias

    • ejecuta sentencias secuenciales en un orden explícito durante el tiempo de ejecución

    • la concurrencia exige arduas tareas de sincronización, explicitas en la codificación

  • Operador ?:, if/else

    • con 2 ramas obligatoriamente

    • dentro de una expresión

    • evalúa expresiones sin un orden explícito durante la evaluación de la expresión

    • no existe el tiempo de ejecución

    • la concurrencia no exige nada, es implícita en el motor de ejecución

if (<condición>)
  <sentencia>

if (<condición>)
  <sentencia>
else
  <sentencia>
return <condición> ? <expresión> : <expresión>;

return if <condición> then <expresión> else <expresión>;
Programación Funcional en Java
  • Los flujos imutables de Java, al igual que las colecciones mutables, la clase File, …​, disfrutan de métodos que colaboran con funciones anónimas (lambda) que implementan interfaces funcionales que permiten varios métodos default, static, …​

    • Se encuentran lejos del paradigma funcional porque admiten:

      • declaración de variables

      • sentencias secuenciales, alternativas e iterativas fuera y dentro del ámbito de la función anónima

      • no devolver ningún valor de retorno

    • Son, simplemente, la implantación de funciones de orden superior mediante objetos función, a través de un notación sintáctica más compacta que las clases anónimas

public class App {

  public static void main(String[] args) {
    System.out.println("Inicio.");
    Stream.of(1,2,3,4,5,6,7,8,9,10)
      .filter(integer -> {
        boolean isPrime = false;
        if (integer >= 2){
          int next = 2;
          while (integer % next != 0){
            next++;
          }
          isPrime = integer == next;
        }
        return isPrime;})
      .forEach(integer -> {
        System.out.println(integer);
      });
      System.out.println("Fin.");
  }
}

Según el Bloque Organizativo

  • Paradigma Orientado a Procesos, preponderancia de las operaciones sobre los datos

    • tesis a imagen de la arquitectura de von Neumman con procesador activo sobre memoria pasiva

  • Paradigma Orientado a Datos, preponderancia de los datos sobre las operaciones (1ª forma normal, 2ª forma normal, …​, Boyce-Codd)

    • antitesis como reacción a los problemas de mantenibilidad al modificar los datos

  • Paradigma Orientado a Objetos, equilibrio entre datos y operaciones, conformando una "clase" de objetos reinstanciable

    • síntesis como equilibrio entre ambas posturas anteriores

pendulo

procesos
procesosObjetos

CuadranteParadigmas

CuadranteParadigmasLenguajes

Paradigma Orientado a Procesos

  • Con funciones como bloque constitutivo de las aplicaciones software con

    • opcionalmente, entrada de datos y otras funciones, en tal caso será una función de orden superior

    • En el paradigma imperativo se permite:

      • declaración local de variables y/o constantes

      • agrupación de sentencias secuenciales, alternativas y/o iterativas

      • opcionalmente, el retorno de un valor de salida

    • En el paradigma funcional

      • declaración local de constantes

      • una única expresión para la regla de correspondencia

      • obligatoriamente, el retorno de un valor de salida

public class App {

  public static void main(String[] args) {
    System.out.println("Inicio.");
    ArrayList<Integer> integerList =
      new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
    integerList.removeIf(integer -> {
        boolean isPrime = false;
        if (integer >= 2){
          int next = 2;
          while (integer % next != 0){
            next++;
          }
          isPrime = integer == next;
        }
        return !isPrime;});
    for(Integer integer : integerList){
      System.out.println(integer);
    }
    System.out.println("Fin.");
  }
}

imperativoProcesos

funcionalProcesos

  • (1) Muy frecuentemente soluciones mutables e iterativas, porque es la naturaleza del paradigma

  • (4) Infrecuentemente soluciones mutables y recursivas o inmutables e iterativas porque el dominio es recursivo o inmutable

  • (7) Muy infrecuentemente soluciones inmutables y recursivas porque el dominio es inmutable y recursiva

  • (1) Muy frecuentemente soluciones inmutables y recursivas porque es la naturaleza del paradigma

  • (4) Infrecuentemente soluciones mutalbes e iterativas porque se requieren efectos laterales

  • (7) Muy infrecuentemente soluciones inmutables e iterativas o mutables y recursivas porque se requieren optimizaciones o efectos laterales

Orientado a Procesos

Mutable

Inmutable

Iterativo

Recursivo

Paradigma Orientado a Objetos

Año Autor Publicación Referencia

1962

O.J. Dahl, K. Nygaard

Simula Primer lenguaje orientado a clases

Conferencia de Trabajo en Lenguajes de Simulación IFIO TC 2, Oslo

1971

A. Kay, A. Goldberg, D. Ingalls

Smalltalk Comunidad generadora del 1ªLOO, interfaz de ventanas, patrones de diseño, arquitectura MVC, xUnit, …​

Xerox Palo Alto Research Center (PARC)

1972

O.J. Dahl, E.W. Dijkstra, C.A.R.Hoare

Structured Programming Simula!!!

Academic Press

1987

Barbara Liskov

Data Abstraction and Hierarchy

OOPSLA

Características fundamentales Caracterísiticas accesorias
  • un objeto que combina datos y operaciones válidas sobre esos datos, mensajes, cohesionando la legibilidad del software al elevar el sistema de tipos del desarrollador

  • polimorfismo (enlace dinámico) que a través de un enlace dinámico permite colaborar a un objeto con distintos tipos de objetos desacoplando el software de sus colaboradores actuales y/o futuros al elevar la abstracción, ocultación, generalización y extensibilidad

  • puro o no, Eiffel/ Smalltalk vs Java que dispone de tipos primitivos con operadores diferentes de objetos con mensajes

  • clases o no, Javascript vs Java que requiere la definición de cada clase

  • herencia o no, Smalltalk vs Simula que solo incorpora implementación de interfaces

  • con estado o no, furto de la cosificacion de un algoritmo: controller, mapper, checker, …​

  • mutabilidad o no, C++ vs Haskell que no permite cambios de estado

imperativoObjetos

funcionalObjetos

  • (1) Muy frecuentemente soluciones mutables e iterativas, porque es la naturaleza del paradigma

  • (2) Infrecuentemente soluciones mutables y recursivas o inmutables e iterativas porque el dominio es recursivo o inmutable

  • (3) Muy infrecuentemente soluciones inmutables y recursivas porque el dominio es inmutable y recursiva

  • A través de los métodos estáticos u objetos función caben todas las combinaciones del paradigma imperativo orientado a procesos

  • (4) Muy frecuentemente soluciones inmutables y recursivas porque es la naturaleza del paradigma

  • (7) Infrecuentemente soluciones mutalbes e iterativas o inmutables e iterativas o mutables y recursivas porque se requieren optimizaciones y/o efectos laterales

  • A través de los métodos estáticos u objetos función caben todas las combinaciones del paradigma imperativo orientado a procesos

Soluciones

Mutable

Inmutable

Iterativo

Recursivo

Según la Ejecución de Procesos

Concurrencia
  • En el ámbito de la programación, es el acaecimiento de varios sucesos al mismo tiempo, que pueden ser acciones que ejecuta un programa con un cierto fin o pueden ocurrir espontáneamente en su entorno, eventos.

    • Puesto que, en general, estos sucesos pueden durar un cierto intervalo de tiempo, la concurrencia es un concepto muy amplio, que engloba:

  • Paralelismo, si los sucesos se producen durante el mismo intervalo de tiempo.

  • Solapamiento, si se producen en intervalos de tiempo superpuestos.

  • Simultaneidad, si se producen en el mismo instante de tiempo, sólo si los sucesos son instantáneos.

Paradigma de la programación concurrente
  • es un conjunto de teorías, métodos y herramientas, cuyo objetivo es la construcción y verificación de programas formados por múltiples actividades que se ejecutan concurrentemente para llevar a cabo una cierta tarea.

  • Se han desarrollado distintos lenguajes de programación para representar actividades simultáneas y para coordinar su ejecución, tales como ADA, OCCAM, Concurrent-Pascal, Erlang, Java, …​.

  • Algunas áreas de aplicación típicas de la programación concurrente son los sistemas operativos, los sistemas de gestión de bases de datos y los sistemas en tiempo real, tales como los sistemas de control de procesos o los sistemas multimedia.

Procesos concurrentes Programa concurrente Sistema concurrente
  • si varios procesos se ejecutan al mismo tiempo en un sistema. Más formalmente, si la primera instrucción de uno se ejecuta entre la primera y la última del otro, o viceversa.

  • es un conjunto de varios programas secuenciales, cuyos procesos pueden ejecutarse concurrentemente en un sistema para resolver un cierto problema.

  • es un sistema informático (hardware + software) en el que es posible ejecutar varios procesos concurrentemente.

Relaciones entre procesos
  • Independencia, cuando no existe ninguna interacción entre los procesos

  • Competencia, cuando los procesos deben compartir recursos comunes del sistema (UCP, memoria, disco, impresora, …​), por lo que deben competir entre ellos para adquirirlos.

  • Cooperación, cuando los procesos deben trabajar conjuntamente sobre distintas partes de un problema para resolverlo, para lo cual necesitan intercambiar información entre sí.

Interacciones entre procesos
  • Sincronización es el intercambio entre los procesos de información acerca del control del flujo de ejecución de sus instrucciones

    • Sirve para coordinar el orden de ejecución de las instrucciones de los procesos, imponiendo restricciones para que no se ejecuten unas instrucciones antes que otras

    • Tipos:

      • Sincronización condicional es la sincronización de un proceso que debe esperar a que se cumpla una cierta condición para poder continuar su ejecución, la cual será activada por otro proceso

      • Exclusión mutua es la sincronización de varios procesos que compiten por un recurso común de acceso exclusivo, deben coordinar sus ejecuciones para evitar el acceso concurrente a dicho recurso

  • Comunicación es el intercambio entre los procesos de información acerca de sus datos porque varios procesos deben cooperar para resolver un problema, habitualmente unos necesitan disponer de datos obtenidos por otros.

    • En este caso, es obvia la necesidad de sincronizar los procesos, pues o bien

      • los que necesitan los datos no pueden continuar progresando en su ejecución mientras no se disponga de ellos (sincronización condicional), o bien

      • se debe evitar que unos procesos modifiquen los datos mientras otros estén leyéndolos, con el fin de mantener su integridad (exclusión mutua).

iteraccionProcesos

Estados de un proceso
  • Preparado, el proceso está dispuesto para ejecutar instrucciones, a falta únicamente de un procesador físico libre

    • Este estado se deriva del hecho de que en un sistema normalmente hay menos procesadores físicos que procesos en ejecución.

  • Ejecución, el proceso está ejecutando instrucciones en un determinado procesador

  • Bloqueado, el proceso debe esperar la ocurrencia de un suceso antes de poder hacer uso de un procesador

    • Este estado se deriva de la terminación de una operación de entrada/salida, cálculo, …​

estadosProceso - Un proceso se duerme a sí mismo, cuando las condiciones del estado del sistema lo obligan

  • Un proceso despierta a otros procesos, cuando las condiciones del sistema lo permiten

Modelos de concurrencia
  • Variables Compartidas, donde los procesos leen o escriben en variables de acceso común para sincronizarse y comunicarse. Es decir, un proceso escribe en una variable, la cual es leída por otro proceso.

    • Son soluciones complejas, tal y como se ha demostrado en ciertos problemas clásicos: exclusión mutua con el algoritmo fallido de Hyman, de Decker (2 procesos), de Lamport (n procesos)

  • Paso de Mensajes, donde los procesos se sincronizan y comunican mediante el intercambio de mensajes. Es decir, un proceso envía un mensaje que es recibido por otro proceso.

  • Herramientas:

    • Semáforos

    • Regiones críticas

    • Regiones críticas condicionales

    • Monitores

  • Herramientas:

    • Envío asíncrono

    • Envío síncrono o cita simple

    • Invocación remota o cita extendida

Arquitecturas de sistemas concurrentes

Sistemas multiprocesador
  • Sistemas fuertemente acoplados, formados por varias UCPs, una o más memorias y un sistema de entrada/salida comunes para todas las UCPs, unidos mediante varios buses.

    • Además, algunas UCPs pueden tener memorias locales de acceso particular

arquitecturasFisicas2

  • Sistemas débilmente acoplados, también llamados sistemas distribuidos, formados por un conjunto de nodos, que pueden estar dispersos geográficamente.

    • Cada nodo puede ser un sistema uni o multiprocesador y no comparten memoria común, sino que están unidos por redes de comunicación.

    • Dependiendo de las distancias entre nodos, se habla de:

      • Sistemas multicomputador De 1 dm a 10 m.

      • Redes de área local De 1 m. a 10 Km.

      • Redes de área extensa De 1 Km. en adelante.

arquitecturasFisicas4

Sistemas uniprocesador Modelos Concurrentes en Arquitecturas
  • Básicamente están formados por una única UCP, una memoria, y un sistema de E/S, conectados mediante varios buses.

arquitecturasFisicas

arquitecturasFisicas5

Multiprocesamiento
  • En un sistema multiprocesador, es posible que cada proceso de un programa concurrente se ejecute en un procesador físico distinto.

    • Este primer enfoque se denomina

      • Multiprocesamiento si los procesadores comparten memoria común en sistemas multiprocesadores fuertemente acoplados, o como

      • Procesamiento Distribuido si los procesadores están conectados por una red de comunicaciones en sistemas distribuidos.

  • En el multiprocesamiento, se dice que existe paralelismo real en la ejecución de los procesos, lo que permite un aumento de la velocidad de ejecución del programa.

multiprocesamientoMultiprogramacion

Multiprogramación
  • El concepto de programación concurrente admite la ejecución concurrente de más de un proceso en un único procesador físico.

    • Consiste en multiplexar la ejecución de los procesos sobre los procesadores mediante la intercalación de la ejecución de sus instrucciones.

    • Esto se suele conseguir mediante la técnica conocida como compartición de tiempo, en la que se asigna una cuota de tiempo a cada proceso para su ejecución en un procesador.

  • En la multiprogramación, se habla de paralelismo simulado o de pseudoparalelismo.

    • Excepto en lo que se refiere a su velocidad de ejecución, la sensación que proporciona el sistema es similar a la que se obtendría con paralelismo real.

multiprocesamientoMultiprogramacion2

  • Como sabemos, con el multiprocesamiento es posible aumentar la velocidad de ejecución de un programa concurrente, mediante las asignación de diferentes procesadores físicos a distintos procesos.

  • Sin embargo, multiprogramar varios procesos concurrentes no aumenta la velocidad de ejecución del programa.

    • Incluso, puede disminuir, debido a que la intercalación de sus ejecuciones en el procesador implica un cierto coste adicional.

También son posibles enfoques híbridos, por ejemplo, los procesadores de un sistema distribuido pueden multiprogramarse.

Aplicación de la Multiprogramación
  • Aprovechar la posibilidad de ejecutar procesos concurrentes, cuando el dominio del problema no está totalmente ordenado.

    • En ciertas aplicaciones, el orden de ejecución de ciertas operaciones del programa no está fijada de antemano, sino que puede depender de sucesos externos cuyo orden se desconoce y, por tanto, debe determinarse en tiempo de ejecución

  • Dar un servicio interactivo a varios usuarios simultáneamente, por ejemplo, los sistemas operativos multiusuario.

  • Mejorar la utilización del procesador, cuando un proceso está bloqueado, esperando un cierto suceso (por ejemplo, en una operación de E/S), es posible asignar el procesador a otro proceso.

    • Aunque esto pueda ralentizar la ejecución de cada proceso individual, se aumenta la utilización del procesador y, por tanto, la velocidad de ejecución del programa global.

multiprocesamientoMultiprogramacion3

Planificación, (scheduling) Despacho (dispatching)
  • Consiste en determinar la asignación, en cada instante, de los procesos existentes a los procesadores físicos disponibles, cuando se cumpla alguna de las siguientes condiciones:

    • El proceso que tiene el control de la UCP termina.

    • El proceso se bloquea por alguna razón, espera por E/S, sección crítica, …​

    • Cuando finaliza su cuota de tiempo, en un sistema multprogramado

    • Se produce un error en su ejecución.

  • Cuando la UCP queda disponible, el algoritmo de planificación determina a qué proceso preparado se le asigna, usando diferentes técnicas: el que más tiempo lleve esperando, por prioridades, aleatorio, etc.

  • Hay dos conceptos importantes acerca de la planificación muy relacionados con la programación concurrente:

    • Justicia Un planificador es justo si a todo proceso preparado se le asigna en algún momento un procesador para ejecutarse.

    • El comportamiento funcional (datos/resultados) de un programa concurrente no debe depender del algoritmo de planificación empleado.

  • Consiste en entregar el control de la UCP al proceso elegido por el planificador para su ejecución,

    • Cuando un proceso abandona una UCP, se almacena una copia de los valores de todos los registros de la UCP, para que puedan restaurarse cuando el proceso sea despachado de nuevo, como consecuencia de haber sido seleccionado por el planificador.

    • Esto es necesario para conseguir que el proceso reanude su ejecución exactamente en las mismas condiciones que cuando la detuvo, sin sufrir ninguna interferencia por parte de los procesos que hayan visitado la UCP en ese período.

    • Esto equivale a suponer que cada proceso dispone de su propio juego virtual de registros de la UCP.

Abstracción de la programación concurrente

“La abstracción de la programación concurrente es el estudio de las secuencias de ejecución intercalada de las instrucciones atómicas de los procesos secuenciales“.
— Ben-Ari
1990
  • Para alcanzar esta abstracción se ignorarán detalles tales como:

    • El número de procesadores físicos disponibles,

    • Las velocidades de ejecución de los procesos,

    • Y los posibles solapamientos en las ejecuciones de las instrucciones indivisibles de cada proceso.

Inctrucciones atómicas
  • aquélla cuya ejecución es indivisible en un cierto sistema.

    • En consecuencia, ningún otro proceso puede observar los efectos de una instrucción atómica ni puede interferir en sus resultados durante su ejecución.

    • Sin embargo, no se puede hacer esta suposición sobre lo que ocurre entre la ejecución de dos acciones atómicas sucesivas.

  • Para aclarar el concepto de instrucción atómica, supongamos la siguiente instrucción de un cierto proceso, que incrementa en una unidad el valor de una variable entera x:

x = x + 1;
  • Esta instrucción, en general, puede no ser atómica, ya que el código resultante, escrito en un cierto lenguaje ensamblador, podría ser el siguiente:

a1: LOAD R, X (* Cargar X en el registro R *)
a2: ADD R, #1 (* Sumar 1 a R *)
a3: STORE R, X (* Almacenar R en X *)
  • Si estas instrucciones son indivisibles en un cierto procesador, debido a que existen mecanismos (hardware o software) que garanticen su ejecución sin interrupción, entonces podremos asegurar que son atómicas.

Tipos de instrucciones atómicas
  • De grano fino, es aquélla que se implanta directamente por el hardware en el que se ejecuta el programa concurrente. Se corresponden con las instrucciones máquina de la UCP.

  • De grano grueso, es una secuencia de instrucciones atómicas de grano fino, cuya ejecución es indivisible.

    • Esto se consigue mediante herramientas software proporcionadas por un lenguaje de programación o pueden estar implantadas en un sistema operativo subyacente que permitan sincronizar la ejecución de los procesos

  • 1ª abstracción

    En la programación concurrente se considera que cada proceso se ejecuta en su propio procesador. Esto permite tener en cuenta únicamente las interacciones entre los procesos derivadas de sus relaciones de competencia y cooperación
    — Ben-Ari
    1990
  • 2º abstracción

    Una abstracción superior es ignorar las velocidades relativas de cada proceso, lo que posibilita eliminar la variable tiempo y considerar sólo las secuencias de instrucciones atómicas que se ejecutan
    — Ben-Ari
    1990
Intercalación
  • 3º abstracción

    “Se considera que las secuencias de ejecución de las instrucciones atómicas de todos los procesos se intercalan en una única secuencia.”
    — Ben-Ari
    1990
    • Esta abstracción considera que la ejecución de dos instrucciones atómicas sólo puede intercalarse, pero no solaparse.

    • Esta restricción se basa en la suposición de que el resultado de la ejecución simultánea de dos instrucciones atómicas debe ser cualquiera de los dos posibles resultados obtenidos al ejecutar las instrucciones secuencialmente.

      • Esta suposición es totalmente adecuada en el caso de multiprogramación, puesto que la ejecución de las instrucciones atómicas siempre debe intercalarse por la competencia por un único procesador.

  • En multiproceso, dos instrucciones atómicas pueden ejecutarse, en principio, simultáneamente, sin embargo, si las instrucciones compiten por un cierto recurso de acceso exclusivo, por ejemplo, tratan de escribir simultáneamente en una misma posición de memoria, el hardware o software subyacente debe resolver el problema fijando un cierto orden arbitrario (porque, por definición, son atómicas)

    • Si las instrucciones son independientes, su resultado será el mismo cualquiera que sea el orden en que se ejecuten, por lo que también podemos suponer un cierto orden arbitrario.

    • Más aún, la abstracción de la programación concurrente no impone una intercalación fija de las instrucciones atómicas de los procesos, sino que hay que considerar todas las posibles secuencias de ejecución intercalada de sus instrucciones atómicas.

      • Esto es un problema de gran complejidad porque el número de posibles intercalaciones crece exponencialmente al aumentar el número de procesos y el número de sus instrucciones atómicas.

Indeterminismo
  • la imposibilidad de reproducir exactamente la ejecución de un programa concurrente que parte del mismo estado inicial de su entorno.

    • Como consecuencia, dos ejecuciones del mismo programa con los mismos datos pueden producir distintos resultados, incluso en el mismo sistema.

  • Esto es debido a que, aun cuando el estado inicial sea el mismo, la secuencia de ejecución de sus instrucciones atómicas intercaladas puede ser diferente, lo que provoca que el programa pase por distintos estados intermedios.

  • Esto no sucede en el caso de un programa secuencial, cuyo comportamiento es completamente determinista.

  • Consideremos el siguiente programa concurrente, escrito en un lenguaje de programación abstracto.

int x = 0;
PROCESS P1 :
  x = x + 1;
PROCESS P2 :
  x = x + 1;
  • Si las instrucciones de incremento no son atómicas, sino que se descomponen en las siguientes instrucciones atómicas:

PROCESS P1 :
  a11) LOAD R1, X
  a12) ADD R1, #1
  a13) STORE R1, X

PROCESS P2 :
  a21) LOAD R2, X
  a22) ADD R2, #1
  a23) STORE R2, X
  • Entonces hay que considerar 20 posibles secuencias de ejecución intercalada de las instrucciones atómicas de los procesos, de las cuales sólo las 2 siguientes producen un resultado final igual a 2 en la variable x:

a11 -> a12 -> a13 -> a21 -> a22 -> a23 => x = 2
a21 -> a22 -> a23 -> a11 -> a12 -> a13 => x = 2
  • mientras que el resto de secuencias de ejecución producen un resultado final igual a 1 en la variable x:

a11 -> a21 -> a12 -> a13 -> a22 -> a23 => x = 1
a11 -> a21 -> a22 -> a12 -> a13 -> a23 => x = 1
...
  • El ejemplo anterior ilustra una propiedad importante, que el indeterminismo, aumenta cuando disminuye el grano de las acciones atómicas de cada proceso.

    • Esto es debido a que el número de posibles intercalaciones crece exponencialmente con el número de acciones atómicas de cada proceso, y con ellas, el número de posibles estados intermedios.

  • Un objetivo primordial de la programación concurrente es tratar de reducir este indeterminismo, sincronizando los procesos para restringir el número de posibles secuencias de instrucciones de un programa concurrente sólo a aquéllas deseables.

    • Si en el ejemplo anterior sincronizamos los procesos para garantizar que hay exclusión mutua en el acceso a la variable x, entonces el resultado final siempre será 2.

Propiedades de corrección

Corrección de un programa concurrente
  • se define en términos de las propiedades de sus secuencias de ejecución

    • Una propiedad de un programa concurrente es un atributo que debe satisfacerse para todas sus posibles secuencias de ejecución

  • Un programa correcto debe cumplir tres clases de propiedades en toda posible ejecución del mismo:

Propiedades de seguridad Propiedades de vitalidad Propiedades de justicia
  • Deben ser ciertas en todo instante de la ejecución del programa.

    • Aseguran que nada malo ocurrirá nunca durante una ejecución, (safety)

  • Deben ser eventualmente ciertas, es decir, deben cumplirse en algún instante de la ejecución del programa.

    • Aseguran que algo bueno ocurrirá eventualmente durante su ejecución, (liveness)

  • Cuando varios procesos compiten por recursos comunes, es deseable poder especificar cómo debe resolverse esta competencia, (fairness)

  • Ausencia de interbloqueo pasivo (deadlock) se produce cuando un conjunto de procesos se bloquean esperando un suceso que sólo puede producir otro proceso del propio conjunto.

    • Puesto que todos esperan, ninguno puede producir el suceso que desbloquearía a otro y, por tanto, todos continúan esperando indefinidamente.

  • Exclusión mutua se establece cuando nunca puedan intercalarse ciertas secuencias de instrucciones de un grupo de procesos.

    • Es decir, una secuencia debe terminarse de ejecutar antes de que ninguna otra comience. Esta propiedad sirve para garantizar el acceso exclusivo a recursos compartidos por los procesos.

  • Ausencia de interbloqueo activo (livelock) se produce cuando ciertos procesos no se bloquean, pero ejecutan instrucciones inútiles sin obtener ningún progreso.

  • Ausencia de inanición (starvation), si un proceso hace una petición para obtener un recurso, debe garantizarse que sea atendida eventualmente.

    • Lo que no puede ocurrir es que a un proceso no se le atienda nunca, mientras otros procesos obtienen ese recurso repetidamente.

  • Ausencia de inanición

  • Espera lineal, si un proceso hace una petición, debe garantizarse que se le conceda antes de que se le conceda a otro proceso más de una vez

  • Espera FIFO, si un proceso hace una petición, debe concedérsela antes de a cualquier otro proceso que la haga posteriormente

Programación No Bloqueante

Programación Bloqueante Programación No Bloqueante
  • Cuando un programa ejecuta una operación de E/S, su proceso se bloquea hasta la llegada/salida de los datos

    • Motivo por el que se denomina programación síncrona: un proceso avanza cuando otro proceso alcanza cierto avance de ejecución

  • Problemas de escalabilidad por la planificación y despacho de procesos cuando éstos alcanza un gran volumen (problema C10k)

    • Un servidor web que ejecuta un hilo/proceso por cada petición (miles, cientos de miles, …​) con latencias de 250.000.000 de ciclos de procesador desaprovechados en operaciones de E/S

  • Cuando un programa ejecuta una operación de E/S, su proceso no se bloquea hasta la llegada/salida de los datos y coontinua su ejecución por otro punto

    • Motivo por el que se denomina programación asíncrona: un proceso avanza sin que otro proceso alcance cierto avance de ejecución

  • Esto evita el problema de escalabilidad contemplando un único proceso que atiende una cola de eventos con peticiones de usuario, resultados de E/S asíncrona de ficheros, red, …​

    • Motivo por el que se denomina programación reactiva: el proceso en ejecución reacciona ante eventos, llegada de datos, …​

costIO

eventLoop

Programación Asíncrona No Bloqueante
  • Retrollamadas, Callbacks

    • Se registra en la operación de E/S, la operación que tratará los datos cuando lleguen.

    • Una función de orden superior recibe función continuadora

    • Producen un código muy complejo de entender (Callback Hell)

  • Javascript, de forma natural desde su origen con funciones de orden superior

  • Java, desde Java 8 con Interfaz Funcional con funciones lambda

  • Futuribles

    • versión orientada a objetos de los callbacks orientados a procesos

    • Mejoran la gestión de callbacks, pero sólo soportan un objeto en el futuro y están limitadas

  • Javascript, con Promesas

  • Java, con ComputableFuture

  • Mecanismos particulares de cada lenguaje

  • Javascript, C-sharp, con async/await

  • Java, con VirtualThreads

  • Go, Kotlin, con rutinas

  • Programación Reactiva

    • se considera el modelo más potente, pero no es sencillo de usar

Según otros criterios

Paradigmas

TabalaPeriodicaLenguajes

  • Paradigma Orientado a Restricciones

  • Paradigma Orientado a Aspectos

  • Paradigma Orientado a Eventos

  • …​

  • Paradigmas Exotéricos:

    • lenguajes bidimensionales,

    • lenguajes bioinspirados,

    • lenguajes multicriteriales,

    • …​

Tendencias

Variables Pasado Actualidad
  • Según el Nivel Semántico

  • bajo nivel

  • alto nivel

  • Según la Traducción para la Ejecución

  • compilado

  • interpretado

  • Según el Sistema de Tipos

  • débilmente tipado

  • fuertemente tipado

  • Según el Fundamento Matemático

  • imperativo

  • funcional

  • Según los Saltos de Ejecución

  • desestructurado

  • estructurado

  • Según el Bloque Organización

  • orientado a procesos

  • orientado a objetos

  • Según la Ejecución de Procesos

  • sobre procesos concurrentes con sincronización, bloqueante

  • procesos disjuntos sin sincronización, no bloqueante

CuadranteEntornoLenguajes

  • ¿Siendo equipotentes los distintos paradigmas (imperativo o declarativo - orientado a procesos u objetos) qué necesidad hay de disponer de todos los paradigmas para las distintas partes de la solución de un proyecto?

    • El problema del desplazamiento de C a C++, Arquitecturas CISC vs RISC, …​ ¿Sencillo o ¿complejo?

    • Lenguajes multiparadigmaticos: Leda, …​, Javascript!?!

¿En el caso de que fuera conveniente, arregla los problemas de los proyectos como para justificar la inversión de tiempo/esfuerzo, …​ que absorbe actualmente …​ o desde siempre? ¿Gestión, Requisitos, Análisis, …​?

Errores en Programación

  • Error, una mala decision hecha durante el desarrollo de un sistema software que produce defectos: despiste, ignorancia, …​

  • Defecto, propiedad de un sistema de software que pueden hacer que el sistema se aparte de su comportamiento especificado: incumplimiento de la especificación del del lenguaje y/o de los requisitos

  • Fallo, cuando un sistema software se aparta de su comportamiento especificado durante una de sus ejecuciones

    • con fallos léxicos, sintácitos, semáticos en Tiempo de Compilación

    • con fallos lógicos y/o excepcionales en Tiempo de Ejecución

errorSoftware
  • Los fallos son debidos a los defectos los cuales resultan de los errores

  • Un fallo es el hecho real y un defecto es posibilidad potencial,

  • La corrección sólo tiene sentido en relación con una determinada especificación

Tipos de error en tiempo de compilación
  • Errores léxicos: producidos por piezas (palabras reservadas, identificadores, literales y signos de puntuación) que no respetan las reglas lexicográficas del lenguaje

  • Errores sintácticos: producidos por sentencias léxicamente correctas que no respetan las secuencias de la gramática del lenguaje

  • Errores semánticos: producidos por sentencias léxica-sintacticamente correctas que no respeta las reglas del sistemas de tipos del lenguaje

Tipos de error en tiempo de ejecución
  • Errores Lógicos: producidos por la lógica de un programa que no contempla todos los posibles valores de datos

  • Errores Excepcionales: producidos por recursos (ficheros, comunicaciones, bibliotecas, …) fuera del ámbito del software que los maneja

  • Contexto: ciertos errores pueden ser un error lógico o excepcional dependiendo del software en el que se está desarrollando

    • un valor negativo para calcular un factorial, una referencia sin la dirección de un objeto -null-, …​

  • En el desarrollo de una aplicación se debe responsabilizar de la detección y subsanación de los errores lógicos dentro de su ámbito en la fase de desarrollo y pruebas.

  • En el desarrollo de una biblioteca NO se puede responsabilizar del uso indebido de los servicios prestados a las aplicaciones y NUNCA debe responsabilizarse de la subsanación de dichos errores.

    • En estos casos, estos errores lógicos se considerarán excepcionales porque la causa del error está fuera de los límites del software de la biblioteca.

Itinerario

Itinerario

  • Otros lenguajes:

    • Parecidos: Python, PHP, C#, …​, complementario

    • Medio nivel: C/C++, profundidad

    • Diferentes: Smalltalk, Eiffel, Rust, LISP, …​, muy complementario

  • Meta-Programación

    • Programación Orientada a Aspectos, profundidad

    • Frameworks, uno de cada en profundidad

      • frontend: interfaz de Usuario, atacar servicios Web, …​: React, Angular, Swing, QT, …​

      • backend: desarrollar servicio Web, bases de datos, …​: Spring, Hibernate, Symphony, …​*

  • Programación Lógica, Prolog, muy complementario

  • …​

  • Desarrollador: disciplinas de Diseño y Pruebas

  • Otras disciplinas: requisitos, análisis, despliegue

  • Especialista: gráficos, sistemas, web, IA, seguridad, …​

Bibliografía

Autor, Obra y Editorial Portada Autor, Obra y Editorial Portada
  • Lenguajes de Programacion. Conceptos y Constructores

    • Ravi Sheti

    • Addison Wesley, 1992

LenguajeProgramacionSheti

  • Código Completo. Un manual práctico de construcción del software

    • Steve McConnell

    • Microsoft Press, 2004

CodigoCompletoMcConnell

Ponente

  • Luis Fernández Muñoz

setillo

  • Doctor en Inteligencia Artificial por la UPM

  • Ingeniero en Informática por la UMA

  • Diplomado en Informática por la UPM

  • Profesor Titular de ETSISI de la UPM