Introduction to the JARU programming language
JARU is a dynamically typed programming language designed to provide full control over the stack: the language itself, the virtual machine, and the surrounding tooling.
It runs on its own compact and efficient VM, built to be predictable, extensible, and easy to integrate, both on desktop systems and on resource-constrained environments such as ESP32 microcontrollers, the ESP32-P4 or the ESP32-S31 (the last two are RISC-V).
JARU prioritizes a clear and readable syntax, with explicit structures and no unnecessary dependencies, making code easier to read, maintain, and debug—even in complex systems.
More than a standalone language, JARU is designed as the foundation of a complete ecosystem, where the runtime, debugger, and IDE share a common vision, enabling a level of control and coherence that is difficult to achieve with traditional general-purpose languages.

The VM includes a garbage collector and standard libraries to accelerate development: Math, Display, Sprite, Sound, GPIO, I2C, Http, MQTT, etc.
Main features
- Dynamic types — no need to declare the type before assigning a value.
- Clean syntax — less noise, more intention.
- Built-in GC — automatic memory management.
- Cross-platform — develop on Windows and deploy to ESP32, ESP32-S3, ESP32-P4 and ESP32-S31.
- Standard library for IoT — ready-to-use modules for common hardware.
Semicolon (;)
The semicolon at the end of a statement is optional. Use it to separate statements when writing multiple on the same line.
print("Hello"); print("world");
println("!")
Comments
- Single line:
// ... - Multiple lines:
/* ... */
// This is a single-line comment
/*
This is a
multi-line comment
*/
Indentation
Use spaces or tabs (choose one and be consistent). Recommended: 2 spaces.
Identifiers
Identifiers name variables, functions, classes, objects, properties, and methods.
They must start with a letter or _, can only contain unaccented letters, digits and _, and must not be reserved words. JARU is case-sensitive.
| Valid | Invalid | Reason |
|---|---|---|
person_name | 1number | Cannot start with a number |
_price | my identifier | Spaces not allowed |
myClass | class | Reserved word |
VAR_1 | #value | Non-alphanumeric symbol |
Hello, world! (and more)
- Hello, world
- IoT control
- Classes
print("Hello, world!");
// print doesn't add a newline; println does
print("Hello"); print(", ");
println("World");
use GPIO, Math
const PIN_LED = 2 // LED pin
const PIN_SENSOR = 34 // analog input: a potentiometer, for example
GPIO.pinmode(PIN_LED, GPIO.OUTPUT)
// Blink the LED faster or slower depending on the sensor reading
while (true)
var reading = GPIO.aread(PIN_SENSOR) // 0 to 4095
var wait = Math.floor(100 + reading * 900 / 4095) // 100 to 1000 ms
GPIO.write(PIN_LED, HIGH); pause(wait)
GPIO.write(PIN_LED, LOW); pause(wait)
end
use GPIO
class Sensor
def init(pin, kind)
this.pin = pin
this.kind = kind
end
def read()
return GPIO.aread(this.pin)
end
def calibrate(offset)
return this.read() + offset
end
end
var temp = Sensor(34, "temperature")
println("Reading: ", temp.calibrate(2.5))
print vs println
print()does not add a newline.println()does add a newline.
print("Hello"); print(", "); println("World");
Was this page helpful? Continue with Data types and Variables and constants.