We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

Tau (Noelle)

From Esolang
Jump to navigation Jump to search
Tau
Paradigm(s) imperative
Designed by noellekde
Appeared in 2026
Type system none (fixed-size cells)
Memory system cell-based
Dimensions one-dimensional
Computational class Unknown
Reference implementation tau.py
Major implementations Tau++
File extension(s) .tau

Tau is an esoteric imperative programming language in which programs work directly on memory cells of fixed size instead of variables, strings or types. There are exactly three kinds of cell: T (1 byte), Ta (50 bytes) and Tau (100 bytes). A program changes memory by writing bytes into a numbered address, does its arithmetic in sixteen registers, and controls the flow of execution with labels and jumps. It was created in October 2026.

Tau is meant to be demanding to write: it has no variables, no structured loops or conditionals, no functions with arguments and no input statement. Its computational class has not been determined.

There are two interpreters that behave identically, a reference implementation in Python (tau.py) and a C++ implementation called Tau++, which also powers tauIDE, a Windows editor whose syntax highlighter and status bar are themselves written in Tau.

Overview

Tau began as a single operator, Define, which writes bytes straight into the cell stored at an address. A program made only of Define statements prints its Tau cells as text when it ends, and this is the Tau 0.1 way of producing output. Version 0.2 added registers, arithmetic, byte loading and storing, labels, conditional jumps, subroutines, printing statements and a host interface. Programs written for 0.1 still run unchanged.

Memory

Memory is a set of cells found at numeric addresses. The type of a cell fixes its size:

Type Size Note
T 1 byte A single byte
Ta 50 bytes Medium cell
Tau 100 bytes Largest cell; the one that 0.1 programs print

A cell is created by writing to its address. Data shorter than the cell is padded with zero bytes, data that is too long is an error, and writing to an address that already holds a cell replaces it. Reading, writing or printing an address that holds no cell is an error, as is using a byte index outside the cell.

Registers and values

There are sixteen signed 32-bit registers, r0 to r15. Arithmetic wraps around on overflow, and division and remainder truncate toward zero. A value is a register, a number or a character:

  • decimal, hexadecimal and binary numbers: 10, 0x1F, 0b101, -4
  • characters: 'a', '\n'

Addresses are values too, so they can be kept in registers.

Commands

A program is a list of statements, one per line. A # starts a comment that runs to the end of the line. Statement and type names are not case-sensitive. A line that contains only T, Ta or Tau is a section header and does nothing.

Statement Effect
Define <T|Ta|Tau> <addr> "<bits>" Writes bytes, given as groups of eight binary digits, into the cell at addr
Text <T|Ta|Tau> <addr> "<text>" Writes text; the escapes \n \t \r \0 \\ \" \xHH are understood
Set, Add, Sub, Mul, Div, Mod rD <v> Arithmetic on register rD
Load rD <addr> <idx> Puts byte number idx of the cell at addr into rD
Store <addr> <idx> <v> Sets byte idx of the cell to the low eight bits of v
Len rD <addr> Puts the number of bytes before the first zero byte of the cell into rD
name: Defines a label
Jump L Continues at label L
Jeq, Jne, Jlt, Jgt, Jle, Jge <v> <v> L Continues at L if the comparison between the two values holds
Call L, Ret Subroutine call and return, nested up to 256 deep
Halt Stops the program
Print <addr> Prints the cell as text, up to its first zero byte
PrintChar <v>, PrintInt <v>, Newline Print a character, a number or a line break
Host <function> <args...> Calls a function of the program that embeds Tau

A program that contains nothing but Define and Text statements prints all of its Tau cells as text, in address order, when it ends.

Errors and limits

An error stops the program and names the line:

Tau error: line 2: index 5 outside T cell

To catch endless loops, a program is stopped after a fixed number of steps: 5 million by default, or 50 million when a document is supplied. The limit can be changed with --steps.

Host interface

Tau has no input statement. A program that runs inside another program can instead read a document through Host functions, each of which stores its result in its first argument.

Call Result
Host TextLen rD Length of the document
Host CharAt rD <idx> Character code at idx, or 0 outside the document
Host CaretLine rD, Host CaretCol rD Caret position, counted from 1
Host LineCount rD Number of lines
Host Paint <start> <len> <colour> Colours a range of the document

On the command line the document comes from a file or from standard input. In tauIDE it is the text in the editor.

Examples

Hello, World!

The Tau 0.1 program. The bytes in the first cell spell "Hello World!" in ASCII.

tau
Define tau 0x01 "01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 00100001"
Ta
Define Ta 0x02 "00000000"

Output:

Hello World!

Factorial

# factorial of 10
Set r0 10
Set r1 1
loop:
Jle r0 1 done
Mul r1 r0
Sub r0 1
Jump loop
done:
PrintInt r1
Newline

Output:

3628800

Reversing a string

# reverse a string in place with Load/Store/Len
Text tau 0x10 "Tau++ rocks"
Len r0 0x10        # r0 = length
Set r1 0           # left
Set r2 r0
Sub r2 1           # right
swap:
Jge r1 r2 show
Load r3 0x10 r1
Load r4 0x10 r2
Store 0x10 r1 r4
Store 0x10 r2 r3
Add r1 1
Sub r2 1
Jump swap
show:
Print 0x10
Newline

Output:

skcor ++uaT

Implementations

Name Written in Description
tau.py Python The reference implementation and home of the language definition. Command line only; needs Python 3.9 or newer.
Tau++ C++17 A native implementation with no dependencies beyond the standard library. It gives exactly the same output and error messages as tau.py, which is checked by an automated test suite.
tauIDE C++ and Tau A Windows editor built on Tau++. The window, files and the Run command are C++; syntax highlighting and the status bar are Tau programs that the editor runs whenever the text changes and that can be edited and reloaded without recompiling.

Both interpreters are run the same way:

python3 tau.py program.tau [--text file|-] [--caret N] [--steps N]
tau++ program.tau [--text file|-] [--caret N] [--steps N]

tauIDE

tauIDE is a dark editor with live syntax highlighting, an output pane and a status bar that shows the caret position and the size of the document. F5 runs the program in the editor, and a running program can read the editor's own text through the host interface. Ctrl+R reloads the two Tau scripts that implement the highlighter and the status bar. Releases for Windows contain the program together with its scripts folder.

Programs written in Tau

The distribution includes textstats.tau, a text analyser written entirely in Tau. Given a text file it reports the numbers of lines, words, characters, letters, digits and empty lines, the length of the longest line, and a bar chart of how often each letter of the alphabet occurs. A smaller counter in the style of the Unix wc utility, wc.tau, is also included.

See also

External resources

  • Tau on GitHub - the Python reference implementation, the language reference, examples and tools (MIT license)
  • Tau++ on GitHub - the C++ implementation and tauIDE, with Windows builds under Releases (MIT license)