CÓMO ROMPE LAS PALABRAS 0x01

¡TÚ ERES EL HÉROE DE ESTE POST!
ELIGE ENTRE 1 POSIBLE FINAL
¡TE HAS VUELTO
UN COMPILADOR!

POR PALBO* · ILUSTRACIONES EN TU MENTE

Department of Pointless Programming
University of Nowhere

August 1, 2009


Abstract

The problem of combining the style of a Choose your Own Adventure book with the implementation of programming language technology in a nonsensical pseudoscientific fashion is well-known in literature, but it lacks practical implementations. In this blog post we describe the anatomy of a toy compiler for a single-assignment concurrent language, supporting the most essential Scheme primitives (lambda, if and letrec) with the addition of basic operations to allow Erlang-like concurrency (spawn and send). We provide an implementation written in Common Lisp that compiles to bytecode for an ad-hoc virtual machine, and also the virtual machine itself, written in C. Neither do we measure nor compare anything. We don't feel like to.

* E-mail: xxxxxxxxxxxxxxxx@gmail.com. Work partially supported by nobody and unsupported by anybody.

Permission to make digital or hard copies of part or all of this work is hereby granted without fee provided that copies are not made or distributed for profit or direct commercial advantage and that copies show his notice on the first page or initial screen of a display along with the full citation.

 
¡¡ADVERTENCIA!!

No leas este post de corrido del principio al fin. Es un embole. De vez en cuando, a medida que vayas leyendo, si no abandonas en el intento, tendrás que hacer una elección. ¡Una decisión que puede llevarte al éxito o al caos, salvo por el hecho de que hay un final solo!

Tus aventuras serán resultado de tus elecciones ¡y tú el único responsable de ellas! ¡Qué loco, man! Una vez tomada la decisión, sigue las instrucciones para averiguar qué sucede más adelante.

Piensa con mucho cuidado antes de actuar. Ser independiente puede ser divertido, pero también muy peligroso.

¡Buena suerte!

 
1

Introduction

Estás en la casa de la abuela Pola, con tus dos mejores amigos y tu perro guardián. Hace tres años visitaste la casa por última vez, cuando la abuela todavía vivía. El hecho de que haya una máquina de engranientos grasajes, recheas que polinan, biciclenas de cadeneta y quejancas palancosas en el patio resulta sobremanera preocupante. Un duende vestido de turquesa, con un logotipo en el pecho en el que, después de varios esfuerzos, logras descifrar las letras mnq, dotado de tres ancas, que antes de que falleciese ella le tiraba los galgos a Pola, atiende un mostrador y tú le dices: necesito que me encolés esto en el batch. O en otras palabras, le das una receta con instrucciones que le dicen de qué manera accionar las palancas y pedales, las botoneras y un dial que silba como sintonizando una vieja radionovela de OVNIs 54-40. Entonces al duende le das las instrucciones de la Figura 1:

(letrec
  ((waiter
     (spawn
       (letrec
         ((waiter-loop
            (fun ()
              (let ((msg
                    (receive)))
                (pr msg)
                (waiter-loop)))))
         waiter-loop)))
   (sender
     (fun (n)
       (if n
         (begin
           (send waiter n)
           (sender (dec n)))))))
  (sender 12))
Figura 1 - Las instrucciones que le diste al duende

El duendecillo, obediente, morosamente, sigue tus instrucciones. Después de mucho traqueteo, trajín, qué meneo, qué vaivén, qué ajetreo, qué ruïna, de la máquina sale una manzana dorada del sol, perféctrica y simeta, similar a aquella otra que, por obra de Eris, enfrentara a los troyanos y a los aqueos de hermosas grebas.

Pese a que no resbalaste, estás cayendo hacia las profundidades de la mente de Palbo. Si bien te atrae la posibilidad de analizar la salida final del compilador, de esa manera no podrías apreciar con todo detalle el proceso mediante en cual la entrada se transforma en la salida. Por otra parte, estudiando el proceso, podrías tratar de amortiguar el impacto profundo. Todos estos pensamientos desfilan por tu mente con la velocidad de un rayo.

Si decides analizar la salida final del compilador, pasa a la página 3.
Si decides estudiar el proceso mediante el cual se llega a la salida, pasa a la página 2.
2 [Nociones básicas de anatomía del sistema digestivo del compilador]

¿So, qué es el compilador?

El compilador es un bicho muy raro, parece que fueran muchos bichos atados: el lexer, el parser, el inferidor de tipos, el generador de código intermedio, el peephole optimizer, el dataflow analyzer, el just-in-time compiler, el ensamblador, el linker. Bueno, estos últimos no son exactamente vagones en tren del compilador, pero forman parte de la larga línea en el proceso que convierte la bola de paréntesis en una tirita digna de un tubo de alumiño de Festivus. Yo lo miro y parece un tren, le cuento las patas y llego hasta cien.

¿Qué ocurre en las entrañas del compilador? Cuando le das una serie de instrucciones como las de la Figura 1, primero pasa por la boca. Los paréntesis y palabras que le diste se convierten en un bolo alimenticio que las glándulas del compilador son capaces de desmenuzar y separar en partes. En el pasado se le daba mucha importancia a esta parte del proceso, porque los zoólogos que estudiaban compiladores no tenían demasiado claro cómo era este proceso. Y, si bien es un proceso complejo y rico, no es verdaderamente relevante.

La verdadera transformación comienza en el estómago del bicho, donde el bolo alimenticio se da vuelta como una media. En lugar de escribir las cosas en el orden natural, de afuera hacia adentro, el bolo alimenticio se transforma en un hilo largo, donde primero aparecen las partes que estaban más adentro. Algunos lugares del bolo, a los que a veces las enzimas tienen que ir y volver, se marcan especialmente con una banderita, como cuando un usuario con el mouse configurado en diestro usa el botón derecho del mouse en el tradicional juego del buscaminas. El estómago deja las banderitas así como están, colgadas del hilo largo. El intestino se ocupa más tarde de sacar todas las banderitas.

En la Figura 2a se muestra el bolo alimenticio convertido en un hilo con banderitas.

push_empty_rib 2

 push_empty_rib 1
 jmp LABEL-1
 LABEL-2:
  receive
  push_rib 1
   local_ref 0 0
   print ; (pr msg)
   local_ref 2 0
   call 0 ; (waiter-loop)
  pop_rib
  ret
 LABEL-1:
  make_closure LABEL-2 0
  fill_rib 1
  local_ref 0 0
 pop_rib
 spawn 0
 jmp LABEL-3
 LABEL-4:
  local_ref 0 0
  jz LABEL-5 ; (if n ...)
   local_ref 1 0
   local_ref 0 0
   send ; (send waiter n)
   local_ref 0 0
   dec
   local_ref 1 1
   call 1 ; (sender (dec n))
  jmp LABEL-6
  LABEL-5:
  LABEL-6:
  ret
 LABEL-3:
  make_closure LABEL-4 1
  fill_rib 2

 push_int 12
 local_ref 0 1
 call 1
pop_rib
end
Figura 2a - Análisis post-inodoro. Mirando el estómago del compilador
Pasa a la página 7.
3

Decides inmergirte directamente en las profundidades de mi double-mindt. A medida que te adentras en ella, la luz se hace cada vez más tenue. Empiezas a sentirte maread(chrm[23] == X ? a : o), y pierdes el conocimiento.

Pasa a la página 6.
4

No llegaste por propia voluntad, ni siguiendo instrucciones, y sin embargo aquí estás, en Fátima Thule.

Habitualmente, las mitologías y leyendas tratan de sustantivos fantásticos, ya sean éstos animales, lugares, monstruos, espadas, elixires o semidioses. Las leyendas de Fátima Thule hablan en cambio de verbos mitológicos. Por ejemplo, se cuenta de la existencia remota del verbo lenerar, mitad nacer y mitad morir. El verbo reflexivo pirnerse, que corresponde a la idea de volver sin haber ido. Se dice que la primera persona que se pirne una noche de luna llena, lenerará.

El verbo fantástico sonsompar significa "pronunciar sonsompar". Los profesores de mitología de Fátima Thule suelen sonsompar cuando hacen referencia a este verbo. Un grupo de verbos mitológicos relacionados, probablemente inspirados en sonsompar son los tres verbos conocidos como flinatunos: flinar significa "pronunciar nater", nater significa "pronunciar tunosir", y tunosir significa "pronunciar flinar". Se dice que aquél que trata describir qué es lo que está diciendo mediante el uso de estos verbos despierta la confusión en los que no están muy atentos a las diferencias entre "uso y mención" y "mención y uso".

Otro verbo ligeramente relacionado con estos, es güirturir, cuyo significado es "comprender el verdadero significado güirturir". La leyenda dice que en el instante en el que alguien por fin güirture, es decir, por fin comprenda el verdadero significado del verbo güirturir, el verbo volverá a ser nuevamente un príncipe, y el afortunado descubridor se convertirá en piedra.

Pasa a la página 4.
5

Tras haberte inmergido en los oscuros recodos de la mente de Palbo Xxxxxxxxxxxxxxxx, decides que tu paciencia se agotó y que ya es hora de volver a casa. Lentamente te desperezas y te encuentras nuevamente en un territorio familiar. ¡La casa de la abuela Pola!

Felices por tu regreso, aunque no tanto, el duende vestido de turquesa, tus dos mejores amigos y tu perro guardián te preguntan dónde estuviste. Pero por más que insistes e insistes en que estuviste en mi mente, te dicen que estás en pedo y que seguramente lo que pasó fue que leíste este post. Y en realidad ni siquiera eso, solamente espiaste esta página porque viste que decía

Fin

References

[Mif89] Roque R. Mifús. Cómo hacerse rico. PhD thesis, University of La Pieza, La Pieza, 1989.
[Óte06a] Íteles Óteles. Un algoritmo lineal para el Martín Pescador, Almost Nowhere U., 2006.
[Óte06b] Íteles Óteles. Algoritmos lineales para «Hay un barco en el fondo de la mar», Almost Nowhere U., 2006.
[PC07] F. Puppy, P. Chuza. Optimal binary representations for dogs and owls. Dep. of Raicism, Universidá del Estante. 2007.
[Pic05] Payaso Pichito. A functional approach to shadow bricks in Lecture Notes in Luminic Masonry, pages 102-34. Magmesana, 2005.
6

Despiertas en una habitación en la que hay un dragón, salido quizá del Dragon Book y un mago salido de SICP. En eso aparecen el centauro Backus y el fauno McCarthy, y una cohorte de bufones, arlequines de rombos de una pinturería de Triste-le-Roy, reyes visigodos y ostrogodos, desamores, califas musulmanes, Conrado Nalé Roxlo, tú no sabe inglé, el estado de Louisiana, iglesias románicas, pilgrims, Les Luthiers, el Mayflower Power, Hipólito Yrigoyen, como te digunacó, te digolahó, Schönfinkel, ese pibe me tiene harta, poemas en languedoc, culpas, Kenneth Iverson, demostraciones de confluencia, Kay, dagas, portasidís, relojes de parez, qué ricos mates, Ritchie, angustias, metageMónica, Stallman, recuerdos, las Tortugas Ninja y Guy Steele.

El tema es que viene venusta Afroda con el bombín de Steed y se lo sa cosaca celosaca y te dice:

AFRODITA: Pibe, dame YA esa manzana de la discórdea.
TÚ: ¿Y si no qué?
AFRODITA: Si no, te mato.
TÚ: Ah, ta bien, ahora te la doy.

Pero tu principal problema es que, cuando vas a sacar del bolsillo la manzana dorada, il pomo d'oro, te percatas de que quedó en el otro mundo, lejos de este caos de coranes y termotanques. Sin embargo, y esta es tu última esperanza, conservas todavía la receta, aquella de la Figura 1, la que le diste al duende. ¡Si tan sólo hubiera un duende como aquel; si, ay, tan sólo hubiera una máquina como la que hay en lo de la abuela Pola en este planetita, inhóspito como el asteroide B-612, que te atrae con una fuerza directamente proporcional al producto de vuestras masas e inversamente proporcional al cuadrado de la distancia incomprendida!

Pasa a la página 8.
7

Lo más curioso e importante de todo el proceso es que la receta y la comida son lo mismo. Esto tiene varias aristas: por un lado, muchas veces en este mundo, las recetas de cocina dicen cómo preparar... ¡recetas de cocina!

Y esas recetas de cocina, a su vez, sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
recetas de cocina que sirven para preparar otras
...

Además, el hecho de que las recetas y la comida sean lo mismo tiene dos aspectos, que son, en realidad, desde luego, el mismo:

(1) Toda receta es comestible.
(2) Toda comida es una receta.

El intestino delgado o delicado de un compilador consta de duodeno, yeyuno, íleon, colon, Colón, estribo, martillo, yunque, estribillo, libro, librillo, bonete, arañita, mondongo, picada común y cuarto de pollo con guarnición.

El trabajo del intestino delgado o delicado es relativamente simple comparado con el del estómago del compilador. Su labor más importante es la de sacar las banderitas y enumerar los puntos del tejido. Si la lana tiene un patrón periódico de n puntos y el ancho de la bufanda es de m puntos, la bufanda tendrá un patrón periódico cada lcm(n, m) puntos.

Por compleción, se presenta aquí una sección transversal del intestino delgado o delicado del compilador en cuestión.

00| push_empty_rib 2
02| push_empty_rib 1
04| jmp 20
06| receive
07| push_rib 1
09| local_ref 0 0
12| print
13| local_ref 2 0
16| call 0
18| pop_rib
19| ret
20| make_closure 6 0
23| fill_rib 1
25| local_ref 0 0
28| pop_rib
29| spawn 0
31| jmp 57
33| local_ref 0 0
36| jz 56
38| local_ref 1 0
41| local_ref 0 0
44| send
45| local_ref 0 0
48| dec
49| local_ref 1 1
52| call 1
54| jmp 56
56| ret
57| make_closure 33 1
60| fill_rib 2
62| push_int 12
64| local_ref 0 1
67| call 1
69| pop_rib
70| end
Figura 2b - Análisis post-inodoro. Mirando el intestino delgado del compilador
Si aún quieres analizar la salida final del compilador, pasa a la página 3.
Si prefieres olvidar el asunto, pasa a la página 5.
8 [Donde se cuenta cómo Sancho Panza acudió con el tubo de Festivus y otras muchas cosas dignas de saberse]

Válame, que dembargospojadamente, acierta a pasar en ese instante una versión tímida, hirsuta y hexadecimal de 0xSancho, que te promete que él también tiene una máquina, y que si le das las instrucciones precisas, es capaz aquella también de construir la manzana dorada del sol perféctrica y simeta.

Lamentablemente, la máquina del escudero no se parece nada a l'anterior. Es un pequenio tubo de alumiño y punto. Es un tubo cualunque de Festivus. Pancisancho te dice:

SANCHO: No se preocupe, don Inodoro, ya está demostrau que sirve pa' lo mismo que cualquier máquina de Turin'.
TÚ: ¿Se refiere Ud. a la macchina di Torino, el Fiat Lux?
SANCHO: No, yo digo las de Alan Turing.
TÚ: Desconozco ese verbo to ture.
SANCHO: Miralde. Corrientes y Callaos la boca.

Se te ocurre que estás perdido, que ese tubo de Festivus nunca va a poder reemplazar aquella máquina, de engranientos grasajes, rellenas que polinan, Averroes y Avicenas de cadeneta y reclamancas palancosas.

Pero por algo el título de estElige tu Propia es El compilador, bicharraco precioso. Su fiel escudero saca del bombín de Afrodita una galera, y de la galera un conejo, y el conejo vomita a una reina de corazones que le corta la cabeza, y que abriendo el bolsillo de la campera extrae un Quillet de los Niños, lo abre, del libro emerge una anaconda de resorte, que no es Treng-treng sino Kai-kai, y al son de una polka, el baile de la bicha hace que empiece a diluviar. Con el diluvio, del que por suerte te salvás porque tenés un salvavidas de patito, viene el arca de Papá Noé con varios miles de bichos, incluyendo la E. Coli, el T. Cruci y también el magnánimo compilador.

El compilador es probablemente un mamífero, pero quizá es ovíparo si mal no recuerdo. Ávido y en pelotas, se come la receta de la Figura 1 y, por arte de magia, va de cuerpo en el preciso medio de los cerámicos inmaculadamente #ffffff, dejando como testimonio del movimiento de su vientre un pedazo de caca cilíndrico y marrón. Después de estrictos controles de calidad, depuraciones y engolosinamientos, se obtienen las instrucciones de la Figura 3:

09 02 09 01 03 14 0f 0a
01 08 00 00 02 08 02 00
06 00 0c 07 05 06 00 0b
01 08 00 00 0c 0d 00 03
39 08 00 00 04 38 08 01
00 08 00 00 0e 08 00 00
80 08 01 01 06 01 03 38
07 05 21 01 0b 02 01 0c
08 00 01 06 01 0c ff   
Figura 3 - Las instrucciones que cagó el compilador
Si aún tienes ganas de estudiar el proceso mediante el cual se llega a la salida, pasa a la página 2.
Si te te encuentras putrefacto, pasa a la página 5.

2 comentarios:

Unknown dijo...

me he quedado no solo estupefacto, sino entusiasmado, exponencialmente hablando, hasta el punto de querer probar ese compilador tuyo con otras instrucciones...

un abrazo

.

P dijo...

Se puede bajar de ahí.

Para poder usarlo hay que tener gcc y Common Lisp. Fue desarrollado en Clisp (sudo apt-get install clisp), pero espero que cualquier otra implementación sirva.

Requiere tener instalada la biblioteca libgc (incluída la de desarrollo, libgc-dev).

Después hay que hacer make.

chec.lisp es el compilador.

che.c es el intérprete de la vm.

La entrada está hardcodeada en el archivo (sí, ya sé que deberí cambiar eso). La salida queda en co.bc.