Está en la página 1de 8

Universidad Nacional Autónoma de México

Facultad de Ingeniería

Práctica 1: Sistema de Procesamiento de Lenguaje

Carrillo Sánchez Ricardo

Ing. Adrian Ulises Mercado Martinez

Compiladores

Grupo: 1

Semestre: 2022-2

9 de Febrero del 2022


Sistema de procesamiento de Lenguaje

Objetivo

El alumno identificará el funcionamiento de las entradas, salidas y los programas que


componen el sistema de procesamiento de lenguaje, as ́ı como el formato de cada uno de
los archivos con los que se trabajan.

Introducción

Un compilador es un programa que se encarga de hacer la traducción de un programa


fuente escrito en lenguaje de alto nivel a un programa escrito en lenguaje objeto que por lo
general es un lenguaje de bajo nivel. El compilador realiza el análisis del código fuente y la
síntesis a código objeto.

Para realizar esta traducción el compilador se auxilia de otros programas como lo son el
preprocesador, que se encarga de recolectar el programa escrito en módulos en archivos
separados, expandir fragmentos de código abreviados de uso frecuente, llamados macros.

El programa modificado por el preprocesador ingresa al compilador, esté produce a el


programa destino escrito en lenguaje ensamblador, que a continuación es procesado por un
ensamblador que genera el código de máquina.

Una vez que el programa ha sido ensamblado, es necesario vincular los archivos de código
máquina con otros archivos objeto y de biblioteca para que se produzca el código
ejecutable.

Finalmente el cargador lleva el archivo objeto a la memoria para su ejecución.


3. Usar el siguiente comando: cpp programa.c > programa.i

a. Busque los archivos .h y revise su contenido

El contenido de los archivos stdio.h y stdlib.h lo podemos visualizar con la opción de


“ir a declaración” que nos proporciona el editor de código de visual studio. En estos archivos
encontraremos las definiciones escritas en lenguaje c de estos archivos tales como las
siguientes definiciones de funciones comúnmente usadas al programar en C.

b. Compare el contenido de programa.i con el de stdio.h y stdlib.h, indique de forma


general las similitudes entre los archivos .h y el .i
En este caso hemos llamado al preprocesador y el .i es el archivo generado tras su tarea,
en este podemos ver que a este archivo se le han incluido todas las definiciones del
preprocesador tales como las ifdef o include de los archivos de stdio.h y stlib.h

Respecto a los archivos .h contiene más líneas de código ya que este incluye a las
definiciones de ambos archivos .h más otras definiciones del preprocesador que se ven
reflejados como archivos de encabezado que se llaman al ejecutar gcc.

c. Observe lo que ocurrió con los comentarios y las directivas de preprocesador.

Lo primero que observamos es que se excluyen los comentarios que se realizaron en el .c y


además de que se sustituyen las directivas realizadas en el .c por los valores a operar.

4. Ejecute la siguiente instrucción: gcc -S programa.i

a. ¿Qué opción se agrega para que gcc muestre todas las advertencias durante este
proceso?

-Wall

b. ¿Qué le indica a gcc la opción -S?

Nos indica que lleve a cabo únicamente la compilación sin pasar al ensamblador o al
enlazador (linker)
c. ¿Que contiene el archivo de salida y cual es su extensión?

Como podemos observar se hace la llamada al compilador el cual transforma nuestro


código de alto nivel en código ensamblador el cual podemos pasar más fácilmente a codigo
máquina.
5. Ejecute la siguiente instrucción: as programa.s -o programa.o

a. ¿Formule una hipótesis sobre el contenido del archivo .o?

Será un archivo objeto el cual contiene el programa en código máquina.

b. ¿Que representa el contenido del programa .o de acuerdo con el diagrama de un


sistema de procesamiento de lenguaje?

Representa el ejecutable del programa escrito.

6. Encuentre la ruta de los siguientes archivos en el equipo de trabajo:

• Scrt1.o o crt1.o
• crti.o
• crtbeginS.o o ctrbegin.o
• crtendS.o o ctrend.o
• crtn.o

A los archivos crtbegin y crtend los encontraremos en la siguiente ruta:

/usr/lib/gcc/x86_64-linux-gnu/*version/

En mi caso particular sería la siguiente ruta:


Al resto de archivos solicitados los encontraremos en la siguiente ruta

/usr/lib/x86_64-linux-gnu/

En mi caso particular sería la siguiente ruta:

7. Ejecute el siguiente comando, sustituyendo las rutas que encontró en el paso anterior: ́

ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /ruta/para/Scrt1.o /ruta/para/crti.o


/ruta/para/crtbe-ginS.o -L /usr/lib/gcc/x86 64-pc-linux-gnu/7.3.1 -L/usr/lib -L/lib -L/usr/lib
-L/usr/lib programa.o -lgcc –as-needed -lgcc s –no-as-needed -lc -lgcc –as-needed -lgcc s
–no-as-needed /ruta/para/crtendS.o /ru-ta/para/crtn.o -o ejecutable

O bien

ld -o programa -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie /usr/lib/Scrt1.o /ruta/para/crti.o


/ruta/para/crt-beginS.o programa.o -lc /ruta/para/crtendS.o /ruta/para/crtn.o

a. En caso de que el comando ld mande errores, investigue cómo enlazar un programa


utilizando el comando ld.

Salieron errores en la primera corrida por lo que use la siguiente alternativa:

ld -o prac1.out prac1.o -L /usr/lib/gcc/x86_64-linux-gnu/9/


/usr/lib/gcc/x86_64-linux-gnu/9/crtbegin.o
/usr/lib/gcc/x86_64-linux-gnu/9/crtend.o /usr/lib/x86_64-linux-gnu/crti.o
/usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o
-dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc

b. ¿Qué se generó al ejecutar el comando anterior?


Se genero un archivo ejecutable
8. Una vez que se enlazo el código máquina relocalizable, podemos ejecutar el programa
con la siguiente instrucción en la terminal: ./programa

9. Quite el comentario de la macro #define PI

a. Genere nuevamente el archivo.i. De preferencia asigne un nuevo nombre.


b. ¿Cambió algo en la ejecución final?

En la ejecución apreciamos que existe un cambió en el resultado de la operación. Notamos


que el ejecutable 2 obtiene un resultado ligeramente menor al original. Esto se debe a que
la definición de pi se hizo con mayor precisión en decimales.

También podría gustarte