The Glitch - Compiladores

12

description

Revista Digital - Lenguaje de Programacion

Transcript of The Glitch - Compiladores

Page 1: The Glitch - Compiladores
Page 2: The Glitch - Compiladores

Índice

Compiladores. Pag. 3

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la má-quina será capaz de interpretar.

Descompiladores. Pag. 5

El término "descompilar" es más comúnmente aplicado a programas cuya función es la de tra-ducir un ejecutable (la salida de un compilador) a código fuente en un lenguaje de alto nivel, que, cuando compile, volverá a producir un ejecutable cuyo comportamiento es el mismo que el del ejecutable original.

Clasificación de los Compiladores. Pag. 7

Hay muchos tipos de compiladores, entre ellos están: Los de una sola pasada, pasadas múlti-ples, optimización, compiladores incrementales, ensambladores, compiladores cruzados, com-piladores con montador, auto compiladores, meta compiladores, etc.

Fases de Compilación. Pag. 8

El compilador tiene diferentes fases por las cuales debe pasar antes de que el código de máqui-na sea generado.

Recreación Pag. 9

Crucigrama para entretenerse con palabras sobre el tópico de la revista.

1

Page 3: The Glitch - Compiladores

The Glitch es una revista digital dirigida a todos los

amantes de la ciencia de la eléctrica, informá�ca/

computación y telecomunicaciones. Podrás encontrar des-

de no�cias hasta quizás sobre estas ramas de la ciencia ini-

ciando nuestro segundo volumen enfocado sobre los siste-

mas puesta a �erra.

Aquí en The Glitch Digital Magazine esperamos que

les sea ú�l y prac�co la información dada y que desde hoy

sean subscriptores de esta revista.

Atentamente:

Jorge Boscán

2

Page 4: The Glitch - Compiladores

Compiladores

Un compilador es un programa informático que traduce un programa escrito en un lenguaje de progra-

mación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz

de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser simple-

mente texto. Este proceso de traducción se conoce como compilación.

Historia:

En 1946 se desarrolló la primera computadora digital.

En un principio, estas máquinas ejecutaban instrucciones

consistentes en códigos numéricos que señalaban a los

circuitos de la máquina los estados correspondientes a

cada operación, lo que se denominó lenguaje máquina.

Pronto los primeros usuarios de estos ordenadores des-

cubrieron la ventaja de escribir sus programas mediante

claves más fáciles de recordar que esos códigos; al final,

todas esas claves juntas se traducían manualmente a

lenguaje máquina. Estas claves constituyen los llamados

lenguajes ensambladores.

Pese a todo, el lenguaje ensamblador seguía siendo el de una máquina, pero más fácil de manejar. Los

trabajos de investigación se orientaron hacia la creación de un lenguaje que expresara las distintas accio-

nes a realizar de una manera lo más sencilla posible para una persona. El primer compilador fue escrito por

Grace Hopper, en 1952 para el lenguaje de programación A-0, En 1950 John Backus dirigió una investiga-

ción en IBM sobre un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escri-

bir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae

TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la computadora IBM

modelo 704.

3

Por: Jorge Boscán

Page 5: The Glitch - Compiladores

Partes de un Compilador:

Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases corres-

pondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxi-

cos), Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis Semán-

tico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).

Síntesis: Su objetivo es la generación de la salida expresa-

da en el lenguaje objeto y suele estar formado por una o

varias combinaciones de fases de Generación de Código

(normalmente se trata de código intermedio o de código

objeto) y de Optimización de Código (en las que se busca

obtener un código lo más eficiente posible).

Alternativamente, las fases descritas para las tareas de

análisis y síntesis se pueden agrupar en Front-end y Back-

end:

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, y está compuesta por las fases comprendidas entre el Análisis Léxico y la

Generación de Código Intermedio.

Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resul-

tados 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 len-

guajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un

lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Sue-

le incluir la generación y optimización del código dependiente de la máquina.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita

ser enlazado por un programa enlazador (linker).

.

4

Page 6: The Glitch - Compiladores

Descompiladores

El término "descompilar" es más comúnmente aplicado a programas cuya función es la de traducir un

ejecutable (la salida de un compilador) a código fuente en un lenguaje de alto nivel, que, cuando compile,

volverá a producir un ejecutable cuyo comportamiento es el mismo que el del ejecutable original. En compa-

ración, un desensamblador traduce un ejecutable a lenguaje ensamblador (y este código puede volver a ser

ensamblado en un programa ejecutable).

Descompilar es el acto de utilizar un descompilador, aunque si es usado como nombre, puede referirse

a la salida de un descompilador. Puede ser usado para recuperar código fuente, y es muy útil en casos de

seguridad del ordenador, interoperatividad y corrección de errores.1 El éxito de la descompilación depende

de la cantidad de información presente en el código que está siendo descompilado y en la sofisticación del

análisis realizado sobre él. Los formatos de bytecode utilizados por muchas máquinas virtuales (como la

Java Virtual Machine o el lenguaje .NET (.NET Framework Common Language Runtime)) en ocasiones in-

cluyen metadatos en el alto nivel que hacen que la descompilación se más flexible. Los lenguajes máquina

normalmente tienen mucha menos metadata, y son por lo tanto mucho más difíciles de compilar.

Algunos compiladores y herramientas de post-compilación producen código ofuscado (esto quiere decir

que intentan producir una salida que es muy difícil de descompilar). Esto hace que sea más difícil revertir el

código del ejecutable.

Diseño:

Los descompiladores pueden ser pensados como un conjunto de fases, en las que cada una de ellas

contribuye de una forma específica en el proceso de descompilación.

5

Por: Jorge Boscán

Page 7: The Glitch - Compiladores

Cargador: La primera fase de descompilación es el cargador, que recibe el código máquina o el archivo

binario de un lenguaje intermedio. El cargador debería ser capaz de descubrir datos básicos sobre el pro-

grama, como por ejemplo la arquitectura (Pentium, PowerPC, etc), y el punto de entrada. En muchos casos,

debería ser capaz de encontrar la función main de un programa en C, que es el comienzo del código escrito

por el usuario. Esto excluye el código de inicialización de la ejecución, que no debería ser descompilado si

es posible.

Desensamblado: La siguiente fase lógica es el desensamblado del código máquina, éste pasa a una

representación máquina independiente.

Secuencias idiomáticas: Las secuencias de código máquina idiomáticas es un conjunto de secuencias

de código cuya semántica no aparenta instrucciones semánticamente individuales. Tanto como parte de la

fase de desensamblado, o como parte del análisis posterior, estas secuencias idiomáticas necesitan ser

traducidas a su equivalente en código IR (representación máquina independiente).

Análisis del programa: Se pueden aplicar varios tipos de análisis al IR. De forma particular, la propaga-

ción de expresiones combina la semántica de muchas instrucciones en expresiones más complejas.

Análisis de tipos: Un buen descompilador debería implementar un análisis de tipos. Aquí, la forma en

que se usan los registros o las regiones de memoria dan como resultado restricciones en el tipo de localida-

des.

Estructuración: La penúltima fase de la descompilación implica la estructuración del código IR en cons-

trucciones de alto nivel como ciclos while y estructuras condicionales if/then/else. Por ejemplo, el código

máquina.

Generación de código: La fase final es la generación de código de alto nivel. Tal como un compilador

puede tener varios lenguajes destinos para generar código máquina de diferentes arquitecturas, un des-

compilador puede tener varios destinos de generación de código en diferentes lenguajes de alto nivel.

Justo antes de la generación del código, es deseable permitir la edición interactiva del código IR, tal vez

haciendo uso de alguna interfaz gráfica de usuario. Esto puede permitir al usuario agregar comentarios,

variables no genéricas y nombres de funciones. Aun así, esto también se puede agregar en ediciones pos-

teriores a la descompilación. El usuario puede cambiar algunos aspectos estructurales, como por ejemplo,

convertir un ciclo while a un ciclo for. Esto se puede cambiar con un simple editor de textos, o también se

pueden usar herramientas de refactoring sobre el código fuente. El usuario también necesitará agregar in-

formación que no se pudo reconocer durante la fase de análisis de tipos, por ejemplo, modificar una expre-

sión de memorias a un arreglo o a una estructura. Finalmente, se necesita corregir código IR incorrecto, o

hacer cambios para hacer que la salida de código sea más legible.

6

Page 8: The Glitch - Compiladores

Clasi�icaciondelosCompiladores

El programa compilador traduce las instrucciones en un lenguaje de alto nivel a instrucciones que la

computadora puede interpretar y ejecutar. Para cada lenguaje de programación se requiere un compilador

separado. El compilador traduce todo el programa antes de ejecutarlo. Los compiladores son, pues, progra-

mas de traducción insertados en la memoria por el sistema operativo para convertir programas de cómputo

en pulsaciones electrónicas ejecutables (lenguaje de máquina). Los compiladores pueden ser de::

• Una Sola Pasada: examina el código fuente una vez, generando el código o programa objeto.

• Pasadas Múltiples: requieren pasos intermedios para producir un código en otro lenguaje, y una

pasada final para producir y optimizar el código producido durante los pasos anteriores.

• Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el progra-

ma.

• Compiladores Incrementales: generan un código objeto instrucción por instrucción cuando el

usuario teclea cada orden individual. El otro tipo de compiladores requiere que todos los enunciados o ins-

trucciones se compilen conjuntamente.

• Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

• Compilador Cruzado: se genera código en lenguaje objeto para una máquina diferente de la que

se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere

código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++.

• Compilador con Montador: compilador que compila distintos módulos de forma independiente y

después es capaz de enlazarlos.

• Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar. Evidente-

mente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código

generado, etc.

• Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa que reci-

be como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera

como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la

dificultad de unir la generación de código con la parte de análisis. Lo que sí se han desarrollado son gene-

radores de analizadores léxicos y sintácticos.

7

Por: Daniel Morillo

Page 9: The Glitch - Compiladores

FasesdeCompilacion

Análisis Léxico: Esta fase se encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es

decir realiza un análisis símbolo por símbolo indicando el token por cada uno de los elementos reconocidos

o el error en caso de no reconocer. Este análisis no logra detectar muchos errores por su característica.

Análisis Sintáctico: En esta fase se analiza la

estructura de las expresiones en base a gramáti-

cas. Aquí ya se puede determinar si una estructu-

ra por ejemplo una expresión matemática mal

formada. El análisis que se realiza es jerárquico

es decir en base a árboles de derivación que se

obtienen de las mismas gramáticas.

Análisis Semántico: Este análisis es más

difícil de formalizar, determina el tipo de los resul-

tados intermedios, comprobar que los argumentos

que tienen un operador pertenecen al conjunto de

operadores posible, y si son compatibles entre sí.

Generación de Código Intermedio: El código intermedio es una representación en base a elementos

de 3 y 4 direcciones. Lo que nos permite llegar a la fase de optimización de código.

Optimización de Código: Consiste en realizar una mejora en el código intermedio, para reducir el nú-

mero de líneas y hacer que la ejecución sea más rápida

8

Por: Daniel Morillo

Page 10: The Glitch - Compiladores

Recreacion:Crucigrama

Palabras a conseguir:

LENGUAJE JAVA ORDENADOR

COMPILADOR DISCO PROGRAMACION

SINTAXIS INTERPRETE COMPUTACION

PENTIUM FORTRAN OPERATIVO

9

C H I J G E T S U O I S X Z C

O Z D V Z N C O M P U X J R F

M Y I G J A O P E R A T I V O

P E N T I U M B N X J D A Q R

U E T X C B P C K D G W E R T

T A E A Z S I N T A X I S J R

A D R Z B N L E N G U A J E A

C I P J A V A H F S R T U X N

I V R J K V D G D Q B V Z C M

O H E B Z X O R D E N A D O R

N V T H K H R D K Ñ Y I E Q D

A B E T T R S M F V D K J G A

Z N D I S C O U Y U J Q W E R

V N X V K H A D G L A D U W G

D S P R O G R A M A C I O N N

Page 11: The Glitch - Compiladores

Publicidad

10

Page 12: The Glitch - Compiladores