Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Jennifer

Jennifer is a small, experimental, interpreted programming language written in (Tiny)Go and ships as two binaries:

  • jennifer - standard Go build, full host-feature surface. This is the default binary you install and reach for.
  • jennifer-tiny - TinyGo build, smaller and embeddable. Missing os/exec and the network stack (TinyGo runtime gaps); calls into those surfaces return a friendly runtime error pointing back at jennifer. Use this variant when binary size or embeddability matters (embedded systems, minimal containers, small-footprint scripting hosts).

But small is not bare. Jennifer is batteries-included: a broad standard library and a growing set of distributable modules cover what real programs actually need, so you build genuine tools, not toys. Text handling has full regular expressions; structured data flows through JSON; email is a complete stack - SMTP to send, POP3 and IMAP to receive; in-memory data stores come through Redis and memcached clients; the web runs from an ergonomic REST client to turnkey integrations such as Gotify push notifications; and lightweight concurrency is built into the language via spawn and the task library. Browse the full library catalog and module catalog - both grow with every release.

It is also a natural fit for teaching and learning: an interactive REPL, an easy-to-read grammar, and token and AST dumps that make it ideal for mastering language design, plus a built-in linter and profiler and full test support. Its strict, explicit design - conditions must be bool, conversions are spelled out, names never shadow, and errors are positioned - surfaces a mistake as a clear message instead of a silent surprise, so a learner sees exactly what went wrong.

Source files use the .j extension. Whitespace is not significant anywhere; statements end with ;.

use io;
use time;

def start as time.Time init time.now();
io.printf("hello, world\n");
def gap as time.Duration init time.sub(time.now(), $start);
io.printf("ran for %d ms\n", time.milliseconds($gap));

Write Jennifer with your editor and an AI assistant

Syntax highlighting ships in editors/ (a Vim / Neovim drop-in, a TextMate grammar for VS Code / Sublime / Zed, a highlight.js definition). And because Jennifer is new, we ship JENNIFER.md: drop it into your project and point an AI coding assistant at it (“we code in Jennifer, see JENNIFER.md, let’s go”) so it writes correct .j from the start. See Editor & AI support.

What’s in this site

  • Getting started - install the interpreter and run your first program.
  • Editor & AI support - highlighting and the drop-in JENNIFER.md for AI-assisted coding.
  • Language reference - syntax, types, methods, control flow, imports, style.
  • Libraries - per-library reference plus an alphabetical cheatsheet of every builtin.
  • Modules - the Jennifer-coded, importable module ecosystem (import "name.j";): formats, mail, stores, web, and protocol clients, each with its own reference page.
  • Technical reference - implementation details for the lexer, parser, interpreter, and CLI.
  • Project - milestones, design stances, glossary.

Status

Pre-1.0. The major version stays at 0.x.y while the language is still finding its shape; breaking changes can happen at milestone boundaries and are called out in docs/milestones.md. Once Jennifer reaches 1.0.0, semver applies and breaking changes need a major bump.

Source

Source, issues, and pull requests live at https://github.com/jennifer-language/jennifer.

License: LGPL-3.0-only.

Manual

Download the whole manual as a single PDF. The entire documentation in one file, regenerated from these pages on every build - handy for reading or searching offline.