SG #52 https://sg.com.mx/ en Contenedores: Un poco de historia https://sg.com.mx/revista/52/contenedores-un-poco-historia <span class="field field--name-title field--type-string field--label-hidden">Contenedores: Un poco de historia</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/containers_0.jpg" width="1265" height="879" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 03:19</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/programar-es-un-estilo-vida" hreflang="und">Programar es un Estilo de Vida</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/gunnar-wolf" hreflang="und">Gunnar Wolf</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Recuerdo la primera vez que tuve contacto con la virtualización. En 2005, en un congreso, participé en un breve taller en el que nos presentaron esta (entonces) característica tan única de las arquitecturas IBM de gama alta: los servidores s390.</p><p dir="ltr">¡Parecía magia! Varios sistemas operativos corriendo a velocidad nativa, compartiendo armónicamente una misma computadora. Un hipervisor gestionando y mostrando estadísticas de uso en tiempo real. Claro, a esas alturas yo ya conocía el mecanismo que empleaba VMWare para virtualizar sobre la arquitectura PC desde fines de los noventa, pero la diferencia en el rendimiento y la confiabilidad era muy notoria. Por esos años, relativamente muy poca gente consideraba la oferta de VMWare para entornos de producción.</p><p dir="ltr">Un año más tarde, el panorama cambió radicalmente. Tanto Intel como AMD comenzaron a incorporar extensiones de virtualización en sus procesadores de arquitectura x86 —las instrucciones y niveles de protección necesarios para permitir este mágico aislamiento que hasta entonces estaba reservado a los sistemas de muy alto costo. Si bien la virtualización apareció primero en la gama alta de estas compañías, hoy en día (diez años más tarde) prácticamente todos sus procesadores las incluyen. Y sí, cambiaron fuertemente la forma de trabajo en los centros de datos, las ofertas de servicio de los proveedores de infraestructura— y permitieron el nacimiento del, permítanme esta redundante cacofonía, nebuloso término de "la nube".</p><p dir="ltr">Por un par de años, hubo un claro surgimiento de la “virtualización basada en hardware”. Proveedores de servicio de todo tamaño comenzaron a ofrecer “servidores privados virtuales” a precios que antes nunca hubiéramos esperado. Los administradores de sistemas de todo el mundo comenzamos a cambiar nuestra mecánica de trabajo, “particionando” el trabajo que realizaban nuestros grandes servidores monolíticos en cargas especializadas, a ser repartidas en cuantos servidores virtuales fuera necesario. No tardaron en aparecer numerosas tecnologías base, libres y propietarias.</p><h3 dir="ltr">De virtualización a paravirtualización</h3><p dir="ltr">Quedaba aún mucho por mejorar, sin embargo, si bien la ejecución de código dentro de las máquinas virtuales ocurría ya a velocidad nativa, había inocultables capas de emulación que era necesario cruzar. ¿A qué me refiero? Una máquina virtual aparenta ser una computadora completa, al lanzar una, vemos cómo una interfaz comparable con el BIOS lanza al gestor de arranque, el sistema operativo se inicializa… la máquina virtual cree tener las tarjetas de red, unidades de disco y demás periféricos que le indiquemos (que normalmente corresponden con modelos simples y antiguos). El manejo del video es particularmente curioso; lo más común es que se presente como una tarjeta de video tonta, sin aceleración 3D, que interfacea mediante un framebuffer. Todos estos dispositivos tienen que ser emulados, y toda emulación tiene su costo.</p><p dir="ltr">Hoy en día, prácticamente la totalidad de herramientas de virtualización ofrece más bien un híbrido, entrando al terreno de la paravirtualización. ¿Qué es? Es cuando el engaño no es completo, cuando el hardware virtual ofrecido al sistema operativo ya no pretende ser una computadora completa, sino que el sistema operativo huésped “sabe” que está siendo virtualizado y coopera en la tarea. Esta cooperación estiba en que, en vez de buscar controlar a su hardware como si fuera real, lo toma como un buffer glorificado y envía, más bien, solicitudes al anfitrión (host) para cumplir lo que los programas requieren. Una diferencia aparentemente sutil, pero que —sobre todo en los casos de cargas de trabajo orientadas a la entrada y salida, como las bases de datos y el manejo de red— típicamente llevan a una diferencia de rendimiento de diez veces tanto.</p><p dir="ltr">Virtualización y paravirtualización brindan grandísimas ventajas a los administradores, y una en la que insistiré en este punto es que el “engaño” es a nivel sistema entero, cada computadora virtual puede ejecutar un sistema operativo distinto completo. Esto es particularmente útil al hablar de proveedores de servicio en la nube, pues cada cliente tendrá la flexibilidad absoluta de correr en su computadora el software que desee. Sin embargo, hacia adentro de las organizaciones, sigue siendo subóptimo.</p><h3 dir="ltr">Raíces, jaulas, contenedores</h3><p dir="ltr">Como siempre, la respuesta a una nueva necesidad viene del pasado, con nuevas maneras de emplear lo ya conocido, de refinamientos técnicos que mejoran la implementación de la idea —y en este caso, de la mano de bastante mercadotecnia que llevó a mucha gente a ver hacia el lugar obvio.</p><p dir="ltr">Los contenedores pueden definirse como virtualización a nivel sistema operativo. Los usuarios de máquinas virtuales ya no serán engañados con lo que parece ser una computadora completa, sino que únicamente con algo que dice ser un sistema operativo dedicado a ellos. Y, siendo el sistema operativo el principal encargado de agrupar al hardware en clases, gestionar su manipulación de bajo nivel, y proveer abstracciones uniformes para los programas que corren en espacio de usuario… la diferencia es enorme.</p><p dir="ltr">Pero vamos por partes, ¿cómo se originaron los contenedores?, ¿cuáles son las ideas primigenias?</p><p dir="ltr">En 1982, Bill Joy, uno de los arquitectos del Unix de BSD y fundador de Sun Microsystems, creó la llamada al sistema chroot() para auxiliarse en el desarrollo de Unix. Dado que desarrollaba en la misma computadora donde hacía sus pruebas, quería poder mantener aislado su entorno de desarrollo y construcción del entorno de pruebas. La manera más sencilla (y, además, elegante) de hacerlo es por medio de esta llamada, se invoca con un argumento, y a partir del momento en que un proceso la llama con el nombre de un directorio y hasta el final de su ejecución, el sistema operativo le dará a dicho proceso una vista parcial del sistema, limitada al directorio que le es indicado. Esto es, tras un chroot('/home/gwolf/test'), si el proceso en cuestión da un cd /, el sistema operativo lo llevará a /home/gwolf/test.</p><p dir="ltr">En los manuales de sistema es común encontrar advertencias de seguridad — chroot() no está pensado para proveer aislamiento, únicamente conveniencia — Hay varias maneras por medio de las cuales un proceso puede escapar de esta jaula, además de que su funcionamiento se limita a restringir la vista del sistema de archivos, sin proteger otros aspectos del sistema como las interfaces de red, la lista de procesos, o el acceso a dispositivos.</p><p dir="ltr">El primer sistema operativo en ofrecer lo que hoy conocemos como contenedores (bajo el nombre de jails) fue la versión 4 de FreeBSD, liberada en el año 2000. Poco después, esta funcionalidad apareció en Solaris, Linux e incluso para Windows; en los dos últimos casos, esto fue inicialmente mediante productos de terceros (Parallels Virtuozzo Containers para Windows, Vserver y OpenVZ para Linux, OpenVZ siendo una rama libre de Virtuozzo). Varios años después de la introducción de esta funcionalidad por medio de terceros, tanto en el caso de Linux (con lxc desde 2009) como recientemente en el de Windows (desde 2015) han sido incorporados a la plataforma base del sistema operativo.</p><p dir="ltr">La virtualización a nivel sistema operativo implica que los contenedores engañarán a los procesos huéspedes presentándoles una vista limitada en los siguientes aspectos:</p><ul><li>Tablas de procesos</li><li>Señales y comunicación entre procesos (IPC)</li><li>Interfaces de red</li><li>Dispositivos de hardware</li><li>Límites en el consumo de recursos (espacio en disco, memoria, o ciclos de CPU)</li><li>Información del sistema, como el nombre del equipo o la hora actual</li></ul><p dir="ltr">Esto permite a los árboles de procesos que habitan dentro de un contenedor tener una vista de sistema completo, viéndose obligados a respetar las asignaciones de recursos de los demás contenedores. Uno de los principales atractivos para los administradores de sistemas es que un contenedor cuyos servicios no están siendo activamente utilizados permanece efectivamente dormido, con un nivel de consumo de recursos verdaderamente mínimo — A diferencia de la virtualización de sistema entero, en este caso el sistema operativo conoce directamente todos los eventos a que están esperando cada uno de los procesos, y mientras dicho evento no ocurra, los contenedores no pasarán de ser una estructura en memoria.</p><p dir="ltr">A últimos años, los contenedores se han ido popularizando ya no únicamente como una herramienta para que el administrador de sistemas particione lógicamente la carga de trabajo de servidores o provea infraestructura de cómputo con acceso privilegiado a distintos usuarios manteniendo garantías de seguridad, sino también como mecanismo de distribución de software, instalado y preconfigurado —la implementación más conocida es el proyecto docker. En lo particular, como administrador de sistemas de vieja guardia y formado en la escuela tradicionalista, le veo importantes carencias a su planteamiento… pero sin duda ha logrado una importante penetración de mercado.</p><p dir="ltr">Como sea, la tecnología de contenedores es una genial herramienta con la que contamos hoy, que ha cambiado de raíz la manera en que se despliegan los servicios. Invito a todos los lectores que no se hayan aún adentrado a comprenderla y utilizarla, a no dudar en hacerlo.</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Gunnar Wolf es administrador de sistemas para el Instituto de Investigaciones Económicas de la UNAM y desarrollador del proyecto Debian GNU/Linux. http://gwolf.org</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 08:19:44 +0000 sg 6833 at https://sg.com.mx https://sg.com.mx/revista/52/contenedores-un-poco-historia#comments Designing Software Architectures: A Practical Approach https://sg.com.mx/revista/52/designing-software-architectures-practical-approach <span class="field field--name-title field--type-string field--label-hidden">Designing Software Architectures: A Practical Approach</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/humberto.jpg" width="989" height="548" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 03:14</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/humberto-cervantes" hreflang="und">Humberto Cervantes</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta ocasión tengo el gusto de compartir con ustedes la noticia de la reciente publicación del libro que escribí junto con mi colega Rick Kazman quien es investigador en el Software Engineering Institute (SEI). Nuestro libro lleva por título “Designing Software Architectures - A Practical Approach” (Diseñando Arquitecturas de Software - Un Enfoque Práctico) y fue publicado por la editorial Addison Wesley en la colección “SEI Series in Software Engineering”.</p><p dir="ltr"><img src="https://lh3.googleusercontent.com/xHuoR_tQmRPKr5UcrMRwL8BatKjFbrjA7GN2ppO78FSnDqT7CZtvLQFveNkBur6C5EZJsjp0lXSsQ2m0eoeDv1-TvkXNv50FbTYEtEgsACX8Mw1cc_W3WKSOk7BB0ivb2qCAe5uV" alt="PortadaLibro.jpg" width="372" height="552" /></p><p dir="ltr">Nuestro libro se enfoca en el método de Diseño Guiado por Atributos (Attribute-Driven Design), o ADD; un método de diseño de arquitecturas originalmente creado por el Software Engineering Institute y del cual hablé en la columna <a href="https://sg.com.mx/revista/29/diseno-la-arquitectura#.V6jY05PhCRs">“Diseño de la Arquitectura”, en SG 29</a>. A pesar de que ADD ha existido por más de una década, se ha escrito relativamente poco al respecto y es difícil encontrar ejemplos de cómo llevarlo a cabo. Esta falta de información ha complicado su adopción y enseñanza. Además, la información que se ha publicado acerca de ADD tiende a ser un tanto abstracta y puede ser difícil conectarla con los conceptos, prácticas y tecnologías que los arquitectos usan en sus actividades cotidianas.</p><p dir="ltr">Rick y yo hemos guiado a arquitectos de software durante años en la realización del proceso de diseño y, al mismo tiempo, hemos estado aprendiendo de ellos; por ejemplo, que en la práctica los arquitectos consideran la tecnología de forma temprana en el proceso de diseño y esto es algo que no era parte de la versión original de ADD. Por tal razón, el método original parecía “desconectado” de la realidad para la gente de la industria. En este libro presentamos una versión revisada de ADD en la cual hemos tratado de reducir la brecha entre la teoría y la práctica.</p><p dir="ltr">Durante varios años, hemos estado también enseñando arquitectura de software y la manera en que se realiza el diseño de la misma. Nos hemos dado cuenta que a la gente que no tiene experiencia le es muy difícil diseñar arquitecturas. Este entendimiento nos empujó a crear una “hoja de ruta” que creemos será útil para guiar en la realización del proceso de diseño. También creamos un juego que es útil para enseñar acerca del diseño de arquitecturas, y que se puede considerar como un complemento al libro (ver “<a href="http://sg.com.mx/revista/49/smart-decisions-un-juego-para-aprender-arquitectura-y-big-data#.V6kFB5PhCRs">Smart Decisions: Un juego para aprender Arquitectura y Big Data” en SG 49</a>).</p><p dir="ltr">Nuestro libro está dirigido a cualquier persona que esté interesada en el diseño de arquitecturas de software. Creemos que será particularmente útil para los practicantes que deben realizar esta tarea, pero que actualmente la realizan de forma ad hoc. Los practicantes con experiencia que ya realizan el diseño siguiendo un método establecido también encontrarán nuevas ideas, por ejemplo, cómo dar seguimiento al proceso de diseño usando un tablero Kanban o cómo analizar el diseño usando cuestionarios basados en tácticas. Por último, la gente que está familiarizada con otros métodos del Software Engineering Institute encontrarán información acerca de la manera de combinar ADD con métodos tales como el taller de atributos de calidad QAW, el método de análisis de compromisos arquitectónicos ATAM (ver <a href="https://sg.com.mx/revista/31/arquitectura-evaluacion-la-arquitectura-software#.V6kHIJPhBPU">SG 31</a>) y el método de análisis de costos beneficios CBAM.</p><p dir="ltr">Este libro también será útil para estudiantes y profesores de programas de ciencias de la computación o de ingeniería de software. Creemos que los casos de estudio que describimos ayudarán a entender a través de ejemplos la manera de realizar el proceso de diseño más fácilmente. Como dijo Einstein: “El ejemplo no es otra manera de enseñar, es la única manera de enseñar”.</p><p dir="ltr">Esperamos que nuestro libro permita entender que el diseño puede realizarse siguiendo un método y que el hacerlo de esta manera es de gran ayuda para producir mejores sistemas de software.</p><p dir="ltr">Su estructura es de la siguiente manera siguiente:</p><ul><li dir="ltr"><p dir="ltr">En el capítulo 1 presentamos una introducción breve del concepto de arquitectura de software y del método ADD.</p></li><li dir="ltr"><p dir="ltr">En el capítulo 2 discutimos acerca del diseño de arquitecturas de manera más detallada, junto con las entradas principales al proceso de diseño a las cuales llamamos los drivers de la arquitectura. Además, hablamos de los conceptos de diseño que son ‘bloques de construcción’ a partir de los cuales se construye la arquitectura y que permiten satisfacer estos drivers usando soluciones probadas.</p></li><li dir="ltr"><p dir="ltr">El capítulo 3 presenta el método ADD de forma detallada. Presentamos cada uno de los pasos del método junto con varias técnicas que pueden ser usadas para llevar a cabo estos pasos de manera adecuada.</p></li><li dir="ltr"><p dir="ltr">El capítulo 4 presenta un primer caso de estudio que ilustra el desarrollo de un sistema “desde cero”. Para este caso de estudio, hemos hecho un esfuerzo por mostrar la manera en que la mayoría de los conceptos descritos en el capítulo 3 son usados en el proceso de diseño, así que este caso de estudio tiene una naturaleza más “académica” (aunque se deriva de un sistema del mundo real).</p></li><li dir="ltr"><p dir="ltr">El capítulo 5 presenta un segundo caso de estudio que escribimos junto con arquitectos de software expertos en big data y, por ello, tiene muchos más detalles técnicos que el anterior. Este caso de estudio describe los detalles finos de cómo usar ADD en el diseño de un sistema de big data que involucra diversas tecnologías. Este ejemplo ilustra también lo que consideramos un diseño en un dominio “novedoso”, a diferencia del dominio más tradicional usado en el capítulo 4.</p></li><li dir="ltr"><p dir="ltr">El capítulo 6 es un caso de estudio más corto que describe el uso a ADD para realizar la extensión de un sistema legado, lo cual es una situación común en la práctica. Este ejemplo demuestra que el diseño arquitectural no es algo que se realice una sola vez, al inicio del desarrollo del sistema, sino que más bien es una actividad que puede ser realizada en distintos momentos del proceso de desarrollo.</p></li><li dir="ltr"><p dir="ltr">El capítulo 7 presenta otros métodos de diseño. En nuestra revisión de ADD, adoptamos ideas de otros autores que también han investigado el proceso de diseño y aquí resumimos brevemente sus enfoques como un homenaje a sus propuestas y como una comparativa de ADD a estos métodos.</p></li><li dir="ltr"><p dir="ltr">El capítulo 8 discute acerca del tema del análisis de forma detallada. Aún si el tema principal de este libro es el diseño, el análisis se realiza naturalmente como parte del mismo, así que aquí describimos técnicas de análisis que pueden ser usadas durante el proceso de diseño o después de que una parte del diseño ha sido completada. En particular, describimos el uso de cuestionarios basados en tácticas, los cuales son útiles para entender de forma simple y rápida las decisiones que se realizan durante el proceso de diseño.</p></li><li dir="ltr"><p dir="ltr">El capítulo 9 describe la manera en que el proceso de diseño embona a nivel organizacional. Por ejemplo, es posible realizar cierta cantidad de diseño en los momentos más tempranos del ciclo de vida con el fin de realizar la estimación del proyecto (ver <a href="http://sg.com.mx/revista/46/arquitectura-y-preventa#.V6kPhpPhCRs">“Arquitectura y Preventa” en SG 46</a>). Mostramos también cómo ADD puede ser usado con distintos enfoques de desarrollo, como por ejemplo, con las metodologías ágiles o con métodos más establecidos como el Team Software Process (TSP).</p></li><li dir="ltr"><p dir="ltr">El capítulo 10 concluye el libro.</p></li></ul><p dir="ltr">Incluímos también dos apéndices. El A presenta un “catálogo de conceptos de diseño” que, como su nombre indica, es un catálogo de distintos tipos de conceptos de diseño que pueden ser usados para un dominio aplicativo particular (ver “<a href="http://sg.com.mx/revista/38/conceptos-dise%C3%B1o-patrones-t%C3%A1cticas-y-frameworks#.V6kQB5PhCRs">Conceptos de Diseño: Patrones, Tácticas y Frameworks” en SG 38</a>). Este catálogo presenta conceptos de diseño que recopilamos de distintas fuentes y refleja la manera en que los arquitectos con experiencia trabajan en el mundo real. En este caso, el catálogo contiene una muestra de conceptos de diseño usados en el caso de estudio presentado en el capítulo 4. El apéndice B provee un conjunto de cuestionarios basados en tácticas para los siete atributos de calidad más comunes, así como un cuestionario adicional para DevOps.</p><h2 dir="ltr">Conclusión</h2><p dir="ltr">Debo decir que me llena de orgullo el haber escrito un libro para la prestigiosa colección editorial del Software Engineering Institute que, además, es el nuevo material de referencia para el curso “Software Architecture Design and Analysis” que se imparte en el SEI. Espero que sea de mucha utilidad para la comunidad de desarrollo en México y en el resto del mundo.</p><p dir="ltr">Quiero aprovechar para agradecer a Pedro Galván y su equipo por la oportunidad que me han dado a lo largo de estos años de escribir esta columna de arquitectura de software. Como se puede apreciar en las distintas referencias que hice a números pasados de la revista, muchos de los temas desarrollados de forma detallada en el libro han sido presentados de forma resumida a lo largo de los años en esta columna.</p><p dir="ltr">Para terminar, incluyo una liga en donde se puede adquirir el libro: <a href="https://goo.gl/Wd01TL">https://goo.gl/Wd01TL</a></p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>El Dr. Humberto Cervantes es profesor-investigador en la UAM-Iztapalapa. Además de realizar docencia e investigación dentro de la academia en temas relacionados con arquitectura de software, realiza consultoría y tiene experiencia en la implantación de métodos de arquitectura dentro de la industria. Ha recibido diversos cursos de especialización en el tema de arquitectura de software en el SEI, y está certificado como ATAM Evaluator y Software Architecture Professional por parte del mismo. (<a href="http://www.humbertocervantes.net">www.humbertocervantes.net</a>)</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 08:14:37 +0000 sg 6832 at https://sg.com.mx https://sg.com.mx/revista/52/designing-software-architectures-practical-approach#comments La Capacitación como Agente de la Transformación https://sg.com.mx/revista/52/la-capacitaci-n-como-agente-la-transformaci-n <span class="field field--name-title field--type-string field--label-hidden">La Capacitación como Agente de la Transformación</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/michael-phelps.jpg" width="600" height="381" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 03:09</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/carrera" hreflang="und">Carrera</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/sgvirtual/speakers/omar-s-nchez" hreflang="und">Omar Sánchez</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La capacitación práctica y teórica en Tecnologías de Información es de vital importancia, y necesaria a fin de ampliar el desempeño de las actividades de los profesionales del sector, debido a que las organizaciones son cada vez más dependientes de ellas para soportar y mejorar los procesos de negocio que demandan cumplir las necesidades de los clientes y de la propia organización. Esto requiere de una estrategia y transformación bien definida para la mejora del software que las empresas necesitan, por lo que cabe preguntarnos ¿qué valor o aporte le estamos dando al cliente, colaboradores o accionistas, con el uso de este tipo de tecnologías?</p><p dir="ltr">Actualmente la capacitación en TI para los profesionales dedicados a la gestión contribuye al desarrollo profesional, y por tanto al económico de las empresas que prestan interés al tema, ya que los servicios de TI conforman la base del modelo de negocio en su totalidad para cualquier tipo de empresa, por ello, las compañías deben encontrar mecanismos que transmitan información relacionada con las actividades de su organización brindando a sus colaboradores conocimientos, habilidades y actitudes que se pretenden para lograr a través de las mejores prácticas en gestión de servicios de TI, un desempeño óptimo.</p><p dir="ltr">Lamentablemente muchas organizaciones consideran que la formación profesional de TI es un gasto innecesario, sin darse cuenta que es todo lo contrario, ya que puede ofrecer resultados positivos así como una optimización en la calidad de la infraestructura en el software que maneja la propia organización; es decir, es una inversión que trae beneficios al colaborador, a la organización y, lo más importante, al cliente o usuario final.</p><p dir="ltr">Dentro de la industria de TI existen organismos que centran su importancia en el desarrollo de mejores prácticas ITIL (Information Technology Infrastructure Library, por sus siglas en inglés), que se basa en una colección de documentos públicos, fundamentados en procesos y en un marco de optimización en la industria, permitiendo la Gestión de Servicios de TI con calidad y a un costo adecuado, por supuesto que para ello es importante una capacitación en ITIL enfocada a los profesionales involucrados con todos aquellos procesos que se necesitan ejecutar dentro de las organizaciones para la administración y operación de la infraestructura de TI, de tal forma que logre una excelente provisión de servicios a los clientes bajo un esquema de costos congruentes con las estrategias del negocio.</p><p dir="ltr">La biblioteca de ITIL &nbsp;se ha convertido en el estándar mundial de capacitación y actualización para la gestión de servicios Informáticos que genera una sinergia entre personas, procesos y tecnología. Tal es el caso de ITSMF (Information Technology Service Management Forum), que anualmente realiza un congreso en la Ciudad de México, sobre dichos temas.</p><p dir="ltr">Algunos de los beneficios de una capacitación ITIL para una adecuada gestión del servicio en las tecnologías de información son: maximiza la calidad del servicio apoyando al negocio de forma expresa, ofrece una visión clara de la capacidad del área TI, aumenta la satisfacción en el trabajo mediante una mayor comprensión de las expectativas y capacidades del servicio, minimiza el ciclo de cambios y mejora los resultados de los procesos y proyectos TI, incrementa la rentabilidad del negocio.</p><p dir="ltr">Las TI aportan de manera más que sustancial los elementos para lograr las metas y objetivos, cuantitativos como cualitativos, de cualquier tipo de organización o industria, por ello es imposible lograr una gestión exitosa de negocio sin el manejo apropiado de dichas tecnologías. En las organizaciones no solo deben existir mecanismos alineados a los objetivos tácticos como estratégicos, sino también para el resguardo de los activos informáticos, pero sobre todo en capacitación, para saber cómo hacerlo con base a las mejores prácticas normas, guías y estándares.</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Omar Sánchez es un consultor especializado en Gestión de Servicios de TI. Actualmente dirige la empresa O2 Systems y es Presidente de ITSMF México, además de ser profesor de asignatura en la Universidad Iberoamericana en el área de Gobierno de TI.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 08:09:00 +0000 sg 6831 at https://sg.com.mx https://sg.com.mx/revista/52/la-capacitaci-n-como-agente-la-transformaci-n#comments Asegurando la Calidad de la Experiencia de Usuario https://sg.com.mx/revista/52/asegurando-la-calidad-la-experiencia-usuario <span class="field field--name-title field--type-string field--label-hidden">Asegurando la Calidad de la Experiencia de Usuario</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/qa.jpg" width="424" height="242" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 03:03</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/calidad" hreflang="und">Calidad</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/roselyn-pinango" hreflang="und">Roselyn Piñango</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">Según el ISTQB (International Software Testing Qualifications Board), uno de los objetivos de las pruebas, es satisfacer compromisos aplicando la validación de los requisitos de usuario respecto al sistema que está siendo objeto de la prueba. Igualmente este estándar define las pruebas de sistema como aquellas que se realizan desde la perspectiva del usuario y predomina como protagonista el equipo de QA para ejecutarlas [1]. Por otro lado, uno de los atributos no funcionales de la calidad según la norma ISO9126 es la usabilidad que consiste en la capacidad que tiene un software de ser amigable, atractivo y útil al usuario final. Ahora bien, el dinamismo tecnológico ha permitido que usuarios no expertos interactúen con la tecnología como parte de su día a día haciéndolos más exigentes. La validación de requisitos, pruebas de sistema y la usabilidad ya no son suficientes, es necesario que las pruebas incluyan en su alcance la experiencia de usuario (UX).</p><p dir="ltr">La experiencia de usuario es el conjunto de factores y elementos relativos a la interacción del usuario con dispositivos o software tecnológico cuyo resultado es la generación de una percepción positiva o negativa de dicho servicio, producto o dispositivo. Ésta depende no solo de los factores relativos al diseño sino además de aspectos relativos a las emociones, sentimientos, confiabilidad y transmisión de la marca (2). El diseño de la experiencia del usuario se define como el proceso de aumentar la satisfacción y lealtad del cliente mediante mejoras en la usabilidad, facilidad de uso y el placer de la interacción entre el cliente y el producto.</p><p dir="ltr">El diseño de experiencia de usuario se preocupa por un número mayor de variables que el diseño de interfaz de usuario y no necesariamente están relacionadas con el aspecto visual, por ejemplo: la presentación de los productos, redacción de contenidos, la velocidad de carga, entre otros factores. Algunos de los principios de este tipo de diseño son el color, eficiencia, error humano, estética, íconos, jerarquía visual, legibilidad, mapeo natural y visibilidad, entre otros. Definitivamente esto compromete aún más a los especialistas en ingeniería de requisitos y en sí, al proceso de interacción con los usuarios de manera que el equipo de desarrollo y pruebas pueda conocer las pautas, funcionalidades y expectativas que debe cumplir el sistema.</p><p dir="ltr">En el ámbito de las pruebas, esto significa que no será suficiente la base de pruebas que utiliza un equipo de QA (listado de funcionalidades) sino es necesario comprender claramente cuál es la motivación del sistema, qué beneficios traerá, qué se busca con su construcción y qué se espera de él. Para ello es necesario que las pruebas de calidad de la experiencia de usuario cuenten con la participación del usuario, pero no significa que estas pruebas deban realizarse al final del ciclo de vida de desarrollo, al contrario, debe ser una de las primeras exploraciones (por ejemplo por medio de prototipos) a realizar dentro del enfoque de pruebas definido respetando el principio “pruebas tempranas” &nbsp;de ISTQB. Pudiera ser un nuevo nivel de pruebas híbrido probador/usuario.</p><p dir="ltr">De de las pruebas más conocidas en este ámbito son las A/B que consisten en dos escenarios controlados que se envían/cargan de forma aleatoria a los usuarios (normalmente una muestra de ellos) con el objetivo de medir la efectividad de un diseño de interfaz y/o contenido en específico. Otro tipo de prueba utilizada es la llamada think aloud (piensa en voz alta) en donde se le solicita al usuario que utilice el sistema, narrando sus pensamientos y percepciones del mismo mientras navega por las funcionalidades del sistema. Lo importante es que se contemple desde QA que las pruebas del diseño de experiencia de usuario no es tarea única del profesional de QA, se trata de un trabajo conjunto con el usuario, y aunque algunos autores califican estas pruebas como “costosas”, sin duda no es equivalente a desarrollar un sistema que no sea utilizado cuando esté en producción.</p><h3 dir="ltr">Conclusión</h3><p dir="ltr">La tecnología avanza y los usuarios son cada día más exigentes con los sistemas que reciben para su rutina laboral o vida diaria, lo cual significa un reto adicional para los profesionales de QA, en donde el objetivo de satisfacer compromisos lo obliga a ser un tecnólogo multidisciplinario que debe garantizar la mejor experiencia de usuario posible, funcionalidad (y otros atributos de la calidad) bajo la arquitectura idónea para el contexto donde se ejecutará el sistema, convirtiéndolo en un profesional integral.</p><p dir="ltr">Referencias:</p><ol><li dir="ltr"><p dir="ltr">“Foundation Level Syllabus”. ISTQB, 2011. <a href="http://swgu.ru/rt">http://swgu.ru/rt</a></p></li></ol><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Roselyn C. Piñango Díaz es Ingeniero en Computación con especialización en Sistemas de Información. Gerente de QA Factory en Global R, Venezuela. Cuenta con 10 años de experiencia en desarrollo y pruebas de software; y certificaciones: OCE SQL, OCA PL/SQL Developer, CTFL ISTQB, ASE HP ALM v11, CAA SAPB1.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 08:03:33 +0000 sg 6830 at https://sg.com.mx https://sg.com.mx/revista/52/asegurando-la-calidad-la-experiencia-usuario#comments Special Purpose Languages, parte 4 https://sg.com.mx/revista/52/special-purpose-languages-parte-4 <span class="field field--name-title field--type-string field--label-hidden">Special Purpose Languages, parte 4</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/prueba-fig1.jpg" width="1444" height="648" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:59</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/prueba-software" hreflang="und">Prueba de Software</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/luis-vinicio-leon-carrillo" hreflang="und">Luis Vinicio León Carrillo</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En el número anterior mostramos la </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Jerarquía de lenguajes de Chomsky</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, que se construye considerando la complejidad de la estructura de las reglas del conjunto </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">R</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> que define cada tipo de lenguaje. Partamos ahora no de las gramáticas, sino de los lenguajes, y apliquemos unas extensiones: llamamos…</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Regulares</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o de </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tipo 3</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, o de manera corta</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) a aquellos que pueden definirse utilizando </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gramáticas Regulares</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, cuyas</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">reglas son de la forma &nbsp;&nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A→ B d </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;(o menos compleja). </span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(Nota: las reglas podrían ser de la forma </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A→ d B </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;, pero no se pueden mezclar ambas formas en una misma gramática.)</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Libres de Contexto </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tipo 2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, o </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a aquellos que pueden definirse utilizando </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gramáticas Libres de Contexto</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, cuyas</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">reglas son de la forma &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A→ </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;(o menos compleja).</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Dentro de estos lenguajes existen varias divisiones. Una de las más relevantes es la que diferencia entre los lenguajes determinísticos y los no-determinísticos; un ejemplo de estos últimos es &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">n</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">n </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">∪ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">n</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2n &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, que como podrán intuir, para procesarlo es necesario que el compilador asociado realice </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">backtracking</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: -1px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Sensibles al Contexto </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tipo 1</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, o </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a aquellos que pueden definirse utilizando </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gramáticas Sensibles al Contexto</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, cuyas</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">reglas ó son de la forma a) </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">A</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">→</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;(o menos compleja), donde </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≠</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> ; ó b) &nbsp;&nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">θ</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">→</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o menos compleja), donde |</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">θ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≤</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> |</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| .</span></p></li><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Estructurados por Frases </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Recursivamente Enumerables</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">o </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tipo 0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, o </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a aquellos que pueden definirse utilizando </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Gramáticas Estructuradas por Frases</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, cuyas reglas son de la forma &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">θ</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">→ </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">α</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(o menos compleja), donde </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">θ</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≠</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Dentro de estos </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0 </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">se encuentra la importantísima clase los </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Decidibles</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (o </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Recursivos</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">o </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">dec</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">), que son</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;aquellos para los que es posible construir programas (por ejemplo compiladores) que siempre terminan y anuncian si la cadena sí es elemento del lenguaje o si no lo es (aunque para ello consuman cantidades considerables de tiempo y memoria). Las reglas con las que se definen tienen la misma forma que los </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. </span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Podemos ver a los </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> como lenguajes semi-decidibles: los programas que los procesan (por ejemplo compiladores) pueden determinar cuando las cadenas sí son elementos del lenguaje, pero cuando no es así continúan su procesamiento indefinidamente.</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes Generales</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (o </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">gral</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a aquellos que incluyen a todos los anteriores y a los que no son susceptibles de ser definidos con reglas.</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr">&nbsp;</p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En esta jerarquía ocurre (obviando algunas precisiones) que &nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⊂≠ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⊂≠ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⊂≠ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">dec</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⊂≠ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0 </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">⊂≠ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">grals</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esto enuncia con mayor exactitud lo que mencionamos sobre la cantidad de programas (|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">N|</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) y de lenguajes (|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">2</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">N</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|): de todo el universo de lenguajes </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">grals</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, solamente para los </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lgs</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">dec</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">podemos escribir procesadores que determinan cuando las cadenas sí forman parte del lenguaje y también cuando no es así. &nbsp; <br /></span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr">&nbsp;</p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 14.666666666666666px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ejemplos de especificaciones usando gramáticas</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Especifiquemos ahora con gramáticas los lenguajes que definimos “algebraicamente” en el número anterior: &nbsp;</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> : &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">m</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">n</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">i</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">k</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">m, n, i, k </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≥</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;0 e independientes entre sí:</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">E → &nbsp;λ </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> a E </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">b </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b F</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c G</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d H &nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">F &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b F</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c G</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d H &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">G &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">| </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c G</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d H &nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">H &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d H</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;&nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Como pueden observar, se trata de una Gramática Regular.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Escribamos lo que se denomina una </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">derivación</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> :</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">E → &nbsp;a E → &nbsp;aa E &nbsp;→ &nbsp;aa F → &nbsp;aab F → &nbsp;aabb F → &nbsp;aabbb F → &nbsp;aabbb G → &nbsp;aabbbc G → &nbsp;aabbbc H &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;→ &nbsp;aabbbc λ &nbsp;→ &nbsp;aabbbc</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este tipo de gramáticas son equivalentes a las conocidas </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">expresiones regulares</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, y como veremos en seguida, son suficientes para especificar los “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">scanners</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">” de los compiladores, los cuales se encargan del análisis lexicográfico.</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> : &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">m</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">i</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">i</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">m</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">m, i </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≥</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0 &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">que aparecen por pares y están “anidadas”:</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">E → &nbsp;a E d | F</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 70.8pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">F → &nbsp;b F c | λ</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este es un ejemplo “clásico” de una Gramática Libre de Contexto.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">He aquí una derivación para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;:</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">E → &nbsp;a E d → aa E dd → aa F dd → aab F cdd → &nbsp;aabb F ccdd → &nbsp;aabbb F cccdd → &nbsp;aabbb λ cccdd </span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;→ aabbbcccdd</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(Si hacemos &nbsp;&nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = ( , &nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">b</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = { , &nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = } , &nbsp;&nbsp;y &nbsp;&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> = ) &nbsp;&nbsp;tenemos el caso concreto que mencionamos en la revista anterior.)</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Este tipo de gramáticas son equivalentes a los conocidos </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">grafos de sintaxis</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, y son suficientes para especificar los </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">parsers</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> de los compiladores, los cuales se encargan del análisis sintáctico.</span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> : &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">m</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">i</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">m</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">i</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">m, i </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">&nbsp;</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">≥</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> , que aparecen por pares pero no están anidadas:</span></p></li></ul><ol style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;S → V &nbsp;| λ</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;V → a V Y | a c | X</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;X → b X Z | b Z</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Z Y → Z T</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;, &nbsp;&nbsp;Z T</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> → Y T</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;, &nbsp;Y T</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> → Y Z &nbsp;&nbsp;&nbsp;/* </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Reglas que abreviaremos como</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;Z Y → Y Z &nbsp;*/</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">b Y → b c</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c Y → c c </span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">c Z → c d</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">d Z → d d</span></p></li><li style="list-style-type: decimal; font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; margin-left: 71px;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">b Z → b d</span></p></li></ol><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Excepto por el </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">en la primera regla, que es indispensable porque el lenguaje genera </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, y que es aceptable porque solo la genera el Símbolo-inicial, la anterior es una Gramática Sensible al Contexto: en las 3 primeras reglas no hay contexto (</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, volviéndolas Libres de Contexto); en las restantes ocurre que </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> o que </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">β</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">= </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> .</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">He aquí una derivación para </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;:</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">S → &nbsp;V &nbsp;→ &nbsp;a V Y → &nbsp;a a V Y Y → &nbsp;a a a V Y Y Y </span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;→ &nbsp;a a a X Y Y Y → &nbsp;a a a b X Z Y Y Y &nbsp;→ &nbsp;a a a b b Z Z Y Y Y &nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;→ &nbsp;a a a b b Z Y Z Y Y → &nbsp;a a a b b Y Z Z Y Y → &nbsp;a a a b b Y Z Y Z Y → &nbsp;a a a b b Y Y Z Z Y</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;→ &nbsp;a a a b b Y Y Z Y Z &nbsp;→ &nbsp;a a a b b Y Y Y Z Z → &nbsp;a a a b b c Y Y Z Z → &nbsp;a a a b b c c Y Z Z</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 85.05pt; text-indent: -14.150000000000006pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;&nbsp;→ &nbsp;a a a b b c c c Z Z → &nbsp;a a a b b c c c d Z → &nbsp;a a a b b c c c d d</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 35.4pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Con este tipo de gramáticas se podrían especificar (al menos buena parte de) los Sistemas de Tipos de los lenguajes de programación, los cuales definen sus aspectos semánticos (de significado, como los del paso de parámetros que mencionamos, o la equivalencia de tipos). Sin embargo, dado que el procesamiento de estas gramáticas es más complejo y costoso en tiempo que el de las Libres de Contexto, y que la mayoría de los constructos de los lenguajes de computación son de este último tipo, los aspectos semánticos también se suelen abordar apoyándose en gramáticas Libres de Contexto y en una </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tabla de Identificadores </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">(en la cual suele almacenarse, entre otras cosas, su nombre, clase (si es variable, procedimiento, función, etc.), tipo (v.gr. integer, string, </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">〈</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">char, real</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">〉</span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">→</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> boolean), y dirección). </span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 14.666666666666666px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Lenguajes y Compiladores </span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Obviando algunas precisiones, un compilador suele tener una estructura como la siguiente:</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: center;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img src="https://lh6.googleusercontent.com/-sJNqehZmbwX1MVNl0QyoKaLLLMbMDplka0JgqZPHNGqO4sX8hIW1xfwbleLf_edEqcig1TGAoE48srFplrF1sW9hC98B-DXEItKmNvJHc7BhR7OTAXm4E9sSXnjxTchNRn_7vtoy5KfgoHq5g" width="489" height="227" style="border: none; transform: rotate(0.00rad); -webkit-transform: rotate(0.00rad);" /></span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Grosso modo</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, su funcionamiento es como sigue:</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Cada vez que el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">scanner</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Analizador Léxico</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) es llamado, reanuda su lectura de caracteres del </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Código Fuente</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> escrito en el Lenguaje</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">1</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">; se salta caracteres irrelevantes (como una secuencia de comentarios, blancos, y/o saltos de línea) y luego concatena los que sí son relevantes hasta completar una cadena que tenga significado por sí misma (por ejemplo “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">“, “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">main</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">” y “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">contador</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">” en el lenguaje C); en seguida detecta si la cadena es una palabra reservada (como “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">main</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”), un símbolo (como “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">“,) o un identificador (como “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">contador</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”), en cuyo caso &nbsp;lo busca en la </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Tabla de Identificadores</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y si no lo encuentra lo da de alta; finalmente, regresa esta información a la subrutina que lo llamó, usualmente el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">parser</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">parser</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Analizador Sintáctico</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">) suele ser el componente central del procesamiento de un compilador. Manda llamar al scanner, el cual le regresa la cadena que acaba de completar y la información que mencionamos arriba. Con esos datos, el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">parser</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> busca seguir alguna de las reglas gramaticales del lenguaje; en caso de no encontrar alguna envía un mensaje de error. En su procesamiento va utilizando y actualizando la Tabla de Identificadores (por ejemplo, escribiendo si el Identificador es el nombre de una subrutina o de una variable, así como su tipo), va construyendo el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Árbol Sintáctico</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> del programa en cuestión (ver un ejemplo en seguida), y va ejecutando instrucciones que tiene “embebidas”, tanto del </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Analizador Semántico</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> que revisa cuestiones relacionadas principalmente con tipos de datos (para lo cual se apoya en la Tabla de Identificadores), como del </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Generador de Código</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> (el cual también se apoya en esa Tabla) para ir construyendo el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Código Objeto</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> con instrucciones en el Lenguaje</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2.</span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;"><br /><br /></strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">El árbol sintáctico para la cadena </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">a</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> b</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> c</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">3</span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: super; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> &nbsp;del lenguaje </span><span style="font-size: 13.333333333333332px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="font-size: 7.999999999999999px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: bold; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">2</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, descrito arriba, se muestra en la siguiente figura. En ella se puede observar que se parte de S</span><span style="font-size: 7.999999999999999px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: sub; white-space: pre-wrap;">0</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y se van generando ramificaciones sustituyendo no-Terminales mediante la aplicación de alguna regla de la gramática; las hojas del árbol acaban siendo Terminales o </span><span style="font-size: 13.333333333333332px; font-family: Symbol; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">λ</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 16px; font-family: 'Times New Roman'; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img src="https://lh5.googleusercontent.com/J17SZbUIb5-2NzgfVORHxa98xlVeddrw0sFyScmZmRIzDpHibV0DpD99XiRC7MH1e80kzlx8TSN3pMoyY6sKGlTsWGDMqEycn5hapmOp8bT-ckI5soBuliCms8IzksFg-4KRjfT4nuCXQB67Bw" width="62" height="201" style="border: none; transform: rotate(0.00rad); -webkit-transform: rotate(0.00rad);" /></span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 14.666666666666666px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Compiladores y Arquitectura </span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La investigación en Arquitectura de Software ha estado motivada principalmente porque los sistemas han venido creciendo en tamaño y complejidad, haciendo que el tema de mayor preocupación no sean ya tanto los algoritmos y las estructuras de datos, sino la interacción entre los constituyentes del sistema.</span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Esta investigación puede verse como una continuación natural del desarrollo de mecanismos de abstracción en los lenguajes de programación, los cuales buscan facilitar el desarrollo de sistemas:</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Los primeros programas de software fueron escritos en lenguaje máquina. La inserción de una nueva instrucción podía requerir tener que revisar manualmente el programa completo, lo cual motivó el desarrollo de Ensambladores Simbólicos, que hacían actualización automática de referencias y permitían utilizar nemónicos en lugar de códigos de operación de instrucciones. Los posteriores procesadores de macros fueron más allá y permitieron que un solo símbolo fuera sustituido por una secuencia de instrucciones.</span></p></li><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Después se detectaron patrones de ejecución comunes, como la evaluación de expresiones aritmético-algebraicas, el llamado a subrutinas, así como las instrucciones de alternación (como el “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”) y de repetición (como el “</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">while</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">”).</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Luego se detectaron también patrones en el uso de datos, que condujeron al desarrollo de Sistema de Tipos que incluían tipos básicos y constructores de tipos.</span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Después vino la introducción de módulos, que permitió “aislar” subrutinas y tipos de datos para impedir su modificación, y proveer interfaces de los mismos solamente para su uso a (el resto de) los programadores.</span></p></li><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Hoy se trabaja en la formalización de Patrones Arquitectónicos para poder procesarlos con lenguajes formales, &nbsp;facilitando la construcción de la arquitectura los sistemas.</span></p></li></ul><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Es común que la </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">arquitectura</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> de un producto de software se defina formalmente como un grafo dirigido definido por: a) un conjunto (finito) de nodos, que son los componentes del producto (subrutinas, datos, etc.); b) un conjunto (finito) de conectores entre los nodos (interacciones como llamadas, accesos a datos, etc.); y (eventualmente) c) un conjunto de restricciones e invariantes sobre los grafos (v.gr. la ausencia de ciclos).</span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;">&nbsp;</strong></strong></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">En la literatura especializada se han documentado varios </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: bold; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">patrones arquitectónicos</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">. Dos de ellos son: </span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Pipelines</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: en ellos los componentes son programas que llamamos </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">filters</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y que se ejecutan secuencialmente, y los conectores, que llamamos </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">pipes</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, son los flujos de datos entre ellos. </span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Inicialmente (en los 70’s), la arquitectura de un compilador se veía como un </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">pipeline</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: &nbsp;&nbsp;&nbsp;</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: center;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><img src="https://lh3.googleusercontent.com/hQ2s0uZ-UpQIx7bbLuBZqMV9537pAsyv1Fmjo9Ox0zQ1ru1qq8pa9gtk4Pci-EnB0C-CStCSKL1DvzHWay5ui7ejKNySmzD4IUZY4nKNiseAL73qBR7cq_HahEe14Xc3XqUG1zOk8-Kh7Ti4pw" width="509" height="193" style="border: none; transform: rotate(0.00rad); -webkit-transform: rotate(0.00rad);" /></span></p><p><strong style="font-weight: normal;"><strong style="font-weight: normal;"><br /><br /><br /></strong></strong></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Repositories</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: uno de los tipos más importantes de </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">repository</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> son los </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">blackboards</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, en los cuales hay una(s) estructura(s) de datos central(es) a la(s) que se conectan los componentes, la(s) cual(es) dirige(n) la ejecución de los mismos.</span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; margin-left: 36pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">La arquitectura de los compiladores se ha venido sofisticando y hoy en día tiene más bien una estructura de </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">blackboard</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> como la que mostramos al inicio de la sección anterior.</span></p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr">&nbsp;</p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Los compiladores pueden ser un muy buen ejemplo al abordar el tema de los patrones arquitectónicos: </span></p><ul style="margin-top: 0pt; margin-bottom: 0pt;"><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">facilitan el estudio de la necesidad y aplicabilidad de patrones a la luz de la complejidad y sofisticación el producto en cuestión a lo largo del tiempo (como hemos intentado hacerlo aquí, si bien superficialmente);</span></p></li><li style="list-style-type: disc; font-size: 13.333333333333332px; font-family: Arial; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;" dir="ltr"><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">cuando se construyen compiladores se aprovechan los avances en el procesamiento de lenguajes formales para generar automáticamente el </span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: italic; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">blackboard</span><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> y utilizar meta-lenguajes especializados (como como las Expresiones Regulares, la notación BNF, y los Grafos de Sintaxis) con los cuales se especifica la instancia del compilador específico, así como para aplicar el método de análisis sintáctico que resulte más conveniente. </span></p></li></ul><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr">&nbsp;</p><p style="line-height: 1.2; margin-top: 0pt; margin-bottom: 0pt; text-align: justify;" dir="ltr"><span style="font-size: 13.333333333333332px; font-family: Calibri; color: #000000; background-color: transparent; font-weight: 400; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Podremos abundar sobre este tema en números posteriores.</span></p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Luis Vinicio León Carrillo es Director General y co-fundador de e-Quallity. Fue profesor-investigador en la universidad ITESO. Realizó estudios de posgrado en Alemania, durante los cuales abordó temas relacionados con la prueba de software y los métodos y lenguajes formales.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:59:18 +0000 sg 6829 at https://sg.com.mx https://sg.com.mx/revista/52/special-purpose-languages-parte-4#comments Cómo Aumentar la Lealtad de tus Usuarios en Aplicaciones Móviles https://sg.com.mx/revista/52/c-mo-aumentar-la-lealtad-tus-usuarios-aplicaciones-m-viles <span class="field field--name-title field--type-string field--label-hidden">Cómo Aumentar la Lealtad de tus Usuarios en Aplicaciones Móviles</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/SG52_UX.jpg" width="3000" height="2003" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:53</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/buzz/seccion-revista/user-experience" hreflang="und">User eXperience</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/misael-leon" hreflang="und">Misael León</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">Hablemos de cuando los usuarios abandonan nuestra aplicación y no vuelven más. Ese duro momento que nos duele tanto a los equipos de productos. Si está sucediendo con tu app no te sientas solo; es de hecho un suceso promedio en la industria de software y es tan alto que es impresionante.</p><p dir="ltr">Los datos duros dicen: la media de las aplicaciones en el mercado pierde 77% de sus usuarios después de 3 días de haberla instalado. Dentro de 90 días sube a 95% [1]. El terror encarnado. Pero, ¿qué hacer al respecto? A continuación veamos las causas más comunes y algunas soluciones para ponerle fin a la pesadilla.</p><h2 dir="ltr">Causas comunes de abandono</h2><p dir="ltr">Hay distintas razones para que un usuario abandone una aplicación. Exploremos una de las más recurrentes, cuando creamos una barrera inicial justo después de haberla instalado.</p><h3 dir="ltr">1. Un proceso de onboarding confuso</h3><p dir="ltr">Onboarding es la actividad de educar a los usuarios respecto a cómo funciona nuestra aplicación o tal vez sobre los beneficios de utilizarla. Son una serie de pantallas informativas colocadas al inicio de la interacción.</p><p dir="ltr">Usualmente nuestra intención de educar es genuina. Sin embargo, es común abusar de este recurso y presentar mucha información en una sola pantalla, o ceder a la tentación de hablar de todas las funcionalidades que nuestro producto es capaz de hacer. Esto ocasiona que nuestros usuarios terminen sintiéndose abrumados y confundidos. Recuerda que lo que ellos quieren es experimentar tu aplicación de inmediato, usar el juguete nuevo. Déjalos descubrirla por sí mismos.</p><p dir="ltr">Solución. Realiza entrevistas con algunos de tus usuarios (entre 8 y 10 será suficiente) para entender cómo tu producto encaja en su estilo de vida. De esto aprenderás a identificar qué los motiva y qué los frustra. También podrás conocer sus hábitos personales y de consumo. De esta manera podrías seleccionar el tipo de onboardingprocess adecuado. A continuación describo los tipos de onboarding más comunes:</p><ul><li dir="ltr"><p dir="ltr">Orientado a beneficios: es cuando describimos en esas pantallas iniciales la transformación que el usuario experimentará si utiliza nuestra aplicación. Tal vez será más feliz, más saludable, más conectado con sus amigos, más organizado. Quizás ganará acceso a millones de canciones o recomendaciones de recetas. Estos son beneficios subjetivos. Recomiendo no ir más allá de 4 o 5 pantallas.</p></li><li dir="ltr"><p dir="ltr">Orientado a funciones: aquí es cuando describimos lo que la aplicación hace propiamente. Tal vez permitirá crear listas de reproducción inteligentes, compartir información en redes sociales u obtener recomendaciones de expertos. Estos son beneficios objetivos que tu producto brindará. Recuerda que el usuario ya está convencido de utilizarla, dado que ya la ha instalado. Así que ten máximo 3 o 4 pantallas y úsalas para sorprenderlos con algo inesperado.</p></li><li dir="ltr"><p dir="ltr">Orientado a funcionalidades específicas: cuando tu producto funciona de manera diferente al estándar del mercado o cuando es algo radicalmente nuevo, lo ideal es indicar dónde están ciertas funcionalidades y explicar cómo usarlas. Es decir, en dónde los usuarios podrán crear listas de reproducción, cómo podrán exportar información o cómo sacar mayor provecho de alguna búsqueda tal vez. Es ideal utilizar entre 3 a 4 pantallas. Dejemos que las personas gocen de su deseo innato de descubrir lo nuevo por sí mismas.</p></li></ul><p dir="ltr">No existe una solución única que sea adapte para todas las aplicaciones. Puedes considerar incluso no utilizar ningún tipo de onboarding en absoluto. Una interfaz intuitiva debería ser capaz de explicarse a sí misma.</p><h3 dir="ltr">2. Llenar un perfil muy largo</h3><p dir="ltr">¡Hurra! Tenemos un usuario nuevo, pidámosle todos los datos posibles para conocerlo mejor. Errrrr. Esta es una práctica nociva. Pedirle mucha información a un usuario cuando recién llega es como si entraras a una tienda y te pidieran llenar una encuesta para identificarte. Piensa, ¿realmente necesitas el número teléfonico de inmediato?</p><p dir="ltr">Pedir a los usuarios que llenen un perfil muy largo antes que experimenten tu aplicación los hará sentirse atrapados. De nuevo, los ponemos muy lejos del juguete nuevo.</p><p dir="ltr">Solución. Lo más sencillo es pedirles hacer login mediante servicios conocidos como Google o Facebook. De no ser posible puedes definir un perfil modelo de tus usuarios. En UX le llamamos Persona [2]. La información base la puedes obtener a través de entrevistas, analizando tus analíticos o realizando encuestas. De esta manera podrás tener una visión aproximada de quiénes son ellos exactamente. Entendiendo sus hábitos y estilo de vida, puedes determinar qué información te es relevante y cuáles datos están dispuestos a proporcionar. La diversidad moderna hace del uso de perfiles una necesidad. Por ejemplo, no podemos tratar de igual manera a una mamá que a un millennial, ambos tienen una visión del mundo muy diferente.</p><h3 dir="ltr">3. Limitaciones en las versiones</h3><p dir="ltr">Imagina que vas a comprar una carro nuevo, de inmediato sientes la adrenalina que experimentarás al manejarlo y mueres por hacer una prueba de manejo. Pero por alguna razón desconocida la agencia solamente te deja encender el carro, pero no manejarlo. ¡Imposible! Esto nunca sucede. Y sin embargo constantemente vemos esta situación en las aplicaciones móviles.</p><p dir="ltr">Cuando bloqueamos funcionalidades de nuestro producto, no estamos dejando a los usuarios “probar” la mercancía antes de comprarla. Solamente causamos frustración cuando ponemos a los usuarios en la situación de comprar una versión completa sin antes dejarlos evaluarla.</p><p dir="ltr">Soy creyente fiel de los trial versions, por tanto &nbsp;dejar a las personas utilizar una versión completa para sentirse seducidos por las bondades de tu aplicación, hará que suban tus cifras de conversión. Después de todo, nos medimos la ropa antes de comprarla, probamos una muestra de galletas antes de decidirnos por una caja. Nuestro comportamiento en el mundo real no es tan diferente al mundo digital.</p><p dir="ltr">Solución. Realiza A/B testing [3] para determinar qué incluir en tu trial. Por ejemplo, puedes liberar una versión lite con cierto número de funcionalidades, digamos 4 de 10, y mides el nivel de conversión de compra de la versión completa. Posteriormente, liberas otra versión con 7 de 10 funcionalidades y mides si la conversión mejoró.</p><h3 dir="ltr">4. Configuraciones iniciales complicadas</h3><p dir="ltr">Creemos saberlo todo. Es por eso que a menudo no leemos los manuales de lo que compramos. Esto es excepcionalmente cierto para los productos digitales. Poner a los usuarios a llenar configuraciones complicadas y robustas antes de dejarlos experimentar tu aplicación es como ponerlos a leer un manual. Lo que termina ahuyentando a cualquiera.</p><p dir="ltr">Si tu producto realmente necesita cierto tipo de configuraciones iniciales por parte de tus usuarios, piensa primero cuáles de esas pueden ser predefinidas o cuáles pueden ser completadas en una ocasión posterior.</p><p dir="ltr">Solución. Realiza pruebas de usabilidad para determinar en qué parte del proceso de configuración tus usuarios se confunden y abruman. Si pruebas la configuración inicial con 5 personas [4] podrás descubrir los problemas más críticos de usabilidad de tu aplicación. Los datos que obtendrás serán útiles para determinar esos momentos bajos que tu usuario experimenta al ir llegando a tu aplicación. De esta manera podrás determinar más fácilmente qué configuraciones predeterminar, cuáles posponer y cuáles otras deben ser redefinidas para hacerlas más sencillas.</p><h3 dir="ltr">El largo camino del abandono a la lealtad</h3><p dir="ltr">Sin duda, el éxito del producto con los usuarios está determinado desde el día uno de uso. Esto no es tan fácil como parece, requiere de una medición esmerada sobre lo que funciona y lo que no funciona. Es por eso que realizar investigación de usuarios es necesario para entender por qué la gente termina abandonando nuestra aplicación.</p><p dir="ltr">Las aplicaciones que hoy en día son exitosas, lo son porque han logrado convertirse en parte indispensable de la vida de las personas; piensa en Facebook o Snapchat.</p><p dir="ltr">Con tantas opciones, la competencia entre apps es intensa. Liberar tu aplicación al mercado no es garantía de éxito, ya que es una entre miles. El aprendizaje continuo es lo que hará fuerte a tu equipo de producto. ¿Ya estás listo para salir a investigar?</p><p dir="ltr">Referencias</p><ol><li dir="ltr"><p dir="ltr">A. Chen. “New data shows losing 80% of mobile users is normal, and why the best apps do better.” <a href="http://swgu.ru/rj">http://swgu.ru/rj</a></p></li><li dir="ltr"><p dir="ltr">S. Carter and J. Christ. “Avoiding Bullshit Personas”. Presentación: <a href="http://swgu.ru/rk">http://swgu.ru/rk</a> Audio: <a href="http://swgu.ru/rl">http://swgu.ru/rl</a></p></li><li dir="ltr"><p dir="ltr">J. Cardello. “Define Stronger A/B Test Variations Through UX Research.” &nbsp;Nielsen Norman Group. <a href="http://swgu.ru/rm">http://swgu.ru/rm</a></p></li><li dir="ltr"><p dir="ltr">J. Nielsen. “Why You Only Need to Test with 5 Users.” Norman Nielsen. <a href="http://swgu.ru/rn">http://swgu.ru/rn</a></p></li></ol><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p dir="ltr">Misael León (@misaello) es un UX Designer que trabaja en Nearsoft investigando usuarios, desarrollando ideas de productos y diseñando prototipos. Su misión es la de crear herramientas intuitivas para que otros puedan realizar su trabajo. Le apasiona difundir las mejores prácticas de UX en comunidades de diseñadores y desarrolladores.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:53:44 +0000 sg 6828 at https://sg.com.mx https://sg.com.mx/revista/52/c-mo-aumentar-la-lealtad-tus-usuarios-aplicaciones-m-viles#comments El Desarrollo de Baja Codificación ya no es Opcional https://sg.com.mx/revista/52/el-desarrollo-baja-codificaci-n-ya-no-es-opcional <span class="field field--name-title field--type-string field--label-hidden">El Desarrollo de Baja Codificación ya no es Opcional</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/low-code.png" width="698" height="462" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:41</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/gesti%C3%B3n" hreflang="und">Estrategia de TI</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/sgvirtual/speakers/aad-van-schetsen" hreflang="und">Aad van Schetsen</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>El desarrollo de aplicaciones con baja codificación (low-code development) no es nada nuevo. En muchos sentidos, es simplemente una rama de la tendencia 4GL de las décadas los 80 y 90. Pero el mundo de la tecnología ha cambiado y hoy en día, la baja codificación se ha vuelto más relevante que nunca.</p><p dir="ltr">De acuerdo con Forrester, el mercado mundial para el desarrollo con baja codificación eclipsará los 10 mil millones de dólares en 2019. Eso tiene sentido, ya que las fortalezas de dicha estrategia —iteraciones rápidas, colaboración simple, y fácil mantenimiento a largo plazo— se complementan perfectamente con las necesidades de las empresas que requieren llevar de manera eficiente aplicaciones móviles comerciales, de escritorio, de nube y arquitecturas cliente-servidor.</p><p dir="ltr">En pocas palabras, si tienes que competir en la creciente industria del software, es necesario el desarrollo con baja codificación. A continuación comparto cinco razones de por qué hacerlo:</p><h3 dir="ltr">Colaboración casi en tiempo real entre las áreas de Negocio y TI</h3><p dir="ltr">Las aplicaciones son hechas por desarrolladores, no necesariamente para desarrolladores. No importa qué tan elegante sea la interfaz de usuario, o qué tan intuitiva sea la experiencia de usuario, una aplicación que no concuerda con los objetivos de negocio es, en cierto nivel, un fracaso.</p><p dir="ltr">Afortunadamente, aquí es donde el desarrollo con baja codificación brilla en particular. Debido a que la cantidad de codificación manual de bajo nivel se reduce drásticamente, el desarrollo avanza muy rápido. Lo que le lleva a un desarrollador días o semanas programar manualmente, puede en muchos casos realizarse en horas con herramientas de baja codificación. Como resultado, los stakeholders pueden ver su visión tomar forma rápidamente, dejando tiempo para ajustes rápidos. Los desarrolladores y los usuarios de negocios disfrutan de una colaboración en tiempo casi real y del intercambio de ideas, en lugar de la metodología tradicional iterativa de “prueba y error”.</p><p dir="ltr">Adicionalmente, en el desarrollo de baja codificación basada en modelos, la aplicación es derivada directamente de las reglas del negocio. El comportamiento de la aplicación no está impulsada solo por el código sino por la misma lógica del negocio. En tal escenario, los requerimientos del negocio y la aplicación están íntimamente ligados; la aplicación debe ajustarse a igualar las reglas de negocio más exigentes, ya que están inextricablemente "construidas al mismo tiempo".</p><h3 dir="ltr">Aumento del enfoque del desarrollador hacia la funcionalidad</h3><p dir="ltr">Las empresas contratan trabajadores expertos con altos conocimientos esperando que sean eso —expertos en su área. Cuando se trabaja en una plataforma de desarrollo con baja codificación, los programadores pasan menos tiempo “escribiendo” genérico y más tiempo creando objetos que representan la funcionalidad de muchas líneas de código. Esto aumenta considerablemente la productividad potencial de cada desarrollador, se consiguen resultados más rápido y se mejora la utilización de sus habilidades únicas.</p><h3 dir="ltr">Despliegue transparente, independiente de plataforma</h3><p dir="ltr">En un proyecto de baja codificación, los desarrolladores trabajan en la definición de modelos y se centran en la interfaz y experiencia de usuario, en lugar de preocuparse acerca de cómo se implementará la aplicación a través de diferentes arquitecturas. El despliegue de una aplicación con baja codificación es completamente transparente; no importa el paradigma o plataforma que se utilice —nube, servidor, web, móvil, cualquiera que sea— todos los datos se extraen de localidades específicas en el modelo, con la configuración necesaria y con muy poca codificación adicional.</p><p dir="ltr">Los desarrolladores pueden concentrarse en hacer una genial aplicación dentro del contexto de los requisitos de negocio y no tener que preocuparse por el entorno de implementación, ya que muchas de las tareas de bajo nivel que participan en el despliegue de una aplicación orientada a objetos son eliminadas.</p><h3 dir="ltr">Adecuada para el uso a largo plazo</h3><p dir="ltr">La velocidad y facilidad con la que una aplicación de baja codificación puede ser modificada no termina en el despliegue. Puesto que tales aplicaciones siguen siendo muy fáciles de mantener —ya que los ajustes del modelo afectan a muchos elementos individuales— es especialmente adecuado para el uso a largo plazo. Añadir soporte para una nueva tecnología o plataforma es simple, y los requisitos de negocio cambiantes se pueden resolver eficientemente de manera extraordinaria.</p><h3 dir="ltr">Una sola base de código con menor margen de error</h3><p dir="ltr">En el desarrollo tradicional de aplicaciones, es común ver una disminución gradual en la calidad y facilidad de uso. La primera iteración se ve muy bien, pero luego hay ajustes y cambios en las necesidades de los usuarios. Pasa otra iteración y sucede lo mismo. Conforme se acerca la fecha de entrega, la aplicación comienza a parecer un muégano, adiciones tardías que se aplican a las prisas, y con distintos criterios de calidad. Esto se ve agravado por el hecho de que muchos cambios de última hora afectan componentes centrales de la aplicación, creando una situación donde las funciones más importantes tienen la menor calidad.</p><p dir="ltr">En contraste, en el desarrollo con baja codificación, los desarrolladores trabajan en una simple línea base de código limpio. Las modificaciones se realizan una vez, y se extienden a lo largo del desarrollo de la aplicación, debido a que el proceso general es más sencillo. Los usuarios de negocio pueden proporcionar retroalimentación temprana durante el proceso, multiplicando el beneficio. La modificación de los requisitos y especificaciones se pueden abordar de forma cuidadosa y metódica, en lugar de manera previa o posterior al lanzamiento.</p><h3 dir="ltr">Conclusión</h3><p dir="ltr">Mediante la eliminación de código de bajo nivel que se programa de manera manual, se aumenta el tiempo que los desarrolladores dedican a tareas de alto valor. El desarrollo con baja codificación permite a los equipos producir rápidamente aplicaciones que se alinean estrechamente con los objetivos de negocio. El despliegue —sin importar la plataforma— es simple y consistente, y las aplicaciones conservan un alto nivel de calidad pensando a futuro. No es la respuesta a todos los retos de programación —siempre habrá un lugar para Java, .NET y otros frameworks orientados— pero el desarrollo con baja codificación está encontrando cada vez más su lugar dentro de los equipos de desarrollo modernos.</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Aad van Schetsen es CEO de la empresa Uniface. Cuenta con tres décadas de experiencia en la industria, con un liderazgo demostrado y profundo conocimiento en negocios empresariales, administración general, software y TI.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:41:16 +0000 sg 6827 at https://sg.com.mx https://sg.com.mx/revista/52/el-desarrollo-baja-codificaci-n-ya-no-es-opcional#comments Prerrequisitos para una Implementación Exitosa de la Entrega Continua https://sg.com.mx/revista/52/prerrequisitos-para-una-implementaci-n-exitosa-la-entrega-continua <span class="field field--name-title field--type-string field--label-hidden">Prerrequisitos para una Implementación Exitosa de la Entrega Continua</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/entrega.jpg" width="800" height="435" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:31</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/buzz/seccion-revista/devops" hreflang="und">DevOps</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/sgvirtual/speakers/cyrille-le-clerc" hreflang="und">Cyrille Le Clerc</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La entrega continua está ganando rápidamente la atención de las organizaciones, ya que ayuda a satisfacer la demanda creciente para entregar software de manera ágil. Con su énfasis en mantener el software en un estado “listo para despliegue” en todo momento, es una evolución natural de las prácticas de integración continua y desarrollo ágil de software. Sin embargo, los retos culturales y operacionales para lograrlo son mucho más grandes que dichas prácticas. Para la mayoría de las organizaciones, la entrega continua requiere la adaptación y extensión de los procesos existentes de liberación de software. Los roles, relaciones y responsabilidades de la gente en toda la organización también pueden ser impactados; por otra parte, las herramientas utilizadas para entregar, actualizar y mantener el software deben apoyar la automatización y colaboración en forma apropiada, con el propósito de minimizar demoras en el despliegue de nuevos servicios y proporcionar ciclos de retroalimentación rápida en toda la empresa.</p><p dir="ltr">Las organizaciones que están buscando hacer la transición a la entrega continua deben considerar los siguientes siete prerrequisitos. Son pasos prácticos que les permitirán ejecutar en forma exitosa los cambios culturales y operacionales dentro del marco legal y funcional en el cual operan.</p><h3 dir="ltr">Los equipos de desarrollo, QA y operaciones deben tener metas compartidas y comunicarse</h3><p dir="ltr">Mientras que la integración continua limita el alcance del equipo de desarrollo, la entrega continua incluye las fases de prueba del equipo de aseguramiento de calidad (QA) y los despliegues a producción manejados por el equipo de operaciones. Esto es un cambio de paradigma importante, y para tener éxito evolucionando una práctica de integración continua a entrega continua, es crítico que los equipos de desarrollo, QA y operaciones tengan un modelo de gobernanza (governance) compartido. La colaboración y la comunicación son componentes vitales del desarrollo exitoso de software hoy en día, y en un ambiente de entrega continua tienen que tomar el centro del escenario.</p><h3 dir="ltr">La integración continua debe funcionar antes de moverse a la entrega continua</h3><p dir="ltr">La entrega continua es una extensión de la integración continua, su prerrequisito es tener la integración continua implementada y funcionando, incluyendo control de versiones, y construcción automatizada (automated builds) con pruebas unitarias y pruebas automatizadas.</p><h3 dir="ltr">Automatiza y haz versiones de todo</h3><p dir="ltr">La entrega continua involucra la repetición continua de muchas tareas tales como hacer builds, desplegar aplicaciones y configuraciones, restaurar ambientes y bases de datos. Todas estas tareas se deben automatizar con herramientas y scripts, y todo se debe mantener bajo control de versiones para poder auditarlo y reproducirlo.</p><h3 dir="ltr">Compartir las herramientas y procedimientos entre equipos es crítico</h3><p dir="ltr">La entrega continua apunta a validar los procedimientos de implementación y automatización utilizados en el ambiente de producción; para hacerlo exitosamente, estos procedimientos y automatizaciones deben ser utilizados tan temprano como sea posible de forma tal que, sean ampliamente probados cuando se usen para implementar software a el ambiente de producción. En la mayoría de los casos, las mismas herramientas pueden utilizarse en todos los ambientes (pruebas, preproducción y producción).</p><p dir="ltr">Los scripts de automatización deben manejarse en repositorios compartidos de código fuente de tal forma que cada equipo —desarrollo, QA y operaciones— pueda mejorar las herramientas y los procedimientos. Mecanismos como pull-requests pueden ayudar al gobierno de estos scripts y herramientas.</p><h3 dir="ltr">La aplicación tiene que ser amigable en su despliegue para hacer que las implementaciones no generen eventos disruptivos</h3><p dir="ltr">Las aplicaciones deben simplificar sus procedimientos de instalación y marcha atrás (rollback) para minimizar conflictos. Un paso importante para lograrlo es reducir el número de componentes y de parámetros de configuración. La facilidad de dar marcha atrás, brinda la posibilidad de que en caso de que haya algún problema con una instalación se pueda rápidamente deshacer y regresar el sistema a su estado anterior. La capacidad de activar capacidades de forma independiente (feature toggle) permite desacoplar la instalación de binarios de la activación de capacidades, de esta manera si hay un problema al activar una capacidad, simplemente se desactiva en lugar de tener que reinstalar los binarios anteriores. Una marcha atrás entonces puede ser simplemente la desactivación de la misma , gracias a una tecla de conmutación.</p><p dir="ltr">Se debe poner especial atención a cualquier cambio en el esquema de las bases de datos, ya que se pueden volver mucho más complejas las implementaciones y los retrocesos. El patrón de diseño sin esquema de las bases de datos NoSQL trae mucha flexibilidad, pasando la responsabilidad del esquema desde la base de datos, al código. Este concepto también puede ser aplicado a bases de datos relacionales.</p><h3 dir="ltr">La infraestructura debe apuntalar el proyecto para potenciar a la gente y equipos</h3><p dir="ltr">Las infraestructuras deben proporcionar todo el equipamiento (GUIs, APIs y SDKs) y documentación requeridos para empoderar al equipo de desarrollo y QA, y hacerlos autónomos en su trabajo. Estas tareas incluyen:</p><ul><li>Poder implementar la versión de su elección de la aplicación.</li><li>Gestionar los parámetros de configuración (ver, modificar, exportar, importar).</li><li>Gestionar bases de datos (crear snapshots y restaurar a partir de estos).</li><li>Dar acceso a las bitácoras (logs) de la aplicación.</li></ul><p dir="ltr">Las plataformas de nube pública, principalmente en modelos de Plataforma como Servicio (PaaS), son ejemplos de plataformas amigables con los proyectos.</p><h3 dir="ltr">Las versiones de aplicaciones deben estar listas para ser enviadas a producción</h3><p dir="ltr">Una de las metas más importantes de la entrega continua es permitir que el dueño de producto pueda desplegar en producción cualquier versión de la aplicación que pase exitosamente el conducto (pipeline) de entrega continua, en lugar de solo poder liberar las versiones mayores que resultan al final de una iteración.</p><p dir="ltr">Alcanzar este objetivo requiere cambios importantes en la forma en que son diseñadas las aplicaciones, por ejemplo: las características que aún no han sido validadas por el equipo de QA se deben poder ocultar a los usuarios finales sin que la base de código se modifique. Dichas características deben estar en ramas (branches) de código distintas a la rama maestra, e incorporarse a la rama maestra hasta que hayan sido validadas por QA y aceptadas para su uso en producción. Otra posibilidad es usar feature toggling que consiste en poder activar o desactivar una funcionalidad desde alguna consola de administración.</p><p dir="ltr">Las herramientas de construcción deben evolucionar del concepto de versiones semánticas (SemVer) hacia un flujo continuo de versiones. En el caso de subversion, es sencillo ya que automáticamente provee un número de versión ordenado. En el caso de Git, dado que su árbol de versiones no es lineal, es un poco más complicado y requiere acuerdos en cuanto a cómo se va a organizar el árbol de versiones y la nomenclatura que se le dará.</p><h3 dir="ltr">Conclusión</h3><p dir="ltr">La entrega continua no solo se trata de un conjunto de herramientas. También debe tomar en cuenta a las personas y la cultura organizacional. La tecnología, la gente y el proceso necesitan estar alineados para hacer que la entrega continua sea exitosa; y un enfoque colaborativo es fundamental para su éxito. Implementar estas mejores prácticas puede permitir a las organizaciones cosechar las recompensas de un enfoque automatizado más fluido al desarrollo de software, y uno que también proporciona agilidad de negocios.</p><p>&nbsp;</p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Cyrille Le Clerc es Director of Product Management en la empresa CloudBees. Previamente Cyrille fue CTO de Xebia. Fue uno de los primeros proponentes del modelo ágil de desarrollo “You Build It, You Run It” , que ha puesto en marcha con una gran variedad de clientes.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:31:41 +0000 sg 6826 at https://sg.com.mx https://sg.com.mx/revista/52/prerrequisitos-para-una-implementaci-n-exitosa-la-entrega-continua#comments Arquitectura Lambda: Combinando lo mejor de dos mundos https://sg.com.mx/revista/52/arquitectura-lambda-combinando-lo-mejor-dos-mundos <span class="field field--name-title field--type-string field--label-hidden">Arquitectura Lambda: Combinando lo mejor de dos mundos</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/lambda.png" width="600" height="342" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:27</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/sgvirtual/speakers/benjam-n-vera-tudela" hreflang="und">Benjamín Vera-Tudela</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>A alto nivel hay dos tipos de procesamiento de datos: el primero es el procesamiento de datos en modo batch, el segundo es en modo stream o tiempo (semi)-real. Elaborando un poco más sobre esta diferencia, el procesamiento batch es aquel que nos permite procesar volúmenes de datos en tiempos espaciados (ej. cada 15 minutos, cada 3 horas, o diario). Mientras que el modo stream es aquel que nos permite procesar datos casi al instante en que estos son producidos (ej. cada 100 milisegundos o cada segundo).</p><p dir="ltr">Para entender por qué esta diferencia es importante, podemos utilizar ejemplos de la vida real que la hacen más evidente. Por ejemplo, si una empresa quiere entender al final de cada trimestre cuál fue la tendencia de venta de un producto, para tomar decisiones, es necesario almacenar datos sobre las transacciones de venta del producto a lo largo del mismo periodo para luego realizar el procesamiento. Si el volumen de datos es alto, este procesamiento podría tomar varios minutos o incluso horas, y en este caso en particular es probable que quienes tomen decisiones estén dispuestos a esperar ese tiempo para poder hacerlo.</p><p dir="ltr">Sin embargo en otros casos, la espera para tomar decisiones puede ser costosa, y por lo tanto se necesita hacerlo de manera casi inmediata. Por ejemplo, si se desea bloquear el uso de una tarjeta de crédito que aparenta ser fraudulenta, no podemos esperar varios minutos ya que el daño realizado por ese tipo de transacciones puede ser elevado. En estos casos es mejor tomar decisiones casi al instante en que la información de una posible transacción fraudulenta esté disponible.</p><p dir="ltr">Cuando los volúmenes de datos en cualquiera de estos casos son muy altos —es decir, cuando afrontamos temas de big data como es el caso hoy para muchas empresas operando en la era digital, y como lo será en los próximos años con el internet de las cosas— la complejidad y el costo de implementar sistemas de información que nos permitan manejar ambos tipos de procesamiento también incrementa. Es ahí en donde nace el concepto de la Arquitectura Lambda.</p><p dir="ltr">En una arquitectura lambda la idea es implementar sistemas de información que combinan ambas modalidades de procesamiento de datos: batch y stream. Esto nos da lo mejor de dos mundos, ya que el modo batch nos brinda un alcance completo y confiable mientras que el modo stream nos da los datos en línea para decisiones instantáneas.</p><p dir="ltr"><img src="/sites/default/files/images/stories/sg52/lambda.png" width="600" height="342" /></p><p dir="ltr">Figura 1. Arquitectura Lambda.</p><p dir="ltr">La figura 1 muestra un modelo de cómo funciona la arquitectura lambda. Los datos que entran al sistema se despachan tanto a la capa batch como a la capa de velocidad (speed). La capa batch escribe los datos al master data set y prepara las vistas batch, pasándolas a la capa de servidor. Esta última se encarga de indexar las vistas batch de manera que pueda responder a búsquedas con muy baja latencia. El problema es que el proceso de escribir datos y luego indexarlos es lento, por lo que éstos no están disponibles de forma instantánea; es aquí donde entra en acción el rol de la capa de velocidad; que se dedica a exponer solamente los datos más recientes, sin preocuparse por escribirlos a un registro permanente. El resultado de cualquier búsqueda puede conjuntar datos provenientes tanto de vistas de la capa batch como de la capa de velocidad.</p><h3 dir="ltr">Tecnologías involucradas</h3><p dir="ltr">En cada una de las capas de esta arquitectura se utilizan tecnologías especializadas para cada propósito. Aunque es posible utilizar distintas opciones, una opción popular es utilizar Apache Sqoop + HDFS + Hive para capturar, almacenar y procesar datos en forma batch, y Apache Kafka + HBase + Spark para capturar, almacenar y procesar datos en forma stream. Existen proveedores —como Cloudera, donde yo colaboro— que ofrecen productos que integran estas herramientas y permiten fácilmente incorporar arquitecturas lambda.</p><p dir="ltr">Referencias:</p><ol><li dir="ltr"><p dir="ltr"><a href="http://lambda-architecture.net">http://lambda-architecture.net</a></p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Benjamin Vera-Tudela es Senior Big Data Architect en Cloudera, compañía líder en el desarrollo y comercialización de tecnologías abiertas para big data.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:27:06 +0000 sg 6825 at https://sg.com.mx https://sg.com.mx/revista/52/arquitectura-lambda-combinando-lo-mejor-dos-mundos#comments Un Vistazo a la Arquitectura Serverless https://sg.com.mx/revista/52/un-vistazo-la-arquitectura-serverless <span class="field field--name-title field--type-string field--label-hidden">Un Vistazo a la Arquitectura Serverless</span> <div class="images-container clearfix"> <div class="image-preview clearfix"> <div class="image-wrapper clearfix"> <div class="field field--name-field-image field--type-image field--label-hidden field__item"> <img src="/sites/default/files/images/serverless-fig1.jpg" width="882" height="792" alt="" loading="lazy" typeof="foaf:Image" /> </div> </div> </div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 10/12/2016 - 02:22</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/52" hreflang="und">SG #52</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/secci%C3%B3n-revista/arquitectura" hreflang="und">Arquitectura</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/pedro-galvan" hreflang="und">Pedro Galván</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr">Uno de los temas que hemos explorado durante los últimos meses en los distintos canales de Software Guru, es el de arquitectura serverless (sin servidor). Ya en el primer episodio del vlog Devotion lo comentamos de forma casual, y luego en el congreso SG Next tanto Verónica López como Obie Fernández nos platicaron al respecto con mayor detalle. Así que ahora es mi turno de compartir mi perspectiva sobre este modelo arquitectónico.</p><p dir="ltr">Lo primero que hay que aclarar es que, a pesar de lo que diga su nombre, en las arquitecturas serverless sí hay servidores. Y de hecho no es uno, sino muchos. La diferencia respecto a las aplicaciones tradicionales es que no hay un servidor maestro que controle el flujo de la aplicación, sino que los servidores simplemente hospedan servicios que atienden peticiones de forma atómica y no están conscientes del flujo de la aplicación, ya que éste se controla del lado del cliente. Dichos servicios pueden haber sido implementados por nosotros (en el caso de comportamiento específico a nuestra aplicación) o también podemos usar servicios proporcionados por terceros para resolver aspectos comunes tales como, autenticación de usuarios, almacenamiento, mensajería. Por último, los desarrolladores no tienen ninguna visibilidad a los servidores que hospedan los servicios, ya que estos son administrados por terceros. Así que los desarrolladores se pueden dedicar exclusivamente a implementar la funcionalidad de la aplicación sin tener que preocuparse por administrar servidores.</p><p dir="ltr">La figura 1 (es la misma que aparece en la cabecera de este artículo) brinda un panorama de este concepto.</p><p dir="ltr"><img src="https://lh6.googleusercontent.com/Y92BKbj1puntKnAJ6YyfVYqpP0HG1jJeloULEFCbXPFdSR64BGOUubmKnjGzn6w4gtkt8lZ56v0b-VHdpDD5QcBSOEL6f0yJ3qS2C29GN_I0cXxPP-dEGusKjtqM1IhMxLJW3LDJ" width="624" height="560" /></p><p dir="ltr">Figura 1. Arquitectura serverless. Fuente: <a href="http://martinfowler.com">http://martinfowler.com</a> [1]</p><p dir="ltr">Las aplicaciones serverless típicamente hacen uso extensivo de servicios terceros para cumplir tareas que no son centrales o específicas a la aplicación. Una aplicación puede utilizar una familia de servicios terceros de un mismo proveedor (ej. Firebase) o usar servicios de proveedor distintos, por ejemplo una aplicación podría usar Auth0 para la autenticación de usuarios, Azure Media Services para entregar video por streaming, y OneSignal para push notifications.</p><p dir="ltr">Una de las principales responsabilidades de una aplicación tradicional centrada en el servidor es controlar el ciclo de petición-respuesta. Los controladores en el servidor procesan las entradas, invocan el comportamiento correspondiente y construyen una respuesta dinámica usando un motor de plantillas (template engine). En contraste, en una aplicación serverless, donde el comportamiento se ensambla a partir de servicios, el control del flujo se hace del lado del cliente y el contenido se genera de forma dinámica en el cliente. Por ejemplo, las aplicaciones móviles, IoT e incluso las de smart TV utilizan frameworks de interfaz de usuario para generar contenido dinámico a partir de información obtenida por medio de llamadas a APIs remotas.</p><p dir="ltr">En las aplicaciones centradas en el servidor, la aplicación está compuesta por procesos que están continuamente activos y atendiendo peticiones. En contraste, en las aplicaciones serverless el ciclo de vida de los programas es mucho más corto, tendiendo a ser un solo ciclo petición/respuesta en HTTP. El programa se activa cuando recibe una petición, la procesa y en cuanto termina se apaga. Este tipo de programas típicamente están hospedados en un entorno como Amazon Lambda, Azure Function o Google Cloud Functions, que se encarga de gestionar el ciclo de vida y escalabilidad del programa. Este tipo de estructura se conoce como “Funciones como Servicio” (FaaS).</p><h3 dir="ltr">Ventajas y desventajas</h3><p dir="ltr">Cualquier decisión de diseño arquitectónico involucra ventajas y desventajas.</p><p dir="ltr">Uno de los principales beneficios de la estrategia serverless es el ahorro en costo. En sistemas que tienen patrones de tráfico con picos repentinos, tener un servidor con grandes recursos continuamente disponible es costoso; en cambio, en el modelo FaaS se cobra por petición atendida. Otro componente de costo que te ahorras con serverless es el del personal y del esfuerzo requerido para administrar el servidor.</p><p dir="ltr">En cuanto a las desventajas, la primera sería la complejidad que se agrega al estructurar las aplicaciones de esta forma. También puede haber un impacto en el desempeño de la aplicación debido a la carga y latencia introducida al estar continuamente invocando servicios que no están inmediatamente disponibles.</p><p dir="ltr">Este artículo apenas ha sido un panorama general sobre serverless. Si te interesa conocer más al respecto, te recomiendo leer el artículo “Serverless Architectures” [2] de Mike Roberts.</p><p dir="ltr">Referencias:</p><ol><li dir="ltr"><p dir="ltr">B. Janakiranam. “Serverless”. <a href="http://swgu.ru/rs">http://swgu.ru/rs</a></p></li><li dir="ltr"><p dir="ltr">M. Roberts. “Serverless Architectures”. <a href="http://swgu.ru/rr">http://swgu.ru/rr</a></p></li></ol></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Pedro Galván es cofundador y director editorial de Software Guru.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 12 Oct 2016 07:22:21 +0000 sg 6824 at https://sg.com.mx https://sg.com.mx/revista/52/un-vistazo-la-arquitectura-serverless#comments