Page 1


Í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 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.

Clasificación de los Compiladores. Pag. 7 Hay muchos tipos de compiladores, entre ellos están: Los de una sola pasada, pasadas múltiples, optimización, compiladores incrementales, ensambladores, compiladores cruzados, compiladores 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áquina sea generado.

Recreación Pag. 9 Crucigrama para entretenerse con palabras sobre el tópico de la revista.

1


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 desde nocias hasta quizás sobre estas ramas de la ciencia iniciando nuestro segundo volumen enfocado sobre los sistemas puesta a erra.

Aquí en The Glitch Digital Magazine esperamos que les sea úl y pracco la información dada y que desde hoy sean subscriptores de esta revista.

Atentamente: Jorge Boscán

2


Compiladores Por: Jorge Boscán 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. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser simplemente 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 descubrieron 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 acciones 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 investigación en IBM sobre un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir 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


Partes de un Compilador: Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis Léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisis Sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis Semántico (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 expresada 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 Backend: 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 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 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. Suele 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


Descompiladores Por: Jorge Boscán 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 comparació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 incluyen 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


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 programa, 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 propagació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 localidades. Estructuración: La penúltima fase de la descompilación implica la estructuración del código IR en construcciones 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 descompilador 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 posteriores 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 información que no se pudo reconocer durante la fase de análisis de tipos, por ejemplo, modificar una expresió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


Clasiicació n de los Compiladores Por: Daniel Morillo 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, programas 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 instrucciones 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 generadores de analizadores léxicos y sintácticos.

7


Fases de Compilació n Por: Daniel Morillo 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áticas. Aquí ya se puede determinar si una estructura 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 resultados 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


Recreació n: Crucigrama

C O M P U T

H Z Y E E A

I D I N T E

J V G T X A

G Z J I C Z

E N A U B S

T C O M P I

S O P B C N

U M E N K T

O P R X D A

I U A J G X

S X T D W I

X J I A E S

Z R V Q R J

C F O R T R

A C I O

D I V H

R P R E

Z J J B

B A K Z

N V V X

L A D O

E H G R

N F D D

G S Q E

U R B N

A T V A

J U Z D

E X C O

A N M R

N A Z V

V B N N

T E D X

H T I V

K T S K

H R C H

R S O A

D M U D

K F Y G

Ñ V U L

Y D J A

I K Q D

E J W U

Q G E W

D A R G

D

S

P

R

O

G

R

A

M

A

C

I

O

N

N

Palabras a conseguir:

9

LENGUAJE

JAVA

ORDENADOR

COMPILADOR

DISCO

PROGRAMACION

SINTAXIS

INTERPRETE

COMPUTACION

PENTIUM

FORTRAN

OPERATIVO


Publicidad

10


The Glitch - Compiladores  

Revista Digital - Lenguaje de Programacion

Read more
Read more
Similar to
Popular now
Just for you