lunes, 21 de octubre de 2013

GCC (GNU Compiler Collection)


Hoy escuché un podcast titulado “Internals of GCC” de un sitio dedicado a la ingeniería de software, este podcast dirigido por Arno es acerca de una entrevista realizada a Morgan Deters, él cual platica acerca de los pasos que realiza un compilador para generar código binario. 

Como sé que alguien más puede llegar a leer esto, GCC se refiere a la colección de compiladores de GNU. Para los que recuerdan y para los que no, GNU es un sistema operativo totalmente libre, es así como también sus compiladores lo son. 

Hay muchos compiladores como lo es el de C/C++, Java o Fortran. No había pensado en la importancia de un compilador, o bueno, al menos en la manera en que se refería el podcast, ya que un compilador es la herramienta para hacer que los programas que creamos funcionen, además de aprovechar los recursos de hardware que tiene disponibles. 
Hablando de GCC este tiene grandes cantidades de compiladores para cada lenguaje además de que son totalmente portables, todo posible gracias a su estructura arquitectónica de 3 capas, principalmente, aunque también se menciona que la arquitectura seguida es totalmente modular. Debo aclarar que me sorprendió que estos compiladores contarán con una estructura como tal, por un momento creí que alguien se había sentado frente a su monitor y solo había codificado todo, sin pensar en arquitectura, portabilidad o flexibilidad. 
Hablando un poco de las tres capas que se mencionan, estas son FrontEnd, Middle-End y BackEnd. Las cuales me recuerdan mucho al diseño Web. Usando esta analogía, claro el FrontEnd es todo lo que nosotros como usuarios vemos, en el caso del compilador es la parte donde se obtiene el Abstract Syntax Tree, para esto, como ya es conocido para algunos, se realizan los análisis léxico y sintáctico.
En web no existe algo similar al Middle-End, pero pensando en otras cosas de la vida común, el Middle-End se parece a una sastrería. Si ahí venden un elegante traje, pero a veces por alguna razón no nos queda, así que hay que realizarle optimizaciones y algunos ajustes para que este nos luzca. Exactamente eso hace el Middle-End en el compilador, optimiza y repara.
Por último tenemos el Back-End, en la web aquí se llevan a cabo toda la lógica de algún sitio en base a la arquitectura (hardware) que tengamos, y así también es en el compilador. 
Es interesante conocer las estructuras detrás de estos componentes que sin duda ayudan a que las personas que creamos soluciones a partir de las computadoras podamos realizarlo de una manera más sencilla. Creo que a veces no hay personas que se interesen por el tópico, siendo así que a lo mejor no es importante conocer a fondo como el compilador realiza cierto trabajo por nosotros pero si al menos tener una noción general para así aprovechar al máximo su uso.
Para escuchar el podcast al que me refiero puedes entrar a 

http://www.se-radio.net/2007/07/episode-61-internals-of-gcc/

Espero tus comentarios

viernes, 30 de agosto de 2013

Diseño de compiladores




Esta lectura me hace reflexionar acerca del curso y sus alcances de enseñanza y práctica. Se mencionan que está tomando cierta importancia este curso dentro del plan de materias de las carreras que tienen que ver con el área computacional.
Después de leer varios ejemplos sobre algunos compiladores que no necesariamente transforman a código maquinal, como lo es Dot, me ha quedado muy claro que el algoritmo de compilación es el mismo en cualquier caso o aplicación que quieras darle.
Estos pasos para no olvidarlos son:

  • Análisis léxico y sintáctico
  • Análisis semántico
  • Generación de código
  • Optimización del código


El análisis léxico es nuestro punto de partida y lo que realiza es convertir aquello que vamos a compilar en alguna unidad que nos ayude en el proceso de traducción. Esto también es conocido como transformar a “tokens” y es el proceso que consume más tiempo en un compilador.
Después de ello el análisis sintáctico define que la secuencia de tokens actual concuerda con la gramática o lenguaje que estamos a punto de compilar. Es decir, si nuestro archivo esta en HTML si lo que leyó es HTML. El resultado de esto es algo conocido como parse tree.
Luego en el análisis semántico revisamos que ese HTML sea coherente. Un ejemplo de esto es que todas las etiquetas, tengan sus respectivas etiquetas de cierre.
Y como últimos pasos la generación y optimización del código.
No esperaba se tocará el tema de optimización de código, resulto nuevo para mí, pero vi que era importante ya que todos pensemos que la optimización es para que el código sea más rápido de ejecutar tiene otros enfoques esto, como mayor facilidad de lectura del código resultante, o en el caso que ejemplificaban de Dot, pues que el diagrama de resultado no tuviese líneas cruzadas y fuese más fácil su visualización.

Después de conocer un poco más de aplicaciones de compiladores sin duda resulta mucho más interesante el tópico, y no solo por el hecho de que podemos crear un programa que se ejecute en una pc o en un teléfono, sino porque podemos crear imágenes o algunas otras cosas interesantes.

Referencias
Saumya , D. Making compiler design relevant for students who will (most likely) never design a compiler.

jueves, 15 de agosto de 2013

Yo!

Así es, esta entrada habla acerca de mí. Mi nombre es Daniela, aunque me gusta que me digan Dany o Nanis. Actualmente me cambié de campus así que espero mucho de todo. Para los que no sepan este blog es para la materia de Compiladores que actualmente curso y todos están invitados a leer mis posts. Espero que sea una experiencia grata y que aprenda mucho acerca de ese proceso mágico de ver ejecutar aquellas pequeñas creaciones que llamo programas, quizá en algún momento con tanto aprendizaje me interese emprender el diseño de un nuevo lenguaje (yo siempre soñando).

Pero bueno esto es para hablar de mí, de mis pasatiempos...

Acerca de los videojuegos (creo que a ellos les debo la elección de mi carrera) en este momento me encuentro jugando Alan Wake, uno de los mejores juegos del 2010. Aquí les dejo el trailer para ver si se animan a jugarlo. Sin duda una excelente historia.





En los pocos ratos libres que mis actividades me han proporcionado esta semana, he comenzado a leer Frankenstein de Mary Shelley, sin duda una historia muy descriptiva, quién no se ha dado la oportunidad de leerlo debería de hacerlo simplemente es fantástico.





Nunca me he considerado fanática de las series de TV pero hace no mucho comenzó a llamar mi atención la famosa serie The Big Bang Theory, en un día normal mientras no había que ver en la TV alguien decidió dejarle ahí, no pude dejar de reír todo el tiempo, cada broma "nerd" era excesivamente graciosa para mí aunque de repente me di cuenta que era la única que entendía algunas cosas, me sentí extraña, pero sin duda es una buena serie para verse.




Y de mi último gran pasatiempo es Magic: The Gathering, no sé si alguien lo conozca pero en lo personal es de lo mejor que me ha pasado en la vida, he hecho muy buenos amigos y me ha brindado excelentes experiencias. Este juego de cartas, se basa en duelos entre "magos" o "planeswalkers" en un multiverso. La cantidad de historias es muy variada y claramente tiene ese toque de fantasía, acción y suspenso que me encanta. Lo que más me encanta es la interacción con las personas, pero también tiene sus versiones para jugar online y tiene también un juego para diversas plataformas (Xbox, Steam, etc). Les dejo el trailer que más me gusta de todo el tiempo que llevo jugando.



Creo que he platicado suficiente de mí, espero sus comentarios!