Beta 0.1 release notes — draft

Draft. No release has been cut. Where beta 0.1 will be published, what it will be tagged, and whether it ships as source, as binaries or both are not decided yet, so nothing below assumes any of them. Until a release exists, the way to get PXX is a clone of the repository; see Install.

Everything on this page was measured on 2026-09-24 on an x86-64 Linux host, against pin v423: commit 906239536, compiler binary sha256 113a515bbdc9…. This is the compiler that ./pxx runs in a checkout of that commit. If you are reading this against a later pin, the figures describe v423, not yours.

What PXX is

A self-hosting compiler for the Pascal dialect of Free Pascal, written from scratch. It has its own runtime library, its own ELF writer and its own linker, so it produces finished executables with no as, ld or libc involved. It compiles itself to a byte-identical binary. The same backend also compiles C and Nil Python (a Python-shaped language), and it targets several CPUs and the ESP32 family.

By default a compiled program is a static ELF whose only runtime dependency is the Linux kernel. That holds for every frontend.

What works

The examples showcase is the best answer: every entry on it was compiled and run with this pin, and it shows the output or a screenshot of each. It covers:

Languages

Language State
Pascal Solid. FPC's objfpc and Delphi modes: classes, interfaces, generics, managed strings, dynamic arrays, exceptions, threads. The target is correct Pascal compiled correctly; we do not reproduce FPC behaviour for its own sake. See FPC compatibility.
C Solid. A C99-class dialect with common GNU extensions and PXX's own C runtime (lib/crtl). The corpus above compiles and its output matches GCC's; zlib needs one struct tag added when built as a single file, as the showcase explains. See C frontend.
Nil Python Python-ish, and known to have plenty of issues. It compiles Python-shaped source ahead of time to a static binary; it is not CPython and does not run CPython's standard library. Imports resolve to PXX's own implementations first, and several of those cover only part of the Python module they are named after. See Nil Python.
BASIC A small real frontend with its own dialect.
Rust, Zig Experimental proofs of concept. Do not build on them.
Ada, Fortran, Algol, Erlang, LOLCODE, Whitespace Skeleton probes, one test each. Listed by pxx --version; not a support claim.

Other frontends explains the last three rows.

Targets

The same one-line program, writeln(6*7) or its equivalent in each language, compiled by pin v423 and run: natively on x86-64, under QEMU user mode for the other Linux targets (tools/run_target.sh), and under wasmtime for wasm32.

x86-64 i386 aarch64 arm32 riscv32 wasm32
Pascal 42 42 42 42 42 traps (fixed after v423)
C 42 42 42 42 42 42
Nil Python 42 42 42 42 refuses 42
Rust 42 42 42 42 42 refuses
Zig 42 42 42 42 42 refuses

A refusal is a compile-time error that names the reason, for example "a heap arena needs mmap" for Nil Python on riscv32. It is not a crash.

ESP32

PXX builds bare-metal and ESP-IDF images for esp32s3 (xtensa) and esp32c3 (riscv32), from Pascal, C and Nil Python.

ESP is not a Unix: FreeRTOS provides tasks, not processes. Calls with POSIX shapes that have no meaning there return an explicit "unsupported" error rather than a plausible wrong answer. A getting-started guide for ESP is being written; until it lands, see ESP32.

Known issues

These lists are measured, not recalled. The Pascal and C rows were run on this pin and on the development tree by the Pascal/C lane on 2026-09-24. Rows that compile and silently give a wrong answer come first, because a refusal at least tells you something is wrong.

Silently wrong

Fixed after v423

These are wrong in v423 and fixed in the development tree, so the next pin will carry the fixes. Until then, the workarounds apply.

Refused, with a message that names the problem

Nil Python

Nil Python is Python-ish and known to have plenty of issues. Its measured list is kept in one place, Known limits on the Nil Python page. That list includes silent wrong answers. For example, an -> int result wraps at 64 bits, and hex() of an int wider than 64 bits is wrong (both confirmed on v423). The same page records the deliberate differences from CPython; a difference not recorded there is a bug.

Reporting bugs

Open an issue at https://github.com/yoctobyte/pxx/issues. The most useful report contains:

  1. the smallest source file that shows the problem;
  2. the exact command you ran, including --target= if any;
  3. what you expected and what you got (for C, GCC's output is a good "expected"; for Pascal, FPC's; for Nil Python, CPython's);
  4. the output of ./pxx --doctor, and the commit of your checkout (git log -1 --format=%h).

Programs that compile and quietly give a wrong answer are the most valuable reports. A refusal with a clear message is usually already known; a wrong answer usually is not.

Contributions are welcome under the terms in CONTRIBUTING.md in the repository.