Sunday, November 4, 2007

Perl

Recuerdo el día que se rompió la burbuja C/C++ que aprisionaba mi cabeza. Fue por la noche, estaba molesto, pues tenía que aceptar, nuevamente, que aquel simple programita que me había querido hacer seguiría demorándose n-dias mas porque ya estaba cansado de escribir tanto código aburrido, para hacer hacer algo que no era ni tan interesante, ni tan urgente como para seguir frente a una computadora, después de haber estado todo el día frente a otra en mi trabajo, tal ves podría dormir temprano por alguna vez, y tratar de llegar temprano mañana, para variar.




"Debe haber algo mejor", me decía, no puede ser que para abrir un archivo tenga que escribir:

HANDLE hArchivoFuente = NULL;
hArchivoFuente = CreateFile( m_strSource,
                             GENERIC_READ, // Para lectura
                             0, // No se permite compartir

                             NULL, // No seguridad
                             OPEN_EXISTING, // Falla si no existe
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);

if ( hArchivoFuente == INVALID_HANDLE_VALUE )
{
    ::MessageBox( NULL, "No se pudo abrir el archivo de origen.",
                  NULL, MB_OK | MB_ICONERROR);
    return;
}
 

Y eso que ni siquiera estaba programando usando el API Win32 puro, debido a que me estaba tomando mucho tiempo, había terminado usando MFC, denigrándome en mi auto conferido titulo de "verdadero programador". Que iba a saber yo entonces que los "verdaderos programadores" solo programan en ensamblador.

Para entonces seguro que ya me habría hecho el programita en VisualBasic en un dos por tres, pero a mis cándidos ojos de flamante internauta, crédulos y asombrados, le era evidente que en el mundo de los "verdaderos programadores", los que programaban en VisualBasic o eran unos retardados o lo hacían porque no tenían ninguna otra opción. Y claro esta que yo no quería parecer retardado ante tantas luminarias.

Asi pues, por ese entonces, para mis proyectos personales o era C/C++ o era nada. Aunque por ahi rondara un triste engendro mio hecho en VB, cuyo único punto que lo salvaba del anonimato era que tenia un control programado en C++ usando ATL.

Pero ya estaba harto. Programar en C/C++ era lento, tanto que aveces me aburría del proyecto y comenzaba con otro. Asi fue como comencé a buscar algún otro lenguaje y me tope con Perl, lo que mas me gusto fue que podía programar iterativamente, lanzaba el programa desde mi editor con una tecla y asi sucesivamente iba refinando mi programa. A mis manos cayo un librito de como "Aprender Perl en 24 dias" o era horas? no recuerdo bien y casi como jugando empecé a usarlo para todas esa cosas aburridas y tediosas que necesitaban ser automatizadas. Gracias a Perl pude agregar comandos a mi editor para compilar C/C++, Java, C#, Haskell, Ocaml y hasta HLA, pude mandar correos con una tecla, hacer backups de la empresa mientras leía cosas mas interesantes, administrar el repositorio SVN, crear instaladores y no se cuanta cosa mas. Mi computadora (y la de mi trabajo) esta llena de pequeños y útiles archivos pl, tanto asi que Perl es la segunda cosa que instalo cada vez que tengo que formatear mi computadora.

De eso ya hace tiempo, puedo decir que he aprendido lo suficiente de Perl como para encontrarle cosas que no me gustan. Por el tiempo que decidí aprender Perl, ya existía Python y Ruby. Pero debido a que todos esos nombres me sonaban raros decidí usar el primer lenguaje que me funcionó, así que se puede decir que mi elección por Perl fue accidental, y no fríamente calculada. A pesar de ello, no me arrepiento de haberlo aprendido, aunque ahora ya no lo use tanto. De haber llegado a mis manos "Aprenda Lisp en 24 horas" tal vez otra seria mi historia :)

# Fill parameter values
if (/(\S+)/) {
  if ($arrayOpen) {
    if (/\}/) {
      $arrayOpen = 0;
    }
    chomp($_);
    @{$test[$indexTest]}[$indexParam] .= $_;
    $_ .= "\n";
  }
  else {
    if (( /\{/ ) && !( /\}/)) {
      $arrayOpen = 1;
    }
    chomp($_);
    @{$test[$indexTest]}[$indexParam] = $_;
    $_ .= "\n";
  }
}


El código de arriba es parte del script mas grande que tengo en Perl, crea una solución completa para VisualStudio 2005, interpreta un problema, y crea todos los archivos necesarios con formato y casos de prueba. En el colmo de la ironía: para poder resolver problemas en C++. En Perl es un poco mas de 600 lineas, no quiero imaginar cuantas lineas sería en C++, aun usando Boost. Pero seguro que son mas de las que me molestaría en programar para algo así. El punto es: el código de arriba trata de ser legible, aun asi: ¿Cuantos pueden adivinar que esta pasando ahi?.

Hace tiempo Larry Wall (el creador de Perl) estaba hablando de las irracionalidades que comenten los que crean lenguajes de programación, aquí algunos extractos, algunos bastante graciosos (tristemente con algo de verdad) :

- "Tenemos que comenzar todo desde el principio!" (casi cualquier lenguaje académico que encuentres)
- "Frases en ingles" (eso es Cobol)
- "El procesamiento de texto no importa mucho" (Fortran)
- "Lenguajes simples producen soluciones simples" (C)
- "Se me ha ocurrido un modo de hacerlo asi que debe de estar bien" (PHP)
- "Puedes construir todo con puertas NAND" (cualquier lenguaje inventado por un electrónico)
- "Este es un lenguaje de muy alto nivel, ¿A quien le importan los bits?" (lenguajes 4G)
- "A los usuarios les importa la elegancia" (Eiffel)
- "La especificación es suficientemente buena" (Ada)
- "Hagamos esto fácil para la computadora!" (Lisp)
- "Todo es un objeto" (Smalltalk y Ruby)
- "Todo es una hipótesis" (Prolog)
- "Todo es una función" (Haskell)
- "Los programadores no deberían tener nunca libre albedrío" (Python)


Pero Larry se olvido de criticar Perl, yo diría:

- "Hagamos esto críptico!" (Perl) :p

[EDIT 2016] sigo usando Perl! de hecho ahora lo uso tambien en Linux, sigo peleando con la sintaxis, el regex es genial, es rapido y no me ha fallado nunca. El script que hablo aqui lo pueden ver aca.

No comments:

Post a Comment