Heard of Scratch? My nephew Dante introduced me to it. It’s a really nice visual programming environment, aimed at kids. You create programs that control the movement of sprites by snapping blocks together. There’s an “IDE” (written in Squeak Smalltalk) that you download and install and use to develop your programs, and then you are encouraged to share your programs by uploading them to the Scratch site. On the site, your Scratch program is run in a Java applet. Other users can then download the “source” to your programs, “remix”, and repost them. The people behind it have put a lot of work into both the technology and the community, and it ends up being really fun all around.
I made a few small programs to get the feel of it, like this Mars Lander game, but wanted to see how far I could push Scratch. So I set out to make a LOGO interpreter! It was pretty difficult, since Scratch doesn’t have subroutines, and the only data structure is the array. I ended up with something that supports a small subset of LOGO, including basic turtle graphics, user defined subroutines, and global variables. I also spent quite a lot of effort optimizing it to be as fast as possible within the limitations of Scratch. At first I just wanted to get the simple LOGO program to draw a circle,
REPEAT 360 [ FD 1 RT 1 ], to run as fast as a “native” Scratch program to do the same thing. I succeeded beyond my wildest dreams and actually made my interpreter run faster than native Scratch. How I did that is another story, but to give you a hint,
Anyway the point of all this is while poking around at how to speed things up in Scratch, I decompiled the Java player that runs Scratch programs on the web. I was at first very confused by the output, because it looked like the source code to a… LOGO interpreter…??!?! I looked harder and found enclosed in the JAR file a LOGO program to run Scratch programs! For whatever reason, maybe because they had a LOGO interpreter in Java lying around, the Scratch team implemented the online player as a LOGO program that runs on Java. So that means when my Scratch LOGO interpreter is running, it’s LOGO, on Scratch, on LOGO, on Java. Neat!