Download Chapter 1

Document related concepts

Programación funcional wikipedia , lookup

Lisp wikipedia , lookup

Rust (lenguaje de programación) wikipedia , lookup

Common Lisp wikipedia , lookup

Dylan (lenguaje de programación) wikipedia , lookup

Transcript
Agenda
• Razones para estudiar conceptos de
Lenguajes de Programación
• Dominios de programación
• Criterios de evaluación de un lenguaje
• Influencias en el diseño de lenguajes
• Categorías de lenguajes
• Compromisos en diseño de lenguajes
• Métodos de implementación
• Ambientes de programación
1-1
Razones para estudiar lenguajes
de programación
• Incrementa la habilidad para expresar
ideas
• Mejora el conocimiento para escoger el
lenguaje apropiado
• Incrementa la habilidad de aprender
nuevos lenguajes
• Mejor entendimiento de de la
importancia de la implementación
1-2
Dominios de programación
• Aplicaciones científicas
– Grandes cantidad de operaciones de punto flotante
– Fortran
• Aplicaciones de negocios
– Producir reportes, uso de números decimales y caracteres
– COBOL
• Inteligencia artificial
– Manipular símbolos en lugar de números
– LISP
• Programas de sistema
– Se necesita eficiencia por su continuo uso
– C
• Web
– Colección ecléctica de lenguajes: markup (i.e., XHTML),
scripting (i.e., PHP), propósito general (i.e., Java)
1-3
Criterios de evaluación de un Lenguaje
• Legibilidad (readability): la facilidad
con que los programas pueden ser
leidos y entendidos
• Facilidad de escritura (writability):
la facilidad con que un lenguaje puede
ser usado para crear programas
• Fiabilidad (reliability): conformidad
con sus especificaciones
• Costo: el costo total
1-4
Criterios de evaluación: Legibilidad
• Simplicidad
–
–
–
Un conjunto manejable de características y construcciones
Pocas características de multiplicidad (formas de realizar una
misma operación)
Sobre carga mínima de operadores
• Ortogonalidad
–
–
Un conjunto pequeño de construcciones primitivas puede ser
combinado en un número relativamente pequeño de maneras
Cada combinación posible es legal
• Sentencias de control
–
La presencia de estructuras de control bien conocidas (i.e.,
setencia while)
• Tipos de datos y estructuras
–
La posibilidad de defnir estructuras de datos
• Consideraciones de sintaxis
–
–
–
Formas de identifiadores: composición flexible
Palabras especiales y métodos para crear sentencias
compuestas
Forma y significado: construcciones auto-descriptivas,
palabras clave con significado
1-5
Criterios de evaluación: Facilidad de escritura
• Simplicidad y ortogonalidad
– Pocos contructores, un pequeño número de
primitivas, y un conjunto pequeño de reglas
para combinarlas
• Soporte de abstracción
– La habiliad para definir y usar estructuras
complejas u operaciones de tal forma que
permita igonorar detalles
• Expresividad
– Un conjunto conveniente de maneras para
especificar operaciones
– Ejemplo: la inclusión de “for” en muchos
lenguajes modernos
1-6
Criterio de evaluación: Confiabilidad
• Verificación de tipos
• Manejo de excepciones
– Interceptar errores en tiempo de ejecución y tomar
medidas correctivas
• Aliasing
– Presencia de dos o más métodos distintos para
refererirse a la misma localidad de memoria
• Legibilidad y facilidad de escritura
– Un lenguaje que no soporte una manera “natural” de
expresar algoritmos, usará necesariamente enfoques
“no naturales” y por lo tanto reducirá su confiabilidad.
1-7
Criterios de evaluación: Costo
• Entrenamiento de programadores para
usar el lenguaje
• Escritura de programas (similitud con
aplicaciones particulares)
• Compilación de programas
• Ejecución de programas
• Sistema de implementación del lenguaje:
disponibilidad de compiladores libres
• Legibilidad: poca legibilidad conduce a
altos costos
• Mantenimiento de programas
1-8
Criterios de evaluación: Otros
• Portabilidad
– La facilidad con que los programas pueden ser
movidos de una implementación a otra
• Generalidad
– La aplicabilidad a una gran cantidad de
aplicaciones
• Bien-definido
– La precisión y completez de la definición oficial
del lenguaje
1-9
Influencias en el diseño del lenguaje
• Arquitecturas de computadoras
– Los lenguajes son desarrollados al rededor de
la arquitectura de computadora prevalente,
conocida como la arquitectura de von
Neumann
• Metodologías de programación
– Nuevas metodologías de desarrollo de
software (i.e., orientado a objetos) conduce a
nuevos paradigmas y por extensión, nuevos
lenguajes de programación
1-10
Influencia de arquitectura de computadoras
• Los lenguajes imperativos son los más
dominantes
–
–
–
–
Datos y programas almacenados en la memoria
La memoria está separada del CPU
Instrucciones y datos se conectan de la memoria al CPU
Bases para lenguajes imperativos
• Celdillas de memoria - variables
• Sentencias de asignación
• La iteración es eficiente
1-11
La arquitectura von Neumann
1-12
Influencias de metodologías de programación
• 1950s y principos de 1960s: aplicaciones
simples; se preocupaban por la eficiencia de la
máquina
• Finales de 1960s: La eficiencia de las personas
comenzó a ser importante; legibilidad y mejores
estructras de control
– Programación estructructurada
– Diseño top-down y perfeccionamiento paso-a-paso
• Finales de 1970s: de orientación-a-procesos a
orientación-a-datos
– Abstracción de datos
• Mediados de 1980s: Programación orientada a
objetos
– Abstracción de datos + herencia + polimorfismo
1-13
Categorías de lenguajes
• Imperativas
– Se centra en variables, sentencias de asignación e iteración
– Ejemplos: C, Pascal
• Funcional
– La forma principal de computar es mediante la aplicación de
funciones a los parámetros dados
– Ejemplos: LISP, Scheme
• Logic
– Basado-en-reglas (las reglas están especificadas sin un orden
en particular)
– Ejemplo: Prolog
• Object-oriented
– Abstracción de datos, herencia, vinculación tardía
– Ejemplos: Smalltalk, C++
• Markup
– Nuevos; no es un paradigma per se, pero se usa para
especificar el diseño de información en documentos web
– Ejemplos: XHTML, XML
1-14
Compromisos en el diseño de lenguajes
• confiabilidad vs. costo de ejecución
– java demanda que todas las referencias a elementos de
un array sean verificadas (indexado apropiado) pero
esto conduce a un incremento en los costos de
ejecución
• Legibilidad vs. facilidad de escritura
– APL provee muchos operadores poderosos ( y un gran
número de nuevos símbolos), permitiendo escribir
procedimientos complejos en un programa compacto a
cambio de un costo empobrecer su legibilidad
• Facilidad de escritura (flexibilidad) vs.
confiabilidad
– Los punteros en C/C++ son muy poderosos y flexibles,
pero no son confiables
1-15
Métodos de implementación
• Compiladores
– Los programas son traducidos a
lenguaje máquina
• Interpretes puros
– Los programas son interpretados por
otro programa conocido como
interprete
• Sistemas de implementación híbrida
– Un compromiso entre compiladores e
intérpretes puros
1-16
Vista en capas de una computadora
El sistema operativo y
la implementación del
lenguaje están
ordenados en capas
sobre la interfaz
máquina de una
computadora
1-17
Compilación
• Traducir programas de alto-nivel (lenguaje
fuente) a código máquina (lenguaje máquina)
• Traducción lenta, ejecución rápida
• El proceso de compilación tiene varias fases:
– Análisis léxico: convierte caracteres del código fuente
en unidades léxicas
– Análiss sintáctico: transforma las unidades léxicas en
árboles parse que representan la estructura sintáctica
del programa
– Análisis de la semántica: genera código intermedio
– Generación de código: el código máquina es generado
1-18
El proceso de compilación
1-19
Terminología adicional de compilación
• Carga de módulos (imagen ejecutable):
código de sistema y de usuario junto
• Linking y carga: el proceso de juntar
programas del sistema y ligarlos a los
programas del usuario
1-20
Ejecución de código máquina
• Fetch-execute-cycle (en una arquitectura
von Neumann)
initialize the program counter
repeat forever
fetch the instruction pointed by the counter
increment the counter
decode the instruction
execute the instruction
end repeat
1-21
Cuello de botella de Von Neumann
• La velocidad de conexión entre la
memoria y el procesador de una
computadora, determina su
• Las instrucciones a menudo se puede
ejecutar mucho más rápidamente que la
velocidad de conexión, lo que produce un
cuello de botella
• Conocido como el cuello de botella de
von Neumann; es el factor limitante
primario en la velociad de una
computadora
1-22
Interpretación pura
• No hay traducción
• Fácil implementación de programas
(errores en tiempo de ejecución puede ser
fácil e inmediatamente mostrados)
• Ejecución más lenta (10 a 100 veces más
lenta que programas compilados)
• A menudo requiere más espacio
• Son raros en lenguajes de alto nivel
• Se han puesto de moda con algunos
lenguajes scrípticos para Web(i.e.,
JavaScript)
1-23
Proceso de interpretación pura
1-24
Hybrid Implementation Systems
• Un compromiso entre compiladores e
interpretes puros
• Un programa en un lenguaje de alto nivel
es traducido a un lenguaje intermedio
para facilitar su interpretación
• Más rápido que una interpretación pura
• Ejemplos
– Los programas en Perl programs son parcialmente
compilados para detectar errores antes de su
interpretación
– Implementaciones iniciales de java eran híbridos; se
precompilaba el código para traducirse a byte-code, y
posteriormente ejecutarse en la llamada Java virtual
machine
1-25
Hybrid Implementation Process
1-26
Sistemas de implementación Justo-en-Tiempo
• Inicialmente trasladan el programa a un
lenguaje intermedio
• Posteriormente, compilan el lenguaje
intermedio en código máquina
• El código máquina es guardado para
llamadas subsecuentes
• Sistemas JIT son ampliamente usados por
programas java
• Los lenguajes .NET están implementados
con un sistema JIT
1-27
Preprocesadores
• Las macros del preprocesador
(instructions) son comumente usadas para
especificar qué código de otro archivo
será incluido
• Un preprocesador procesa un programa
justo antes de que el programa sea
compilado para expandir las macros
empotradas del preprocesador
• Un bien conocido ejemplo: C preprocessor
– expands #include, #define, and similar
macros
1-28
Ambientes de programación
• La colección de herramientas usadas para el
desarrollo de software
• Emacs
• VI
• Scite
1-29
Resumen
• El estudio de los lenguajes de programación es
valioso por diversas razones:
– Incrementa nuestra capacidad para usar diferentes
construcciones
– Nos permite seleccionar lenguajes más inteligentemente
– Nos permite aprender lenguajes más fácilmente
• Los criterios más importantes para evaluar
lenguajes de programación son:
– legibilidad, facilidad de escritura, confiabilidad, costo
• Las mayores influencias en el diseño de lenguajes
se deben a la arquitectura de la computadora y a
las metodologías de desarrollo de software
• Los métodos más importantes en la
implementación de lenguajes de programación
son: compilación, interpretación pura e
implementación híbrida
1-30