sábado, julio 28, 2007

IDEs, Editores y Compiladores

Tengo que aceptarlo. Hasta tercer semestre para programar en java usaba JCreator, y para programar en C++ usaba Visual C++. Si no tenia dichas herramientas (cada uno con su respectivo botoncito de compilar super visible) no era capa de hacer nada.

El asunto de usar este tipo de herramientas no tiene nada de vergonzoso. Lo vergonzoso resulta en que a veces, tanto "user friendly" en las herramientas de programación resulta perjudicial... especialmente cuando uno está aprendiendo.

Pues bien. El semestre pasado estaba de monitor de Matemáticas Especiales 2 (Traducido a un lenguaje mas universal sería algo así como Matemáticas Discretas) y como "motivación" era un pequeño trabajo en Haskell. Cuando empecé a dar la inducción al lenguaje y comencé por lo básico.

Diego: "Bueno... Inicialmente las herramientas mas usadas son GHC y Hugs. Existe versión para Windows y Linux..."
Estudiante: "Ahí descargamos el IDE?"
Diego: "No... ahí encuentran el compilador o el interprete"
Estudiante: "Por eso"
Diego: "Ehm no... no son la misma cosa"

A eso es precisamente a lo que me refiero. Algunos personajes creen que la labor pedagógica consiste en hacerle las cosas fácil al pequeño padawan y en este intento surgen oleadas de profesionales incapaces de salirse del ambiente Java .Net de turno. Y respecto a eso hay una historia muy curiosa.

Pascal, el lenguaje desarrollado por Niklaus Wirth, tenía como objetivo principal un uso educacional de la programación estructurada. De hecho uno a veces se topa en mucho articulo que el formalismo no muy práctico de pascal resulta conveniente para escribir pseudocódigo. El uso académico de dicho lenguaje resulto en la utilización del mismo para aplicaciones de verdad simplemente porque a la hora de que el nuevo profesional escogiera una herramienta, usaría la que conocía.

En fin, no me desviare mas.

Que es un Editor?
Esta es fácil.
Básicamente hay dos tipos, editores de texto plano, y editores de "richt text" (texto enriquecido?). Los primeros son los que nos interesan. Estos permiten manipular texto en alguna de sus diversas codificaciones, pero usualmente se refiere a editores de texto plano ASCII.

A veces estos poseen capacidades para reconocer que el texto que se escribe, posee algún tipo de gramática y otras veces tienen herramientas para interactuar con el entorno (Acceso a Shell por ejemplo).

Que es un Compilador?
Sin meternos mucho en discusiones casi filosóficas como que el compilador debe ser tipo 2 en la jerarquía de Chomsky no es compilador, o cosas del estilo, entenderemos por compilador como aquel programa que, toma un Programa fuente, y entrega un Programa Objetivo.

Un Compilador es un traductor y nada mas.

Que es un IDE?

Integrated Development Environment. La idea es esa, tener un compilador, un editor y otras cosas, por ejemplo:

Debugger:
Usualmente se refiere a la posibilidad de poner puntos de parada en el programa y revisar el estado de las variables.
Perfiles de compilación
Si. Posibilidad de tener varias formas a la hora de compilar el proyecto, para ajustar opciones de optimización y demás.

y muchas otras cosas.

En fin. Creo que hasta ahí hay suficiente contexto y pese a que digo solo cosas elementales tenía que hacer un esfuerzo por arreglar el camino al resto de Desencaminados. Probablemente mañana hable de mi reciente experiencia con Emacs ya que hoy me extendí mucho.

domingo, julio 22, 2007

Estricto o Perezoso? 2

Bueno... ya no me rinde tanto la escritura por acá pero continuo con el tema.

Pues bien, estaba el problema de querer forzar a que Haskell evaluara en forma estricta y existen varias alternativas para hacer esto.

Casi Tooodo lo saque de acá

Existe una técnica llamada CPS, pero a mi parecer solo ofusca el código. Asi que pasaré directamente a seq

La primitiva seq de Haskell hace lo siguiente, dado x seq y, se revisa que x no sea _|_ (bottom), se descarta el resultado y se pasa a evaluar y.

Este mecanismo pareciera estúpido, pero con este se pueden hacer cositas como la siguiente. Digamos que queremos forzar la evaluación de y en esta función foo x y

Podemos hacer
foo x y | y seq True = f y 
| otherwise = undefined


Otra forma de forzar la evaluación es mediante el operador $!

el cual está definido así

f $! x = x seq f x


Esto quiere decir que x $! y $! z
Evalúa z, después evalúa y y se lo aplica a z y hace lo mismo con y.

Por último si se está utilizando ghc, se puede utilizar la extensión de bang patterns. La cual permite de una vez en el pattern matching de una función evaluar en forma estricta. Siguiendo el ejemplo de foo es simplemente hacer lo siguiente.

foo x !y = f y


En fin espero que esto le sirva a alguien :)

lunes, julio 16, 2007

Aviso parroquiano

Bueno ya arregle la imagencita de arriba y ya actualice los blogs de la derecha siguiendo la vieja regla de convivencia "linkeame que yo te linkearé" jajajaja

:)

jueves, julio 05, 2007

Estricto o Perezoso?

Pues si... desde hace poco ando trabajando en un proyectico de programación en Haskell, y no hago sino encontrarme inconvenientes :P.

Haskell es un lenguaje funcional llamado perezoso por la forma como evalúa las "expresiones" (diría funciones, pero así queda mas entendible para vírgenes mentes imperativas... como la mía).

La forma de evaluar perezosa básicamente implica que se comienza desde lo que está mas afuera:
Por ejemplo en C o C++ (o casi cualquier lenguaje imperativo) si escribimos...
F1(F2(argumento1),F3(argumento2)); 

El orden de evaluación sería F3, F2, F1 en cambio en un lenguaje perezoso (Lazy) se evaluan F1, F2, F3.

La pregunta obvia que surge es la siguiente...
Como voy a evaluar F1?? no tengo F2 y F3!!

Y la respuesta es sencilla... Los necesito o puedo seguir la ejecución? cuando los necesite los evalúo, sino guardo en memoria un recordatorio (hey acordate de evaluar F1 y F2)... usualmente al final ya toca evaluarlos, pero en los lenguajes funcionales muchas veces se suele reescribir y reescribir los terminos y yaaaa al final se evalúa.

Por ejemplo (sacado de estesitio)

La función:
foldr (+) 0 [1,2,3,4]

Va a operar con + todos los números (Partiendo del cero que se le pasa).

Lo interesante es ver como pospone la evaluación...
   1.  foldr (+) 0 [1,2,3,4]
2. 1 + foldr (+) 0 [2,3,4]
3. 1 + (2 + foldr (+) 0 [3,4])
4. 1 + (2 + (3 + foldr (+) 0 [4]))
5. 1 + (2 + (3 + (4 + foldr (+) 0 [])))
6. 1 + (2 + (3 + (4 + 0)))
7. 1 + (2 + (3 + (4 + 0)))
Y ahora...
Para que evaluación perezosa?

Hay muchas cosas bacanas (de hecho el link anterior tiene muchas), pero mi favorita es la posibilidad de manipular objetos infinitos.
take 5 [1..]

La lista [1..] es la lista de todos los enteros positivos (una lista por comprensión). Teniendo esto claro, la función anterior toma los primeros 5 elementos de los enteros positivos... con una evaluación estricta, se evaluarían inicialmente los parámetros, lo cual implicaría tiempo infinito, mientras que con evaluación perezosa evaluo solo lo que necesito.

El problema?

Pues lo que llame recordatorios ocupan memoria... y a veces todo el heap se va en recordatorios :S

Como Solucionarlo?
Dado que me extendí mucho eso lo dejo para el próximo post.

lunes, julio 02, 2007

Desconfianza...

Hace poco se aprobó en mi universidad lo que será el nuevo pénsum de ingeniería de sistemas (En Eafit). Esta reforma había sido precedida por otra reforma la cual tenía un especial interés en hacer énfasis en Ingeniería de software. Contemos mas bien que se iba a hacer y que se terminó haciendo.

Inicialmente se pensaba eliminar algunas materias de ciencias básicas, para dar mayor profundidad a elementos de construcción de software (que clase de temas se habrían de incluir en estas materias... no me pregunten) Entre las materias que se pensaban eliminar estaba por ejemplo Electricidad y magnetismo (Si, es cierto, iban a hacer ingenieros de sistemas que cuando conectan un computador no saben que es voltaje), se planeaban eliminar materias como cálculo vectorial y otras... El énfasis mencionado abrió hasta la posibilidad de mutar a la carrera para convertirla en Ingeniería de Software (esto no le gustó incluso a muchos Egresados)

En fin, después de unas críticas de algunos profesores se le dió un vuelco total a la reforma y se decidió por eliminar mas bien algunas materias de ingeniería de software (que actualmente es algo así como UML 1, 2 y 3 con algo de tabú programming) y se decidió por conservar casi en su totalidad el programa. A excepción de UNA cosa.

Se planea fusionar la parte de diseño de compiladores con otra materia (actualmente Matemáticas Especiales 3, que es mas bien "Fundamentos de teoría Computabilidad").

Hace relativamente poco leí un articulo bien interesante

Respecto a esto pareciera existir una inevitable tendencia a la ocultación de los mecanismos detrás de la computación. No se porque pareciera que un profesor es capaz de dar una materia en forma de curso nocturno de java y dormir tranquilo. Tal vez la ausencia de curiosidad de los estudiantes por tener el conocimiento para domar la máquina (o la falta de capacidad intelectual para afrontarla) sea un factor predominante para esto.