Want to create interactive content? It’s easy in Genially!

Get started free

Revista Digital - Compilador

Adolfo Ochoa

Created on September 25, 2024

Start designing with a free template

Discover more than 1500 professional designs like these:

Essential Dossier

Essential Business Proposal

Essential One Pager

Akihabara Dossier

Akihabara Marketing Proposal

Akihabara One Pager

Vertical Genial One Pager

Transcript

El compilador

Transformando código en soluciones

Title 1

Fases de un compilador

Compilador

Generación código final
Análisis léxico

Ejemplo

Un compilador es un programa que convierte el código fuente escrito en un lenguaje de alto nivel a un lenguaje máquina.

Análisis sintaxis

Ejemplo

Ejemplo

Análisis semántico

Función

Ejemplo

Trabaja como un traductor entre nosotros y la computadora, tomando el código que escribimos en el lenguaje, bien sea Javascript o Python, y posteriormente lo coniverte en algo que la máquina pueda entender, con su propio lenguaje de ceros y unos.
Generación de código intermedio

Ejemplo

Optimizador de código

Ejemplo

Lenguajes de alto y bajo nivel

Definición Lenguaje Programación

Papel en los lenguajes de programación

Sintaxis y semántica

aLFABETOS Y LENGUAJES

Lenguajes de alto y bajo nivel

Tipos de lenguaje de programación

Definición Alfabetos

Lenguaje de programación Funcional

Lenguaje de programación Orientada a Objetos

Title 1

Cadenas

Una cadena (o bien, string), es una secuencia de caracteres, puede incluir letras, números, espacios y símbolos. Usado para representar texto o datos en forma de caracteres

Operaciones con cadenas

Concatenación de cadenas

Repetición de cadenas

En pocas palabras, es cuando toma una cadena y la repites un número específico de veces

Consiste en el proceso de unir 2 o más secuencias de caracteres (o bien, cadenas), en una sola. Con el fin de juntar fragmentos de texto para crear una frase más grande

Ejemplo

Ejemplo

Title 1

Ejemplo #1

Ejemplo #3

Ejemplo #2

jEjemplo #1

Title 1

Ejemplo #1

Ejemplo #3

Ejemplo #2

jEjemplo #1

Conclusiones

  • Al hablar de las cadenas en programación, nos encontramos con la manipulación de operaciones como concatenar y/o medir longitud. Sin duda, aprender como funciona estás operaciones con ejemplos, hizo que su aplicación en la parte práctica fuera clara
  • El esquema del compilador, me permitió entender como el código es convertido en algo para que la máquina sea capaz de procesarlo. Además, ver cada fases, mostrando la importancia de lo que es escribir bien desde el principio
  • Realizar la comparación de las gramáticas me enseño como las independientes son claras y predecibles, en comparación a las ambiguas, que pueden generar confusión. Posteriormente se entendió que la cerraduras de Kleene y positivas permiten repetir patrones de forma flexible
  • Realizar el análisis de los lenguajes de programación me permitió ver sus diferencias, los niveles altos y bajos, cada uno con sus ventajas. Seguidamente, el alfabeto es la base de todo, comprender este tema hizo que la estructura de los lenguajes sea más lógica

¿Qué es un lenguaje de programación?

Un lenguaje de programación es un sistema de comunicación entre humanos y máquinas, permitiendo escribir instrucciones para que una computadora realice tareas específicas, implementado para el desarrollo de software, aplicaciones y sistemas operativos

Cuando hablamos de la sintaxis en el campo de la programación, nos referimos a las reglas y estructura que deben seguir al momento de escribir código.

No obstante, la semántica está encargada del significado de dichas instrucciones, mientras que, la sintaxis se asegura que el código este bien escrito, está determina lo que realmente hará el código al momento de ejecutarlo

Ejemplo de generación de código intermedio

En este caso, convertimos x = a + b en código intermedio como: t1 = a + b; x = t1 Donde t1 sería la variable temporal donde se estará almacenando el resultado

Para este caso, imaginemos que queremos generar un patrón numérico para un sistema de seguridad, y deseamos crear una contraseña compuesta por un número base, y este se repita varias veces e incluya un sufijo numérico . Tendríamos los siguientes datos

  • numeroBase= "42"
  • sufijo= "00"
  • Ahora bien, queremos repetir el numeroBase 3 veces, y posteriormente añadirlo al sufijo final

Tendríamos: password = (numeroBase * 3) + sufijo Siendo el resultado: "42424200"

Los pasos que se siguieron para llegar al resultado fueron:A)Se definió el número base y el sufijo (siendo 42 y 00) B)Posteriormente, se repite el número base 3 veces, usando el operador de repetición "*" C)Luego, se concatena el sufijo al final del resultado D)Por ultimo, visualizamos el resultado, siendo una cadena que representa una contraseña segura

Ejemplo análisis sintáctico

Para la declaración if(x>0) {y =1 0} El análisis sintáctico comprueba que la sintaxis este correcta, de manera que se asegura de que la condición x > 0 este formada correctamente, además de que las llaves les correspondan

Explicación de los pasos realizados

Cerradura de Kleene -> Conjunto A ={x, y} : 1) Comenzamos con la cadena vacía e. 2)Luego, añadimos combinaciones de x e y en todas las longitudes posibles. 3) Posteriormente, se generará todas las cadenas como e, x, y, xx, xy, yx, ...

Cerradura Positiva-> Conjunto A ={x, y} : 1) Comenzamos con la cadena vacía e. 2)Luego, añadimos combinaciones de x e y en todas las longitudes posibles. 3) Posteriormente, excluyen la cadena vacía,y se genera el resto de las cadenas x, y, xx, xy, yx, ...

Ejemplo del Generación del código final

El código t1 = a + b Puede ser convertido a instrucciones de máquina específica para una arquitectura, como: LOAD a LOAD B ADD STORE t1

Explicación de los pasos realizados

Cerradura de Kleene -> Conjunto A ={0} : 1) Comenzamos con la cadena vacía e. 2)Luego, añadimos combinación 0 en todas las longitudes posibles. 3) Posteriormente, se generará todas las cadenas como e, 0, 00, ...

Cerradura Positiva-> Conjunto A ={a, b} : 1) Comenzamos con los elementos de A: a y b 2)Luego, añadimos combinación 0 en todas las longitudes posibles. 3) Posteriormente, se excluye la cadena vacía, y se genera el restos de las cadenas como 0, 00, 000, ...

Este lenguaje se caracteriza por la creación y manipulación de funciones matemáticas. Si bien, el código es construido a partir de funciones puras, recibiendo entradas y posteriormente devolviendo salidas, sin alterar datos externos ni depender de variables globales. Si bien, los que destacan son Haskell y Lisp

Haskell
Lisp

Su principal característica es que, es ideal al trabajar con operaciones matemáticas complejas, cálculos masivos, y sistemas que requieren de alta confiabilidad

Los lenguajes de bajo nivel se encuentran cerca del hardware de la computadora, y suelen ser más difíciles de entender por los humanos. Un ejemplo de estos sería el lenguaje de máquina (que trabaja con los números binarios), y el lenguaje ensamblador

Mientras que los lenguajes de alto nivel son aquellos que son más cercanos al lenguaje humano, y fáciles de aprender. Ejemplos de estos podrían ser Java y Python, estos lenguajes son independientes de la arquitectura de la máquina

Ejemplo análisis semántico

Ahora bien, en el siguiente código int a = "texto" El análisis generaría un error, debido a que se está intentando asignar un valor de tipo cadena, a una variable de tipo entero

Explicación de los pasos realizados

Para GIC ( S -> aSa | b) 1) comenzamos S, 2)Posteriormente aplicamos la producción S->aSa para expandir S, 3)Luego, sustituimos el nuevo S con b usando S->b, 4)Obtenemos la cadena generada, siendo aaab

Para la gramática ambigua (S -> aS | bS |a |b) 1) Comenzamos con S, 2)Posteriormente elegimos la producción S -> aS y expandimos S a aS, 3) Repetimos la aplicación de S con S ->a para obtener aa, 4) También tendríamos la opción de elegir S ->bS en lugar de S -> aS, dando un lugar diferente a las combinación como ab o ba

Explicación de los pasos realizados

Para GIC (S -> xSy | e) 1) Comenzamos con S 2) Aplicamos S -> xSy para expandir a xSy 3)Luego, repetimos la aplicación de S -> xSy, y obtenemos xxSyy 4)Por ultimo, sustituimos S por e, resultando xxyy

Para la gramática ambigua (S -> AB | a) 1) Comenzamos con S, 2) Aplicamos la producción S -> AB para obtener AB 3)Luego sustituimos A y B por a, resultando en aa 4)Si bien, tenemos una alternativa donde podemos aplicar S -> a directamente para obtener a

Ejemplo de optimización de código

Supongamos que tenemos el siguiente código: int a = 5; int b = 10; int c = a + b; int d = a + b ;-> aquí estariamos repitiendo el proceso La optimización sería int a = 5; int b = 10; int c = a + b; int d = c -> Ahora reutilizaríamos el resultado

El alfabeto en un lenguaje de programación es un conjunto de símbolos usados, como letras, número y operadores, dichos símbolos forman las instrucciones que una computadora pueda entender.

Si bien, los lenguajes de bajo nivel, tales como el ensamblador o el lenguaje de máquina son muy limitados. Debido que, los símbolos suelen ser números binarios (0 y 1), o bien mnemónicos simples (instrucciones básicas como MOV y ADD), por lo que está directamente relacionados con el hardware del computador.

Pero, en los lenguajes de alto nivel, el alfabeto es amplio y más amigable para los humanos, debido a que nos deja usar palabras reservadas, como por ejemplo en python con if, else y while, además de símbolos matemáticos y lógicos (+, - , &&, ==).

Explicación de los pasos realizados

Cerradura de Kleene -> Conjunto A ={a, b} : 1) Comenzamos con la cadena vacía e. 2)Luego, añadimos combinaciones de a y b en todas las longitudes posibles. 3) Posteriormente, se generará todas las cadenas.

Cerradura Positiva-> Conjunto A ={a, b} : 1) Comenzamos con los elementos de A: a y b 2)Luego, generamos combinaciones de a y b en todas las longitudes posibles 3) Posteriormente, se excluye la cadena vacía, y se genera el resto

Supongamos que estamos construyendo un identificador de usuario para un sistema, esto incluirá el código de país, el código de área y un número de teléfono. Por lo que, tendríamos los siguientes datos:

  • codigoPais = "58"
  • codigoArea = "212"
  • numero_telefono = "1234567"

Una vez definidos los datos, creamos el identificador completo: identificador_usuario = "+" + codigoPais + " " + codigoArea + " " + numero_telefono Siendo el resultado: "+58 212 1234567"

Para finalizar, los pasos que se realizaron para llegar a dicho resultado fue:A)Se definio cada parte de los números B)Posteriormente, se concadena las cadenas, añadiendo el símbolo "+" y espacio para tener mayor claridad C)El resultado esperado es un identificador legible, y bien formado

Ejemplo del análisis léxico

Para el código: float temperatura = 36.6El análisis léxico lo convierte en los tokens

  • float -> Identificador
  • temperatura-> Identificador
  • = -> Asignación operador
  • 36.6 -> Número

Explicación de los pasos realizados

Para GIC (S -> 0S1 | 01 ) 1) Comenzamos con S 2)Luego, aplicamos S -> 0S1, expandiendo a 0S1 3)Posteriormente, repetimos este proceso con S usando 0S1 nuevamente, obteniendo 00S11 4)Finalizamos sustituyendo S por 01 para conseguir la cadena 0011

Para la gramática ambigua (S -> SS | a) 1) Comenzamos con S, 2)Aplicamos la producción S -> SS, dando como resultado dos S 3)Luego, elegimos S -> a para ambos S, resultando en aa 4) Si bien, tenemos una alternativa, sería aplicar S -> a para uno y S -> para el otro, generando ab

Este lenguaje se encarga de organizar el código en torno a objetos, dichos objetos son representaciones de entidades del mundo real, o bien, concepto abstractos. Donde, cada objeto tiene atributos (o bien, datos), además de métodos (acciones), que permiten manipular dichos datos