Linux Kernel Module written in Scratch (a visual programming language for kids)
lunduke.substack.com
lunduke.substack.com
"Real" Scratch is much harder to compile to a native language, firstly because Scratch has a very weird concurrency model (unofficially documented here [1]), and secondly because it has weird dynamic type conversion rules, much like JavaScript. E.g. the scratch expression (("0x1" join "4") + (2)) would evaluate to 22.
I'm just being pedantic though, this is still a cool project.
[1] "Scratch and its inner workings" https://docs.google.com/document/d/16SFYkk9dWpMhYaZNnLTE_kTm...
Are you trying to supply material for future Linux Sucks lectures? :)
Edit: I see that Lunduke agrees it is awesome.
(Outside of DSLs, Scratch impresses me as the one visual language to invest confidence in.)
This might be a good gateway drug.
I was actually showing Scratch to an adult non-programmer friend last weekend. She was very impressed, saying that if she ever wanted to learn coding, she thought Scratch would be a great tool for her.
Programming in Scratch is programming. The only real difference is that instead of typing instructions, Scratch users drag them out from a list of options. I think we would all agree that memorizing syntax isn't a major part of programming, but it's a major source of cognitive load for beginners. Scratch removes that barrier.
My company sometimes describes Scratch as "learning to talk before learning to spell." I think that's a great analogy.
Can confirm- excellent gateway drug
As an aside, I think scratch is great, it's definitely not just for kids, I think it's great for anyone learning programming
We had it so good.
I also never again written a poem analysis or held a talk about labour movements in the Weimar Republic. Did I practice important skills in school? I'd say yes.
In the 1980s, I had a Lisp Machine and except for the microcode it was Lisp for everything. Amazing to have an OS and all tools written in one high productivity language.
One of the first things we have kids try to create is a game called "Ghostbusters". The first step is "make your ghost hide and show every two seconds." Nearly every student codes something like this:
forever
hide
show
⬏
The result is a ghost that does not do anything. Not the best introduction!I always tell the kids some variation of "the computer is going too fast", so they'll add a wait block. Their code need the wait block anyway, but it would be better if they could see what was happening and figure it out on their own. Also, my explanation is actually bullshit. Think about it—the ghost should be hidden as often as it's visible. Furthermore, if the kid does:
forever
show
hide
⬏
...their ghost will disappear and never reappear! Can you figure out what's happening yet?Well, consider this. If you do:
move 10 steps
move 10 steps
move 10 steps
...your sprite will jump forwards 30 pixels all at once. But, if you do: repeat 3 times
move 10 steps
⬏
...then the sprite will animate forward, moving ten pixels per frame for three frames.Scratch only updates the screen at set "yield points", which are basically any instruction containing the word "wait" (reasonable enough) and after each iteration of a loop (very problematic). Loops should not have side effects! It's much more difficult to teach iteration when the unrolled version does something completely different!
But the problem is deeper than that—it pops up everywhere with basically every student I work with, because it prevents kids from seeing the results of their code! Fundamentally, two blocks in the same script which request a screen update should not be able to run on the same frame. (Unless the user has enabled turbo mode, which is already an option for advanced users who need to push the limits of the language.)
I know that all languages have quirks, but I just don't know what Scratch's developers were thinking here, or why I seem to be the only person who considers this a massive problem!
I made a fork of Scratch which fixes this problem, but I'm not really sure what to do with it. Without a backend for saving projects to the cloud, I can't realistically use it in my classes. I've been trying to add a backend, but the code is undocumented and I have zero experience with backend development. https://github.com/LLK/scratch-vm/compare/develop...Wowfunha...
I'm sure it could be an uphill battle, but something like this might warrant a toggle-able "debug-friendly" mode that wouldn't be as concerned with performance. I could image possibly extending this principle to make repaints happen much more often, possibly even with a deliberate short pause after each repaint (which you might have already done) to avoid super fast jittering confusing a student's path to understanding loops or the speed of computations allowing them to hide bugs in a string of instructions that don't have one of these wait commands or "critical points" in execution to force a repaint to help them understand the current state.
I did have some success last weekend getting my fork to send a project’s data to a Cloudflare worker (where I can store it via Workers KV), but past that point I feel a bit stuck. None of this code is documented and I don’t have any backend experience. I think I need some sort of actual account and login system so that students can access all of their past projects.
I'll probably keep poking at it, I'm just not sure I'll get anywhere. Other prominent forks such as Turbowarp don’t have cloud saving either, and now I think I understand why.
It’s kind of frustrating tbqh. Scratch isn’t a good open source project if it’s centralized around a single host. I expect this of corporations who ultimately need to cultivate a customer base, but Scratch is an academic initiative from a prominent university. I understand why the backend is closed source, but I wish they provided clear documentation on how to hook it up to something else. (I also realize that like everyone in academia, they're probably understaffed and overworked, and I really do respect the tool they've built.)