TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

38
Compiladores I (06/27/22 11:10) - 2.1 - TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN. Lecciones 3,4,5,6,7,8

description

TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN. Lecciones 3,4,5,6,7,8. Precedentes (I). El diseño de lenguajes es un problema complejo En los lenguajes de programación hay muchos errores de diseño Se han considerado ideas erróneas FORTRAN uso del GOTO - PowerPoint PPT Presentation

Transcript of TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Page 1: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.1 -

TEMA 2.DISEÑO Y PARADIGMAS DE LOS

LENGUAJES DE PROGRAMACIÓN.

Lecciones 3,4,5,6,7,8

Page 2: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.2 -

Precedentes (I)

• El diseño de lenguajes es un problema complejo

• En los lenguajes de programación hay muchos errores de diseño

• Se han considerado ideas erróneas– FORTRAN

• uso del GOTO

• declaración implícita de variables

– COBOL• Sentencias demasiado largas

• Farragoso de escribir y leer

• Uso del GOTO

– APL • si puede significar algo, lo significa

– LISP • una sintaxis simple es más fácil de aprender

• Los paréntesis dificultan escribir programas

• La lectura es compleja por una sintaxis demasiado homogénea

Page 3: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.3 -

Precedentes (II)

– C • el programador sabe lo que hace

– Obtener direcciones de variables locales

– Printf no comprueba el tipo y número de los argumentos

– C++ • se puede extender C al paradigma orientado

a objeto (demasiados compromisos de compatibilidad)

• Uso intensivo de apuntadores a objetos

• Lenguaje demasiado complicado

– Un lenguaje se puede utilizar para todo tipo de desarrollo de software

• Aun con muchos errores de diseño es importante estudiar los lenguajes de programación existentes ya que aportan muchas ideas

Page 4: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.4 -

Consideraciones Preliminares

• ¿Cual es el propósito del lenguaje?– No hay un lenguaje bueno para todo

– Aplicación específica• Bases de datos, sistemas expertos, cálculo

numérico, programación simbólica, diseño algorítmico, etc.

• ¿Es necesario diseñar un nuevo lenguaje?– Ya existe un lenguaje apropiado

• El nuevo lenguaje se diferencia de los existentes

– Se consume demasiado tiempo en el diseño e implementación de un nuevo lenguaje

• Es demasiado fácil diseñar un lenguaje incompleto

• Lenguaje demasiado especializado

• Sacrificar características del lenguaje por un compilador simple.

– Otras opciones• Un modulo o librería de funciones

• Ampliar un lenguaje de programación

Page 5: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.5 -

Fuentes de Ideas

• Lenguaje natural (COBOL)– Fácil de leer y escribir

– Ambiguo

– Solo se puede implementar un subconjunto

• Lenguajes matemáticos (APL)– No ambiguos

– Crípticos

– La programación no es matemáticas

• Lenguajes de programación– Errores de diseño (pasado)

• Hay que valorar cada característica de un lenguaje existente antes de incluirla en el nuevo lenguaje

• Pruebas y experimentos – Programar con el lenguaje antes de haber

acabado su diseño• Sirve para detectar los problemas del diseño

y tomar decisiones difíciles.

Page 6: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.6 -

Objetivos y Filosofías de Diseño

• Comunicación humana

• Prevención y detección de errores

• Usabilidad

• Efectividad

• Compilabilidad

• Eficiencia

• Independencia de la máquina

• Simplicidad

• Uniformidad

• Ortogonalidad

• Generalización y especialización

• Otras filosofías de diseño

Page 7: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.7 -

Comunicación humana (I)

• Se busca una comunicación eficiente entre el programador y el ordenador

• Un buen nivel de comunicación se da cuando los programas son leíbles– No ha de ser necesaria una documentación

externa al programa (minimizar)

– Es más importante que un programa sea leíble que escribible

• Un programa se escribe una vez, pero se lee muchas durante su depuración, documentación y mantenimiento.

• Tendencia actual a separar la interfaz de la implementación de un módulo

– La sintaxis ha de reflejar la semántica• Reducir las manipulaciones implícitas

– Coerciones (coerciones de PL/I o C)

– ON de BASIC para eventos o excepciones

– Constructores y destructores de C++ (necesarios, pero complican el seguimiento del flujo de ejecución)

Page 8: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.8 -

Comunicación humana (II)

– El lenguaje ha de representar los patrones de pensamiento humanos

• No hay que crear una sintaxis pensada exclusivamente para

– un modelo de cómputo teórico (-calculus)

– un conjunto de instrucciones de la máquina

– facilitar la compilación (forth)

– El programador no es un ordenador• Que el compilador entienda una estructura

es posible que el programador no– Evitar incluso la posibilidad de escribirlas

– Reducir el conocimiento contextual

– El programador no funciona con una pila como el programa compilado.

Page 9: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.9 -

Prevención y detección de errores

• El programador comete errores– Hay que prevenir los errores

• El programador es su fuente– El programador no sabe lo que hace y el

compilador ha de limitar sus acciones (EUCLID, PASCAL)

– Hacer imposible cierto tipo de errores• Ejecutar datos -> control de flujo limitado

• Errores en el uso de datos -> Tipado fuerte

• Apuntadores erróneos -> Gestión de memoria implícita (LISP, PROLOG, ML, etc).

– Hay que facilitar su detección, identificación y corrección

• Redundancia– Tener que declarar antes de utilizar.

– Evitar coerciones inductoras de errores• float a int por su perdida de precisión

• Comprobaciones en tiempo de ejecución– Indice de array fuera de limites

– Control sobre los apuntadores a NULL

Page 10: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.10 -

Lenguaje Utilizable y Efectivo

• Un lenguaje ha de ser fácil de utilizar– Un lenguaje ha de ser fácil de aprender y

recordar• Evitar la necesidad de consultar el manual

(C++ no cumple)

• Lenguaje simple (C++ no cumple)

• Aprendizaje incremental (PROLOG no cumple, LISP si cumple)

– El comportamiento del lenguaje ha de ser predecible

• el uso de void* de C++ es incomprensible

• Efectividad– Los detalles de implementación no han de

oscurecer las intenciones del programador• Soportar abstracción

• Modularidad: Separar especificación de implementación

– Los Efectos de un cambio han de quedar localizados

– Evitar los trucos (programas ilegible)

Page 11: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.11 -

Otras filosofías de diseño

• Compilabilidad– Se ha de poder compilar programa en un

tiempo reducido

– Se ha de poder depurar o aplicar otras herramientas de análisis

• Eficiencia: La ejecución ha de ser rápida

• Independencia de la máquina

• Simplicidad

• Uniformidad: lenguaje predecible

• Ortogonalidad– Todas las características del lenguaje se

han de poder combinar

• Generalización y especialización– La generalización dice que algo similar

también es correcto, pero es difícil de implementar

– Hay que especializar para facilitar la implementación sin perder la utilidad del lenguaje

Page 12: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.12 -

Diseño Detallado

• Microestructura

• Estructura de las expresiones

• Estructuras de datos

• Estructuras de control

• Estructura de compilación

• Estructura de la entrada/salida

Page 13: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.13 -

Reducción del Tamaño

Page 14: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.14 -

Pragmatismo

Page 15: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.15 -

Ejemplos: Lenguajes de Programación y su Diseño

• El lenguaje C– Aplicación: programación de sistemas

– Programador: experto

– Sacar el mayor rendimiento posible del ordenador

• PASCAL– Aplicación: docencia

– Programador: inexperto

• LISP– Aplicación: procesamiento simbólico

– Desarrollo rápido

• PROLOG– Aplicación: procesamiento simbólico

– Programación lógica

– Desarrollo rápido

Page 16: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.16 -

El Lenguaje C (I)

• Lenguaje pensado para el desarrollo de sistemas operativos (unix)– Rendimiento/velocidad de ejecución

– Programador experto

– Código compacto

• Redimiento/Velocidad de ejecución– Operaciones básicas simples

– Apuntadores• uso para los strings y arrays

• Estructuras de datos referenciadas por apuntadores (paso por referencia explícito)

– Gestión de memoria explícita

– En las primeras versiones las funciones solo retornan datos que puedan ir en un registro del procesador

– Optimización explícita• Incremento y decremento

• Operaciones con asignación incluida

• variables register

Page 17: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.17 -

El Lenguaje C (II)

– En contra de la velocidad• Cálculos en coma flotante con la máxima

precisión posible

• Programador experto– Amplio uso de coerciones

• Implícitas– char -> int -> double

– double <- int <.- char

– void* -> tipo*, tipo* -> void*

• Explícitas– El programador puede convertir cualquier

tipo de datos en cualquier otro.• int -> void*

– Flujo de ejecución• break y continue

• goto local

• long jump

– Obtención de direcciones• Se puede obtener la dirección de cualquier

variable aunque esta sea local

Page 18: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.18 -

El Lenguaje C (III)

– Prioridades de operadores complejas• Casi cualquier combinación de operadores

es aceptada por el compilador

• Otras cuestiones– Falta de un método por defecto para la

gestión de excepciones• Códigos de error retornados por las

funciones de la librería que continuamente ha de verificar el programa

– Faltan comentarios de una línea

– Palabras clave con diferentes significados según el contexto

• static

– Semántica ambigua• Incrementos en una expresión

– Métodos para la escritura de programas transportables soportados por el programador

• Compilación condicional

• sizeof

Page 19: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.19 -

El Lenguaje C (IV)

– Sintaxis de los comentarios confundible (A=b/*p)

• Código compacto– La mayor parte de las instrucciones se

traducen a unas pocas instrucciones de código máquina

– Faltan instrucciones de alto nivel• Strings

– Tratamiento por apuntadores

– Gestión explicita de la memoria

– Considerar continuamente si la reserva de memoria es suficiente

• No hay copia de datos compuestos– Asignación array a array

Page 20: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.20 -

PASCAL

• Docencia– Estructura muy rígida de los programas

– Un buen nivel de abstracción

– Transportable

– Lenguaje simplificado• Falta de módulos y librerías

• Librería básica muy limitada

– Escritura farragosa de los programas

– Minimización del uso de coerciones• Todo lo que hace el programa se indica

explícitamente

– Pensado para la resolución de problemas por subdivisión

• Definiciones anidables de funciones y procedimientos

– Tipado fuerte

Page 21: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.21 -

LISP

• Sintaxis demasiado simple– Difícil escritura y lectura de los programas

• Comprobaciones semánticas en tiempo de ejecución– Variables declaradas

– Tipos de datos

• Enfoque pragmático– Programación imperativa y funcional

• Orientado a optimizar el desarrollo frente a la velocidad de ejecución– Gestión de memoria implícita

– Uso de listas para todo

– Amplia librería de funciones

• Diseño por etapas– Funciones repetidas

• setq y setf

– Parches para mantener compatibilidad• forma de creación de los places

Page 22: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.22 -

PROLOG

• Programación declarativa y lógica

• Implementación del cálculo de predicados– Faltan funciones (-prolog)

• Difícil modularidad

– Un método de programación demasiado alejado de la programación habitual

– Gramática de operadores extensible

– Totalmente transportable

– Modulariza las búsquedas• Convierte los bucles de una búsqueda en

una secuencia lineal de aplicación de predicados

Page 23: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.23 -

C++

• Orientación a objeto de C– Mantener la compatibilidad con C

• Uso masivo de apuntadores

• Tratamiento de excepciones no soportado por las librerías estándar

– Rendimiento• Complica el lenguaje

– Static en métodos

– Métodos virtuales y no virtuales

– Templates

• Destructores por gestión de memoria explícita

• Apuntadores y referencias

• Otros– comentarios de una línea fáciles de escribir

y leer (repetición de //)

– Implementación parcial de las coerciones

Page 24: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.24 -

ADA

• Lenguaje pensado para grandes proyectos de software– Facilitar el uso de librerías

• Interfaz separa de la implementación del módulo

• Control exhaustivo sobre la interfaz

– Fácil lectura y detección de posibles bugs• Sintaxis de las instrucciones de control de

flujo con marcadores claros de inicio y fin (If then else end if)

• Etiquetas visibles <<etiqueta>>

• Coerciones explicitas

– Reducción de los errores• Definición de excepciones para controlar

errores de ejecución– Acceso a array fuera de rango

– Un case del que no se selecciona ninguna opción

• Atributos asociados a las variables: – un array tiene asociado el atributo de su

tamaño

Page 25: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.25 -

Opciones en el Diseño (I)

• Sintaxis de control de flujo– Instrucción compuesta

• C, PASCAL (for (;;) ; {...}

– Instrucciones de control de flujo con claros marcadores de inicio y fin

• ADA

– Instrucción vacía• Explicita ADA (null)

• Implícita C, PASCAL (; o nada)

• Lenguaje orientado a – Instrucción: ADA, PASCAL

– Expresión: C, funcionales

• Marcadores de las estructuras sintácticas– Si: PASCAL, ADA

– No: C, C++

• Expresiones– Riqueza de operadores C, C++

– Pobreza de operadores PASCAL, ADA

Page 26: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.26 -

Opciones en el Diseño (II)

• Sistema de tipos– No tipado: LISP, BASIC

– Tipado: C, PASCAL, ADA, etc.

• Código genérico– Datos marcados con su tipo en ejecución

– Tipos paramétricos

– templates

• Gestión de memoria– Explicita: C, PASCAL, ADA

• Velocidad

– Implícita: LISP, PROLOG, Java, funcionales

• Simplicidad

• Gestión de errores de ejecución– Responsabilidad del programador: C, C++

– Responsabilidad del lenguaje ADA

– Excepciones sin declarar C++

– Excepciones declaradas Java

Page 27: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.27 -

Opciones en el Diseño (III)

• Estructura declaraciones– Rígida: PASCAL, ADA

– Poco rígida: C

– Libre: C++

• Ámbitos– Expresión LISP

– Instrucción compuesta C, C++, Java

– Función C, C++, PASCAL, ADA

– Espacios de nombres

– Clases

– Paquetes

– Módulos

• Coerciones– Explicitas: ADA

– Pocas implícitas: PASCAL

– Muchas implícitas: C, C++

Page 28: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.28 -

• Lección 5. CARACTERÍSTICAS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN. Valores. Almacenamiento. Ligaduras. Abstracción.

Page 29: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.29 -

• Lección 6. SISTEMAS DE TIPOS Y LENGUAJES IMPERATIVOS. Monomorfismo. Polimorfismo. Tipos Paramétricos. Inferencia de Tipos. Coerciones. Subtipos. Flujos de control. Excepciones.

Page 30: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.30 -

• Lección 7. ENCAPSULACIÓN Y PARADIGMAS DE OBJETOS. PROGRAMACIÓN FUNCIONAL Y PROGRAMACIÓN LÓGICA. Tipos abstractos. Objetos. Clases. Herencia. Funciones. Pattern matching. Valores y tipos. Funcionales. Programación lógica. Cláusulas, relaciones y términos. Concepto de mundo cerrado.

Page 31: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.31 -

• Lección 8. CONCURRENCIA. ENTRADA, SALIDA Y FICHEROS. Paradigmas concurrentes de alto nivel (Rendezvous). Entrada / salida incluida en las primitivas del lenguaje o en bibliotecas de funciones. Tipos de datos y la entrada / salida. Conceptos de entrada / salida en un lenguaje. Ejemplos: Pascal, C, C++.

Page 32: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.32 -

Page 33: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.33 -

• Lección 3. OBJETIVOS Y FILOSOFÍAS DE DISEÑO. Consideraciones preliminares. Fuente de ideas. Comunicación humana. Prevención y detección de errores. Utilizabilidad. Programación efectiva. Compilabilidad. Eficiencia. Independencia del hardware. Simplicidad. Uniformidad. Ortogonalidad.

Page 34: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.34 -

• Lección 4. CONSIDERACIONES PRACTICAS. Generalización y especialización. Reducción de tamaño. Pragmatismo. Metodología.

Page 35: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.35 -

• Lección 5. CARACTERÍSTICAS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN. Valores. Almacenamiento. Ligaduras. Abstracción.

Page 36: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.36 -

• Lección 6. SISTEMAS DE TIPOS Y LENGUAJES IMPERATIVOS. Monomorfismo. Polimorfismo. Tipos Paramétricos. Inferencia de Tipos. Coerciones. Subtipos. Flujos de control. Excepciones.

Page 37: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.37 -

• Lección 7. ENCAPSULACIÓN Y PARADIGMAS DE OBJETOS. PROGRAMACIÓN FUNCIONAL Y PROGRAMACIÓN LÓGICA. Tipos abstractos. Objetos. Clases. Herencia. Funciones. Pattern matching. Valores y tipos. Funcionales. Programación lógica. Cláusulas, relaciones y términos. Concepto de mundo cerrado.

Page 38: TEMA 2. DISEÑO Y PARADIGMAS DE LOS LENGUAJES DE PROGRAMACIÓN.

Compiladores I (04/19/23 18:32) - 2.38 -

• Lección 8. CONCURRENCIA. ENTRADA, SALIDA Y FICHEROS. Paradigmas concurrentes de alto nivel (Rendezvous). Entrada / salida incluida en las primitivas del lenguaje o en bibliotecas de funciones. Tipos de datos y la entrada / salida. Conceptos de entrada / salida en un lenguaje. Ejemplos: Pascal, C, C++.

• Lección 5. CARACTERÍSTICAS GENERALES DE LOS LENGUAJES DE PROGRAMACIÓN. Valores. Almacenamiento. Ligaduras. Abstracción.