Traductores de lenguajes de programación

  • 654 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
654
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
23
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. traductores de lenguajes de programación Un traductor es cualquier programa que toma como entrada un texto escrito en un lenguaje, llamado fuente y dacomo salida otro texto en un lenguaje, denominado objeto. Existen distintos tipos de traductores, entre ellos destacan: • Ensambladores • Preprocesadores • Intérpretes • CompiladoresLenguaje de Programación: Un lenguaje de programación es un lenguaje que puede ser utilizado para controlar elcomportamiento de una máquina, particularmente unacomputadora. Consiste en un conjunto dereglas sintácticas ysemánticas que definen su estructura y el significado de sus elementos, respectivamente.Aunque muchas veces se usa lenguaje de programación ylenguaje informático como si fuesen sinónimos, no tiene por qué serasí, ya que los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como, por ejemplo, el HTML.Un lenguaje de programación permite a un programadorespecificar de manera precisa: sobre qué datos una computadora debeoperar, cómo deben ser estos almacenados y transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias.Todo esto, a través de un lenguajeque intenta estar relativamente próximo al lenguaje humano o natural.Estos pueden ser “a grosso modo” clasificados de la siguiente manera: • lenguajes de bajo nivel Los lenguajes de bajo nivel son lenguajes de programación que se acercan al funcionamiento de una computadora. Ellenguaje de más bajo nivel es, por excelencia, el lenguaje máquina. A éste le sigue el lenguaje ensamblador, ya que alprogramar en ensamblador se trabajan con los registros dememoria de la computadora de forma directa. • lenguajes de medio nivel Hay lenguajes de programación que son considerados por algunos expertos como lenguajes de medio nivel (como es elcaso del lenguaje C) al tener ciertas características que los acercan a los lenguajes de bajo nivel pero teniendo, al mismotiempo, ciertas cualidades que lo hacen un lenguaje más cercano al humano y, por tanto, de alto nivel. • lenguajes de alto nivel Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajesnaturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como "IF CONTADOR = 10 THENSTOP" pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a 10. Por desgracia para muchas personasesta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguajenatural, lo hacen en realidad de una forma rígida y sistemática.Ensambladores El término ensamblador (del inglés assembler) se refiere a un tipo de programa informático que se encarga detraducir un fichero fuente escrito en un lenguaje ensamblador, a unfichero objeto que contiene código máquina,ejecutable directamente por la máquina para la que se ha generado. El propósito para el que se crearon este tipo de aplicacioneses la de facilitar la escritura de programas, ya que escribir directamente en código binario, que es el único código entendiblepor la computadora, es en la práctica imposible. La evolución de los lenguajes de programación a partir del lenguajeensamblador originó también la evolución de este programa ensamblador hacia lo que se conoce como programacompilador.FuncionamientoEl programa lee el fichero escrito en lenguaje ensamblador y sustituye cada uno de los códigos mnemotécnicos que aparecenpor su código de operación correspondiente en sistema binario.Tipos de ensambladoresPodemos distinguir entre tres tipos de ensambladores: • Ensambladores básicos. Son de muy bajo nivel, y su tarea consiste básicamente en ofrecer nombres simbólicos a las distintas instrucciones, parámetros y cosas tales como los modos de direccionamiento. Además, reconoce una serie de directivas (o meta instrucciones) que indican ciertos parámetros de funcionamiento del ensamblador.Texto extraído de http://traductoresune.blogspot.com
  • 2. • Ensambladores modulares, o macro ensambladores. Descendientes de los ensambladores básicos, fueron muy populares en las décadas de los 50 y los 60, antes de la generalización de los lenguajes de alto nivel. Hacen todo lo que puede hacer un ensamblador, y además proporcionan una serie de directivas para definir e invocar macroinstrucciones (o simplemente, macros). • Ensambladores modulares 32-bits o de alto nivel. Son ensambladores que aparecieron como respuesta a una nueva arquitectura de procesadores de 32 bits, muchos de ellos teniendo compatibilidad hacia atrás pudiendo trabajar con programas con estructuras de 16 bits. Además de realizar la misma tarea que los anteriores, permitiendo también el uso de macros, permiten utilizar estructuras de programación más complejas propias de los lenguajes de alto nivel.Interpretes Interpretes Traduce a lenguaje máquina, cada línea del programa fuente y la ejecuta de inmediato. Traducen en Lenguaje de Alto Nivel a Lenguaje Maquina, se encargan de traducir cada instrucción, una por una(ocada línea de instrucciones) contenida en un programa escrito en cualquier lenguaje de alto nivel a instrucciones en códigobinario, comprensible por las computadoras. Los intérpretes no producen código objeto, por ello la ejecución de un programa requiere forzosamente del códigofuente. Además, los programas en lenguaje interpretado se ejecutan con más lentitud que aquellos en lenguaje compilado. Los intérpretes realizan la traducción y ejecución de forma simultanea, es decir, un intérprete lee el código fuente y lova ejecutando al mismo tiempo.Se pueden utilizar como alternativa a los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programafuente y grabar en forma permanente el código objeto que se produce durante la corrida de compilación para utilizarlo en unacorrida de producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van aprocesar. A continuación, un programa intérprete,almacenado en el sistema operativo del disco, o incluido de manerapermanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vayasiendo necesario durante el proceso de los datos. No se graba el código objeto para utilizarlo posteriormente. La siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje máquina. Porejemplo, durante el procesamiento repetitivo de los pasos de un ciclo, cada instrucción del ciclo tendrá que volver a serinterpretado cada vez que se ejecute el ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se varevisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando acada momento el código completo). El intérprete elimina la necesidad de realizar una corrida de compilación después de cadamodificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objetocompilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante unacorrida de producción. En general, se puede decir que un lenguaje es interpretado si sus instrucciones se ejecutan secuencialmente a partirde código fuente. Para ejecutar el código de un lenguaje interpretado, necesitamos un intérprete de ese lenguaje. Elintérprete irárecibiendo líneas de código que traducirá a lenguaje máquina para que se ejecute. A diferencia de los lenguajes compilados, nose produce un ejecutable. De este modo, de una plataforma a otra, sólo habrá que cambiar el intérprete, no el código.La siguiente figura muestra el funcionamiento de un interprete.Etapas del proceso de interpretación A la hora de construir un intérprete es conveniente utilizar una Representación Interna (RI) dellenguaje fuente a analizar. De esta forma, la organización interna de la mayoría de los intérpretes sedescompone en los módulos: • Traductor a Representación Interna: Toma como entrada el código del programa P en Lenguaje Fuente, lo analiza y lo transforma a la representación interna correspondiente a dicho programa P.Texto extraído de http://traductoresune.blogspot.com
  • 3. • Representación Interna (P/RI): La representación interna debe ser consistente con el programa original. Entre los tipos de representación interna, los árboles sintácticos son los más utilizados y, si las características del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia. • Tabla de símbolos: Durante el proceso de traducción, es conveniente ir creando una tabla con información relativa a los símbolos que aparecen. La información a almacenar en dicha tabla de símbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, información sobre identificadores (nombre, tipo, línea en la que aparecen, etc.) o cualquier otro tipo de información que se necesite en la etapa de evaluación. • Evaluador de Representación Interna: A partir dela Representación Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluación es necesario contemplar la aparición de errores • Tratamiento de errores: Durante el proceso de evaluación pueden aparecer diversos errores como desbordamiento de la pila, divisiones por cero, etc. que el intérprete debe contemplar.Ventajas de la utilización de intérpretes En general, la utilización de compiladores permite construir programas más eficientes que loscorrespondientes interpretados. Esto es debido a que durante la ejecución de código compilado no esnecesario realizar complejos análisis (ya se hicieron en tiempo de compilación), además, un buencompilador es capaz de detectar errores y optimizar el código generado. Los intérpretes, por definición, realizan la fase de análisis y ejecución a la vez, lo cualimposibilita tales optimizaciones. Por esta razón, los sistemas interpretados suelen ser menos eficientesque los compilados. No obstante, los nuevos avances informáticos aumentan la velocidad deprocesamiento y capacidad de memoria de los ordenadores. Actualmente, la eficiencia es un problemamenos grave y muchas veces se prefieren sistemas que permitan un desarrollo rápido de aplicacionesque cumplan fielmente la tarea encomendada.Tipos de intérpretes • Intérpretes puros Son los que analizan y ejecutan sentencia a sentencia todo el programa fuente. Siguen el modelo deinterpretación iterativa y, por tanto, se utilizan principalmente para lenguajes sencillos. Los intérpretes puros se han venido utilizando desde la primera generación de ordenadores alpermitir la ejecución de largos programas en ordenadores de memoria reducida, ya que sólo debíancontener en memoria el intérprete y la sentencia a analizar y ejecutar en cada momento. El principalproblema de este tipo de intérpretes es que si a mitad del programa fuente se producen errores, se debede volver a comenzar el proceso. • Intérpretes avanzados Incorporan un paso previo de análisis de todo el programa fuente. Generando posteriormente unlenguaje intermedio que es ejecutado por ellos mismos. De esta forma en caso de errores sintácticos no pasan de la fase de análisis. Se utilizan paralenguajes más avanzados que los intérpretes puros, ya que permiten realizar un análisis más detalladodel programa fuente (comprobación de tipos, optimización de instrucciones, etc.) • Intérpretes incrementales Existen ciertos lenguajes que, por sus características, no se pueden compilar directamente. La razónes que pueden manejar objetos o funciones que no son conocidos en tiempo de compilación, ya que secrean dinámicamente en tiempo en ejecución. Entre estos lenguajes, pueden considerarseSmalltalk, Lisp o Prolog. Con el propósito de obtener una mayor eficiencia que en la interpretaciónsimple, se diseñancompiladores incrementales. La idea es compilar aquellas partes estáticas delprograma en lenguaje fuente, marcando como dinámicas las que no puedan compilarse. Posteriormente,Texto extraído de http://traductoresune.blogspot.com
  • 4. en tiempo de ejecución, el sistema podrá compilar algunas partes dinámicas o recompilar partesdinámicas que hayan sido modificadas. Estos sistemas no producen un código objeto independiente, sinoque acompañan el sistema que permite compilar módulos en tiempo de ejecución (run time system) alcódigo objeto generado. Normalmente, los compiladores incrementales se utilizan en sistemas interactivos dondeconviven módulos compilados con módulos modificables. • Evaluadores Parciales La utilización de evaluadores parciales o especializadores surge al considerar que muchosprogramas contienen dos tipos de datos de entrada. Existen una serie de datos de entrada que sondiferentes en cada ejecución mientras que otros datos no varían de una ejecución a otra. El primerconjunto, se conoce como datos de entrada dinámicos (se denotará comoDin), mientras que el segundoconjunto, serían los datos de entrada estáticos (Est). Dado un programa P, el proceso de evaluaciónparcial consiste en construir otro programa especializado PEst para los datos estáticos de P. ElprogramaPEst suele estar escrito en el mismo lenguaje fuente que P y se debe garantizar que cuando sele presenten los datos dinámicos produzca los mismos resultados que si se hubiesen presentado todoslos datos al programa P original.Compiladores Es el tipo de traductor más conocido. Se trata de un programa que traduce código fuente escrito en un lenguaje dealto nivel (Pascal) en código máquina (no siempre). Son más rápidos que los intérpretes pero presentan mayor dificultad a lahora de detectar errores. Un compilador es un programa que lee el código escrito en un lenguaje (lenguaje origen), y lotraduce o traduce en un programa equivalente escrito en otro lenguaje (lenguaje objetivo). Como unapartefundamental de este proceso de traducción, el compilador le hace notar al usuario la presencia deerrores en el código fuente del programa. El compilador deriva su nombre de la manera en que trabaja, buscando en todo el código fuente, recolectando yreorganizando las instrucciones. Un compilador difiere de un intérprete en que el intérprete toma cada línea de código y laanaliza y ejecuta mientras que el compilador mira el código por completo. Los compiladores requieren de un tiempo antes de poder generar un ejecutable, sin embargo los programas creadoscon compiladores se ejecutan mucho más rápido que un mismo programa ejecutado con un intérprete. Cada lenguaje de programación de alto nivel (excepto los estrictamente imperativos) viene con un compilador. Dado que los compiladores traducen código fuente a código objeto, el cual es único para cada tipo de maquina,existen múltiples compiladores para un mismo lenguaje. Por ejemplo lenguaje C tiene un compilador para PC, otro para AppleMacintosh, además existen muchas casa que desarrollan compiladores para una misma plataforma y un mismo lenguaje, porejemplo Microsoft y Borland tienen sus compiladores propios para lenguaje C.Etapas del proceso de compilación: 1. Edición. Esta fase consiste en escribir el programa empleando algún lenguaje y un editor. Como resultado nos dará el código fuente de nuestro programa. 2. Compilación. En esta fase se traduce el código fuente obtenido en la fase anterior a código máquina. Si no se produce ningún error se obtiene el código objeto. En caso de errores el compilador los mostraría para ayudarnos a corregirlos y se procedería a su compilación de nuevo, una vez corregidos. 3. Linkado. Esta fase consiste en unir el archivo generado en la fase dos con determinadas rutinas internas del lenguaje, obteniendo el programa ejecutable. Existen dos tipos de linkados:Texto extraído de http://traductoresune.blogspot.com
  • 5. o Linkado estático: Los binarios de las librerías se añaden a nuestros binarios compilados generando el archivo ejecutable. o Linkado dinámico: no se añaden las librerías a nuestro binario sino que hará que se carguen en memoria las librerías que en ese momento se necesiten. Una vez traducido, compilado y linkado el archivo esta listo para su ejecución donde también podrán surgir problemasy fallos, para los cuales tendríamos que volver a realizar todo el proceso anteriormente citado, de modo que puedan sercorregidos.Por este motivo es importante realizar numerosas pruebas en tiempo de ejecución antes de presentar el programa al cliente.Partes de un compiladorNormalmente los compiladores están divididos en dos partes: • Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. • Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End. Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes deprogramación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje deprogramaciónconcreto sirva para la generación de código máquina en varias plataformas distintas. El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por unprograma enlazador (linker).Tipos de compiladores Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban avarias categorías: • Compiladores cruzados: generan código para un sistema distinto del que están funcionando. • Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. • Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente. • Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina. • Compiladores JIT (Just In Time): forman parte de unintérprete y compilan partes del código según se necesitan.Diferencias entre Compilador e InterpreteLos compiladores difieren de los intérpretes en varios aspectos: • Un programa que ha sido compilado puede correr por si solo, pues en el proceso de compilación se lo transformo en otro lenguaje (lenguaje máquina). • Un intérprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en acciones. • La ventaja del intérprete es que dado cualquier programa se puede interpretarlo en cualquier plataforma (sistema operativo), en cambio el archivo generado por el compilador solo funciona en la plataforma en donde se lo ha creado. • Pero por otro lado un archivo compilado puede ser distribuido fácilmente conociendo la plataforma, mientras que un archivo interpretado no funciona si no se tiene el intérprete. • Hablando de la velocidad de ejecución un archivo compilado es de 10 a 20 veces más rápido que un archivo interpretado.Texto extraído de http://traductoresune.blogspot.com