Conceptos de Lenguajes de Programación
Transcript of Conceptos de Lenguajes de Programación
Conceptos de Lenguajes
de Programación
Diseño y Paradigmas de Lenguajes
Guía de Estudio correspondiente a la Teoría 1
Departamento de Informática
Facultad de Cs. Fco. Matemáticas y Naturales
Universidad Nacional de San Luis
Año 2021
San Luis - Argentina
Bibliografía utilizada
“Concepts of Programming Languages” Robert W. Sebesta, Edición 12, Pearson, 2019
Págs 33 a la 79 y 89
“Programming Languages. Design and Implementation” Terrence W. Pratt & Marvin V. Zelkowitz, Edición 4, Prentice Hall, 2001.
Págs 45 a la 51 y
61 a la 65
Estudio de los Lenguajes de
Programación
Importancia:
Incrementa nuestra habilidad para expresar ideas.
Nos permite elegir los lenguajes para los proyectos de manera más inteligente.
Hace el aprendizaje de nuevos lenguajes, más fácil.
Mejor comprensión de la importancia de la implementación: porqué el lenguaje fue diseñado así?
Un mejor uso de los lenguajes que ya se conocen.
Visión global de los avances en computación.
Dominios de Programación
Los programas son usados en una amplia variedad de dominios de resolución de problemas.
El diseño y evaluación de un lenguaje particular es altamente dependiente del dominio en el cual es usado.
• Aplicaciones Científicas – Gran cantidad de computaciones con
números de punto flotante, uso de arreglos ---Fortran, ALGOL 60
• Aplicaciones de Negocios - Producir reportes, usar números
decimales, caracteres ---COBOL, RPG
• Inteligencia Artificial - Símbolos son manipulados más que números;
uso de listas vinculadas ---LISP, Prolog, Scheme
• Web Software – Lenguajes desde markup ( XHTML) a scripting para
propósito general ---Java, PHP, JavaScript
Criterios de Evaluación de
Lenguajes
Legibilidad (Readability): facilidad con la cual los programaspueden ser leídos y entendidos
Simplicidad (pocas formas de hacer lo mismo, sin sobrecarga), ortogonalidad (pocas construcciones y combinables), posibilidad de definición de datos, sintaxis adecuada
Facilidad de Escritura (Writability): facilidad con la cual un lenguaje puede ser usado para crear programas
Simplicidad, ortogonalidad (pocas construcciones y combinables), expresividad (lo que se lee es lo que realmentehace la instrucción)
Confiabilidad (Reliability) : conformidad con las especificaciones, es decir, hace lo que dice que hace
Chequeo de tipos, manejo de excepciones, alias restringidos, legibilidad y escritura
Criterios de Evaluación de
Lenguajes
Costo: costo total
Entrenamiento para aprender (relacionado a la simplicidad y
ortogonalidad)
Entrenamiento para uso (relacionado a escritura)
Ejecución (chequeo de tipos, tiempo de ejecución, recursos)
Otros: portabilidad, licencias, etc.
Criterios de Evaluación de
Lenguajes
Tabla 1.1 extraída de “Concepts of Programming Languages” Robert W.
Sebesta, Edición 12 Pearson, 2019
Criterios de Evaluación: Legibilidad
Características que contribuyen:
Simplicidad (general)
• Un conjunto manejable de características y construcciones
• Características de multiplicidad mínimas – Ejemplo: count++ en Java
• Sobrecarga de operadores mínima – Ejemplo: símbolo +
Ortogonalidad
• Conjunto relativamente pequeño de construcciones
primitivas; puede ser combinado en un número
relativamente pequeño de formas donde toda combinación
posible es legal. Es decir, hay pocas excepciones sobre lo
que se puede hacer
Criterios de Evaluación: Legibilidad
Tipos de Datos
• Adecuados tipos de datos predefinidos
Ejemplo: tipos numéricos vs. Boolean para variables
• Estructuras adecuadas
Ejemplo: arreglos
• Estructuras de datos definidas por el programador
Ejemplo: registros
Consideraciones de Sintaxis
• Formas de los identificadores: composición flexible
• Palabras especiales
• Forma y significado
Criterios de Evaluación: Escritura
Difiere de acuerdo al dominio para el cual se diseña el
lenguaje
Simplicidad y ortogonalidad
• Es mejor tener un número pequeño de construcciones
bien definidas, un número pequeño de primitivas, y un
conjunto consistente de reglas para combinarlas.
Criterios de Evaluación: Escritura
Soporte para abstracción
• Habilidad para definir y usar estructuras complejas u
operaciones de manera que permitan ignorar los
detalles.
Ejemplo: Codificación de árboles binarios en Fortran 77 el cual no
tiene punteros ni asignación dinámica de memoria
Expresividad
• Un conjunto de formas relativamente convenientes de especificar operaciones
--count++
--for loops
Criterios de Evaluación: Confiabilidad
Chequeo de tipos
Manejo de excepciones
Alias restringidos
Legibilidad y Facilidad de escritura
Componentes Fundamentales
de una Computadora
Una computadora es un conjunto integrado de algoritmos y estructuras de datos,
capaz de almacenar y ejecutar programas.
• Datos
• Operaciones Primitivas
• Control de Secuencia
• Acceso a Datos
• Gestión de Almacenamiento
• Entorno de Operación
Influencias sobre el Diseño de
Lenguajes
Arquitecturas de Computadoras
El modelo más usado en los lenguajes de los años 60
es el de von Neumann (lenguajes imperativos) en donde
datos y programas están almacenados en la misma
memoria y CPU ejecuta instrucciones.
La Arquitectura von Neumann
Fetch-execute-cycle (ejecución de código de máquina)
initialize the program counter
repeat forever
fetch the instruction pointed by the counter
increment the counter
decode the instruction
execute the instruction
store the result
end repeat
La Arquitectura von Neumann
La velocidad de
conexión entre la
memoria de una
computadora y su
procesador determina
la velocidad de la
misma.
Las instrucciones de
programa a menudo
pueden ser ejecutadas
mucho más rápido
que la velocidad de
conexión; esto da
lugar a cuello de
botella.
Se sabe que los
cuellos de botella en
esta arquitectura son
el factor principal que
afecta la velocidad.
Figura 1.1 extraída de “Concepts of Programming Languages” Robert W.
Sebesta, Edición 12, Pearson, 2019
Métodos de Implementación
Compilación
Los programas son traducidos a lenguaje de máquina (C,
COBOL, Pascal, C++)
Interpretación Pura
Los programas son ejecutados por otros programas que se
denominan intérpretes (‘60 a ‘80 APL, SNOBOL, Lisp.
Actualmente JavaScript y PHP)
Sistema de Implementación Híbridos
Una combinación entre compiladores e intérpretes (PERL, Java)
Etapas usuales de Traducción
Preprocesador
Compilador
Ensamblador (linking module)
Cargador (loading module)
Etapas usuales de Traducción
• Preprocesador: procesa un programa
inmediatamente antes que el programa sea
compilado, para eliminar comentarios, expandir
macros embebidas, etc.
Ejemplo: el preprocesador C, expande #include,
#define, y macros similares.
• Compilador: es un traductor, cuyo lenguaje fuente
es un lenguaje de alto nivel y el lenguaje
resultante se aproxima al (o es) lenguaje de
máquina de una computadora real.
• Ensamblador: se ocupa de conectar el programa
del usuario generado por el compilador con los
programas del sistema para que puedan ser
ejecutados (direcciones de memoria en las
invocaciones).
• Cargador: se encarga de construir el programa
ejecutable añadiendo al programa objeto, los
encabezados y las funciones de librería utilizadas
por el programa fuente.
Etapas usuales de Traducción
Programa Fuente Preprocesador
Compilador
Ensamblador
Cargador
Programa Fuente
estándar
Código Objeto
Código Máquina
Ejecutable
Gráficamente
Interpretación Pura
• Ventaja: facilidad en el
debugging
• Desventajas: 10 a 100
más bajo el tiempo de
ejecución. A menudo
requiere más espacio
• Reaparición significativa
con algunos lenguajes
Web scripting (JavaScript,
PHP)
Figura 1.4 extraída de “Concepts of Programming
Languages” Robert W. Sebesta, Edición 12, Pearson, 2019
Comparación
Intérprete Compilador
Velocidad de ejecución BAJA ALTA
Tamaño del programa
ejecutable
CHICO GRANDE
Información durante
ejecución
MUCHA POCA
Confiabilidad BAJA ALTA
Implementación Híbrida
Figura 1.5 extraída de “Concepts of Programming
Languages” Robert W. Sebesta, Edición 12, Pearson, 2019
Programa en C
Máquina virtual de C
ADD #1, AX
MOV BX, 300
010111011
Oculta las operaciones
y estructuras de bajo
nivel
Son las estructuras de datos y algoritmos de un lenguaje que se
emplean durante el tiempo de ejecución de un programa.
• Las estructuras de datos en tiempo de ejecución y los
algoritmos utilizados para la ejecución del programa
definen una computadora, dicha computadora se
denomina computadora virtual.
• El lenguaje de máquina de esta computadora virtual es
el programa ejecutable producido por el traductor del
lenguaje.
Ligadura y Tiempo de Ligadura
Una ligadura es una asociación entre un atributo (característica o propiedad) y una entidad (elemento de programa), tal como entre una variable y su tipo o valor, o entre una operación y un símbolo.
El momento en que una ligadura se lleva a cabo se denomina tiempo de ligadura.
Tiempos de Ligadura
Tiempo de ejecución: por ej, la ligadura de
variables a sus valores, de variables a ubicaciones
de memoria.
• A la entrada de un subprograma o bloque: por
ej. en C y Pascal la ligadura de parámetros
actuales a los parámetros formales se realiza al
entrar a los subprogramas.
• En un punto arbitrario: el ejemplo más
importante es, la ligadura de variables a
valores a través de la asignación.
Tiempos de Ligadura
Tiempo de traducción
• Elegidas por el programador, por ej. nombres y tipos
de las variables.
• Elegidas por el traductor, por ej. cómo se almacenan
los descriptores de arreglos.
• Elegidas por el cargador, por ej. elementos de
programas a direcciones específicas.
Tiempos de Ligadura
Tiempo de implementación del lenguaje: por ej. la
representación de los números y operaciones pueden
depender de la arquitectura.
Tiempo de definición del lenguaje: por ej. las posibles
formas de las sentencias, tipos de estructuras de datos.
Tiempos de ligadura
Ver páginas 61-62 de Programming Languages Design
and Implementation – Terrence Pratt
Paradigmas (Categorías) de Lenguajes
Imperativo
• Características principales: variables, sentencias de asignación e iteración.
• Incluyen scripting y lenguajes visuales.
Ejemplos: C, Pascal, Ada, Visual BASIC .NET
Orientado a Objetos
• Se definen objetos (abstracción) y las operaciones para manipularlos.
Ejemplos: Smalltalk, C++, Java
Funcional
• La forma de realizar cálculos es aplicando funciones a los parámetros dados.
Ejemplos: LISP, Scheme
Logic
• Basado en reglas (las reglas son especificadas en un orden particular).
Ejemplo: Prolog
Programación híbrida
• Lenguajes markup extendidos para soportar “algo” de programación.
Ejemplos: JSTL, XSLT, Combinación de programación lógica y orientada a
objetos, CLOS.
Evolución de los Lenguajes de
Programación
Figura 2.1 extraída de “Concepts of
Programming Languages” Robert W.
Sebesta, Edición 12, Pearson, 2019