Free tools Windows power users keep installed
One-click scans. No signup required.
AlexScript is an interpreted, object-oriented scripting language with Polish keywords, implemented in Ruby. Its author, Konstanty Koszewski, says building it taught him more about Ruby’s internals than years of Rails work did. He reports seven specific lessons from the project. Each one is an implementation experience, not a benchmark, so the sections below separate what he observed from what can be generalized.
What AlexScript is
Koszewski describes AlexScript as a weekend toy interpreter that grew over roughly eighteen months into a fuller language. The project’s GitHub README (repository N3BCKN/alexscript) lists modules, a REPL, cooperative async/await, a standard library, and a debugger. The author also says a web framework is written in the language itself.
The README states that the project requires Ruby 4.0.3 or later. Project requirements change, so confirm the current minimum in the repository before installing.
How the Polish keywords work
Keywords are written in Polish, and the language accepts both ASCII and accented spellings. The README treats the ASCII form as canonical in its documentation and examples. The table below lists the keywords the author cites.
#1 Best Overall
| Keyword (ASCII form) | Meaning | Accented form |
|---|---|---|
klasa |
class | not stated (the word has no diacritics) |
funkcja |
function | not stated (the word has no diacritics) |
niech |
let | not stated (the word has no diacritics) |
zwroc |
return | zwróć, the correct Polish spelling per the author |
The accented spelling of return is the reason the feature exists. Typing ó and ć repeatedly can be awkward on some keyboard layouts, so the ASCII form lets people write code without switching layouts. Both forms are accepted by the interpreter, as the README documents.
Seven lessons from building it
1. Use exceptions for errors, and throw/catch for controlled non-local returns
Koszewski first implemented a language-level return by raising and rescuing an exception. He later switched to Ruby’s throw and catch. He attributes the speed difference to the cost of constructing exceptions and capturing backtraces, which matters most in deeply recursive code. He gives no benchmark figure. The lesson is narrow: throw/catch suits a known, deliberate exit from nested code, not a general replacement for raise.
Rank #2
2. Avoid repeated character indexing on UTF-8 strings
The lexer used indexed string access, and on text containing Polish diacritics it became, in his words, accidentally quadratic. Switching to getbyte and byteslice resolved the slowdown. This is an account of one lexer, not a general measurement of Ruby string performance.
3. One method table for native and user-defined methods
AlexScript stores native methods and user-defined methods in a single table, with native entries marked for dispatch. Koszewski says this made inheritance, super, reflection, and debugger behavior easier to implement. He also says MRI uses a similar shared approach for C and Ruby methods; that comparison is his, and it was not independently checked here.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Rank #3
4. Fibers can underpin cooperative concurrency
His async/await is built on fibers. The surrounding machinery is his own work: a reactor with a ready queue, timers, IO.select, and an integration with Ruby’s fiber scheduler interface. Fibers supply the suspension mechanism, but they do not on their own provide a complete async runtime.
5. Weak references were unreliable for closure environments
Using WeakRef in this implementation produced intermittent invalid-reference failures, so he replaced the weak references with strong ones. This describes one design in one interpreter. It does not show that WeakRef is unsuitable in general.
Rank #4
6. Mapping language exceptions onto Ruby exception classes
AlexScript exceptions map onto Ruby exception classes. Koszewski reports that this gives the language real stack unwinding, backtraces, and ensure-style cleanup without reimplementing them. The benefit is the project’s own assessment of its architecture.
7. Arbitrary-precision integers for exact arithmetic
He uses pairs of Ruby integers to represent exact rational numbers and computes Bernoulli numbers, including B(60), without overflow or loss of precision. Ruby’s arbitrary-precision integers make this straightforward. The result is his example; it was not independently verified here.
Best Value
The fiber-scheduler disconnect problem
The most significant limitation Koszewski reports concerns the web framework. When a client disconnected during a blocked socket read, IO#close could not interrupt the fiber scheduler. As a result, the project runs one thread per connection. He describes this as an open Ruby bug. The search behind this article did not establish whether it still affects current Ruby releases, so check the status against the Ruby bug tracker and your target Ruby version before designing a server around fibers.
Sources
- Konstanty Koszewski, “I wrote a programming language where you code in Polish. Here are 7 things it taught me about Ruby.”, DEV Community, September 16, 2026. This is the primary first-person account of the lessons and the limitation above.
- N3BCKN/alexscript, GitHub project README, for the feature list, keyword conventions, and the Ruby 4.0.3 requirement.
The author writes Ruby for a living, and his own framing of the project is that it started as a question about what happens between typing x = 5 and the machine acting on it.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




