Prog8 Compiler Release History
A condensed timeline of major releases and significant changes in the Prog8 programming language compiler.
Note
Python to Kotlin Transition: The original Prog8 compiler (pre-1.0) was written in Python. In early 2022, the compiler was completely rewritten in Kotlin starting with v1.0 Beta. The Kotlin rewrite brought significant improvements in performance, IDE support, type safety, and maintainability. This document covers the Kotlin-era releases.
Summary of Major Language Milestones
Version |
Milestone Feature |
|---|---|
1.6 |
Address-of operator |
1.10 |
|
1.11 |
Structs (first introduction) |
3.0 |
CPU registers removed, new loop syntax |
4.0 |
CommanderX16 target support |
5.0 |
Calling convention overhaul (registers for returns) |
6.0 |
Virtual registers |
7.0 |
Structs removed |
8.3 |
|
9.0 |
|
9.3 |
Software evaluation stack removed |
9.7 |
Unicode identifiers, |
10.0 |
Short-circuit boolean logic |
10.3 |
|
11.0 |
|
11.1 |
Multi-value returns from subroutines |
11.4 |
|
12.0 |
``long`` datatype, structs reintroduced, typed pointers |
12.1 |
|
12.2 |
Long loop support, |
12.3 |
Deterministic module search order, -srcdirs priority |
Breaking Changes Summary
Major breaking changes that require code modifications when upgrading:
v3.0: CPU registers (A,X,Y) removed, loop syntax changed
v4.0: Module renames,
mkword()parameter order flippedv5.0: Calling convention overhaul
v5.3: Explicit
&required for pointer assignmentsv7.0: Structs removed,
%targetdirective removedv9.0:
-targetnow requiredv9.3: Eval stack removed (affects low-level code)
v10.0:
push/popmoved tosysmodulev10.2: Stricter boolean types
v10.4: Namespace reorganization (
cx16tocbm)v12.0: Structs reintroduced (different from v1.11), typed pointers
v12.1: Combined virtual register renames (
R0R1_32→R0R1, etc.)v12.2:
swap()is now a statement (not a function),math.crc16()andmath.crc16_start()require new parameters,privateis now a reserved keywordv12.3: Deterministic module search order, filesystem priority over internal resources
2019–2022 — Early Development (Python to Kotlin Transition)
- v1.0–v1.2 Beta — January–February 2022
First public Kotlin release (v1.0, 26 Jan)
MAJOR: Compiler rewritten from Python to Kotlin — complete implementation language change
Zeropage variable allocation and block-level variable initialization
Gradle build system, math optimizations,
floatsafezeropage mode
- v1.3–v1.6 — March–April 2022
asmsubroutines can return values in expressionsAddress-of operator ``&`` implemented — replaces
memorykeywordFor loops can iterate over literal collections
New builtins:
strlen(),sqrt16(),pow(),powf()
- v1.7–v1.11 — July 2022
Array size optional with initializer
``%asmbinary`` directive for assembly inclusion
AST-based Virtual Machine with optimization passes
``when`` statement — new multi-way control flow
Structs added — composite datatype feature
- v1.20 — July 2023
Struct literals — inline struct initialization
2023 — Language Maturation
- v2.0–v2.3 — May–July 2023
Major compiler speedup (scope lookups, code generation)
Stricter type checking, optimized
swap()String value reassignment, new string functions (
leftstr,rightstr,substr)Subroutine inlining optimization
- v3.0–v3.2 — July–August 2023
CPU register variables (A, X, Y) removed — use inline assembly
Loop syntax changes:
repeat-untiltodo-until, newrepeat X {},forever {}removed``continue`` statement removed
``sizeof()`` function added
Optimized in-place/augmented assignments — major performance boost
- v4.0–v4.1 — August–September 2023
CommanderX16 target added — major platform expansion
Floating point support for CX16, VERA registers, 65c02 features
``lsl()``/``lsr()`` removed — use
<<=1/>>=1Module renames (
c64scrtotxt),mkword()parameter order flipped
- v4.2–v4.6 — September–October 2023
Cross-platform C64/CX16 compatibility
``.w`` postfix removed — breaking syntax change
``%option no_sysinit`` directive — skip system initialization
String escape characters:
\\xHH,\\'``diskio`` module introduced — file I/O routines
Automatic string comparisons by value
- v5.0–v5.4 — November 2023–January 2024
Calling convention overhaul: args via variables, returns via registers
Explicit ``&`` required for string/array pointer assignments
``in`` containment operator:
if xx in [1,2,3]Experimental C128 target
Pipe operator ``|>`` and string encoding syntax (
iso:"hello")``@requirezp`` flag — force zeropage allocation
Rewritten variable allocation — large program size savings
2024 — Advanced Features
- v6.0–v6.4 — January–March 2024
Virtual registers ``cx16.r0..r15`` for CX16 and C64
New builtins:
target(),offsetof(),memory(),cmp()``gfx2`` module — enhanced graphics with highres modes
``peekw()``, ``pokew()`` — word memory access
IRQ handling routines for CX16
Improved RNG with seeded variants (
rndseed,rndseedf)Assembly codegen completed — all expression types supported
- v7.0–v7.8 — June 2024–February 2025
Struct feature removed — rewrite as separate variables
``%target`` directive removed — use CLI options only
Software evaluation stack removed — frees memory page and X register
PET32 target — Commodore PET 4032 support
2x faster multiplication and square root operations
New modules:
verafx,emudbg,monogfx,spritesBuiltins:
setlsb(),setmsb(),math.diff(),math.diffw()
- v8.0–v8.13 — April 2024–May 2025
R39 CX16 ROM support
``**`` operator removed — use
floats.pow()Experimental VM target with
syscallbuiltinAPI reorganization: trig/float functions moved to
math/floatsmodules``bool`` datatype introduced — optimized true/false (0/1)
BSS section — uninitialized variables, reduced PRG size
``divmod()``, ``divmodw()`` builtins
Major codegen optimizations — significantly smaller and faster code
- v9.0–v9.7 — June–December 2024
``-target`` now required (c64 no longer default)
New builtins:
min(),max(),clamp()``@split`` storage class — efficient LSB/MSB array storage
``cbm`` module — all CBM kernal routines
Boolean ``when`` conditions
Underscores in numbers:
320_000Multiple declarations/assignments:
ubyte x,y,zandx=y=z=calculate()``continue`` statement for loops
Unicode identifiers:
knäckebröd,πNegative array indexing (Python-style)
Range containment:
if x in 10 to 100
2024–2026 — Modern Prog8
- v10.0–v10.5 — January–November 2024
Short-circuit boolean evaluation (McCarthy logic)
Stricter boolean types — no longer equivalent to bytes, require explicit casting
``void`` keyword — skip unused return values in multi-return assignments
Namespace reorganization: non-X16 variables moved from
cx16tocbmBuiltins removed:
sort,reverse,any,alltoanyallmoduleCompiler renamed to ``prog8c``
``defer`` statement — delayed execution for resource cleanup
If-expression:
result = if x>10 "yes" else "no"Memory alignment:
@alignword,@alignpage,@align64Array literals with repetition:
[42] * 99
- v11.0–v11.4 — December 2024–June 2025
``const long`` numbers — 32-bit integer literals
``goto`` can jump to calculated addresses
Word arrays split by default (LSB/MSB in separate arrays)
Subroutines can return multiple values
Multi-value variable initialization:
ubyte a,b,c = multi()``%output library`` and ``%jmptable`` directives — loadable libraries
``%option romable`` — ROM-compatible code warnings
ROMABLE programs — no inline variables or self-modifying code
Range choices in ``when`` statements
Foenix256 target
Boolean virtual registers:
cx16.r0bL,cx16.r0bH``on .. goto`` / ``on .. call`` — efficient jump tables
Float to int casts (truncating)
Double buffering in monogfx module
- v12.0–v12.1 — November 2024–February 2026
``long`` datatype — native 32-bit signed integers
Structs reintroduced — grouping multiple fields together
Typed pointers — can point to structs and specific types (not just
uwordaddresses)PET32 modules:
petgfx,petsnd,diskioNew builtin:
swap()C128 enhancements:
fast()/slow()for 2MHz modeString operations: case-insensitive comparison,
strings.split(),strings.next_token()Virtual target improvements:
f_seek(),f_tell(),diskname(),loadlib()
- v12.2 — May 2026
Long loop support — for-loops with long counters on 6502, long math (division, sqrt, min/max/clamp/abs)
``private`` keyword — for structs, enums, aliases, variables, and subroutines
Const pointers — compile-time constant-folding for const pointers
``enum`` syntax — concise constant list declarations
2D array support —
ubyte[3][4] matrix``swap()`` is now a statement — more efficient than the previous builtin function
``math.crc16()`` signature changed — now requires
initvalueandxoroutparameters for flexibilityNew compiler options:
-daemon(IDE integration),-nostdlibNew modules:
serial(CX16 UART+ZiModem),lineclip,wavfile,adpcm``-libsearch`` fuzzy search fallback — finds libraries even with partial names
- v12.3 — June 2026
Deterministic module search order — replaced alphabetical search with prioritized list.
``-srcdirs`` priority — user-specified source directories now have the highest priority.
Neighboring directory priority — the directory of the importing file is searched before the current directory.
Standard library overrides — the filesystem is now searched before internal resources.
Improved error messages — missing module errors now list all searched filesystem paths and the requester.
Fuzzy library search —
-libsearchnow automatically attempts a fuzzy search if no exact matches are found.Trace imports — new
-traceimportsoption to see exactly how modules are being resolved.Search Path Comparison:
Step
Old Behavior (Approximate)
New Behavior (Strict)
1
Internal Standard Library
User Source Directories (-srcdirs)
2
Target Library Directories
Neighboring Directory
3
Neighboring Directory
Current Working Directory (.)
4
User Source Directories (alphabetical)
Target Library Directories
5
(not applicable)
Internal Standard Library
This document summarizes major and minor releases. Bugfix releases (e.g., v12.0.1, v12.1.1) are omitted for brevity.