cd /news/developer-tools/show-hn-tight-c-a-systems-language-w… Β· home β€Ί topics β€Ί developer-tools β€Ί article
[ARTICLE Β· art-7539] src=github.com β†— pub= topic=developer-tools verified=true sentiment=↑ positive

Show HN: Tight C, a systems language with 10 keywords

Tight C is a minimal systems programming language that compiles to C11 and features only 10 keywords, with no garbage collector, type inference, or object-oriented programming. It offers manual memory management through `alloc()` and `free()`, raw and fat pointers with built-in slicing, packed structs, and direct C FFI via `extern "C"`. The language prioritizes simplicity and predictability, aiming to provide C-level power without its historical complexity.

read3 min views18 publishedMay 22, 2026

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

,pinNo hidden magicβ€” no GC, no type inference, no shadowing, no aliasing** Raw pointers**(->

) andfat pointers(=>

) with built-in slicingManual memoryβ€”alloc()

/free()

withdefer

for cleanupPacked structsβ€” no padding, predictable layout** C FFI**β€”extern "C"

for direct interopCompiles to C11β€” readable output, use any C toolchain

make

./tcc stdlib/io.tc -o stdlib/io.h

./tcc samples/fizzbuzz.tc -o fizzbuzz.c

gcc fizzbuzz.c -std=c11 -o fizzbuzz
./fizzbuzz
use "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
php
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) { ... }
php
->i32 arr = alloc(i32, 100)
defer { free(arr) }
php
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 artifacts


Everything 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
── more in #developer-tools 4 stories Β· sorted by recency
── more on @tight c 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/show-hn-tight-c-a-sy…] indexed:0 read:3min 2026-05-22 Β· β€”