Revista Digital - Compilador
Adolfo Ochoa
Created on September 25, 2024
Over 30 million people build interactive content in Genially.
Check out what others have designed:
Transcript
Transformando código en soluciones
El compilador
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.
Un compilador es un programa que convierte el código fuente escrito en un lenguaje de alto nivel a un lenguaje máquina.
Ejemplo
Compilador
Función
Ejemplo
Ejemplo
Generación código final
Ejemplo
Ejemplo
Ejemplo
Fases de un compilador
Optimizador de código
Generación de código intermedio
Análisis semántico
Análisis sintaxis
Análisis léxico
Title 1
Lenguaje de programación Orientada a Objetos
Sintaxis y semántica
Lenguajes de alto y bajo nivel
Lenguaje de programación Funcional
Lenguajes de alto y bajo nivel
Definición Alfabetos
Papel en los lenguajes de programación
Tipos de lenguaje de programación
DefiniciónLenguaje Programación
aLFABETOS Y LENGUAJES
Ejemplo
Ejemplo
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
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
En pocas palabras, es cuando toma una cadena y la repites un número específico de veces
Cadenas
Concatenación de cadenas
Repetición de cadenas
Operaciones con cadenas
Title 1
jEjemplo #1
Ejemplo #1
Ejemplo #2
Ejemplo #3
Title 1
jEjemplo #1
Ejemplo #1
Ejemplo #2
Ejemplo #3
Title 1
- 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
- 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
- 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
- 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
Conclusiones
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
¿Qué es un lenguaje de programación?
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
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.
En este caso, convertimos x = a + ben código intermedio como:t1 = a + b; x = t1Donde t1 sería la variable temporal donde se estará almacenando el resultado
Ejemplo de generación de código intermedio
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 resultadoD)Por ultimo, visualizamos el resultado, siendo una cadena que representa una contraseña segura
Tendríamos:password = (numeroBase * 3) + sufijoSiendo el resultado:"42424200"
- numeroBase= "42"
- sufijo= "00"
- Ahora bien, queremos repetir el numeroBase 3 veces, y posteriormente añadirlo al sufijo final
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
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
Ejemplo análisis sintáctico
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, ...
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, ...
Explicación de los pasos realizados
El códigot1 = a + bPuede ser convertido a instrucciones de máquina específica para una arquitectura, como:LOAD aLOAD BADDSTORE t1
Ejemplo del Generación del código final
Cerradura Positiva-> Conjunto A ={a, b} : 1) Comenzamos con los elementos de A: a y b2)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, ...
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, ...
Explicación de los pasos realizados
Lisp
Haskell
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
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
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
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
Ahora bien, en el siguiente códigoint 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
Ejemplo análisis semántico
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
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
Explicación de los pasos realizados
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
Para GIC (S -> xSy | e)1) Comenzamos con S2) Aplicamos S -> xSy para expandir a xSy 3)Luego, repetimos la aplicación de S -> xSy, y obtenemos xxSyy4)Por ultimo, sustituimos S por e, resultando xxyy
Explicación de los pasos realizados
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 procesoLa optimización seríaint a = 5;int b = 10;int c = a + b;int d = c -> Ahora reutilizaríamos el resultado
Ejemplo de optimización de código
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.
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 (+, - , &&, ==).
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.
Cerradura Positiva-> Conjunto A ={a, b} : 1) Comenzamos con los elementos de A: a y b2)Luego, generamos combinaciones de a y b en todas las longitudes posibles3) Posteriormente, se excluye la cadena vacía, y se genera el resto
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.
Explicación de los pasos realizados
Para finalizar, los pasos que se realizaron para llegar a dicho resultado fue:A)Se definio cada parte de los númerosB)Posteriormente, se concadena las cadenas, añadiendo el símbolo "+" y espacio para tener mayor claridadC)El resultado esperado es un identificador legible, y bien formado
Una vez definidos los datos, creamos el identificador completo: identificador_usuario = "+" + codigoPais + " " + codigoArea + " " + numero_telefonoSiendo el resultado: "+58 212 1234567"
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"
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
Ejemplo del análisis léxico
Para la gramática ambigua (S -> SS | a)1) Comenzamos con S, 2)Aplicamos la producción S -> SS, dando como resultado dos S3)Luego, elegimos S -> a para ambos S, resultando en aa4) Si bien, tenemos una alternativa, sería aplicar S -> a para uno y S -> para el otro, generando ab
Para GIC (S -> 0S1 | 01 )1) Comenzamos con S2)Luego, aplicamos S -> 0S1, expandiendo a 0S13)Posteriormente, repetimos este proceso con S usando 0S1 nuevamente, obteniendo 00S114)Finalizamos sustituyendo S por 01 para conseguir la cadena 0011
Explicación de los pasos realizados
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