A primera vista, muchos lenguajes de proyectoción parecen ?escritos en griego? para el ojo del neófito, son una amalgama de inglés y una sintaxis inusual. Considere por ejemplo el proyecto siguiente, escrito en lenguaje Javaclass Hello     public static void main(String [] args)         System.out.println(?hola, mundo!?); Todo lo que hace este programa, cuando se ejecuta, es escribir ? hola mundo ? en la pantalla del usuario. Usted podría haberlo adivinado con solo echarle un vistazo al código e ignorar todo lo que no le hacía sentido! Pero ¿qué son todos esas llaves, paréntesis y corchetes {([])? ¿Qué desea decir System.out? ¿Qué implica class Hello? y ¿public static void main(String [] args)? Ni sigamos. Basta con decir que, cuando se trata de aprender a proyector, la curva de aprendizaje con lenguajes como Java es muy plana. Antes de comenzar a resolver problemas, usted tiene que aprender primero a leer y escribir en un nuevo lenguaje, aún si la tarea que tiene por delante es sencilla, por ejemplo: ?Hola mundo?. Aunque usted entiende a un forastero cuando pronuncia mal cierta palabras en Inglés, este no es el caso con los computadores que son intolerantes cuando de yerros se trata. Y no hablemos de un punto y coma, porque sin este el proyecto previo ni siquiera va a correr! Aprender a programar tiene que ver, en últimas, con aprender a pensar lógicamente y aprender a abordar los dificultades metódicamente. Sin embargo, los bloques de construcción sobre los que se apoyan los programadores para desarrollar soluciones, son relativamente simples. Por ejemplo, son comunes en proyectoción tanto los ?ciclos? (loops), por recurso de los cuales un proyecto hace algo repetidamente, como las ?condicionales?, por recurso de las cuales un proyecto hace algo solo debajo ciertas circunstancias. También son comunes las ?variables?, para que un proyecto, al idéntico que un matemático, pueda recordar ciertos valores. Para muchos estudiantes, la que parece una sintaxis críptica de lenguajes como Java, pone impedimentos en su sendero para dominar estructuras tan sencillas como estas. Por lo que antes de abordar un lenguaje como Java, con sus paréntesis y puntos y comas, dirijamos vuestra vigilancia a Scratch, ?nuevo lenguaje de programación que le faculta crear sus particulares animaciones, juegos y producciones artísticas interactivas?. Aunque originalmente el grupo de investigación del  MIT Media Lab, ?Lifelong Kindergarten? (Jardín Infantil para toda la vida), lo desarrolló para que lo usaran los niños, Scratch también es provechoso y divertido para los futuros Científicos de la Computación [1]. Mediante la representación de los bloques de construcción de los proyectos por bloques con códigos de color (similares a las piezas de un rompecabezas), Scratch le baja la ?exigencia? a la programación, permitiendo a los futuros científicos de la computación enfocarse en los problemas, en espacio de realizarlo en la sintaxis. La sintaxis, por supuesto, vendrá más tarde. Pero, por ahora, nos vamos a enfocar en la programación misma. De forma que por ahora, la programación va a parecerse más a armar un rompecabezas que a escribir en griego. Este tutorial comienza a los futuros científicos de la computación [1] en programación mediante bloques constructivos utilizando Scratch. Se supone que usted ya esta familiarizado con el uso de Scratch y por lo tanto tiene una idea común de cómo programar con el. Este tutorial pretende formalizar su comprensión de la programación, enmarcando determinadas construcciones escenciales de programación en el lenguaje de Scratch.  Fijemos vuestra vigilancia para empezar, en las instrucciones INSTRUCCIONES En programación, una instrucción simplemente es la indicación o directiva que le dice al computador que haga algo. Piense en ella como un comando o sentencia. En Scratch, cualquier bloque cuya etiqueta se lea como una orden, es una instrucción. Uno de esos bloques le da instrucciones a un objeto (sprite) para que diga algo: Otro bloque de instrucciones le indica que vaya a determinado sitio: A veces, usted desea que una instrucción se ejecute solo debajo ciertas cláusulas. Esas cláusulas se determinan en términos de expresiones Boleanas, en las que nos fijaremos a continuación. EXPRESIONES BOOLEANAS En programación, las expresiones Boleanas, son expresiones que son o ciertas o falsas. En Scratch, cualquiera de los bloques que tiene manera de diamante prolongado es una expresión Boleana. Uno de esos bloques es: Después de todo, es cierto o es falso que el botón del ratón (mouse) está presionado. Otro de esos boques es: Después de todo, es cierto o es falso que un número dado es menor que otro numero. Con expresiones Booleanas podemos desarrollar estructuras  condicionales, en las que fijamos ahora vuestra atención. CONDICIONALES En programación, una condición es algo que debe ser cierto para que algo pueda pasar. Una condición es entonces decir que ?se evalúa para verdadero? o ?se evalúa para falso?. En Scratch, cualquier bloque cuya etiqueta diga ?si?, ?al presionar? o ?hasta que? es un tipo de constructo condicional. Uno de esos bloques es: El constructo previo se conoce generalmente como un ?si constructo?. Con este podemos darle instrucciones a un objeto para que por ejemplo, diga ?hola? únicamente cuando el usuario presione el botón izquierdo del ratón (mouse): Un constructo relacionado es ?si ? si no? constructo Con el constructo previo damos instrucciones al objeto para que diga ?hola? o ?adiós?, dependiendo de que el usuario haya presionado el botón izquierdo del ratón (mouse): Tenga en cuenta de que estos constructos pueden anidarse para permitir, por ejemplo, tres cláusulas diferentes: El constructo previo podría llamerse ?si-si no?, ?si-si no? constructo Otro bloque condicional es: Y otro más de este tipo es: Algunas veces, usted desea que una o algúnas de estas instrucciones se ejecuten repetidamente de forma continua. Para implementar esta conducta, debemos dirigir vuestra vigilancia a los  ?ciclos (loops). CICLOS En programación, un ciclo puede causar la ejecución de múltiples instrucciones. En Scratch cualquier bloque cuya etiqueta comience con ?por siempre? o ?repita? es un constructo repetitivo o cíclico Uno de esos bloques es: Este constructo nos permite, por ejemplo, dar instrucciones a un objeto para que indefinidamente diga ?Miau? mientras un segundo, con intervalos de un segundo: Otro bloque le faculta realizar el ciclo un número particular de veces: Y otro bloque le faculta repetir un ciclo hasta que una condición sea verdadera: Algunas veces, usted desea ejecutar una instrucción muchas veces, cada una de ellas variando ligeramente su comportamiento. Por lo que ahora nos fijaremos en las  variables VARIABLES En programación una variable es un ?sitio? para Guardar valores, de la misma manera en que  y son variables populares en álgebra. En Scratch, las variables se representan con bloques que tienen manera de círculos alargados, que solo puede etiquetar usted. Las variables, generalmente hablando, pueden ser locales o globales. En Scratch, una variable local solo la puede usar un objeto; una global la pueden usar todos los objetos.  Las variables nos permiten, por ejemplo, dar instrucciones a un objeto para que cuente de forma ascendente desde 1: Una variable que solo coge dos valores posibles; por ejemplo, 1 para verdadero o 0 para falso, se llama variable Booleana Con instrucciones, expresiones Booleanas, condicionales, ciclos y variables, ahora en su acervo como bloques de construcción, podemos explorar ya dos constructos de programación de gran nivel, comencemos por los hilos. HILOS  En proyectoción, un hilo es como un mini código dentro de un proyecto que se puede ejecutar al mismo tiempo que lo hacen otros hilos. Entonces, un proyecto con múltiples hilos, puede realizar muchas cosas al mismo tiempo. En Scratch, cualquier bloque cuya etiqueta comience con ?al presionar?, esta señalando o demarcando esencialmente el origen de un hilo: piense de lo que Scratch llama ?proyectos? como un hilo (técnicamente los ?proyectos? corren en hilos, bueno pero eso no importa). Uno de esos bloques es: Como sugiere la etiqueta del bloque anterior, este hilo se inicia a ejecutar cuando el usuario hace clic en la bandera verde ubicada en la esquina sobresaliente derecha de Scratch. Entonces, un proyecto con dos de estos bloques, tiene ?dos hilos de ejecución? que comenzaran a ejecutarse simultáneamente cuando el usuario presione la bandera verde. Con frecuencia, es provechoso utilizar hilos separados para tareas conceptualmente diferentes. Por ejemplo, usted desea hacerle seguimiento a si el usuario en determinado momento presiona una tecla alguna mientras la ejecución de un proyecto para, por ejemplo, implementar un interruptor que prenda (1) y apague el sonido (0). Tome nota, que en este par de códigos, el hilo situado a la izquierda es el encargado de generar el maullido, si la variable ?sonido? tiene almacenado el valor 1 (on); entretanto que el hilo de la derecha constantemente chequea y recuerda si el usuario ha enmudecido o prendido el sonido, presionando la tecla ?m?. Relacionados con los hilos están los eventos, en los que á continuación fijaremos vuestra atención. EVENTOS En programación, múltiples hilos puedan comunicarse unos con otros mediante invocación y empleo de eventos. Un evento, entonces, es como un mensaje que un hilo envía a otro. En Scratch, los bloques cuyas etiquetas comienzan con ?enviar a todos?  invocan  eventos, así como los bloques cuyas etiquetas comienzan con ?al recibir? manejan eventos. Un bloque que invoca un evento es: Un bloque que maneja un evento es: Un evento no solo puede ser invocado por un bloque, sino que las acciones de un usuario pueden invocarlo  también. Por ejemplo, al realizar clic en la bandera verde de Scratch, efectivamente se  invoca un evento que se maneja por: En Scratch, no solo los eventos facultan la comunicación entre hilos, sino que también facultan a los objetos comunicarse unos con otros. Por ejemplo, dos objetos pueden desear jugar Marco Polo entre ellos, con el comportamiento de uno de ellos definido por el hilo que se descubre bajo, a la izquierda y el comportamiento del otro objeto definido por el hilo que se descubre bajo a la derecha: Además de instrucciones, expresiones Booleanas, condicionales, ciclos, variables, hilos y eventos usted puede desarrollar proyectos divertidos e interesantes. De hecho, exploremos el funcionamiento interno de lo que a primera vista parece ser un proyecto muy complejo pero que en realidad, es unicamente una aplicación de estos bloques de construcción. Fijemos vuestra vigilancia en Oscartime! OSCARTIME Pues bien, este es  Oscartime!. Oscartime es un juego, escrito en Scratch, que reta al jugador a arrastrar la gran porción de basura que está cayendo, al bote de basura de Oscar, antes de que este termine de cantar una canción clásica. Acá poseemos una impresión de pantalla: Prosiga, si todavía no lo ha hecho, descargue en su computador el archivo   Oscartime.sb. A continuación, ábralo en Scratch. Haga clic en la bandera verde, lea las instrucciones del juego y disfrute un escaso más de dos minutos de diversión! (Los verdaderos fanáticos pueden incluso ponerle un marcador a la versión que se proporciona en línea en el sitio de  Scratch Oscartime se implementa con nueve objetos, cada uno de los cuáles emplea entre uno y tres hilos. Exploremos este tutorial de constructos programados en el contexto de Oscartime para que usted entienda no solo cómo jugar el juego sino como puede usted implementarlo!. Analicemos primero el objeto Instrucciones de Oscartime OBJETO INSTRUCCIONES DE OSCARTIME El objeto  instrucciones  (Instructions) de Oscartime es responsable de la breve fantasma de las instrucciones del juego cuando este se inicia: Este objeto emplea un solo hilo para presentar las instrucciones del juego, que se implementan como un disfraz, que surge centrado en la pantalla mientras cuatro segundos: Cosa bastante simple. Examinemos ahora el primero de los objetos que caen, el objeto  Basura  de Oscartime. OBJETO BASURA DE OSCARTIME. Este objeto está diseñado para caer al azar desde una ubicación en la fracción sobresaliente de la pantalla y hacia el piso: Una vez lo coge el jugador y lo arrastra con el ratón al bote de basura, el objeto cae desde una nueva posición, burlándose del jugador. El proceso se reitera permanentemente. Por supuesto, cada eliminación del objeto vale un punto! Examinemos el primero de los hilos de este objeto: Este hilo es bastante complicado por lo que propongo examinar las fracciónes que lo componen. Sobra decir que este hilo se inicia a ejecutar en el momento en que el usuario, hace clic en la bandera verde. Las primeras instrucciones básicamente direccionan al objeto hacia abajo, lo ubican al azar y de forma invisible en determinado sitio en la fracción sobresaliente de la pantalla y, después de 4 segundos, lo muestran: Consideremos ahora el primer constructo condicional en este ciclo del hilo: Básicamente, el constructo previo pregunta: Está el jugador oprimiendo el botón izquierdo del ratón (mouse) (Si esto es cierto, el jugador seguramente esté haciendo clic en algo) El ratón (mouse), ¿está tocando este objeto? (Si esto es cierto, podemos suponer que es en este objeto que el jugador está haciendo clic) ¿Acaba el jugador de realizar clic sobre el objeto? (Si esto es cierto, necesitamos activar el modo arrastre. Si no, el jugador ya está en modo arrastre!) Cerciórese de que el jugador, en el momento, no este haciendo clic sobre determinado otro objeto (Queremos asegurarnos de que el jugador solo pueda beber un objeto a al vez, así los objetos se estén sobreponiendo en el monitor). Si las cuatro cláusulas se cumplen, los objetos constituyen una variable Boleana global llamada good_click y la hacen verdadera, de forma que el proyecto recuerde un objeto ? y no  una ubicación al azar en el monitor ? en verdad se le ha hecho clic para arrastrarlo; también constituye una variable local ? llamada my_click y la hace verdadera, así el objeto sabe que es en el en el que se hizo clic para arrastrarlo; y se el transmite a si mismo un evento llamado trash_click, de forma que un hilo separado pueda manejar el arrastre del objeto. Si no se cumplen todas las cuatro cláusulas y el objeto todavía no se está arrastrando, el segundo condicional del ciclo del constructo induce al objeto a ?caer? un paso hacia abajo, a no ser que ya haya llegado al piso: El constructo condicional con que finaliza el ciclo definaliza si el objeto se dejó caer muy cerca del bote de basura de Oscar para que pueda considerarse como depositado en él y en ese caso merecedor de un punto: En esencia, el constructo previo pregunta: ¿Todavía se está desarrollando el juego? (De todas maneras, una vez finaliza Oscar su canción, no deseamos aceptar más basura) ¿Esta situado el objeto dentro de una distancia de 20 pixeles del bote de basura de Oscar? (si esto es así, esta suficientemente cerca para que se pueda analizar depositado) ¿No está presionando el jugador el botón izquierdo del ratón (mouse)? (La basura no se depositará hasta que usted lo suelte!) Si todas las tres cláusulas previos se cumplen, el objeto se esconde (como si se debiera depositado en el bote), comunica un evento ?llamado conteo (scored) ? a uno de los hilos del objetoOscar, aguarda un par de segundos, se mueve a una nueva ubicación en la fracción sobresaliente de la pantalla y la presenta comenzando una nueva caída. Como todos estos tres constructos condicionales están anidados dentro de un bloque que tiene la etiqueta ?por siempre?, el objeto se comporta como se le indica hasta que finaliza el juego. De oto lado, la fracción estética del arrastre la maneja un segundo hilo: Básicamente, mientras el tiempo que después de realizar clic en el objeto el jugador mantenga el botón izquierdo del ratón presionado, el objeto va a seguir los movimientos del ratón, formando así la aspecto de ser arrastrado. Tan pronto como el jugador suelte el botón del ratón, el hilo coge nota de que por el momento, ni este objeto ni ningún otro, está ya recibiendo clic. Entonces el hilo ?muere?, para ser ?tejido nuevamente? cuando se recoja otro objeto para el bote de basura. Los objetos: zapato, periódico, reloj, teléfono, paraguas y trombón de Oscartime, básicamente se comportan tal como este objeto Basura, las únicas diferencias consisten en los tiempos en los que surgen por primera vez. (La fantasma de estos se sincroniza con la primera mención que de ellos hace Oscar en su canción). Entonces finalicemos mirando al último de los objetos de Oscartime, el objeto Oscar. EL OBJETO OSCAR DE OSCARTIME. El objeto Oscar de Oscartime usa tres hilos para llevar la cuenta del puntaje del jugador y su anuncio. El primero de estos hilos provee el marco común del juego: En esencia, este hilo viste al objeto con su disfraz predefinalizado? el de un bote de basura tapado -; mueve el objeto a su ubicación permanente; constituye la variable Boleana global (llamada playing) como verdadera (1), de forma que los otros objetos sepan cuando un juego está en desarrollo; y despues toca la canción de Oscar (soundtrack) entretanto el jugador juega el juego. Cuando finaliza al canción (después de 134 segundos). El objeto constituye la variable Booleana global llamada playing como falsa (0), para que los otros objetos sepan que el juego terminó; anuncia el puntaje del jugador y despues mata todos los hilos. El segundo hilo lleva en todo momento el registro  del puntaje del jugador: Básicamente, cada vez que determinado otro objeto invoca un evento llamado puntaje, el hilo de encima maneja ese evento estableciendo una variable Booleana local (llamada puntaje) como verdadera, para que los otros hilos de los objetos sepan que no deben cambiar el disfraz de Oscar entretanto ese hilo este acumulando el puntaje, de allí en adelante hace brincar a Oscar afuera de su bote de basura para anunciar el puntaje actual del jugador. El tercer hilo del objeto hace que se levante la tapa del bote de basura de Oscar cada que cierta basura se arrastra cerca de él: En esencia, la tapa del bote se levanta mientras todo el tiempo que el juego esté activo, el objeto varía el disfraz de Oscar con el fin de anunciar el puntaje del jugador, y también cuando determinado objeto esté dentro de 40 pixeles de distancia, del bote de basura. Es de esta forma como funciona Oscartime. Con seguridad la implementación involucra muchos bloques. Pero en últimas, el juego es unicamente el fruto de enlazar piezas de bloques constructivos de programación. Ahora, así Scratch soporte constructos comunes a muchos lenguajes de programación, no lo hace todo. Para concluir de este tutorial, revisemos algunos constructos de programación que no tiene Scratch. CONCLUSIÓN Aunque Scratch soporta muchos constructos, no los soporta a todos. Comunes a muchos lenguajes de programación pero ausentes en Scratch tenemos: métodos, que le permitan a usted pasar el control de la ejecución de una secuencia de bloques a otra; parámetros, que le facultan a usted influenciar el comportamiento de los métodos; valores de retorno, que facultan a una secuencia de bloques ?devover? información a otra; herencia y polimorfismo, que facultan la existencia de vinculos entre estructuras de datos. Sin embargo, para un científico de la computación en ciernes, nos parece apreciado Scratch porque omite el soporte para características o apariencias como esos. Lo que verdaderamente proporciona Scratch es un ambiente intuitivo y divertido en el que los comienzos básicos de la programación se pueden explorar y desplegar sin las complicaciones de la sintaxis. Es probable que en últimas la ayuda de Scratch para el futuro científico de la computación, es que se centre menos en las comas y los corchetes y más en la solución de problemas.