A statically-typed permacomputing-oriented language for the purpose of creating 1st generation style 3D games and graphical user interfaces that work on constrained systems, microcontrollers, retro consoles, and the web using emscripten. https://undar-lang.org/
Go to file
zongor 96deaa9ff7 more syntax refinement 2025-11-22 13:52:31 -08:00
bench wip compiler stuff 2025-11-04 17:09:55 -08:00
docs rename some things, create new parser defs. 2025-11-09 22:23:55 -08:00
src wip assembler v2 2025-11-10 23:45:09 -08:00
test more syntax refinement 2025-11-22 13:52:31 -08:00
.gitattributes Setup demos for new compiler. 2025-10-25 13:59:05 -07:00
.gitignore add clangd to gitignore 2025-10-05 12:24:59 -07:00
LICENSE change back to MIT since using some stuff from craftingintepreters 2025-06-15 15:54:49 -04:00
Makefile Refactor and rename to align with new IR better 2025-11-09 13:22:46 -08:00
README.org rename some things, create new parser defs. 2025-11-09 22:23:55 -08:00
ROADMAP.org rename some things, create new parser defs. 2025-11-09 22:23:55 -08:00

README.org

Undâr Programming Language

[ᚢ  ᛫  ᛫  ᛫
 ᛫  ᚾ  ᛫  ᛫
 ᛫  ᛫  ᛞ  ᛫
 ᛫  ᛫  ᛫  ᚱ]

Undâr

Undâr is a programming language for the purpose of creating 3D games and graphical user traits that work on constrained systems, microcontrollers, retro consoles, and the web using emscripten. The language emphasizes hardware longevity, energy efficiency, and the preservation of digital art and games for future generations.

It has an internal REPL that allows for quick development as well as the ability to dump the program to a binary rom for preserving that program/game/etc.

It runs on the Reality Engine, a VM written in freestanding C89, has a CISC like instruction format of one byte opcode and a variable byte operand. 32 local variables per frame.

Philosophy

Undâr conforms to permacomputing principles.

"permacomputing encourages the maximization of hardware lifespan, minimization of energy usage and focuses on the use of already available computational resources. it values maintenance and refactoring of systems to keep them efficient, instead of planned obsolescence, permacomputing practices planned longevity. it is about using computation only when it has a strengthening effect on ecosystems." source

Undâr is designed to ensure that programs created today will remain executable for a very long time, even through technological collapse.

This is achieved through:

  • A standardized bytecode format that maps 1:1 to human-readable assembly
  • A VM specification that can be implemented easily
  • Hardware abstractions for the VM implementation
  • ROM files that contain all necessary information for execution
  • A friendly syntax which focuses on maintaining code without obscuring functionality.

Getting Started

Build the Reality Engine

git clone https://git.alfrescocavern.com/zongor/undar-lang.git
cd undar-lang && make

Sċieppan is a intermediate representation. You can view some examples in the .ul.ir files in /test

Sample Program: hello.ul.ir

function main () 
	str hello is $0

	malloc_immediate "nuqneH 'u'?" -> hello
	call pln hello
	exit 0

function pln (str message is $0) 
	str ts is $1 
	int msg_length is $2 
	str nl is $3 
	int nl_length is $4
	int mode is $5

	malloc_immediate "/dev/term/0" -> ts # get terminal device
	load_immediate 0 -> mode
	syscall OPEN ts mode -> ts
	strlen message -> msg_length
	syscall WRITE ts message msg_length	
	malloc_immediate "\n" -> nl
	strlen nl -> nl_length
	syscall WRITE ts nl nl_length
	return
./build/linux/undar-linux-debug ./test/hello.asm.lisp

Running the compiler without arguments will put it in "REPL" mode. It will function similar to a LISP repl.

Memory Management

memory is managed via frame based arenas. function scopes defines a memory frame.

heap allocations using the internal malloc opcode push pointers within this frame. when a frame exits, the pointer is reset like stack based gc.

function main ()
	int mode is $11
	str term is $10

	malloc_immediate "/dev/term/0" -> term 
	load_immediate 0 -> mode
	syscall OPEN term mode -> term # Terminal term = open("/dev/term/0", 0);

	malloc_immediate "Enter a string:" -> $7 
	string_length $7 -> $8
	syscall WRITE term $7 $8 # print prompt

	str user_string is $9
	load_immediate 32 -> $8
	malloc $8 -> user_string
	syscall READ term user_string $8 # read in max 32 byte string

	call pln user_string
	exit 0

function pln (str message is $0) 
	str ts is $1 
	int mode is $5
	int msg_length is $2 
	str nl is $3 
	int nl_length is $4 

	malloc_immediate "/dev/term/0" -> ts
	load_immediate 0 -> mode
	syscall OPEN ts mode -> ts # get terminal device
	strlen message -> msg_length
	syscall WRITE ts message msg_length	
	malloc_immediate "\n" -> nl
	strlen nl -> nl_length
	syscall WRITE ts nl nl_length

values passed to functions must be explicitly returned to propagate. heap values are copy on write, so if a value is modified in a child function it will change the parents value, unless the size of the structure changes then it will copy the parents value and append it to its own frame with the modification. this allows for the low resource usage of a C but the convenience of a Java/Go without the garbage collection.

Core Types

Type Description
int 32-bit signed integer
nat 32-bit natural number
real Q16.16 fixed-point real number
str fat pointer [length + data] string
bool true/false
byte Character/8 bit unsigned int

A ref type allows pass by reference similar to a pointer in c. most types will be pass by value with some types being explicitly pass by reference.

primitive types like int, nat, real, etc. will always be safe to change in child frames.

License

MIT-0

Inspirations

  • Uxn - The ideal system for permacomputing
  • Plan 9 / 9P - Unified I/O, Tunnels
  • Forth - Shadowing
  • Lisp - Live coding, REPL, introspection
  • Fortran - Array semantics, scientific clarity
  • C / Zig - Control, minimalism
  • Lua - Languages can be portable and expressive without being complicated.
  • Lox - The start of my programming language creation journey
  • Permacomputing wiki - Core ideology
  • Dusk OS - A much better system for doing permacomputing
  • Dis VM - CISC VM structure
  • Retro Systems - N64, PS1, Mac Classic, Windows 95 - UI esthetics