Show HN: Bolt – A super-fast, statically-typed scripting language written in C
29 comments
·August 10, 2025perlgeek
I like 99% of this, and the thing I don't like is in the very first line of the example:
> import abs, epsilon from math
IMHO it's wrong to put the imported symbols first, because the same symbol could come from two different libraries and mean different things. So the library name is pretty important, and putting it last (and burying it after a potentially long list of imported symbols) just feels wrong.
I get that it has a more natural-language vibe this way, but put there's a really good reason that most of the languages I know that put the package/module name first:
import packageName.member; // java
from package import symbol; # python
use Module 'symbol'; # perl
With Typescript being the notable exception: import { pi as π } from "./maths.js";t
jasonjmcghee
Also autocomplete.
Though I almost never manually type out imports manually anymore.
bbkane
I really like the way Elm does it, from "wide" (package) to "narrow" (symbol). I suspect this also helps language server implementation.
See https://guide.elm-lang.org/webapps/modules (scroll down to "Using Modules") for examples
beariish
Do you think approaching the way typescript does it for Bolt is a reasonable compromise here? Bolt already supports full-module renames like
import math as not_math
So supporting something along the lines of import abs as absolute, sqrt as square_root from math
Would be farily simple to accomplish.haberman
I love the concept -- I've often wished that lean languages like Lua had more support for static typing, especially given the potential performance benefits.
I also love the focus on performance. I'm curious if you've considered using a tail call design for the interpreter. I've found this to be the best way to get good code out of the compiler: https://blog.reverberate.org/2021/04/21/musttail-efficient-i... Unfortunately it's not portable to MSVC.
In that article I show that this technique was able to match Mike Pall's hand-coded assembly for one example he gave of LuaJIT's interpreter. Mike later linked to the article as a new take for how to optimize interpreters: https://github.com/LuaJIT/LuaJIT/issues/716#issuecomment-854...
Python 3.14 also added support for this style of interpreter dispatch and got a modest performance win from it: https://blog.reverberate.org/2025/02/10/tail-call-updates.ht...
beariish
I did experiment with a few different dispatch methods before settling on the one in Bolt now, though not with tailcalls specifically. The approach I landed on was largely chosen cause it in my testing competes with computed goto solutions while also compiling on msvc, but I'm absolutely open to try other things out.
summerwant
I see lua, do you know terralang?
cookiengineer
If functions don't have a return signature, does that mean everything must be satisfied in the compilation step?
What about memory management/ownership? This would imply that everything must be copy by value in each function callsite, right? How to use references/pointers? Are they supported?
I like the matchers which look similar to Rust, but I dislike the error handling because it is neither implicit, and neither explicit, and therefore will be painful to debug in larger codebases I'd imagine.
Do you know about Koka? I don't like its syntax choices much but I think that an effect based error type system might integrate nicely with your design choices, especially with matchers as consumers.
zygentoma
Oh, not OP, but I love Koka. I should play around with it again thanks for reminding me!
MobiusHorizons
FYI "the embedded scene" is likely to be interpreted as "embedded systems" rather than "embedded interpreters" even by people who know about embedded interpreters, especially since all the languages you give as an example have been attempted for use on those targets (micropython, lua, and even typescript)
beariish
That's a good point, thank you. I've made a small edit to clarify.
freeopinion
I see your benchmarks compare against other interpreted languages "in its class".
We read here a couple days ago about Q which is compiled. Bolt claims to "plow through code at over 500kloc/thread/second". Q claims to compile in milliseconds--so fast that you can treat it like a script.
Bolt and Q are both newborns. Perhaps you could include each other in your benchmarks to give each other a little publicity.
themonsu
Looks cool, but please can we stop naming things ”bolt”
Fraterkes
Really cool! Roughly how much memory does it take to include it in an engine? Also I'm really interested in the process of creating these really fast scripting languages, have you written anything about how you wrote Bolt?
beariish
Bolt's memory usage in most cases hovers right around Lua 5.4/Luau in my own testing, but maybe I should include a few memory benchmarks to highlight that more. It does notably have a higher memory overhead during compilation than other languages in this class though.
As for writeups, I'm working on putting out some material about the creation of Bolt and my learnings now that it's out there.
k__
Awesome.
Is it deterministic like Lua?
Forgret
It looks cool, I wish you luck in developing the language. I liked your language and I hope it becomes popular someday.
kiririn
Nice, gives me Pawn vibes
grodriguez100
Sounds very good, and I can see many use cases in embedded systems. But that probably requires 32-bit arm support. Is that planned ?
beariish
As of right now no - my primary target when developing this was realtime and games in particular since that's what I know best, but if there's a real target in embedded that's certainly something that could be explored.
I've built many interpreters over the years, and Bolt represents my attempt at building the scripting language I always wanted. This is the first public release, 0.1.0!
I've felt like most embedded languages have been moving towards safety and typing over years, with things like Python type hints, the explosive popularity of typescript, and even typing in Luau, which powers one of the largest scripted evironments in the world.
Bolt attempts to harness this directly in the lagnauge rather than as a preprocessing step, and reap benefits in terms of both safety and performance.
I intend to be publishing toys and examples of applications embedding Bolt over the coming few weeks, but be sure to check out the examples and the programming guide in the repo if you're interested!