jueves, agosto 30, 2007

Estética de la sintáxis

Mi reunión quincenal de programación en Haskell se ha convertido en un pequeño proyecto para conocer como implementar "Parsers Combinadores" (no sé si se pueda traducir así) La idea es que antes de echar código, teníamos que leer algo de Parsers Combinadores (1). Leyendo el artículo caí en cuenta que no sabía que era un Parser Combinador (si... yo se :P) entonces googleando encontré Este Link Súper Interesante.

Mas que ser una tremenda explicación sobre Parsers Combinadores, la entrada despertó una tremenda curiosidad en SmallTalk.

Y esto porqué?

Por ejemplo SmallTalk permite Closures.

El autor dice:
"
(self letter | [self digit]) star
which yields a parser that accepts zero or more occurrences of either a letter or a digit.
In a syntax more people understand, this would look something like:
(1) letter().or( new DelayedParser(){ public Parser value(){ return digit();} }).star()
If Java had closures, it might look like this:
(2) letter().or({=> digit()}).star()
"


Y hace el comentario.

"This is better, but either way, the goal of writing an executable grammar tends to get lost in the noise. Nevertheless, it seems most people prefer (1), and the vast majority of the rest prefer (2) over the “bizarre” Smalltalk syntax. Who knows what darkness lies in the hearts of men."

En fin... usaré mi tiempo pagado en la universidad para aprender ST :)

(1)S. Doaitse Swierstra. "Combinator Parsers: From Toys to Tools"

sábado, agosto 25, 2007

Pajasos mentales para una nueva adicción

Pues con la adicción del momento a World of Warcraft puedo soñar con que realmente estoy ayudando al porvenir de la humanidad.

LINK

jueves, agosto 23, 2007

El mundo fuera de sus cuatro paredes

Pues si... Hace poco vía reddit Encontré este súper diagrama

genial no?

lunes, agosto 20, 2007

La entrada Poliglota :P

Bueno... aqui estará la entrada poliglota... la idea es hacer el famoso Hello World! usando sockets y ver que resultados obtenemos.

Por motivos de testing, puse que antes de responderle al cliente el servidor gastara algo de ciclos. Ademas, puse que para atender a cada usuario se realice un hilo.

En C
El Servidor
El Cliente

La ventaja de escribirlo en C es total control sobre como se hacen los sockets. El manejo de Hilos realizado con pthreads tiene su complique (pasar como argumento un apuntador void lo hace a uno sentir mas hombre, pero el código pierde claridad) Además toca escribir muucho mas código

En Java
El Servidor
El Cliente

Pese al alto nivel de Java, escribir un programa tan sencillo como el de sockets requiere mucho código verbose. Pese a que se ahorra uno unas cuantas líneas comparando con C, resulta necesario escribir mucho mas y separar a veces las expresiones dejando una variable temporal para no pasarse uno de los 76 caracteres por línea.

La ventaja es la legibilidad. Pese a que hice el programa muy reducido, los tipos hablan por si solos. Resulta también mas fácil de depurar.

En Ruby
El Servidor
El Cliente

Salve oh gran minimalismo de Ruby. Si uno requiere un lenguaje para salir del paso lo mas rápido posible éste es Ruby. Si se escribe bien puede ser muy claro el código, si se escribe mal puede ser tan reducido y críptico como Perl. Sin embargo, echar tan poco código trae sus desventajas. La primera es que Ruby es bastante lento y su sistema de threads a nivel de usuario no saca ningún provecho de arquitecturas SMT.

En Haskell
El Servidor
El Cliente

Este es el que a mi parecer resulta en el equilibrio perfecto. Por un lado son programas cortos. Lo fuertemente tipado ayuda a la claridad y a la correctitud. Cumplen con otra pres facil de pensar e implementar.

jueves, agosto 16, 2007

Bitacora del capitán

Fecha estelar...

No mentiras.

Casi que cerebri-lavado por mis amigos de la universidad por fin me decidí a instalar World of Warcraft. Inicialmente mi plan era tratar de emularlo usando Wine y fallé miserablemente. Intente con cedega y también falle (con wine al renderizar con opengl se ve lentísimo y con cedega error 132).

Entonces me dije "Instaleeemos Windows". Se me ocurrió instalarlo en un disco externo que tengo por ahí. Con riesgo de perder mis 160 GB de música y vídeos particioné el disco pero a la hora de instalar windows me salio error. Razón? Por ahi alguien de servicio técnico dijo "Los sistemas operativos se instalan en discos internos, los discos externos son para backups" Eso es tal vez de lo que no me gusta de Windows, odio que me digan que puedo y que no puedo hacer con las cosas que YO compro.

Después intente hacer una minipartición en un área extendida del disco... volví a fallar. Windows tampoco permite instalación en memoria extendida.

En fin ya estoy en este momento instalando windows Vamos a ver como me va.

sábado, agosto 11, 2007

Tutorial de Assembler

Pues por solicitud de de mis fans (No mentiras). Aquí está el link a un pequeño tutorial de Lenguaje ensamblador (sobre Intel (32 bits) y Linux) usando gas.

Este tutorial es el que utilizo para las inducciones en el curso de Arquitectura del Computador, del cual soy Monitor.

TUTORIAL

Alguna vez alguien me dijo que habían unos errores (y es lo mas probable) pero nunca los corregí. Si se encuentra algún error deje su comentario y yo lo corrijo.

El tutorial es muuuy básico, pero quien quita que a alguien le sea de utilidad.

jueves, agosto 02, 2007

Emacs, la edición de código y yo

En la entrada pasada escribí algo muy básico sobre IDE's, Editores y compiladores. Esta vez hablaré del proceso de edición de código y mi paso de Eclipse a Emacs.

El Programador Ideal y El Programador Real
El programador ideal (aquel que no se equivoca) tendrá una labor de la forma.

Genera los esqueletos del fuente que necesita con scripts-generador de código del IDE. Escribe el resto del código, compila y listo.

Con valores imaginarios sería algo así:
Generación de Código 5%
Escribír de código 90%
Compilación 5%

El caso real (o será solo mio?) sería:
Genero los esqueletos, Escribo código, pruebo, corrijo... eventualmente me arrepiento del nombre de alguna variable, refactorizo, me doy cuenta que algo se puede flexibilizar mejor, genero nuevo archivo (Cut-Paste), Corrijo errores de espacios de nombres, compilo, pruebo -> y así hasta terminar.

Compilación 10%
Generación de Código 10%
Escribir de Código 40%
Refactorización 5%
Cut-Paste 10%
Leer él código buscando errores 25%

Si uno se pone a ver bien, casi todo corresponde a edición.

La solución en los IDE's (mas bien de Eclipse para trabajar con Java) para hacer mas fáciles y mejores es la siguiente:

En Eclipse por ejemplo para generar código esta la pestaña source. Ahí uno puede generar getters, setters y overrides. Refactor permite cambiar nombres a las clases y además en todos los archivos del proyecto.

Una pestaña de edición: Con esto se pueden hacer pequeños find-replace, el problema resulta cuando son varios archivos, o los criterios de búsqueda no son fácilmente expresables. A veces hay posibilidad de hacer lo mismo con regex

Escribiendo código hay tres cosas fundamentales. Autoidentación, Autocompletar y facilidad para desplazarse. En Eclipse la autocompletación es mientras se va escribiendo (por ejemplo cuando se escribe punto) o también por medio de C-SPACE hasta da ideas para los nombres de las variables y además solo aconseja opciones que tienen sentido tanto sintáctica como semánticamente. Para desplazarse realmente hay un menú a la izquierda con las clases, métodos y atributos.

Para seleccionar texto está Shift y las diferentes combinaciones con Ctrl, Pg up, Pg Down y flechas. Y para leer código como hacer sin un buen highlighting?

Y ahora Emacs

Que tiene Eclipse que no tiene Emacs? Algo fundamental es la integración de la documentación. Pese a que esto no es edición, juega un papel importante en la autocompletación. Con esto uno puede saber cual es el método que uno quiere escribir y esto definitivamente ahorra tiempo a alguien que no se sabe los mil y un detalles en cuanto a parámetros y clases de java.

Pero bueno, las ventajas de eclipse se acaban cuando uno se pasa a trabajar a otro lenguaje. Los plugins disponibles para C, C++, Ruby resultan insuficientes. Carecen de todas las ventajas que acabo de mencionar.

En que es mejor Emacs?

Universalidad y Extensibilidad.
Emacs por ejemplo posee Modos para cualquier lenguaje concebible y resulta mucho mas extensible que cualquier IDE que conozca. Realizar funciones en e-lisp es mucho mas alcanzable que meterse con el API de Eclipse.

Todo está en el teclado.
Esto pareciera algo trivial. Pese a que soy alguien que no sabe teclear (es decir, usaré máximo 6 dedos de 10) resulta mas fácil concienciarse de las acciones repetitivas cuando uno las hace tecleando que cuando se hacen con mouse o por medio de un montón de wizards del editor de turno.

Emacs no pasa de moda.
JEJEJE esto parece bobo, pero no lo es. Alguna vez programe en Visual Basic 6.0. Después trate de hacer lo mismo que hacía con .Net y no fui capaz de hacer nada. Los programas que se mantienen pese a los cambios no hacen sino demostrar que poseen un buen diseño. Emacs es como los cocodrilos, si sigue existiendo... sin cambios significativos después de tanto tiempo es por algo.

No hay ventanas estorbosas!
Si. El caso típico son las búsquedas incrementales. Si uno va a buscar algo para que va a necesitar una ventana enorme sobre el texto? Por ejemplo... una búsqueda incremental en IExplorer vs Firefox quien gana?

Y es mas liviano que cualquier IDE.