Lenguajes de Programación I Prof. Wilmer Pereira Universidad Simón Bolívar Primeros pasos en los lenguajes de alto nivel El primer computador (1940) tenía el poder cálculo de una calculadora actual Primer lenguaje de alto nivel FORTRAN y LISP con traducción directa del lenguaje alto nivel al lenguaje de máquina. ¿Por qué hay tantos lenguajes? Evolución de las instrucciones o primitivas de uso: Ciclos estilo lenguajes ensamblador (goto) Ciclos estructurados (while, repeat) Orientación a objetos Programación concurrente ... Especificidad en función a la aplicación a programar: C como lenguajes cercano al bajo nivel LISP para manipulación de símbolos Prolog para aplicaciones con relaciones lógicas en la data Preferencias personales: Recursión vs iteración Apuntadores o no ... ¿Qué hace a un lenguaje exitoso? Poder expresivo: aunque todos tienen el poder de computo de una Máquina de Turing ... hasta el lenguaje ensamblador Facilidad de uso para los novatos: LOGO es intencionalmente sencillo Para algunos BASIC y PASCAL también lo son ... Estandarización: Aunque los diferentes desarrolladores agregan ciertas características casi todos respetan el mínimo del estandar. Código abierto: Casi todos los lenguajes tiene al menos un compilador o interpretador Buenos compiladores: FORTRAN es reconocido en este aspecto Apadrinamiento: ADA por ejemplo fue impuldado, sin mucho, exito por el departamento de defensa. En cambio JAVA tuvo exito siendo una propuesta de una compañía privada ... Tipos de Lenguajes ... Inicialmente Inicialmentese seanteponen anteponenlos losdeclarativos declarativosvs vslos losimperativos. imperativos. Los Losdeclarativos declarativosse seconsideran considerande demás másalto altonivel nivel… … … …pero perolos losimperativos imperativosofrecen ofrecen mejor mejorrendimiento rendimiento Imperativos dan énfasis al como: – Estructurados bajo el modelo Von Neumann (C) – Orientados a Objetos inspirados en simula (JAVA) – Orientados a Strings con énfasis en prototipado rápido (PERL) Declarativos se centran en el que: – Funcionales inspirado en lambda cálculo (HASKELL) – Lógicos provenientes del cálculo de predicado simplificado (PROLOG) – Flujos de datos inherentemente concurrente (VAL) También están lenguajes paralelos o concurrente vs los secuenciales. que son independiente de la clasificación anterior En muchos casos se estila tener librerías que permiten desarollar aplicaciones concurrentes en lenguajes secuenciales También depende de la arquitectura (Cluster, Grid, ...) Máximo común divisor ... PROLOG: mcd(A,B,X) :- A @> B, C is A - B, mcd(C,B,X). mcd(A,B,X) :- B @> A, C is B - A, mcd(A,C,X). mcd(A,A,A). HASKELL: mcd mcd | | | C: :: Int -> a b (a == b) (a > b) otherwise Int -> Int = a = mcd (a-b) b = mcd a (b-a) #include <stdio.h> #include <stdlib.h> int gcd (int a, int b) { printf("El MCD de a = %d y b = %d es ",a,b); while (a!=b)if (a>b) a=a–b; else b=b-a; printf("%d.\n",a); } main (int argc, char **argv) { gcd(atoi(argv[1]),atoi(argv[2])); } ¿ Por qué estudiar diferentes lenguajes de programación? Entender aspectos obscuros ... herencia múltiple, union, etc. Esto hace más fácil comprenderlo cuando se desean utilizar Saber seleccionar entre diferentes maneras de escribir un proceso o instrucción para generar código más eficiente Hacer uso eficiente de depuradores (debuggers), enlazadores. Saber ciertos detalles permite descubrir errores dificiles. Usar buenas prácticas o funcionalidades en lenguajes que no las ofrecen. Por ejemplo, armar código estructurado en FORTRAN o usar iteradores. Hacer buen uso de la tecnología de lenguajes Filosofías de traducción ... Los Loslenguajes lenguajesde deprogramación programaciónpueden puedenser sercompilados, compilados, interpretados interpretadosoobajo bajoun unparadigma paradigmade demáquina máquinavirtual virtual Compilación pura: – El código fuente es traducido directamente a lenguaje de máquina – El programa objeto opera indepedientemente sobre el procesador – Son más eficiente a cambio de un costo previo de procesamiento Interpretación pura: – La traducción se realiza paso a paso, ejecutandose directamente sobre el procesador – Cada línea es analizada y ejecutada con sus entradas y salidas – Los programas tienen menos velocidad de ejecución pero son más flexible en el diagnóstico Compilación + Interpretación – El código fuente es traducido a una representación intermedia de más bajo nivel – El código intermedio es interpretado por una máquina que ejecuta sobre el procesador – La calidad de la traducción y la expresividad del lenguaje intermedio combinado con la implantación eficiente de la máquina virtual, permite un buen compromiso: velocidad de ejecución y velocidad de desarrollo Compilación ... Código fuente Compilador Entrada Código Objeto Salida Interpretación ... Código fuente Interpretador Entrada Salida Compilación + Interpretación ... Código fuente Compilador Código Intermedio Interpretador Entrada Salida Compilación + Librería + Enlazador ... Código fuente Compilador En un lenguaje puramente compilado, el enlazador resuelve las dependencias estáticamente. En un lenguaje puramente interpretado, el enlazador resuelve las dependencias dinámicamente, agregando las librerías durante la ejecución. Código fuente incompleto Enlazador Librerías Código objeto Preprocesador ... Código fuente Expande macros Preprocesador Enriquece código fuente Elimina código condicionado Código fuente modificado Compilador Código objeto ¿Cómo escribir un compilador del lenguajes con el propio? Niklaus NiklausWirth Wirthadaptó adaptópara paradistribuir distribuirPASCAL PASCAL una unaestrategia estrategiaconocida conocidacomo comobootstrapping bootstrapping BOOTSTRAPPING: En vez de escribir compilador de código fuente a ensamblador, escribir un interpretador que es más sencillo Ahora escribir un compilador del lenguaje X en X Correr el compilador en el intrepretador dandole como entrada el compilador anterior El programa objeto opera indepedientemente sobre el procesador son más eficiente a cambio de un costo previo de procesamiento Técnica de PASCAL: Compilador para PASCAL escrito en PASCAL que genera p-code Compilador para PASCAL traducido en p-code Interpretador de p-code escrito en PASCAL Ahora basta con traducir ese interpretador en un lenguaje local ...