AksariumCodex Lexpressia Press M for menu
An interactive walkthrough

Programming in non-Latin scripts

Translating the keywords is the easy part. Underneath sit an encoding built for 128 characters, a text engine that stores one order and draws another, a grammar that runs the wrong way, and a script with no spaces to break on. Five modules; each one is a thing you can push on.

← Back to Codex Lexpressia
Module 01

The 128-slot container

Myth we'll unpick: "Unicode fixed this, so the encoding no longer matters"

ASCII was formalised in the 1960s under a hard constraint: seven bits per character, and therefore exactly 128 slots for everything a computer might need to write down. Sixty of those went to the English alphabet in two cases. The rest went to digits, punctuation and control codes. There was nothing left, and nothing was meant to be.

Find your character a slot

Type anything into the field, or take one of the presets. If it has a home in the original 128, the grid will light up. If it does not, you will see what it costs instead.

Or type a character
The 128 slots
Waiting for a character.

The grid is the whole of ASCII. Greyed cells are control codes, which were never printable; they held things like carriage return and the bell. Unicode did not enlarge this grid, it built a much larger one and kept these 128 at the front, which is why an ASCII file is still a valid UTF-8 file and why the Latin alphabet is still the only script that costs one byte per character.

What the constraint actually bought

The saving was real. In an era when memory was measured in kilobytes and priced accordingly, one bit per character across a whole system was not a rounding error. Seven bits rather than eight was a defensible engineering decision made by engineers solving the problem in front of them.
The cost was deferred. It landed decades later, on people who had no part in the decision, in the form of mojibake, broken sorting, truncated names in government databases, and a generation of tooling that assumed one byte meant one character.

Unicode, and UTF-8 as its dominant encoding, removed the hard ceiling. What it could not remove was everything built on top of the assumption while the ceiling was in place: the protocols, the keyword sets, the documentation, and the habit of testing only against Latin input.

Module 02

Right to left, and what breaks

Myth we'll unpick: "Right-to-left text is left-to-right text, mirrored"

A computer stores text in logical order: the order you would read it aloud, first word first. It draws text in visual order: the order the glyphs sit on the line. For English these are the same sequence, which is why the distinction is invisible to most developers for their entire careers. For Arabic they are not, and a line of code holding Arabic words, Western digits and mathematical operators has to be stored one way and drawn another.

One line, two orders

Pick a line, or edit the field directly. The top box is what a reader sees. The row underneath is the same characters in the order they sit in memory, first to last, running left to right.

The line, as edited
As drawn on screen
As stored in memory, character 1 first
digits and their runs everything else

Watch the digits. Inside a right-to-left line, a number still runs left to right, because the Unicode bidirectional algorithm treats a run of digits as its own left-to-right island inside the surrounding right-to-left text. The number twelve is stored as "1" then "2" and drawn as "12", in that order, in the middle of a line moving the other way. An editor, a compiler error message, and a diff tool each have to agree about which order they are reporting, and they do not always agree.

Why a compiler has to care

Column numbers lie

"Error at character 14" is unambiguous in memory and ambiguous on screen. The fourteenth character stored may be nowhere near the fourteenth position a reader counts to.

Selection splits

Dragging across a visually contiguous stretch of a mixed line can select a logically non-contiguous range, so a copy-paste can quietly reorder an expression.

The direction is invisible

Explicit direction marks are zero-width. Two lines that look identical can be different byte sequences, which is a legibility problem and, in other contexts, a security one.

None of this makes right-to-left programming impossible; it makes it work that somebody has to do. Bassil's Phoenix compiler is one demonstration that the work is finite: a general-purpose, object-oriented, compiled language whose source is written entirely in Arabic script, running through a six-stage pipeline of preprocessor, scanner, parser, semantic analyser, code generator and linker, and emitting a standalone native Windows executable.

Bassil, Y. (2019). Phoenix: The Arabic Object-Oriented Programming Language. International Journal of Computer Trends and Technology 67(2). Pipeline stages as described in the paper (high).

Module 03

Word order, claimed and actual

Claim we'll test: "Ezhil lets a Tamil student write the verb last, the way Tamil does"

English puts the verb before its object: print "hello". Tamil is head-final and normally puts the verb last. If the argument for native-language programming is that it removes grammatical friction, then word order is where the argument has to be made; swapping the keyword for a Tamil word while keeping English clause order would only move the friction, not remove it. So it is worth checking what Ezhil actually does.

The same instruction, three ways

What the check turned up. Ezhil's print statement is predicate-first: பதிப்பி comes before its string, the same shape as English. The project's own 2009 paper describes the design as "the predicate followed by the expression like in LISP, which is a natural way of reasoning by the Tamil language grammar", which is an argument for verb-first, not verb-last. The head-final claim appears in the encyclopaedia description of the language's syntactic sugar rather than in this basic statement form. Treat "Hello Print" as a description of the ambition, not of the code.

Annamalai, M. (2009). Ezhil: A Tamil Programming Language. arXiv:0907.4960, quoted passage (high). Print keyword and example programs from the Ezhil-Lang repository and the Wikipedia article on Ezhil, both read 4 August 2026 (high). Whether any Ezhil construct is genuinely verb-final is not resolved here (low); the control-flow forms would be the place to look.

Why the gap is the interesting part

The strongest version of the linguistic argument is not that a language has achieved grammatical alignment. It is that alignment is a design axis at all; that word order is something a language designer can choose, rather than something inherited from whoever wrote the first compiler.

Ezhil's stated aim, removing the impedance between a Tamil-speaking child's sentence and the line they have to type, stands whether or not the current syntax reaches it. The gap between the two is normal for a small volunteer project, and noting it is not a criticism of the work; it is the difference between a claim you can repeat and a claim you have checked.

Module 04

Where the spaces aren't

Myth we'll unpick: "A tokeniser splits on whitespace"

Wenyan is written in classical Chinese, which does not put spaces between words. A tokeniser cannot split on whitespace because there is none; it has to work out where each token ends by trying the longest candidate it knows and shrinking until something matches. That single constraint is the whole parsing strategy, and you can watch it run.

Longest match, shrinking

The tape below is one unbroken line of Wenyan: declare a number, give it the value three, name it, print it. The scanner starts at the left with a five-character window and shrinks until the window is a token it recognises.

Current attempt
Press Step to begin at character 1.
Tokens found

Every failed attempt is a real cost. The scanner does not know where the token boundary is until it has tried and failed at every longer candidate, and a wrong early match would silently mis-parse everything after it. English-based tokenisers get this boundary handed to them for free by the space bar, which is why almost no one who writes one has to think about it.

Choosing a language nobody speaks

A deliberate leveller. Nobody speaks classical Chinese as a daily language. A software engineer in Silicon Valley and a Mandarin speaker in Beijing meet Wenyan on close to equal terms, which strips out the native-speaker advantage that every other language in this walkthrough grants to somebody.
A working compiler underneath. Wenyan is not only a joke about form. It compiles, it has a published syntax reference, and people have written real algorithms in it, including the Sieve of Eratosthenes; an ancient Greek method, in ancient Chinese script, on modern silicon.

Syntax and example forms from the wenyan-lang syntax cheatsheet and project site, read 4 August 2026 (high). Token glosses below the tape are plain-language readings, not the project's own wording (medium).

Module 05

Five languages, five arguments

None of these projects is trying to replace Python. Each is making a different argument about what a programming language is allowed to be, and they disagree with each other as much as they disagree with the default.

LanguageScriptThe argument it makesWhat it demonstrates
Ezhil2007 · Annamalai Tamil A child should not have to learn a second natural language before learning a first computational one. That native-script teaching languages are buildable and maintainable by a small volunteer effort.
Phoenix2019 · Bassil Arabic Localised languages should not be confined to teaching; professional work should be possible too. That a right-to-left script can drive a full compiler pipeline to a native executable.
Citrinede Mooij, Jilani, Litwinow Over 100 languages The keyword layer is a display setting, not part of the program; each collaborator should see their own. That the same source can be read in a different natural language by each member of a team.
QalbNasser Arabic calligraphy Source code is a visual form, and the assumption that it must look like dense Latin type is an aesthetic inheritance, not a technical requirement. That a functional language in the Lisp family can be read as calligraphy without ceasing to be code.
WenyanHuang Classical Chinese If the language nobody speaks natively, nobody has the home advantage. That a script without word spacing forces a different tokenising strategy, and that it works.

Citrine's self-description, including the language count and its transpiler and DSL capabilities, is drawn from the project's own promotional material and has not been independently assessed (medium). Developer surnames as given in the source notes; full names not confirmed (low).

The dependency may just be moving

A model prompted in Swahili or Bengali will now write the Python for you, and the keyword layer stops mattering. Whether that is the democratisation of programming or the relocation of the dependency, from English-language syntax to English-language training data, is the open question; and it is a question about the tools, not about the scripts.

Sources

Bassil, Y. (2019). Phoenix: The Arabic Object-Oriented Programming Language. International Journal of Computer Trends and Technology 67(2). Preprint: arxiv.org/abs/1907.05871 Annamalai, M. (2009). Ezhil: A Tamil Programming Language. arXiv:0907.4960 Annamalai, M. (2013). Invitation to Ezhil: A Tamil Programming Language for Early Computer-Science Education. arXiv:1308.1733 Ezhil Language Foundation. Ezhil-Lang repository. github.com/Ezhil-Language-Foundation/Ezhil-Lang. Read 4 August 2026. Wikipedia, Ezhil (programming language). en.wikipedia.org. Read 4 August 2026. Huang, L. Wenyan (文言), syntax cheatsheet and project site. Cheatsheet · wy-lang.org. Read 4 August 2026. Nasser, R. Qalb (قلب). github.com/nasser/--- The Unicode Consortium. Unicode Bidirectional Algorithm, UAX #9, for the treatment of digit runs inside right-to-left text.

Confidence: the ASCII slot arithmetic and the UTF-8 byte counts in Module 01 are computed live in the browser from the character you enter, so they are exact. The Ezhil finding in Module 03 rests on the sources named there. Citrine's description is the project's own and is unverified.