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