Simplest possible, usable systems language
Tight-C is a minimal systems programming language that compiles to C. It has 10 keywords, no garbage collector, no inference, no OOP — just explicit, predictable code with C-level power.
- 10 keywords —
if,loop,break,defer,ret,struct,fn,use,pub,pin - No hidden magic — no GC, no type inference, no shadowing, no aliasing
- Raw pointers (
->) and fat pointers (=>) with built-in slicing - Manual memory —
alloc()/free()withdeferfor cleanup - Packed structs — no padding, predictable layout
- C FFI —
extern "C"for direct interop - Compiles to C11 — readable output, use any C toolchain
# Build the compiler
make
# Compile stdlib
./tcc stdlib/io.tc -o stdlib/io.h
# Compile a program
./tcc samples/fizzbuzz.tc -o fizzbuzz.c
# Build and run
gcc fizzbuzz.c -std=c11 -o fizzbuzz
./fizzbuzzuse "stdlib/io.tc"
void fn main: {
print("hello, world")
}
i32 x = 10
f64 pi = 3.14
u8 byte
Uninitialized variables default to 0.
i32 fn add: i32 a, i32 b {
ret a + b
}
struct Point {
i32 x,
i32 y
}
Point p
p.x = 10
i32 x = 42
->i32 ptr = @x // address-of
->ptr = 99 // dereference
=>i32 slice = arr[1:4] // fat pointer (slice)
i32 len = slice.len // built-in length
if (x > 0) { ... }
loop { ... break }
loop if (i < 10) { ... }
->i32 arr = alloc(i32, 100)
defer { free(arr) }
extern "C" {
i32 fn printf: ->i8 fmt, ... {}
}
| Tight-C | C Equivalent |
|---|---|
i8 |
char |
i16 |
int16_t |
i32 |
int32_t |
i64 |
int64_t |
u8 |
uint8_t |
u16 |
uint16_t |
u32 |
uint32_t |
u64 |
uint64_t |
f32 |
float |
f64 |
double |
void |
void |
tc-lang/
compiler/
include/ # Header files
src/ # Compiler source (C)
stdlib/ # Standard library (.tc)
samples/ # Example programs
docs/ # Language specification
Makefile # Build system
stdlib/io.tc — I/O
| Function | Description |
|---|---|
print(s) |
Print string + newline |
printn(s) |
Print string, no newline |
printi(n) |
Print i64 + newline |
printin(n) |
Print i64, no newline |
readi() |
Read i64 from stdin |
readc() |
Read single char from stdin |
stdlib/str.tc — Strings
| Function | Description |
|---|---|
slen(s) |
String length |
seq(a, b) |
String equality (returns 1 if equal) |
scpy(dest, src) |
Copy string |
scat(dest, src) |
Concatenate strings |
sneq(a, b, n) |
Compare first n bytes |
sfind(s, c) |
Find first char occurrence |
sfindlast(s, c) |
Find last char occurrence |
shas(haystack, needle) |
Find substring |
stdlib/math.tc — Math
| Function | Description |
|---|---|
iabs(x) |
Absolute value (integer) |
min(a, b) |
Minimum of two integers |
max(a, b) |
Maximum of two integers |
clamp(x, lo, hi) |
Clamp value to range |
sqrt64(x) |
Square root (f64) |
pow64(base, exp) |
Power (f64) |
fabs64(x) |
Absolute value (f64) |
sin, cos, tan |
Trig functions (extern C) |
log, log2, log10 |
Logarithms (extern C) |
stdlib/mem.tc — Memory
| Function | Description |
|---|---|
zero(ptr, n) |
Zero out n bytes |
copy(dest, src, n) |
Copy n bytes (overlap safe) |
memeq(a, b, n) |
Compare n bytes (1 if equal) |
fill(ptr, val, n) |
Fill n bytes with value |
stdlib/conv.tc — Conversions
| Function | Description |
|---|---|
stoi(s) |
String to i64 |
stoib(s, base) |
String to i64 with base |
stof(s) |
String to f64 |
itos(n, buf, size) |
i64 to string (into buffer) |
ftos(n, buf, size) |
f64 to string (into buffer) |
Requires gcc and make.
make # Build tcc
make clean # Remove build artifactsEverything that can be built in the stdlib has to.
Tight-C bets that C's power doesn't require C's complexity. Strip away the historical baggage and you get a language a single person can implement, understand fully, and still write real systems code in.
Built by @alonsovm44