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.
The 128-slot container
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.
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
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.
Right to left, and what breaks
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.
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).
Word order, claimed and actual
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
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
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.
Where the spaces aren't
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.
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
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).
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.
| Language | Script | The argument it makes | What 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
Sources
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.