¿Por qué?

Arquitectura de von Neumann

imagen con partes de la computadora instrucciones de ensamblador/código máquina

  • Entrada/Salida, Procesos y Datos

  • Dispositivos, Procesador, Memoria

    • Interrupciones entre dispositivo y procesador

    • dispositivos:

      • entrada: teclado, ratón, joystick, …​

      • salida: pantalla, impresora, …​

      • entrada/salida: red

  • Código máquina

    • 0100101001010

    • de ahí viene codificar en vez de programar!!!

¿Qué?

  • Programar: instrucciones para manipular los datos

    • Entrada/Salida

    • Procesos

    • Datos

  • Programación, conjunto resultante, acción, …​

  • Programa,

    • En Tiempo de Compilación, fuera del tiempo de ejecución

  • Proceso, hilo de ejecución

    • En Tiempo de Ejecución, desde el inicio al final de la ejecución

    • Aplicación/Componente, sistema distribuido, comunicaciones

¿Para qué?

  • Efectividad

    • Eficacia

    • Eficiencia

  • Programador

    • Desarrollar en Lenguajes Java y JavaScript

    • Comprender el 80% de muchos otros

    • con criterio

    • escalón para diseño y pruebas, desarrollador

¿Cómo?

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

paradigma

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
1994

Según el Nivel Semántico

Saltar de código ensamblador a lenguaje de alto nivel

Bajo nivel Medio nivel Alto nivel

Enfocados a la máquina

Enfocados a la máquina y al desarrollador

Enfocados al desarrollador

ensamblador

c

javascript

código binario, ensamblador, …​

C, C++, …​

Java, Javascript, Scala, PHP, Basic, …​

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

De ensamblador a alto nivel

Interpretado Compilado Hibrido
interprete
compilador
hibrido

Javascript, Typescript, …​

C/C++, …​

Java

Lenguaje Tiempo de desarrollo Tiempo de ejecución Portabilidad

Interpretado

Bajo

Alto

Alta

Compilado

Alto

Bajo

Bajo

Híbrido

Medio

Medio

Alta

Portabilidad: facilidad de migración sobre otros sistemas operativos/ plataformas/ hardware, …​

Según el Sistema de Tipos

Hueco semántico (teoría de lenguajes de gabriel) Poner otros ejemplos a variable?!? Traer enlace estático y dinámico

No hay tipos primitivos Eiffel y Smalltalk Hay tipos primitivos distintos: Java, Javascript Distinta clasificación

Programación parametrizada Inferencia de tipos

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

Java, …​

Javascript, …​

Typescript, …​

Según el Fundamento Matemático

máquina de turing, mutabilidad teoría de funciones, inmutabilidad

aclarar función pura vs impura

Matemática Modelo Paradigma Enfoque Lenguajes

Fundamentos

Máquina de Turing

Paradigma Imperativo

basado en asignación de valores a variables para cambios de estado

Cobol, Fortran, C, Ada, …​

Cálculo Lambda

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

Lisp, FP, Scheme, ML, Haskell, …​

Cláusulas de Horn

Paradigma Lógico

basado en hechos y predicados lógicos con el algoritmo de Unificacion para las reglas de sustitución

Prolog, …​

  • Se llama conjuntamente Pardigma Declarativo, unión del Paradigma Funcional y Lógico, enfrentado al Paradigma Imperativo, porque carece de variables con estado y, por tanto, de bucles.

    • Sus soluciones son eminentemente recursivas, declarando la solución de un problema como alguna operación sobre la solución del problema en un grado menos.

ParadigmasFundamento

Según los Saltos de Ejecución

teorema de programación estructurada codigo de algoritmo y máquina de estados

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

1968

F.L. Bauer

Ingeniería del Software

OTAN, Munich

1972

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

Structured Programming

Academic Press

1972

E. W. Dijkstra

The Humble Programmer Desprecio por el programador, la calidad, …​ subcontratación, …​

ACM Turing Lecture

1974

D. Knuth

Structured Programming with go to Statements

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

cambiar código de búsqueda a primo

Programación spaguetti Programación Estructurada

goto

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

{
  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")
}

Según el Bloque Organización

1 función 2 modular 3 basado objetos: TAD’s 3 orientado a objeto

grupos de función o ramillete de funciones + datos función de orden superior vs polimorfismo

posible transformación de imperativo orientado a objetos a imperativo orientado a procesos posible transformación de imperativo orientado a objetos a funcional orientado a objetos posible transformación de funcional orientado a objetos a funcional orientado a procesos

31 por clases con polimorfismo estático en interfaces 32 por clases con polimorfismo estático en herencia 32 por prototipos con polimorfismo dinámico por prototipos

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

Paradigma Orientado a Procesos Paradigma Orientado a Datos Paradigma Orientado a Objetos

Preponderancia de las operaciones sobre los datos

Preponderancia de los datos sobre las operaciones (1ª forma normal, 2ª forma normal, …​, Boyce-Codd)

Equilibrio entre datos y operaciones, conformando una clase de objetos reinstanciable

C, Pascal, …​

SQL (4GL), …​

Smalltalk, C++, Java, CLOS, Python, …​

Según la Ejecución

secuencial o concurrente

Otros criterios

  • Paradigma Orientado a Eventos

  • Paradigma Orientado a Aspectos

  • …​

  • Paradigmas Exotéricos:

    • bidimensionales, bioinspirados, multicriteriales, …​

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

Paradigmas

TabalaPeriodicaLenguajes

Tendencias

Eje

Variables

  • nivel

  • bajo nivel

  • alto nivel

  • traducción

  • compilado

  • interpretado

  • sistema de tipos

  • débilmente tipado

  • fuertemente tipado

  • fundamento

  • imperativo

  • funcional

  • saltos

  • desestructurado

  • estructurado

  • bloque

  • orientado a procesos

  • orientado a objetos

  • ejecución

  • sobre procesos concurrentes con sincronización

  • procesos disjuntos sin sincronización, como secuencial

Ejes según fundamento y bloque de construcción

CuadranteParadigmas

CuadranteParadigmasLenguajes

  • recursividad NO ⇒ procesos! También en datos

    • recursividad de datos de datos!!! Lista, ListaVacia y ListaNoVacía

  • recursividad NO ⇒ funcional! También en imperativo

    • Lista con nodos mutables iterativo y recursivo

  • funciones, orden superior no ⇒ funcional

    • no efecto lateral!!!! funciones puras, inmutabilidad

    • no sentencias!!!! …​

  • funcional NO ⇒ inteligencia artificial

Ejes según ejecución y sistemas de tipos
  • hablar de posibilidades: metraprogramación, …​

CuadranteEntornoLenguajes

Programación imperativa

Programación funcional

  • Sentencia if

    • 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 ?

    • 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>;
[source, java]
  • lo único común a todos los paradigmas son los tipos, las constantes, valores inmutables, y las expresiones de operadores y funciones puras

  • [red]*ninguna declaración de variable, ni las sentencias if ni secuencial, ni cualquier función con efectos laterales

Lenguajes de Programación

lenguajesProgramacion
Lexicografía Sintaxis Semántica
  • palabras reservadas (if, function, package/module/unit/namespace, …​) para la estructura de las sentencias

  • símbolos (+, /, (, ), …​) para operadores, signos de puntuación, …​ e

  • identificadores del desarrollador (customer, date, …​) para

  • Compromiso entre la legibilidad y concisión (azucar sintáctico)

    • actualmente muchos comparten la propuesta de C

  • Constructores para la organización de miles/millones de líneas de código:

    • asignación o no,

    • bucles o no,

    • funciones o no,

    • clases/objetos o no,

    • …​ determinando su paradigma

al margen de la popularidad de cada lenguaje y su evolución tiempo

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

desarrollo
  • 1. Programación Imperativa

  • 2. Programación Estructurada

  • 3. Programación basada en Procesos

  • 4. Programación basada en Objetos

  • 5. Programación orientada a Objetos

  • 6. Programación Modular

  • 7. Programación con Excepciones

  • 8. Programación Parametrizada

  • 9. Programación Recursiva

  • 10. Programación Funcional

  • 11. Programación Concurrente

  • 12. MetaProgramación

Bibliografía

Obra, Autor y Edición Portada Obra, Autor y Edición Portada

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