Professional Documents
Culture Documents
BAMM PortafolioEvidencias C4
BAMM PortafolioEvidencias C4
Portafolio de evidencias
Elaborado por:
Bautista Monter Marya Fernanda
183107254
Grupo: 363M
Período: 2021-1
CONTENIDO
Instrumentación didáctica para la formación y desarrollo de competencias 1
profesionales
Evaluación diagnóstica 2
Competencia específica 1. Diseña mediante el uso de reglas semánticas 3
dirigidas por sintaxis, un analizador semántico para un compilador.
1. Investigación Documental 4
2. Cuadro Sinóptico 5
1. Investigación Documental 8
2. Cuadro Comparativo 9
1. Investigación Documental 12
2. Mapa Conceptual 13
1. Investigación Documental 17
2. Mapa Conceptual 18
4. ChatBot (Terminado) 20
•
•
•
•
•
• •
• •
•
•
•
•
• •
• •
•
•
•
•
• •
• •
•
•
•
•
•
• •
• •
•
•
• •
• •
EXAMEN DIAGNÓSTICO
COMPETENCIA 1
Competencia específica: 1. Diseña mediante el uso de reglas semánticas dirigidas por
sintaxis, un analizador semántico para un compilador.
Indicadores de alcance:
Temas y subtemas:
Investigación Documental
“Análisis Semántico”
Asignatura:
Lenguajes y Autómatas II
Elaborado por:
Marya Fernanda Bautista Monter 183107254
Docente:
Ing. Brayan Antonio Mejía Díaz
Grupo:
363-M
Período: 2021-1
Contenido
Tabla de Ilustraciones....................................................................................................................... 2
Introducción ..................................................................................................................................... 3
1 Análisis Semántico ................................................................................................................... 4
1.1 Árboles de Expresiones ..................................................................................................... 4
1.1.1 Reglas para la construcción de árboles de expresión ................................................. 5
1.2 Acciones Semánticas de un Analizador Sintáctico ............................................................ 5
1.3 Comprobaciones de Tipos en Expresiones ........................................................................ 6
1.3.1 Comprobaciones estáticas .......................................................................................... 6
1.3.2 Comprobaciones dinámicas........................................................................................ 6
1.3.3 Verificación de Tipos ................................................................................................. 7
1.3.4 Interferencia de Tipos................................................................................................. 7
1.4 Pila Semántica en un Analizador Sintáctico ...................................................................... 7
1.5 Eliminación de Ambigüedad ............................................................................................. 8
1.6 Generación de la Tabla de Símbolo y Tabla de Direcciones ............................................. 9
1.7 Manejo de Errores Semánticos .......................................................................................... 9
Conclusion ...................................................................................................................................... 11
Referencias ..................................................................................................................................... 12
Tabla de Ilustraciones
Ilustración 1. Árbol de Expresiones ................................................................................................. 4
Introducción
Definitivamente la mejor forma de programar es teniendo en cuenta que probablemente el
ochenta por ciento de nuestras líneas de código (o más), tengan por lo menos un error, o en algún
momento nos marcaran el bello y diminuto zigzag rojo debajo de nuestra sentencia.
A pesar de que el ochenta o noventa por ciento de nuestro trabajo esté basado en lo que
podríamos llamar “prueba y error”, sabemos que no puede existir la prueba y error sin el error, y
no puede existir el error sin que alguien o algo nos diga que estamos en un error.
Llegando precisamente a este punto en el que necesitamos de una guía o un
acompañamiento a través de la creación y estructuración de un buen proyecto, podemos encontrar
como algunas muy buenas herramientas, el uso de algunas aplicaciones para desarrollar
programas, en vez de utilizar el no muy confiable o agradable archivo de texto.
Aun teniendo cada una de estas grandes herramientas que nos ayudan a detectar, nos dan
opciones para corregir nuestras equivocaciones, aportan rutas más fáciles para la creación de
código e incluso al momento de ejecutar y compilar el programa completo nos dicen el lugar
exacto en el que estamos cometiendo un error. Hay momentos en los que nos es completamente
imposible identificar el error que tenemos presente.
La realidad es que ninguno de nosotros somos completamente capaces de generar un
código cien por ciento libre de errores, ya que no tenemos la capacidad de reconocimiento y
memoria de cada una de estas ya mencionadas herramientas, sino que conocemos las sentencias
principales y las órdenes básicas que un programa debe llevar por lo menos para declarar
variables, reconocer algunas operaciones básicas o manipular cadenas de caracteres con las
operaciones más simples o comunes que conocemos.
Para realizar otro tipo de operaciones, generar una variedad de extensiones o incluso
importar o crear ciertas paqueterías, tenemos las maravillas de alguien más que decidió hacernos
la vida mucho más fácil, y con estos increíbles trabajos también podemos encontrar las palabras,
caracteres y funciones que nuestro programa o más bien lenguaje pueden reconocer (que no
siempre nos salvan la vida, pero sí son de gran ayuda).
3
1 Análisis Semántico
1.1 Árboles de Expresiones
Se refiere a las estructuras de datos que definen código. Se basan en las mismas
estructuras que usa un compilador para analizar el código y generar el resultado compilado.
Los árboles de expresiones representan el código de nivel del lenguaje en forma de datos.
Los datos se almacenan en una estructura con forma de árbol. Cada nodo del árbol de expresión
representa una expresión, por ejemplo, una llamada al método o una operación binaria, como x <
y.
Un árbol de expresión sirve para evaluar expresiones del tipo: (a + b)*c/d
Para que un árbol represente una expresión se deben tomar en cuenta 2 características
muy importantes:
➢ Cualquier hoja está etiquetada sólo con un operando.
➢ Cualquier nodo interior n está etiquetado por un operador.
4
1.1.1 Reglas para la construcción de árboles de expresión
Para construir el árbol de expresiones que represente nuestra expresión matemática es
necesario construir primero la misma expresión, pero en la notación polaca correspondiente y a
partir de esta es que se construye el árbol.
• Regla I
Existe un orden de prioridad para los operadores, que de menor a mayor es
el siguiente: suma (+) y resta (-), multiplicación (*) y división (/), exponenciación
(^), operadores unarios.
El paréntesis izquierdo lo trataremos como un operador (aunque no lo es)
cuyo orden de prioridad es el mayor de todos cuando se quiera apilar y el menor
de todos cuando esté en la cima de la pila.
• Regla II
Si el nodo corresponde a un operando, entonces se apila.
Si el nodo corresponde a un operador unario entonces se des apila un nodo
de la pila de nodos y es enlazado a la rama izquierda del nodo correspondiente al
operador unario y este último es apilado. Si el nodo corresponde a un operador
binario entonces dos nodos son des apilados de la pila de nodos, el primero es
enlazado a la rama derecha del nodo binario y el segundo a la rama izquierda,
nuevamente este nodo es apilado.
5
En la práctica, el analizador sintáctico también hace:
• Acceder a la tabla de símbolos (para hacer parte del trabajo del analizador semántico).
• Chequeo de tipos (del analizador semántico).
• Generar código intermedio.
• Generar errores cuando se producen.
• En definitiva, realiza casi todas las operaciones de la compilación. Este método de trabajo
da lugar a los métodos de compilación dirigidos por sintaxis.
6
1.3.3 Verificación de Tipos
Comprueba la compatibilidad de tipos de todas las expresiones del código fuente
recuperando la información durante la gestión de declaraciones. Además, se asegura de que no
existe en el programa ninguna referencia a ningún símbolo no declarado.
1.3.4 Interferencia de Tipos
En lenguajes sin tipificación de variables o con sobrecarga se aplican tareas de inferencia
de tipos en el nivel gramatical de las expresiones para resolver el tipo de datos de la expresión
resultante en función del contexto de evaluación.
Las pilas y colas son estructuras de datos que se utilizan generalmente para simplificar
ciertas operaciones de programación. Estas estructuras pueden implementarse mediante arrays o
listas enlazadas.
Una pila es una colección de datos a los cuales se les puede acceder mediante un extremo,
que se conoce generalmente como tope. Las pilas tienen dos operaciones básicas:
• Push (para introducir un elemento)
• Pop (para extraer un elemento)
Sus características fundamentales es que al extraer se obtiene siempre el último elemento que
acabe de insertarse. Por esta razón también se conoce como estructuras de datos LIFO, una
posible implementación mediante listas enlazadas seria insertando y extrayendo siempre por el
principio de la lista. Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia.
Las pilas y colas son estructuras de datos que se utilizan generalmente para simplificar
ciertas operaciones de programación. Estas estructuras pueden implementarse mediante arrays o
listas enlazadas.
Un analizador sintáctico es un autómata de pila que reconoce la estructura de una cadena
de componentes léxicos.
En general, el analizador sintáctico inicializa el compilador y para cada símbolo de
entrada llama al analizador morfológico y proporciona el siguiente símbolo de entrada.
7
Al decir pila semántica no se refiere a que hay varios tipos de pila, hace referencia a que
se debe programar única y exclusivamente en un solo lenguaje, es decir, no podemos mezclar
código de C++ con Visual Basic.
1.5 Eliminación de Ambigüedad
Como la mayoría de los operadores aritméticos son asociativos por la izquierda, es natural
utilizar gramáticas recursivas por la izquierda para las expresiones. La transformación se aplica a
esquemas de traducción con atributos sintetizados.
Para el análisis sintáctico descendente, se supone que una acción se ejecuta en el mismo
momento en que se expandiría un símbolo en la misma posición. Un atributo heredado de un
símbolo debe ser calculado por una acción que aparezca antes que el símbolo, y un atributo
sintetizado del no terminal de la izquierda se debe calcular después de que hayan sido calculados
todos los atributos de los que depende.
Un atributo heredado de un símbolo debe ser calculado por una acción que aparezca antes
que el símbolo, y un atributo sintetizado del no terminal de la izquierda se debe calcular después
de que hayan sido calculados todos los atributos de los que depende.
Los fragmentos de código así insertados se denominan acciones semánticas. Dichos
fragmentos actúan, calculan y modifican los atributos asociados con los nodos del árbol
sintáctico. El orden en que se evalúan los fragmentos es el de un recorrido primero-profundo del
árbol de análisis sintáctico.
En general, para poder aplicar un esquema de traducción hay que construir el árbol
sintáctico y después aplicar las acciones empotradas en las reglas en el orden de recorrido
primero-profundo. Por supuesto, si la gramática es ambigua una frase podría tener dos árboles y
la ejecución de las acciones para ellos podría dar lugar a diferentes resultados. Si se quiere evitar
la multiplicidad de resultados (interpretaciones semánticas) es necesario precisar de qué árbol
sintáctico concreto se está hablando.
8
1.6 Generación de la Tabla de Símbolo y Tabla de Direcciones
9
Existen dos criterios a seguir a la hora de manejar errores:
• Pararse al detectar el primer error.
• Detectar todos los errores de una pasada.
El análisis semántico es posterior al sintáctico y mucho más difícil de formalizar que éste.
Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que
tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí,
etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.
La salida "teórica" de la fase de análisis semántico sería un árbol semántico. Consiste en
un árbol sintáctico en el que cada una de sus ramas ha adquirido el significado que debe tener. En
el caso de los operadores polimórficos (un único símbolo con varios significados), el análisis
semántico determina cuál es el aplicable.
10
Conclusion
What would we do if we couldn't see our mistakes? That is the biggest issue that we could
imagine. We are available to make mistakes once, twice, third, or a million more times. The
problem when we make mistakes is when we can't see it.
Maybe in a current way in our life, we forget to do something or take a thing from the
table in the kitchen, or something like that usual mistakes. But at any time in the day, we will
notice about it even if we don't, it doesn't represent the end of the world.
Another case is an app. If we start to program and we aren't available to see that we have a
mistake, all the programs will fail. In that situation, we are sure in big troubles.
Of course, nothing of that could be possible if we hadn't found the best way to help
ourselves, but anyway, all that thigs as regular expressions are the things that make our life so
easy to make other life easy.
Now all that we have to do is try our best to make the fewer mistakes possible even if we
have a powerful tool as regular expressions.
11
Referencias
• Ullman, J. D. et al. (2007) Introducción a la teoría de autómatas, lenguajes y computación (3ª.
Ed.). Madrid: Pearson Educación. Disponible en: ELibro (Accediso: 10.03.2021)
• Badenas Carpio, J., Llopis Borrás, J. and Coltell Simón, O., 2001. Curso Práctico De
Programación En C Y C++. 2nd ed. Castelló de la Plana: Publicaciones de la Universitat
Jaume I, p.103.
• Hopcroft, J., Motwani, R. and Ullman, J., 2007. Introducción A La Teoría De Autómatas,
Lenguajes Y Computación (3A. Ed.). 1st ed. Madrid: Pearson Educación, pp.28-32.
12
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
FORMULARIO DE INICIO
Se muestra la pantalla de inicio del compilador, misma que contiene los datos
principales y dos botones de interacción: los botones “INICIO” y “SALIR”.
BOTÓN SALIR
Al dar click en el botón inicio, se despliega un cuadro de diálogo con la leyenda
“¿Desea Cerrar el Compilador?”.
Una vez que el usuario haga click en el cuadro de texto, se habilitará el botón
“ANALIZAR”.
BONTÓN “←”
En caso de que el usuario escriba mal un carácter en el cuadro de texto de expresión,
el usuario puede corregirlo con el botón “←”.
BOTÓN “LIMPIAR”
Una vez que todo el compilador esté programado, en el momento en el que se necesite
limpiar todos los campos del formulario, el usuario puede utilizar el botón “LIMPIAR” para
borrar la información y ocultar el resto de los componentes del formulario. De igual manera,
se volverá a deshabilitar el botón “COMPILAR”.
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
COMPETENCIA 2
Competencia específica: 2. Diseña las reglas para traducir el código fuente a un código
intermedio
Indicadores de alcance:
A. Evalúa las reglas las para traducir la codificación fuente en un código intermedio.
B. Desarrolla las reglas las para traducir la codificación fuente en un código intermedio.
Temas y subtemas:
2.1 Notaciones.
2.1.1 Prefija.
2.1.2 Infija.
2.2.3 Postfija.
Investigación Documental
“Generación de código intermedio”
Asignatura:
Lenguajes y Autómatas II
Elaborado por:
Marya Fernanda Bautista Monter 183107254
Docente:
Ing. Brayan Antonio Mejía Díaz
Grupo:
363-M
Período: 2021-1
Contenido
Introducción ..................................................................................................................................... 3
2 Generación de Código Intermedio ........................................................................................... 4
2.1 Notaciones ......................................................................................................................... 4
2.1.1 Prefija ......................................................................................................................... 4
2.1.2 Infija ........................................................................................................................... 4
2.1.3 Postfija........................................................................................................................ 5
2.2 Representaciones de Código Intermedio ........................................................................... 5
2.2.1 Notación Polaca.......................................................................................................... 5
2.2.2 Código P ..................................................................................................................... 6
2.2.3 Triplos ........................................................................................................................ 6
2.2.4 Cuádruplos ................................................................................................................. 7
2.3 Esquema de Generación .................................................................................................... 7
2.3.1 Variables y Constantes ............................................................................................... 7
2.3.2 Expresiones ................................................................................................................ 7
2.3.3 Instrucción de Asignación .......................................................................................... 7
2.3.4 Instrucciones de Control............................................................................................. 8
2.3.5 Funciones ................................................................................................................... 8
2.3.6 Estructuras .................................................................................................................. 8
Conclusion ........................................................................................................................................ 9
Referencias ..................................................................................................................................... 10
Introducción
Definitivamente la mejor forma de programar es teniendo en cuenta que probablemente el
ochenta por ciento de nuestras líneas de código (o más), tengan por lo menos un error, o en algún
momento nos marcaran el bello y diminuto zigzag rojo debajo de nuestra sentencia.
A pesar de que el ochenta o noventa por ciento de nuestro trabajo esté basado en lo que
podríamos llamar “prueba y error”, sabemos que no puede existir la prueba y error sin el error, y
no puede existir el error sin que alguien o algo nos diga que estamos en un error.
Llegando precisamente a este punto en el que necesitamos de una guía o un
acompañamiento a través de la creación y estructuración de un buen proyecto, podemos encontrar
como algunas muy buenas herramientas, el uso de algunas aplicaciones para desarrollar
programas, en vez de utilizar el no muy confiable o agradable archivo de texto.
Aun teniendo cada una de estas grandes herramientas que nos ayudan a detectar, nos dan
opciones para corregir nuestras equivocaciones, aportan rutas más fáciles para la creación de
código e incluso al momento de ejecutar y compilar el programa completo nos dicen el lugar
exacto en el que estamos cometiendo un error. Hay momentos en los que nos es completamente
imposible identificar el error que tenemos presente.
La realidad es que ninguno de nosotros somos completamente capaces de generar un
código cien por ciento libre de errores, ya que no tenemos la capacidad de reconocimiento y
memoria de cada una de estas ya mencionadas herramientas, sino que conocemos las sentencias
principales y las órdenes básicas que un programa debe llevar por lo menos para declarar
variables, reconocer algunas operaciones básicas o manipular cadenas de caracteres con las
operaciones más simples o comunes que conocemos.
Para realizar otro tipo de operaciones, generar una variedad de extensiones o incluso
importar o crear ciertas paqueterías, tenemos las maravillas de alguien más que decidió hacernos
la vida mucho más fácil, y con estos increíbles trabajos también podemos encontrar las palabras,
caracteres y funciones que nuestro programa o más bien lenguaje pueden reconocer (que no
siempre nos salvan la vida, pero sí son de gran ayuda).
3
2 Generación de Código Intermedio
2.1 Notaciones
Los símbolos son la base para expresar oraciones bien definidas. El símbolo más utilizado
es para expresar operaciones aritméticas. Las expresiones aritméticas se pueden expresar de tres
formas diferentes: infijo, prefijo y sufijo.
La diversidad de símbolos se corresponde con el hecho de que, en algunos casos, un tipo
de símbolo es más simple. La notación también depende de la forma en que se atraviesa el árbol
de sintaxis, que se puede ordenar, pre o post. Existe una relación de uno a uno con el símbolo del
operador.
2.1.1 Prefija
La Expresión o Notación PreFija nos indica que el operador va antes de los operandos sus
características principales son:
• Los operandos conservan el mismo orden que la notación infija equivalente.
• No requiere de paréntesis para indicar el orden de precedencia de operadores.
• Se evalúa de izquierda a derecha hasta que encontrar el primer operador seguido
inmediatamente de un par de operandos.
• Se evalúa la expresión binaria y el resultado se cambia como un nuevo operando. Se
repite este hasta que nos quede un solo resultado.
2.1.2 Infija
La Expresión o Notación Infija es la forma más común que utilizamos para escribir
expresiones matemáticas, refiere que el operador esta entre los operandos. La notación infija
puede estar completamente entre paréntesis o puede basarse en un esquema de precedencia de
operadores así como el uso de paréntesis para invalidar los arreglos al expresar el orden de
evaluación de una expresión:
3*4=12
3*4+2=14
3*(4+2)=18
4
2.1.3 Postfija
Como su nombre lo indica se refiere a que el operador ocupa la posición después de los
operandos sus características principales son:
• El orden de los operandos se conserva igual que la expresión infija equivalente.
• No utiliza paréntesis ya que no es una operación ambigua.
• La operación posfija no es exactamente lo inverso a la operación prefija equivalente:
(A+B)*C AB+C*
5
2.2.2 Código P
Hace referencia a máquinas que utilizan o se auxilian de pilas para generar código objeto.
En muchos casos, la “P” es asociada a un código portable, el que garantiza que el código
compilado en una máquina se pueda ejecutar en otras.
Para garantizar la portabilidad del código se necesita que el lenguaje esté estandarizado
por algún instituto y que dicho código no tenga extensiones particulares.
También es recomendada la no utilización de características especiales exclusivas de
alguna arquitectura de computadoras en particular.
2.2.3 Triplos
Las proposiciones de tres direcciones se parecen mucho al ensamblador, el que es un
lenguaje intermedio más entendible para la máquina.
Las estructuras de control (if, switch, while, do-while, for) sin realmente etiquetas go to
disfrazadas.
El problema de usar cuádruplos radica en que se tienen que colocar los valores temporales
en la tabla de símbolos.
Con una estructura de tres campos, se pueden omitir los valores temporales, dicha
estructura recibe el nombre de triplos y tiene los campos:
• Op
• Arg1
• Arg2
Generalmente el código que generan los triples recibe el nombre de código de dos
direcciones, aunque en ocasiones puede variar. Cuando se utilizan triples se ocupan punteros a la
misma estructura de los triples.
• b t1 t2 //cuádruplos
• b (0) //triple
6
detecte como falsa toda la expresión es falsa, en el caso del operador OR si se encuentra una
condición verdadera todo será verdadero.
La notación de tres direcciones es una forma abstracta de código intermedio. Esta
notación se puede implementar como registros con campos para el operador y operadores.
2.2.4 Cuádruplos
Es una estructura tipo registro con cuatros campos que se llaman:
• Op (Con un código intermedio)
• arg1
• arg2
• resultado
7
2.3.4 Instrucciones de Control
Esta forma de programación solo le permite resolver problemas simples. Para resolver
problemas más complejos, es posible que nos interese ejecutar determinadas instrucciones u otras
instrucciones, según el valor de los datos.
Una descripción condicional nos permitirá representar este tipo de comportamiento.
Sentencias IF y SWITCH. En otros casos, encontramos que necesitamos repetir una o más
instrucciones un número específico de veces.
En estos casos, usaremos instrucciones de control iterativas o repetidas (bucles).
Declaraciones WHILE, DO-WHILE y FOR.
2.3.5 Funciones
Las funciones pueden reducir a en línea, lo que se hace es expander el código original de
la función. Las funciones se descomponen simplificando los parámetros de manera individual al
igual que el valor de retorno.
2.3.6 Estructuras
Implica agrupar componentes léxicos en frases gramaticales, y el compilador usa estas
frases gramaticales para sintetizar la salida. Las frases gramaticales generalmente se representan
mediante árboles de análisis sintáctico.
Muchos lenguajes usan reglas para definir proposiciones de forma recursiva. Por ejemplo:
si identificador1 es un identificador y expresión2 es un identificador, entonces:
Identificador1 = expresión2 Si expresión1 es una expresión y proposición2 es una
proposición, entonces:
while (expresión1) realiza una posición2 Si (expresión1), entonces la función de análisis
lineal (léxico) de la proposición 2 no es suficiente para analizar proposiciones o expresiones
recursivas. Cuando las construcciones del lenguaje fuente son recursivas, es factible formalizar la
recursividad usando una gramática libre de contexto.
8
Conclusion
What would we do if we couldn't see our mistakes? That is the biggest issue that we could
imagine. We are available to make mistakes once, twice, third, or a million more times. The
problem when we make mistakes is when we can't see it.
Maybe in a current way in our life, we forget to do something or take a thing from the
table in the kitchen, or something like that usual mistakes. But at any time in the day, we will
notice about it even if we don't, it doesn't represent the end of the world.
Another case is an app. If we start to program and we aren't available to see that we have a
mistake, all the programs will fail. In that situation, we are sure in big troubles.
Of course, nothing of that could be possible if we hadn't found the best way to help
ourselves, but anyway, all that thigs as regular expressions are the things that make our life so
easy to make other life easy.
Now all that we have to do is try our best to make the fewer mistakes possible even if we
have a powerful tool as regular expressions.
9
Referencias
• Ullman, J. D. et al. (2007) Introducción a la teoría de autómatas, lenguajes y computación (3ª.
Ed.). Madrid: Pearson Educación. Disponible en: ELibro (Accediso: 07.04.2021)
• Prog-de-sistemas.blogspot.com. 2021. Notaciones Infija,prefija y posfija. [online] Available at:
<http://prog-de-sistemas.blogspot.com/2008/11/notaciones-infijaprefija-y-posfija.html>
[Accessed 7 April 2021].
• Olivares Rojas, J., 2021. Generación de Código Intermedio. [online] Dsc.itmorelia.edu.mx.
Available at: <http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u6> [Accessed 8
April 2021].
10
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
• Contiene portada con las especificaciones (Nombre
del Docente, Nombre del Estudiante, # de control,
grupo y tema a investigar).
• Faltas de Ortografía.
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
• No se puede utilizar
a = b + c * d; • Permite abstraer la
el modelo de una
El generador de código máquina, separar
pasada.
Existen maneras “formales” intermedio, tratar de operaciones de
• Dificulta llevar a
de representar el código dividir esta expresión alto nivel de su
cabo optimizaciones
intermedio. Ese tipo de en sub-expresiones y, a implementación a
específicas de la
REPRESENTACIONES notaciones simplifican la continuación, generar bajo nivel.
arquitectura destino.
DE CÓDIGO traducción de nuestro código el código • Permite la
• Suele ser ortogonal
INTERMEDIO fuente a nuestro código correspondiente. reutilización de los
a la máquina
objeto ya que ahorran y front-ends y back-
destino.
acotan símbolos de la tabla r1 = c * d; ends;
• La traducción a una
de símbolos. r2 = b + r1; • Permite
arquitectura
r3 = r2 + r1; optimizaciones
específica será más
a = r3 generales.
larga e ineficiente.
La generación de • facilita la escritura
código para las de compiladores
sentencias if-then e if- para distintas
then-else pasa por máquinas.
entender a través de • La traducción del • Problema de
Estrategias o acciones que se un esquema la forma lenguaje a código complejidad
ESQUEMAS DE deberán realizarse y tomarse en la que este se intermedio sería • Variables pueden
GENERACIÓN en cuenta en el momento de genera. idéntica en todas y ser modificadas en
generar código intermedio. Empecemos por el de lo único que cualquier parte del
la sentencia S1 → if E cambiaría sería el programa
then S2: traductor de
código intermedio
a código de
máquina.
Referencias
• Ullman, J. D. et al. (2007) Introducción a la teoría de autómatas, lenguajes y
computación (3ª. Ed.). Madrid: Pearson Educación. Disponible en: ELibro
(Accediso: 07.04.2021)
• Prog-de-sistemas.blogspot.com. 2021. Notaciones Infija,prefija y posfija. [online]
Available at: <http://prog-de-sistemas.blogspot.com/2008/11/notaciones-
infijaprefija-y-posfija.html> [Accessed 7 April 2021].
• Olivares Rojas, J., 2021. Generación de Código Intermedio. [online]
Dsc.itmorelia.edu.mx. Available at:
<http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u6> Accessed 8 April
2021].
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
Identifica todos los elementos de
Establece los elementos
comparación. Las características
y las características a
elegidas son suficientes y
comparar
pertinentes.
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
FORMULARIO DE INICIO
Se muestra la pantalla de inicio del compilador, misma que contiene los datos
principales y dos botones de interacción: los botones “INICIO” y “SALIR”.
BOTÓN SALIR
Al dar click en el botón inicio, se despliega un cuadro de diálogo con la leyenda
“¿Desea Cerrar el Compilador?”.
Una vez que el usuario haga click en el cuadro de texto, se habilitará el botón
“ANALIZAR”.
BONTÓN “←”
En caso de que el usuario escriba mal un carácter en el cuadro de texto de expresión,
el usuario puede corregirlo con el botón “←”.
BOTÓN “LIMPIAR”
Una vez que todo el compilador esté programado, en el momento en el que se necesite
limpiar todos los campos del formulario, el usuario puede utilizar el botón “LIMPIAR” para
borrar la información y ocultar el resto de los componentes del formulario. De igual manera,
se volverá a deshabilitar el botón “COMPILAR”.
Module Module1
Public valor(30) As String
Public valo(30) As String
Public simbolo(31) As String
Public imp As String
Public resultado As Object
Public ss As String
Public orden As Integer
Public orde As Integer
Public op As Integer
Public token As String
Public contador As Integer
Public tama As Integer, m As Integer
Public pru As String, res As String, operacion As String, s As String
Public i As Integer, o As Integer, lim As Integer, a As Integer, se As Integer,
ats As Integer, repetision As Integer, veces As Integer
Public vez As Boolean
Public basura As String, basura2 As String, cd As String
Public des As Integer, z As Integer
Public ordn As Boolean
Public dis As Integer, dr As Integer
Public daf As Integer, x As Integer
End Module
Option Strict On
Imports System.CodeDom.Compiler
Imports System.Reflection
Public Class ModuleCodeDom
Shared Function Eval(ByVal expresion As String) As Object
Dim CrLf As String = Environment.NewLine
cpar.GenerateInMemory = True
cpar.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
Dim ty As System.Type =
res.CompiledAssembly.GetType("MiNamespace.MiClase")
End Function
End Class
Dentro del formulario número 2, declaramos variables adicionales para su uso en los
siguientes procedimientos.
expresion = Nothing
tam = Nothing
caracter = Nothing
operandos = Nothing
operadores = Nothing
numeros = Nothing
simbolos = Nothing
End Sub
Método “Análisis”
Public Sub Analisis()
daf = 0
cd = 0
op = 0
a = 0
o = 0
lim = 0
dr = 0
se = 0
veces = 0
x = 0
ats = 0
token = Mid(imp, 1, 1)
If o = 1 Then
For x = 0 To tama
token = Mid(imp, x, 1)
If token <> ")" Then
op = op + 1
ElseIf token = ")" Then
lim = x
Exit For
End If
Next
Label1.Text = op
daf = tama - op + 1
operacion = Mid(imp, 2, op - 1)
basura = Mid(imp, lim + 1, daf)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
Else
For x = 1 To tama
token = Mid(imp, x, 1)
If token <> "(" Then
op = op + 1
Else
Exit For
End If
Next
For a = op + 1 To tama
token = Mid(imp, a, 1)
If token <> ")" Then
lim = lim + 1
m = lim
Else
Exit For
End If
Next
se = lim + op + 1
basura = Mid(imp, 1, op)
operacion = Mid(imp, op + 2, lim - 1)
If se = tama Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(operacion)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
Else
ats = tama - res
basura2 = Mid(imp, se + 1, ats)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(operacion)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
End If
End If
End Sub
Método “Suma”
Public Sub Suma()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Then
x = i
m = i
While x > 1
token = Mid(imp, x + 1, 1)
If token = "+" Or token = "-" Then
Exit While
Else
lim = lim + 1
End If
x = x + 1
End While
Exit For
End If
Next
dis = lim + m
operacion = Mid(imp, 1, dis)
z = tama - m
basura = Mid(imp, dis + 1, z)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
End Sub
Método “Resta”
Public Sub Resta()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "-" Then
x = i
m = i
While x > 1
token = Mid(imp, x + 1, 1)
If token = "+" Or token = "-" Then
Exit While
Else
lim = lim + 1
End If
x = x + 1
End While
Exit For
End If
Next
dis = lim + m
operacion = Mid(imp, 1, dis)
z = tama - m
basura = Mid(imp, dis + 1, z)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
End Sub
Método “Multiplicación”
Public Sub Multiplicar()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Or token = "-" Or token = "/" Then
o = 1
Exit For
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "*" Then
x = i
m = i
While x > 1
token = Mid(imp, x, 1)
If token = "+" Or token = "-" Or token = "/" Then
z = x
Exit While
Else
lim = lim + 1
End If
x = x - 1
End While
While m <= tama
token = Mid(imp, m, 1)
If token = "+" Or token = "-" Or token = "/" Then
Exit While
Else
des = des + 1
End If
m = m + 1
End While
Exit For
End If
Next
s = lim + des
If o = 1 Then
operacion = Mid(imp, z + 1, s - 1)
basura = Mid(imp, 1, z)
ss = basura + operacion
dis = tama - Len(ss)
If dis = 0 Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
Else
basura2 = Mid(imp, Len(ss) + 1, dis)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
Else
dr = s
While dr > tama
op = op + 1
dr = dr + 1
End While
operacion = Mid(imp, 1, s)
basura = Mid(imp, s + 1, op)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
End Sub
Método “División”
Public Sub Dividir()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Or token = "-" Or token = "*" Then
o = 1
Exit For
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "/" Then
x = i
m = i
While x > 1
token = Mid(imp, x, 1)
If token = "+" Or token = "-" Or token = "*" Then
z = x
Exit While
Else
lim = lim + 1
End If
x = x - 1
End While
While m <= tama
token = Mid(imp, m, 1)
If token = "+" Or token = "-" Or token = "*" Then
Exit While
Else
des = des + 1
End If
m = m + 1
End While
Exit For
End If
Next
s = lim + des
If o = 1 Then
operacion = Mid(imp, z + 1, s - 1)
basura = Mid(imp, 1, z)
ss = basura + operacion
dis = tama - Len(ss)
If dis = 0 Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
Else
basura2 = Mid(imp, Len(ss) + 1, dis)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
Else
dr = s
While dr > tama
op = op + 1
dr = dr + 1
End While
operacion = Mid(imp, 1, s)
basura = Mid(imp, s + 1, op)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
End Sub
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
• El alumno muestra la interfaz del compilador
siendo única y no repetida en su estilo.
• Entrega las capturas de pantalla realizadas en
Presentación esta fase en el formato de evidencias
previamente requisitado.
• El trabajo fue realizado las estrategias vistas
en clase y asignadas por el docente dentro de
las sesiones de la asignatura.
• La interfaz gráfica es adecuada empleando
Diseño grafico colores y matices adecuados dentro del
desarrollo.
• La fase 2 del compilador cumple con realizar la
validación correcta de los operadores, de
Estructura y acuerdo con los datos ingresados.
orden • La fase 2 del compilador cumple con realizar la
validación de los operandos de acuerdo con los
datos ingresados
• El analizador es realizado en Visual Basic 2012
Software
o superior.
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
COMPETENCIA 3
Competencia específica: 3. Conoce e identifica los diferentes tipos de optimización que
permita eficientar el código intermedio
Indicadores de alcance:
Temas y subtemas:
Investigación Documental
“Conoce e identifica los diferentes tipos de optimización que permita eficientar el
código intermedio”
Asignatura:
Lenguajes y Autómatas II
Elaborado por:
Marya Fernanda Bautista Monter 183107254
Docente:
Ing. Brayan Antonio Mejía Díaz
Grupo:
363-M
Período: 2021-1
Contenido
Introducción ..................................................................................................................................... 3
3 Conoce e identifica los diferentes tipos de optimización que permita eficientar el código
intermedio......................................................................................................................................... 4
3.1 Tipos de Optimización ........................................................................................................... 4
3.1.1 Locales ....................................................................................................................... 4
3.1.2 Ciclos .......................................................................................................................... 4
3.1.3 Globales ...................................................................................................................... 5
3.1.4 De mirilla.................................................................................................................... 5
3.2 Costos ................................................................................................................................ 5
3.2.1 Costos de ejecución (memoria, registros, pilas .......................................................... 5
3.2.2 Criterios para mejorar el código ................................................................................. 6
3.2.3 Herramientas para el análisis del flujo de datos ......................................................... 6
Conclusion ........................................................................................................................................ 7
Referencias ....................................................................................................................................... 8
Introducción
Definitivamente la mejor forma de programar es teniendo en cuenta que probablemente el
ochenta por ciento de nuestras líneas de código (o más), tengan por lo menos un error, o en algún
momento nos marcaran el bello y diminuto zigzag rojo debajo de nuestra sentencia.
A pesar de que el ochenta o noventa por ciento de nuestro trabajo esté basado en lo que
podríamos llamar “prueba y error”, sabemos que no puede existir la prueba y error sin el error, y
no puede existir el error sin que alguien o algo nos diga que estamos en un error.
Llegando precisamente a este punto en el que necesitamos de una guía o un
acompañamiento a través de la creación y estructuración de un buen proyecto, podemos encontrar
como algunas muy buenas herramientas, el uso de algunas aplicaciones para desarrollar
programas, en vez de utilizar el no muy confiable o agradable archivo de texto.
Aun teniendo cada una de estas grandes herramientas que nos ayudan a detectar, nos dan
opciones para corregir nuestras equivocaciones, aportan rutas más fáciles para la creación de
código e incluso al momento de ejecutar y compilar el programa completo nos dicen el lugar
exacto en el que estamos cometiendo un error. Hay momentos en los que nos es completamente
imposible identificar el error que tenemos presente.
La realidad es que ninguno de nosotros somos completamente capaces de generar un
código cien por ciento libre de errores, ya que no tenemos la capacidad de reconocimiento y
memoria de cada una de estas ya mencionadas herramientas, sino que conocemos las sentencias
principales y las órdenes básicas que un programa debe llevar por lo menos para declarar
variables, reconocer algunas operaciones básicas o manipular cadenas de caracteres con las
operaciones más simples o comunes que conocemos.
Para realizar otro tipo de operaciones, generar una variedad de extensiones o incluso
importar o crear ciertas paqueterías, tenemos las maravillas de alguien más que decidió hacernos
la vida mucho más fácil, y con estos increíbles trabajos también podemos encontrar las palabras,
caracteres y funciones que nuestro programa o más bien lenguaje pueden reconocer (que no
siempre nos salvan la vida, pero sí son de gran ayuda).
3
3 Conoce e identifica los diferentes tipos de optimización que
permita eficientar el código intermedio
3.1 Tipos de Optimización
Es el conjunto de fases de un compilador que transforman un fragmento de código en otro
fragmento con un comportamiento equivalente y que se ejecuta de forma más eficiente, es decir,
usando menos recursos de cálculo como memoria o tiempo de ejecución.
Las optimizaciones pueden realizarse de diferentes formas con base al alcance ofrecido
por el compilador. Depende del lenguaje de programación y es directamente proporcional al
tiempo de compilación.
Este es un proceso que tiende a minimizar o maximizar alguna variable de rendimiento,
generalmente tiempo, espacio, procesador, etc. La optimización se realiza reestructurando el
código de forma que el nuevo código tenga mayores beneficios.
3.1.1 Locales
Se realiza sobre módulos del programa. En la mayoría de las ocasiones a través de
funciones, métodos, procedimientos, clases, etc. Solo se ven reflejadas en las secciones locales.
Sirve cuando un bloque de programa o sección es crítico. Como el espacio de soluciones
es más pequeño, la optimización local es más rápida.
3.1.2 Ciclos
Se trata de una de las partes más esenciales en el rendimiento de un programa, dado que
realizan acciones repetitivas, y si dichas acciones están mal realizadas, el problema puede crecer
mucho más.
La mayoría de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben
repetirse en un ciclo.
El problema de la optimización en ciclos y en general radica es que muy difícil saber el
uso exacto de algunas instrucciones. Así que no todo código de proceso puede ser optimizado.
Otros usos de la optimización pueden ser el mejoramiento de consultas en SQL o en
aplicaciones remotas
4
3.1.3 Globales
Dada con respecto al código completo.
Este tipo de optimización es más lenta, pero tiene la capacidad de mejorar el desempeño
general de todo el programa y puede depender de la arquitectura de la máquina.
En algunos casos es mejor mantener variables globales para agilizar los procesos, pero
consume memoria. Algunas optimizaciones incluyen utilizar como variables registros del CPU o
utilizar instrucciones en ensamblador.
3.1.4 De mirilla
La optimización de mirilla trata de estructurar de manera eficiente el flujo del programa,
sobre todo en instrucciones de bifurcación como son las decisiones, ciclos y saltos de rutinas. La
idea es tener los saltos lo más cerca de las llamadas, siendo el salto lo más pequeño posible.
3.2 Costos
Los costos son el factor más importante para tomar en cuenta a la hora de optimizar ya
que en ocasiones la mejora obtenida puede verse no reflejada en el programa final, pero si ser
perjudicial para el equipo de desarrollo.
La optimización de una pequeña mejora tal vez tenga una pequeña ganancia en tiempo o
espacio, pero sale muy costosa en tiempo en generarla. Pero en cambio si esa optimización se
hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se
minimiza y es benéfico la mejora.
3.2.1 Costos de ejecución (memoria, registros, pilas
Son aquellos que vienen implícitos al ejecutar el programa. En algunos programas se tiene
un mínimo para ejecutar el programa, por lo que el espacio y la velocidad de microprocesadores
son elementos que se deben optimizar para tener un mercado potencial más amplio.
Las aplicaciones multimedia como los videojuegos tienen un costo de ejecución alto por
lo cual la optimización de su desempeño es crítica, la gran mayoría de las veces requieren de
procesadores rápidos o de mucha memoria.
Los dispositivos móviles tienen recursos más limitados que un dispositivo de cómputo
convencional razón por la cual, el mejor uso de memoria y otros recursos de hardware tiene
mayor rendimiento.
5
3.2.2 Criterios para mejorar el código
Los criterios de optimización siempre están definidos por el compilador.
La mejor manera de optimizar el código es hacer ver a los programadores que optimicen
su código desde el inicio, el problema radica en que el costo podría ser muy grande ya que tendría
que codificar más y/o hacer su código más legible.
Muchos de estos criterios pueden modificarse con directivas del compilador desde el
código o de manera externa. Este proceso lo realizan algunas herramientas del sistema como los
ofuscadores para código móvil y código para dispositivos móviles.
Depurador
Es una aplicación que permite correr otros programas, permitiendo al usuario ejercer
cierto control sobre los mismos a medida que los estos se ejecutan, y examinar el estado del
sistema (variables, registros, banderas, etc.) en el momento en que se presente algún problema.
Éste permite detener el programa en:
• Un punto determinado mediante un punto de ruptura.
• Un punto determinado bajo ciertas condiciones mediante un punto de ruptura condicional.
• Un momento determinado cuando se cumplan ciertas condiciones.
• Un momento determinado a petición del usuario.
6
Desamblador
Es un programa de computadora que traduce el lenguaje de máquina a lenguaje
ensamblador, la operación inversa de la que hace el ensamblador.
Un desensamblador se diferencia de un decompilador, en que está dirigido a un lenguaje
de alto nivel en vez de al lenguaje ensamblador.
Son ampliamente utilizados para crackear programas y para realizar ingeniería inversa.
También son utilizados por desarrolladores de software, investigadores o estudiantes.
Conclusion
What would we do if we couldn't see our mistakes? That is the biggest issue that we could
imagine. We are available to make mistakes once, twice, third, or a million more times. The
problem when we make mistakes is when we can't see it.
Maybe in a current way in our life, we forget to do something or take a thing from the
table in the kitchen, or something like that usual mistakes. But at any time in the day, we will
notice about it even if we don't, it doesn't represent the end of the world.
Another case is an app. If we start to program and we aren't available to see that we have a
mistake, all the programs will fail. In that situation, we are sure in big troubles.
Of course, nothing of that could be possible if we hadn't found the best way to help
ourselves, but anyway, all that thigs as regular expressions are the things that make our life so
easy to make other life easy.
Now all that we have to do is try our best to make the fewer mistakes possible even if we
have a powerful tool as regular expressions.
7
Referencias
• Ullman, J. D. et al. (2007) Introducción a la teoría de autómatas, lenguajes y computación (3ª.
Ed.). Madrid: Pearson Educación. Disponible en: ELibro (Accediso: 28.04.2021)
• Clarisó, R., 2021. Optimización de código: un código más eficiente - Tecnología++. [online]
Tecnología++. Available at: <https://informatica.blogs.uoc.edu/optimizacion-de-codigo-un-
codigo-mas-eficiente/> [Accessed 28 April 2021].
• Olivares Rojas, J., 2021. Unidad VII Otimización. [online] Dsc.itmorelia.edu.mx. Available at:
<http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u7.pdf> [Accessed 29 April
2021].
• Lenguajes y Autómatas 2, 2020. 3.2.3 Herramientas para Análisis del Flujo de Datos. [online]
Blogspot. Available at: <https://equiponegro8.blogspot.com/2020/03/3_53.html> [Accessed
28 April 2021].
8
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
• Contiene portada con las especificaciones (Nombre
del Docente, Nombre del Estudiante, # de control,
grupo y tema a investigar).
• Faltas de Ortografía.
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
Criterios de evaluación:
.
CRITERIOS DE
SI NO OBSERVACIONES
EVALUACIÓN
El concepto principal es adecuado y
Concepto pertinente con el tema y la pregunta de
principal enfoque.
El mapa conceptual incluye todos los
conceptos importantes que representa la
Conceptos información principal del tema o pregunta de
subordinados enfoque. No repite conceptos
Clasificación de conceptos
presentados de manera
lógica, estos se encuentran
Conexión de relacionados unos con otros a través de
conceptos palabras claves
y /o conectores, de tal manera que resulta
fácil su comprensión
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
FORMULARIO DE INICIO
Se muestra la pantalla de inicio del compilador, misma que contiene los datos
principales y dos botones de interacción: los botones “INICIO” y “SALIR”.
BOTÓN SALIR
Al dar click en el botón inicio, se despliega un cuadro de diálogo con la leyenda
“¿Desea Cerrar el Compilador?”.
Ilustración 5. Botón Salir
BONTÓN “←”
En caso de que el usuario escriba mal un carácter en el cuadro de texto de expresión,
el usuario puede corregirlo con el botón “←”.
Ilustración 11. Texto con error
BOTÓN “LIMPIAR”
Una vez que todo el compilador esté programado, en el momento en el que se necesite
limpiar todos los campos del formulario, el usuario puede utilizar el botón “LIMPIAR” para
borrar la información y ocultar el resto de los componentes del formulario. De igual manera,
se volverá a deshabilitar el botón “COMPILAR”.
Ilustración 13. Botón limpiar
BOTÓN REGRESAR
Al dar click en el botón “REGRESAR”, se despliega un cuadro de diálogo con la
leyenda “¿Desea volver a la ventana inicial del compilador?”.
Module Module1
Public valor(30) As String
Public valo(30) As String
Public simbolo(31) As String
Public imp As String
Public resultado As Object
Public ss As String
Public orden As Integer
Public orde As Integer
Public op As Integer
Public token As String
Public contador As Integer
Public tama As Integer, m As Integer
Public pru As String, res As String, operacion As String, s As String
Public i As Integer, o As Integer, lim As Integer, a As Integer, se As Integer,
ats As Integer, repetision As Integer, veces As Integer
Public vez As Boolean
Public basura As String, basura2 As String, cd As String
Public des As Integer, z As Integer
Public ordn As Boolean
Public dis As Integer, dr As Integer
Public daf As Integer, x As Integer
End Module
Option Strict On
Imports System.CodeDom.Compiler
Imports System.Reflection
Public Class ModuleCodeDom
Shared Function Eval(ByVal expresion As String) As Object
Dim CrLf As String = Environment.NewLine
cpar.GenerateInMemory = True
cpar.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll")
Dim ty As System.Type =
res.CompiledAssembly.GetType("MiNamespace.MiClase")
End Function
End Class
Dentro del formulario número 2, declaramos variables adicionales para su uso en los
siguientes procedimientos.
expresion = Nothing
tam = Nothing
caracter = Nothing
operandos = Nothing
operadores = Nothing
numeros = Nothing
simbolos = Nothing
End Sub
Método “Análisis”
Public Sub Analisis()
daf = 0
cd = 0
op = 0
a = 0
o = 0
lim = 0
dr = 0
se = 0
veces = 0
x = 0
ats = 0
token = Mid(imp, 1, 1)
If o = 1 Then
For x = 0 To tama
token = Mid(imp, x, 1)
If token <> ")" Then
op = op + 1
ElseIf token = ")" Then
lim = x
Exit For
End If
Next
Label1.Text = op
daf = tama - op + 1
operacion = Mid(imp, 2, op - 1)
basura = Mid(imp, lim + 1, daf)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
Else
For x = 1 To tama
token = Mid(imp, x, 1)
If token <> "(" Then
op = op + 1
Else
Exit For
End If
Next
For a = op + 1 To tama
token = Mid(imp, a, 1)
If token <> ")" Then
lim = lim + 1
m = lim
Else
Exit For
End If
Next
se = lim + op + 1
basura = Mid(imp, 1, op)
operacion = Mid(imp, op + 2, lim - 1)
If se = tama Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(operacion)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
Else
ats = tama - res
basura2 = Mid(imp, se + 1, ats)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(operacion)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
imp = imp
tama = Len(imp)
End If
End If
End Sub
Método “Suma”
Public Sub Suma()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Then
x = i
m = i
While x > 1
token = Mid(imp, x + 1, 1)
If token = "+" Or token = "-" Then
Exit While
Else
lim = lim + 1
End If
x = x + 1
End While
Exit For
End If
Next
dis = lim + m
operacion = Mid(imp, 1, dis)
z = tama - m
basura = Mid(imp, dis + 1, z)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
End Sub
Método “Resta”
Public Sub Resta()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "-" Then
x = i
m = i
While x > 1
token = Mid(imp, x + 1, 1)
If token = "+" Or token = "-" Then
Exit While
Else
lim = lim + 1
End If
x = x + 1
End While
Exit For
End If
Next
dis = lim + m
operacion = Mid(imp, 1, dis)
z = tama - m
basura = Mid(imp, dis + 1, z)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
End Sub
Método “Multiplicación”
Public Sub Multiplicar()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Or token = "-" Or token = "/" Then
o = 1
Exit For
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "*" Then
x = i
m = i
While x > 1
token = Mid(imp, x, 1)
If token = "+" Or token = "-" Or token = "/" Then
z = x
Exit While
Else
lim = lim + 1
End If
x = x - 1
End While
While m <= tama
token = Mid(imp, m, 1)
If token = "+" Or token = "-" Or token = "/" Then
Exit While
Else
des = des + 1
End If
m = m + 1
End While
Exit For
End If
Next
s = lim + des
If o = 1 Then
operacion = Mid(imp, z + 1, s - 1)
basura = Mid(imp, 1, z)
ss = basura + operacion
dis = tama - Len(ss)
If dis = 0 Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
Else
basura2 = Mid(imp, Len(ss) + 1, dis)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
Else
dr = s
While dr > tama
op = op + 1
dr = dr + 1
End While
operacion = Mid(imp, 1, s)
basura = Mid(imp, s + 1, op)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
End Sub
Método “División”
Public Sub Dividir()
o = 0
m = 0
x = 0
z = 0
lim = 0
dis = 0
s = 0
dr = 0
op = 0
des = 0
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "+" Or token = "-" Or token = "*" Then
o = 1
Exit For
For i = 1 To tama
token = Mid(imp, i, 1)
If token = "/" Then
x = i
m = i
While x > 1
token = Mid(imp, x, 1)
If token = "+" Or token = "-" Or token = "*" Then
z = x
Exit While
Else
lim = lim + 1
End If
x = x - 1
End While
While m <= tama
token = Mid(imp, m, 1)
If token = "+" Or token = "-" Or token = "*" Then
Exit While
Else
des = des + 1
End If
m = m + 1
End While
Exit For
End If
Next
s = lim + des
If o = 1 Then
operacion = Mid(imp, z + 1, s - 1)
basura = Mid(imp, 1, z)
ss = basura + operacion
dis = tama - Len(ss)
If dis = 0 Then
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
Else
basura2 = Mid(imp, Len(ss) + 1, dis)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = basura + res + basura2
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
Else
dr = s
While dr > tama
op = op + 1
dr = dr + 1
End While
operacion = Mid(imp, 1, s)
basura = Mid(imp, s + 1, op)
resultado = ModuleCodeDom.Eval(operacion)
res = Convert.ToString(resultado)
imp = res + basura
txtOperacion.AppendText(imp & vbCrLf)
tama = Len(imp)
End If
End Sub
expresion = TxtExpresion.Text
tam = Len(expresion)
lblCaracteres.Visible = True
txtCaracteres.Visible = True
Case Else
txtCaracteres.AppendText(caracter & " No autenticado" & vbCrLf)
MessageBox.Show("Los valores ingresados no han sido
autenticados", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
txtOperacion.Visible = False
txtOperadores.Visible = False
txtOperandos.Visible = False
lblOperacion.Visible = False
lblOperadores.Visible = False
lblOperandos.Visible = False
Exit Sub
End Select
Next
tam = Len(operandos)
lblOperandos.Visible = True
txtOperandos.Visible = True
For i As Integer = 1 To tam
numeros = Mid(operandos, i, 1)
txtOperandos.AppendText(numeros & vbCrLf)
Next
tam = Len(operadores)
lblOperadores.Visible = True
txtOperadores.Visible = True
For i As Integer = 1 To tam
simbolos = Mid(operadores, i, 1)
txtOperadores.AppendText(simbolos & vbCrLf)
Next
Ilustración 18. Pantalla al dar click en "Analizar"
Por último, programamos el botón “Compila”, que es el que nos mostrará la resolución de la
operación que hemos ingresado; esto a través de los procedimientos que ya creamos de “Suma”,
“Resta”, “Multiplicación” y “División”.
txtOperacion.Clear()
lblOperacion.Visible = True
txtOperacion.Visible = True
ordn = True
imp = TxtExpresion.Text
tama = Len(imp)
txtOperacion.AppendText(imp & vbCrLf)
For x = 1 To tama
token = Mid(imp, x, 1)
If token = "/" Then
Dividir()
GoTo fin
Exit For
ElseIf token = "*" Then
Multiplicar()
GoTo fin
End If
Next
For x = 1 To tama
token = Mid(imp, x, 1)
If token = "+" Then
Suma()
GoTo fin
Exit For
ElseIf token = "-" Then
Resta()
GoTo fin
End If
Next
fin: End If
End While
Ilustración 19. Pantalla al dar click en “Compila”
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
FORMULARIO DE CARGA
Se muestra la pantalla de inicio del chat bot, misma que contiene la leyenda
“Cargando la matriz operativa de Baymax” “Espere…”, así como una barra de carga que
indicará la apertura del formulario 2.
Ilustración 2. Formulario 2
BOTÓN SALIR
Al dar click en el botón inicio, se despliega un cuadro de diálogo con la leyenda
“¿Desea Cerrar el ChatBot?”.
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
COMPETENCIA 4
Competencia específica: 4. Utiliza un lenguaje de bajo nivel para traducir el código
construido a lenguaje máquina para su ejecu-ción.
Indicadores de alcance:
A. Conoce las bases del lenguaje de bajo nivel para la traducción de un código intermedio
B. Desarrolla las bases del lenguaje de bajo nivel para la traducción de un código
intermedio (ChatBot)
Temas y subtemas:
4.1 Registros.
4.2 Lenguaje ensamblador.
4.3 Lenguaje máquina.
4.4 Administración de memoria.
DIVISIÓN DE INGENIERIA EN SISTEMAS COMPUTACIONALES
Investigación Documental
“Utiliza un lenguaje de bajo nivel para traducir el código construido a lenguaje
máquina para su ejecución”.
Asignatura:
Lenguajes y Autómatas II
Elaborado por:
Marya Fernanda Bautista Monter 183107254
Docente:
Ing. Brayan Antonio Mejía Díaz
Grupo:
363-M
Período: 2021-1
Contenido
Introducción ..................................................................................................................................... 3
4 GENERACIÓN DE CÓDIGO INTERMEDIO ....................................................................... 4
4.1 Registros ............................................................................................................................ 4
4.2 Lenguaje Ensamblador ...................................................................................................... 4
4.2.1 Ensambladores Básicos .............................................................................................. 5
4.2.2 Ensambladores Modulares ......................................................................................... 5
4.3 Lenguaje Máquina ............................................................................................................. 5
4.4 Administración de Memoria .............................................................................................. 6
Conclusion ........................................................................................................................................ 7
Referencias ....................................................................................................................................... 7
Introducción
Definitivamente la mejor forma de programar es teniendo en cuenta que probablemente el
ochenta por ciento de nuestras líneas de código (o más), tengan por lo menos un error, o en algún
momento nos marcaran el bello y diminuto zigzag rojo debajo de nuestra sentencia.
A pesar de que el ochenta o noventa por ciento de nuestro trabajo esté basado en lo que
podríamos llamar “prueba y error”, sabemos que no puede existir la prueba y error sin el error, y
no puede existir el error sin que alguien o algo nos diga que estamos en un error.
Llegando precisamente a este punto en el que necesitamos de una guía o un
acompañamiento a través de la creación y estructuración de un buen proyecto, podemos encontrar
como algunas muy buenas herramientas, el uso de algunas aplicaciones para desarrollar
programas, en vez de utilizar el no muy confiable o agradable archivo de texto.
Aun teniendo cada una de estas grandes herramientas que nos ayudan a detectar, nos dan
opciones para corregir nuestras equivocaciones, aportan rutas más fáciles para la creación de
código e incluso al momento de ejecutar y compilar el programa completo nos dicen el lugar
exacto en el que estamos cometiendo un error. Hay momentos en los que nos es completamente
imposible identificar el error que tenemos presente.
La realidad es que ninguno de nosotros somos completamente capaces de generar un
código cien por ciento libre de errores, ya que no tenemos la capacidad de reconocimiento y
memoria de cada una de estas ya mencionadas herramientas, sino que conocemos las sentencias
principales y las órdenes básicas que un programa debe llevar por lo menos para declarar
variables, reconocer algunas operaciones básicas o manipular cadenas de caracteres con las
operaciones más simples o comunes que conocemos.
Para realizar otro tipo de operaciones, generar una variedad de extensiones o incluso
importar o crear ciertas paqueterías, tenemos las maravillas de alguien más que decidió hacernos
la vida mucho más fácil, y con estos increíbles trabajos también podemos encontrar las palabras,
caracteres y funciones que nuestro programa o más bien lenguaje pueden reconocer (que no
siempre nos salvan la vida, pero sí son de gran ayuda).
3
4 GENERACIÓN DE CÓDIGO INTERMEDIO
4.1 Registros
Son la memoria principal de la computadora. Existen diversos registros de propósito
general y otros de uso exclusivo. Existen registros acumuladores para puntero de instrucción,
pila, etc.
En éstos mismo existe la distribución, ésta es el proceso en el que el programa generado
puede ejecutarse en otras máquinas. Respecto al ensamblador, la mayoría del direccionamiento se
hace relativo para que el programa sea relocalizable por un programa llamado cargador.
Respecto a los programas compilados se necesitan librerías, si son estáticas se incluyen en
el ejecutable, por lo que el programa se hace gráfico, si son dinámicas, el programa se hará más
pequeño.
La asignación de valores a variables se hace a través de un proceso de mover el contenido
de memoria a registro, o de registro a memoria, pero nunca de memoria a memoria. Cuando se
trata de memoria dinámica se debe seguir el rastro de los datos.
4.2 Lenguaje Ensamblador
El lenguaje ensamblador se trata de un traductor de código de bajo nivel que pasa la
información a un código que es posible ejecutar directamente por la máquina en la que fue
generado. El lenguaje ensamblador fue la primera abstracción de un lenguaje de programación,
posteriormente aparecieron los compiladores para sustituirlo.
Lo que hace el programa es leer un archivo escrito en lenguaje ensamblador y luego
sustituye cada uno de los códigos con un equivalente en código máquina. Los programas
generados se hacen portables de máquina a máquina y el cálculo de bifurcaciones se hace de
manera sencilla.
Una de las ventajas del uso del ensamblador, es que se encarga de administrar de manera
transparente para el usuario la creación de memoria, las bifurcaciones y el paso de los
parámetros. Además, permite el acceso directo a los recursos de la máquina para un mejor
desempeño.
4
4.2.1 Ensambladores Básicos
De muy bajo nivel. Ofrecen nombres simbólicos a las distintas instrucciones, parámetros
y cosas tales como los modos de direccionamiento.
4.2.2 Ensambladores Modulares
Son descendientes de los ensambladores básicos, fueron muy populares en las décadas de
los 50´s y 60´s, antes de la generalización de los lenguajes de alto nivel. Una macroinstrucción es
el equivalente a una función en un lenguaje de alto nivel.
5
4.4 Administración de Memoria
La administración de la memoria de un proceso hoy en día muy importante, de tal modo
que su mal o buen uso tiene una acción directa sobre el desempeño de memoria. En general un
ensamblador tiene un administrador de memoria más limitado que un compilador.
En la mayoría de los lenguajes de programación el uso de punteros no estaba vigilado por
lo que se tienen muchos problemas con el uso de memoria. Los lenguajes más recientes controlan
el uso de punteros y tienen un programa denominado recolector de basura que se encarga de
limpiar la memoria no utilizada mejorando el desempeño.
Las técnicas que existen para la carga de programas en la memoria son: partición fija, que
es la división de la memoria libre en varias partes (de igual o distinto tamaño) y la partición
dinámica, que son las particiones de la memoria en tamaños que pueden ser variables, según la
cantidad de memoria que necesita cada proceso.
Entre las principales operaciones que desarrolla la administración de memoria se
encuentran la reubicación, que consiste en trasladar procesos activos dentro y fuera de la
memoria principal para maximizar la utilización del procesador; la protección, mecanismos que
protegen los procesos que se ejecutan de interferencias de otros procesos; uso compartido de
códigos y datos, con lo que el mecanismo de protección permite que ciertos procesos de un
mismo programa que comparten una tarea tengan memoria en común.
6
Conclusion
What would we do if we couldn't see our mistakes? That is the biggest issue that we could
imagine. We are available to make mistakes once, twice, third, or a million more times. The
problem when we make mistakes is when we can't see it.
Maybe in a current way in our life, we forget to do something or take a thing from the
table in the kitchen, or something like that usual mistakes. But at any time in the day, we will
notice about it even if we don't, it doesn't represent the end of the world.
Another case is an app. If we start to program and we aren't available to see that we have a
mistake, all the programs will fail. In that situation, we are sure in big troubles.
Of course, nothing of that could be possible if we hadn't found the best way to help
ourselves, but anyway, all that thigs as regular expressions are the things that make our life so
easy to make other life easy.
Now all that we have to do is try our best to make the fewer mistakes possible even if we
have a powerful tool as regular expressions.
Referencias
• Ullman, J. D. et al. (2007) Introducción a la teoría de autómatas, lenguajes y computación (3ª.
Ed.). Madrid: Pearson Educación. Disponible en: ELibro (Accediso: 28.04.2021)
• Clarisó, R., 2021. Administración de memoria - Tecnología++. [online] Tecnología++.
Available at: <https://informatica.blogs.uoc.edu/optimizacion-de-codigo-un-codigo-mas-
eficiente/> [Accessed 03 June 2021].
• Olivares Rojas, J., 2021. Unidad VII Otimización. [online] Dsc.itmorelia.edu.mx. Available at:
<http://dsc.itmorelia.edu.mx/~jcolivares/courses/ps207a/ps2_u7.pdf> [Accessed 03 June
2021].
• Lenguajes y Autómatas 2, 2020. 3.2.3 Herramientas para Análisis del Flujo de Datos. [online]
Blogspot. Available at: <https://equiponegro8.blogspot.com/2020/03/3_53.html> [Accessed
03 June 2021].
7
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
• Contiene portada con las especificaciones (Nombre
del Docente, Nombre del Estudiante, # de control,
grupo y tema a investigar).
• Faltas de Ortografía.
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
https://view.genial.ly/60be995ef5f8410d54931b6b/interactive-image-generacion-
de-codigo-intermedio
DIRECCIÓN ACADÉMICA
Criterios de evaluación:
CRITERIOS OBSERVACIONES
SI NO
DE EVALUACIÓN
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
La conferencia llevada por el ponente René Carrasco Bernal, quien entre muchas
cosas nos compartió los principios y las estrategias que se presentan para el funcionamiento
de Disney World.
Desde el principio de ésta, se nos mencionaron dos instituciones fundamentales para
la capacitación de personal de los parques y de los externos. Éstas con los nombres de
“Disney Institute” el que se encarga de mostrar los modelos Disney a todo externo que lo
desee y/o necesite, y “Disney University” el que cuenta como requisito para todos y cada uno
de los trabajadores de los parques Dinsey.
Entre muchas cualidades y principios, Disney mete a todo su personal bajo la misma
línea, es decir, “El pensamiento Disney”. El que básicamente (aunque no es basta la
expresión), se trata de mantener a todo trabajador bajo un solo propósito; GENERAR
MOMENTOS MÁSGICOS.
El hecho de marcar una diferencia entre un “momento feliz” y un MOMENTO
MÁGICO (es decir, generar momentos inolvidables y trascendente), es parte de lo que hace
a Disney lo que hoy es, y para lograrlo tienen conceptos muy específicos, entre ellos el hecho
de que sus trabajadores no son trabajadores, sino actores, y que los clientes no son clientes
sino huéspedes, por lo que éstos deben ser tratados como amigos o incluso familia.
Para demostrar que cada una de las personas involucradas está completamente
comprometida con este objetivo, Disney no se preocupa en mantener un uniforme, sino que
no escatima en el vestuario de cada uno de sus actores, lo que a su vez implica que las
entrevistas de trabajo no sean eso mismo, más bien son denominadas Audiciones, de tal
forma que tomando en cuenta de que hablamos de una industria hasta cierto punto teatral, el
“trabajo” de cada actor, es interpretar su correspondiente rol.
Otra de las grandes estrategias de Disney, que acompañan los roles de sus actores, se
refiere a las atracciones (cabe puntualizar que NO son juegos mecánicos), ya que cada una
de ellas tiene la misión de contar una historia y de tomar todo lo que está a su alrededor para
llevar de la mano a sus huéspedes en ella.
Las personas encargadas de hacer estas historias realidad son denominadas
Imagineers, es decir ingenieros encargados de no dejar de soñar, de tal forma que son
profesionales los que piensan en hacer y/o deshacer lo que sea necesario para que el huésped
esté lleno de las sensaciones que Disney quiere transmitir.
De la mano de éstos Imagineers, vienen también las reuniones después de cada día en
la que el objetivo es identificad cada una de las cosas que se hicieron bien, es decir, cada uno
de los actores se encarga de trasmitir al resto del elenco las historias que vieron: las familias
que llegaron y qué los hizo felices, qué es lo que un niño hace cuando ve a uno de los
personajes, por qué los huéspedes sonríen en cada atracción, etc.
Estas reuniones, lo que generan normalmente es la creación de nuevos productos y
servicios. Así fue como nació también la rama Disney's Fairy Tale Weddings &
Honeymoons, de forma que Disney se ha posicionado en el record mundial de nuevos
productos, generando en promedio productos nuevos cada 5 minutos.
Así como cada uno de los detalles que Disney se propone generar, tenemos que
incluso su estacionamiento se trata de un “momento mágico”, ya que es tremendamente
importante que los huéspedes sientan la magia desde que llegan, hasta que se van.
Y tanta magia les ha sido tan útil que tan sólo de estacionamiento Disney facturó 10
millones de dólares en 2019, bajo una política muy puntual en la que dicen que “lo que no se
cuenta, no se puede mejorar”.
Así como ser una empresa obsesionada con los detalles y totalmente entregada con
sus huéspedes, Disney es uno de los lugares que más emplea, esto con la finalidad de tener
el suficiente personal, o los suficientes actores, para mantener cada detalle en total control.
Los muchos empleados de Disney son utilizados todo el tiempo de forma eficiente,
de tal forma que tan solo un actor de Disney se encuentra 20 minutos trabajando y 20 minutos
descansando cíclicamente durante toda su jornada. Logrando esto gracias a los múltiples
túneles que se encuentran debajo del parque.
Así después de haber trabajado y “exprimido” totalmente la capacidad de un actor de
estar en una botarga por 20 minutos, la persona que lo acompaña hace una pausa muy breve
con los huéspedes para que este actor sea relevado por otro con el mismo personaje y continúe
generando momentos mágicos.
Las instalaciones de los parques Disney cuentan con redes de internet abiertas en todo
el parque, estacionamientos y restaurantes, así nuestra empresa consigue que los huéspedes
se sientan en la libertad de subir fotografías cuando están en las atracciones, transmitir en
vivo durante el recorrido y de paso ganar publicidad gratis.
Pero las redes de Disney no son manejadas por los Imagineers, sino que las empresas
de telecomunicaciones de encargan de ese aspecto, lo que nos lleva a la siguiente gran
estrategia de Disney: Trabaja en Equipo. A lo largo del mundo y de sus años de experiencia,
Disney ha conseguido generar negocios con las grandes empresas que satisfacen sus
necesidades, entre ellas, las redes, las sodas, alimentos, recuerdos, etc. Logrando así la venta
de 14 millones de dólares en comida por hora, 40 mil orejas de Mickey por hora, 245 mil
litros de helado al año y 45 millones de refrescos al año (por mencionar algunos).
Una de las grandes metas de Walt Disney cuando creó su compañía, era que quería
que sus parques estuviesen abiertos las 24 horas los 365 días del año. Y lo ha logrado gracias
a sus múltiples parques en todo el mundo, así mientras los parques de la mitad del mundo
cierran, los de la otra mitad apenas están abriendo.
Algunos de nosotros podemos recordar al primer personaje de Disney “Oswald” (o
no), realmente la mayoría no conoce al no tan famoso Oswald, ya que su creación fue
compartida con uno de los colaboradores de Walt Disney, quien logró quitarle los derechos
impidiendo que se volviera parte de las atracciones de Walt.
Con ésta valiosa experiencia, Walt Disney aprendió entre muchas cosas, dos muy
importantes: que nunca trabajaría para nadie y que nadie se hace rico trabajando para alguien
más (aunque la segunda llegara un poco después de este episodio). Y dejándonos a todos los
demás sus estrategias gerenciales más importantes:
• Predicar con el ejemplo
• ¿Qué se hizo bien? (productos)
• Divertirse, no trabajar
• Actitud más que aptitud (El estudio e idioma son importantes, pero valen más los
valores)
• Productos, servicios y habilidades únicos
• Obsesión por los detalles
Por último, como aprendizaje personal, me gustaría dejar algo que tal vez pueda
englobar cada una de las estrategias que el Sr. Walt Disney nos ha hecho llegar, que es
básicamente: Haz lo imposible.
Conclusión
Las cosas que hacemos para garantizar el éxito deben estar completamente ligadas a
la forma en la que estamos dispuestos a trabajar y aún más a vivir. Si bien, la mayoría de las
políticas empresariales (sobre todo de servicio) es que el cliente siempre tiene la razón y que
se hace todo por el cliente, debemos entender que nosotros formamos parte de esta directriz,
pero más allá, debemos estar comprometidos con lo que hacemos.
Cada uno de nosotros supuestamente estamos estudiando lo que estudiamos para vivir
de ello, es decir, que lo que hacemos ahora es lo que haremos el resto de nuestras vidas, y
debemos estar completamente comprometidos con éste papel, ya que lo que le entregamos al
público, cliente o huésped, es todo en lo que nosotros también creemos, y por tanto, hacemos
lo imposible para siempre hacerlo mejor.
DIRECCIÓN ACADÉMICA
Formato de entrega de evidencias
FO-205P11000-14
FORMULARIO DE CARGA
Se muestra la pantalla de inicio del chat bot, misma que contiene la leyenda
“Cargando la matriz operativa de Baymax” “Espere…”, así como una barra de carga que
indicará la apertura del formulario 2.
Ilustración 2. Formulario 2
BOTÓN SALIR
Al dar click en el botón inicio, se despliega un cuadro de diálogo con la leyenda
“¿Desea Cerrar el ChatBot?”.
Método Entrena( )
Public Sub Entrena(ByVal Clave As String)
Try
If Clave.ToLower.Contains("hola") Then
RichTextBox1.SelectionColor = Color.DarkGreen
RichTextBox1.AppendText("Baymax: " & "Hola, yo soy Baymax, tu
asistente digital presonal" & vbCrLf)
RichTextBox1.ScrollToCaret()
ElseIf Clave.ToLower.Contains("me duele") Then
RichTextBox1.SelectionColor = Color.DarkGreen
RichTextBox1.AppendText("Baymax: " & "Deberías acudir a lo que los
humanos llaman doctor" & vbCrLf)
RichTextBox1.ScrollToCaret()
Else
Dim Encuentra As Boolean = False
Dim Datos As String = Application.StartupPath & "\Base.txt"
For Each Linea In File.ReadLines(Datos, Encoding.UTF8)
Dim Encontrado As String() = Linea.Split(":")
If Clave.ToLower.Contains(Encontrado(0)) Then
RichTextBox1.SelectionColor = Color.DarkGreen
RichTextBox1.AppendText("Baymax: " & Encontrado(1) & vbCrLf)
RichTextBox1.ScrollToCaret()
Encuentra = True
Exit For
End If
Next
If Encuentra = False Then
RichTextBox1.SelectionColor = Color.DarkGreen
RichTextBox1.AppendText("Baymax: " & "No encuentro en la base de
datos alguna respuesta para continuar la conversación" & vbCrLf)
RichTextBox1.ScrollToCaret()
End If
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Método Editar ( )
Public Sub Editar()
Try
TxtEditar.Clear()
Dim Datos As String = Application.StartupPath & "\Base.txt"
For Each Linea In File.ReadLines(Datos, Encoding.UTF8)
TxtEditar.Text += Linea & vbCrLf & vbCrLf
Next
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Así como tenemos la facilidad para observar cuáles han sido las respuestas del
Chatbot, podemos ordenar estas mismas para mayor facilidad de lectura.
Método Ordenar ( )
Public Sub Ordenar()
Dim Array As New ArrayList
Dim Datos As String = Application.StartupPath & "\Base.txt"
For Each Linea In File.ReadLines(Datos, Encoding.UTF8)
Array.Add(Linea)
Next
Array.Sort()
Try
My.Computer.FileSystem.DeleteFile(Application.StartupPath & "\Base.txt")
Catch ex As Exception
MsgBox(ex.Message)
End Try
For I = 0 To Array.Count - 1
My.Computer.FileSystem.WriteAllText(Application.StartupPath &
"\Base.txt", Array(I) & vbCrLf, True)
Next
End Sub
Implementamos una llave para que el usuario pueda enviar el mensaje que desea que
la computadora responda cuando éste presione la tecla “Enter”
KeyDown Enter
Private Sub TxtTexto_KeyDown(sender As Object, e As KeyEventArgs) Handles
TxtTexto.KeyDown
If TxtTexto.Text <> "" Then
If e.KeyCode = Keys.Enter Then
e.SuppressKeyPress = True
RichTextBox1.SelectionColor = Color.Black
RichTextBox1.AppendText("Karela: " & TxtTexto.Text & vbCrLf)
Entrena(TxtTexto.Text)
RichTextBox1.ScrollToCaret()
TxtTexto.Clear()
End If
End If
End Sub
Botón Guardar
Private Sub BtnGuardar_Click(sender As Object, e As EventArgs) Handles
BtnGuardar.Click
If TxtClave.Text <> "" And TxtRespuesta.Text <> "" Then
My.Computer.FileSystem.WriteAllText(Application.StartupPath &
"\Base.txt", TxtClave.Text.ToLower.Trim & ": " & TxtRespuesta.Text.Trim & vbCrLf,
True)
MsgBox("Guardado Correctamente", MsgBoxStyle.Information, "Guardado")
TxtClave.Clear()
TxtRespuesta.Clear()
Else
MsgBox("Falta de información al realizar la consulta",
MsgBoxStyle.Information, "Error")
End If
End Sub
Por último, mandaremos llamar los métodos de Editar y Ordenar que ya creamos, en
sus correspondientes botones.
Criterios de evaluación:
CRITERIOS
SI NO
DE EVALUACIÓN OBSERVACIONES
1ª oportunidad 2ª oportunidad
Puntuación
Alcanzada (10)