Jamie Balfour

Welcome to my personal website.

Find out more about me, my personal projects, reviews, courses and much more here.

The history of ZPE

ZPE has changed enormously since its beginnings. This page tells the story of its major release generations: the ideas that defined each one and the ways they changed ZPE and YASS.

For individual release highlights, visit What's new in ZPE. The milestones page follows important ideas across versions, while the complete changelog preserves every recorded change.

Before ZPE: Foghorn and BlackRabbit

ZPE's lineage begins with the project originally codenamed Foghorn. BlackRabbit and its BBMSIL-based scripting system were designed to add readable macros and commands to applications including Painter Pro, Cobweb and Wonderword. The scripts were interpreted into operations carried out through C# and the .NET Framework.

BlackRabbit already had an editor that could create, run and debug scripts. It contained at least 50 commands and address lines by May 2011, and its July 2011 Platform Preview became my first major software milestone. By July 2012 it had reached 100 commands and was being tested by a wider group of users.

BlackRabbit Script was the first programming language I worked on, when I was around 16 or 17. Its focus on readable, application-hosted scripting survived into YASS, even though ZPE would later replace its Windows-centred .NET implementation with a faster Java architecture.

Select a version badge to read about the changes that defined that generation of ZPE and YASS.

BlackRabbit Script 1.1

First release: 10 January 2011 · Last change: 31 December 2012

BlackRabbit Script 1.1 was the early application-hosted scripting language that established the readable, command-driven ideas later carried into ZPE and YASS.

BlackRabbit Script

A readable scripting language for building macros and commands inside applications.

1.1

Application scripting

Scripts were designed to control software such as Painter Pro, Cobweb and Wonderword.

1.1

Editor and debugging

BlackRabbit included an editor for creating, running and debugging scripts.

1.1

ZPE 1.2

First release: 19 February 2015 · Last change: 18 March 2015

ZPE 1.2 moved BlackRabbit Script onto the first Zenith Engine parser, introducing the early ZPE command-line, function and data foundations before the modern Zenith Parsing Engine arrived in 1.3.

Zenith Engine

BlackRabbit Script was rewritten around a new parser that became the immediate ancestor of ZPE.

1.2.0

Command line

CLI execution, file reading, translation and variable assignment made the language practical to run.

1.2.01

Language foundations

Functions, conditionals, loops, strings, sets, mathematical functions and comments arrived.

1.2.01

Version 1.3

First release: 9 May 2015 · Last change: 27 August 2015

ZPE 1.3 introduced the Zenith Parsing Engine and established the modern compiler, interpreter and language foundations of ZPE.

Zenith Parsing Engine

The core was redesigned around the Zenith Parsing Engine, improving parsing speed and extensibility.

1.3.0

Compiler and evaluator

Compilation, nested function calls, function assignment and faster interpretation became core capabilities.

1.3.0

Control flow

While, for, do-until and select-when statements expanded the language's control structures.

1.3.0โ€“1.3.1

Lists and sets

Lists, sets, sorting, searching and collection operations became available to everyday programs.

1.3.1

Associative arrays

Associative arrays introduced named-value storage and the foundations of later map support.

1.3.3

1.3.5 family

The 1.3.5 releases and their derivatives expanded numeric handling with exponents, recursion, images, conversions and mathematical evaluation.

1.3.5โ€“1.3.5.190

Real Math Mode

Real Math Mode introduced direct mathematical evaluation, including bracketed expressions, modulo, constants and mathematics in conditions and collections.

1.3.5.63โ€“1.3.5.90

Structures

Structures gained variables, functions, access and assignment, beginning the long path toward YASS OOP.

1.3.6

Plugins and lambdas

Java plugins, function handles and lambda functions made ZPE more extensible and functional.

1.3.7

Version 1.4

First release: 29 August 2015 · Last change: 14 August 2016

ZPE 1.4 made the core more modular and formal, adding internal documentation, typed values, scopes, chaining and a major evaluator rewrite.

Core restructure

The interpreter core was reorganised around faster hash functions, aliases and reusable internals.

1.4.0

Internal manuals

Built-in documentation, parameter requirements and permission requirements became part of the extension system.

1.4.0

Function chaining

Values could call chainable methods such as generating a range and immediately reading its length.

1.4.1

Typed values

Compiler type checking and explicit string, integer, boolean, structure, lambda, object and image types arrived.

1.4.2

New evaluator

The logical and mathematical parsers were rewritten together, with a substantially faster comparison evaluator.

1.4.3

LAMP

The LAMP compiler and interpreter unified logical and mathematical evaluation before the later, faster LAME replacement.

1.4.3โ€“1.7.0

Scopes and errors

Private, public and friendly scopes, try-catch handling and clearer compiler errors strengthened the language.

1.4.3.10โ€“1.4.3.40

Version 1.5

First release: 8 December 2016 · Last change: 4 October 2017

ZPE 1.5 expanded data interchange, networking and the object model, while the parser was redesigned into the reusable ZenithParser.

JSON support

GSON integration and JSON-to-map conversion brought structured data into the standard toolkit.

1.5.0

Encryption

AES encryption and decryption added a practical security feature for programs and stored data.

1.5.0

Client and server

Server and client communication was improved, including server-side script execution.

1.5.0โ€“1.5.0.1

Threaded lambdas

Lambda functions could run in their own threads for asynchronous work.

1.5.0.1

Includes and libraries

Non-compiled source could be included before compilation, and the plugin interface became easier to use from Java.

1.5.1

Custom keywords

Plugins could define custom keyword parsing, opening the door to language extensions.

1.5.2

ZenithParser

The parser was separated from the compiler and JBSON and CSV parsing were redesigned around reusable parsing tools.

1.5.2โ€“1.5.3

Object literals

Objects gained constructor functions, internal methods and a concise object-literal declaration format.

1.5.2โ€“1.5.4

Switch statements

The switch statement arrived as a clearer rewrite of the earlier when-is style of selection.

1.5.4

Version 1.6

First release: 1 February 2018 · Last change: 28 December 2018

ZPE 1.6 pushed deeply into objects, inheritance, typing and the โ€œEverything is a Functionโ€ direction that shaped modern YASS.

Web parser

The -w mode introduced parsing web pages directly through ZPE.

1.6.0

Object rewrite

Objects and structures were substantially rewritten for faster, more efficient runtime behaviour.

1.6.3

Inheritance

Objects gained inheritance, built-in methods and stronger public, private and friendly access checks.

1.6.6

TYPO

Type checking arrived in ZPE, with typed mode and the first major generation of the TYPO system.

1.6.7

Fat-arrow lambdas

Lambda functions gained concise fat-arrow syntax and could be passed through loops and expressions.

1.6.7

Image objects

Images moved from a native type into an object with native methods for dimensions, pixels and transformations.

1.6.4

64-bit values

Long integers replaced 32-bit integers, while binary literals and conversion tools expanded numeric support.

1.6.4โ€“1.6.6

Everything is a Function

Functions, nested functions, retained interpreter definitions and global function handling moved YASS toward a more uniform model.

1.6.8

Version 1.7

First release: 29 December 2018 · Last change: 30 December 2019

ZPE 1.7 separated the compiler from the runtime, accelerated parsing and evaluation, and established many of the language and object-model foundations used by later releases.

Compiler and runtime

The compiler and runtime were separated, improving compilation and execution performance.

1.7.1

LAME evaluator

LAME replaced LAMP with a faster and more accurate evaluator for logic and mathematics.

1.7.1โ€“1.7.4

References

By-reference variables and assignments made it possible to update the original value through an alias.

1.7.0โ€“1.7.1

Unit testing

Assertion tools were added for checking true and false conditions in programs.

1.7.0

ZPE Web Server

The first built-in web server could serve ZPE-HTML pages and index files.

1.7.1

Structures and objects

Structures were rewritten and nested structures became available, with stronger access rules.

1.7.4

ZPE Online

Munro Top introduced registration, cloud storage and online program features.

1.7.4

Built-in objects

Language objects replaced several older generation functions, strengthening the object model.

1.7.5

YWP pages

The web parser adopted YWP pages and the <?ywp opening syntax.

1.7.9

Compiler keywords

Features such as count and alternative values gained concise compiler-supported syntax.

1.7.9โ€“1.7.11

Explicit imports

Libraries began loading through the import keyword instead of interpreter startup work.

1.7.12

Version 1.8

First release: 1 January 2020 · Last change: 31 December 2020

ZPE 1.8 grew into a broader platform with the ZEN client-server tools, web support, a public programming interface and stronger runtime protection.

ZEN Client and Server

The client and server tools were redesigned as ZEN Client and ZEN Server with more reliable communication.

1.8.1

Secure communication

Encryption, authentication and protected communication improved the ZEN platform.

1.8.1โ€“1.8.3

Remote files

ZEN tools gained file transfer and familiar Unix-like commands for working with remote projects.

1.8.2โ€“1.8.4

Interactive mode

The -i option became the dedicated interactive interpreter.

1.8.1

Ranges and indexes

Indexed ranges and negative indexes made list and string access more flexible.

1.8.3โ€“1.8.5

Velocity Web Server

Velocity Web Server support expanded ZPE's web application capabilities.

1.8.4โ€“1.8.8

ZPEKit

ZPEKit became the supported public interface to the compiler and ZPE internals.

1.8.5โ€“1.8.10

Reference types

Reference support matured, allowing values and functions to be handled more dynamically.

1.8.6โ€“1.8.10

Protected programs

Compiled programs and online resources gained stronger protection and access controls.

1.8.7โ€“1.8.12

Version 1.9

First release: 1 January 2021 · Last change: 31 December 2021

ZPE 1.9 focused on expressive syntax, unbound variables, records and the second generation of TYPO, giving YASS a much stronger type system.

Match statements

YASS gained match expressions with an else branch for concise value-based selection.

1.9.1โ€“1.9.5

Compound operators

The *=, /= and ^= operators simplified repeated arithmetic updates.

1.9.2

Unbound variables

let, var and later direct assignment made non-dollar-bound variables practical.

1.9.3โ€“1.9.8

Record structures

Records provided structured values with named fields and later parameterised construction.

1.9.4

TYPO redesign

Strong typing was redesigned from the ground up for variables and structure properties.

1.9.7

Maps

The Map data type superseded associative arrays with clearer naming and stronger comparison support.

1.9.9โ€“1.9.13

Value comparison

Lists, maps, strings and other values gained more consistent hashing and comparison behaviour.

1.9.9โ€“1.9.10

Object magic methods

Objects gained additional runtime hooks, including the _beautify method.

1.9.10

Collections

Lists gained copying, removal and containment helpers, while strings could be split into lists.

1.9.10โ€“1.9.13

Formatting and output

String formatting gained rainbow output, improved comparison and more flexible writing hooks.

1.9.9โ€“1.9.13

Version 1.10

First release: 1 January 2022 · Last change: 31 December 2022

ZPE 1.10 modernised the editor and public tooling while adding stronger function typing, records, networking objects and improved online use.

Online includes

Programs could include code from ZPE Online through the new online include feature.

1.10.1

New editor

The editor moved from JavaFX to Swing and gained a cleaner, stoppable console.

1.10.2

Editor tools

Syntax highlighting, dark mode, code outlines, a function machine and changelog access arrived.

1.10.3

By-reference values

References became available with ZPETypes, including assignments such as $x = &$y.

1.10.4

Records

The record structure returned as a supported data type with named fields.

1.10.5

Networking objects

MQTT and Socket objects provided accessible publish, subscribe and socket communication features.

1.10.10โ€“1.10.11

Typed functions

Function parameters and return values gained strong typing, including return-value coercion.

1.10.8

Downloads

The http_download function made it easier to retrieve remote files from YASS.

1.10.11

System information

System helpers such as hostname, timeout-aware ping and environment support expanded.

1.10.6โ€“1.10.7

AutoGUI

The AutoGUI object added an automation-focused interface to the platform.

1.10.12

Version 1.11

First release: 1 January 2023 · Last change: 31 December 2023

ZPE 1.11 refined the type system, accelerated the runtime and introduced YASS Unfold, bringing clearer code analysis and more expressive modern syntax.

Type casting

Values could be explicitly cast between compatible types when assigning to typed variables.

1.11.1

Static references

Static underlying methods reduced memory use and improved performance across the runtime.

1.11.1โ€“1.11.9

Inline iteration

Values could be generated and transformed directly with inline range iteration.

1.11.4

Union returns

Functions could declare return types such as real | integer.

1.11.4

Better records

Record fields became accessible by name and records could accept values during construction.

1.11.4

Unbound assignments

Python-style declarations such as x = 10 became available through configuration.

1.11.8

Empty keyword

The empty keyword checks whether lists, maps, strings or objects contain no values.

1.11.9

Function references

Functions could be assigned as references, including predefined functions, without immediately calling them.

1.11.9โ€“1.11.10

YASS Unfold

YASS Unfold explains program structure and can export the explanation as HTML.

1.11.10

Functional lists

List references gained map, filter and reduce operations.

1.11.11

Cleaner manuals

Manual information and function descriptions were tidied and made more useful.

1.11.10โ€“1.11.12

Version 1.12

First release: 1 January 2024 · Last change: 31 December 2024

ZPE 1.12 was a major language and runtime generation, bringing a faster evaluator, stronger debugging, richer syntax and the unified ZPE type model that supports the platform today.

LAME X2

A new expression evaluator improved readability and delivered major performance gains.

1.12.3โ€“1.12.4

Interpreter history

The interactive interpreter gained persistent command history through bundled jLine support.

1.12.4

Compiler keywords

Common operations such as is_set and unset became faster compiler keywords.

1.12.4

Richer loops

For-to loops gained expressions, while collection loops gained object-property iteration.

1.12.4โ€“1.12.5

Transpilers

The transpiler system was redesigned around the complete syntax tree and became available in the editor.

1.12.5โ€“1.12.6

Debugging

Breakpoints, runtime halts, source stepping and the Breakpoint Watch window made debugging practical.

1.12.7

Libraries and imports

Libraries could be imported with aliases, while the standard library became bundled and easier to use.

1.12.7

Namespaces

YASS gained namespaces and static methods, including static calls within namespaced structures.

1.12.8

Modern strings

Unescaped strings, escape sequences and improved inline documents made text handling more expressive.

1.12.7โ€“1.12.8

Types and tuples

The type keyword, tuples and stricter tuple safety expanded the built-in type system.

1.12.9

Explicit declarations

Programs could require variables to be explicitly typed and declared before use.

1.12.9

Unified ZPE types

Core values, predefined functions, native methods and maps moved onto the unified ZPEType model.

1.12.9

Process support

The Process object and run_process made external process execution easier to control.

1.12.9

Web integration

Apache integration arrived alongside the foundations for running ZPE-powered web applications.

1.12.10

Multiple returns

Functions could return several values and assign them directly through destructuring.

1.12.10

ZPE performance cache

ZPEC introduced hash-based caching to reduce repeated compilation work.

1.12.12

Version 1.13

First release: 1 January 2025 · Last change: 31 December 2025

ZPE 1.13 expanded the language around modules, modern data formats and a faster runtime, while the editor evolved into a more capable native development environment.

AI assistance

ChatGPT support and an editor AI Assistant brought natural-language help into ZPE development.

1.13.1

Pipe expressions

The pipe command applies a value through an open-ended chain of function references.

1.13.1

INI and TOML

INI and TOML parsing joined ZPE's growing family of structured-data tools.

1.13.1

JBML

The JBML parser and decoder added a concise data format with concatenation and property support.

1.13.2โ€“1.13.3

Binary search trees

Functions, variables, properties, objects and parameters gained faster tree-based lookup.

1.13.3

Modules

Modules became reusable language boundaries with compiler and runtime support.

1.13.4

Scoped constants

Constants and static access became more expressive through module ownership and scope rules.

1.13.5

BalfLaf editor

A major interface overhaul added themes, a purple look, improved menus and a new splash screen.

1.13.5โ€“1.13.8

Search and navigation

Search suggestions, dock positions, code outlines and improved macro tools made the editor easier to navigate.

1.13.7โ€“1.13.8

Labels and goto

YASS gained labels and goto for explicit jumps within a program.

1.13.8

Colour and Point

New Colour and Point objects provided useful values for graphics and interface work.

1.13.8

Statistics

Statistical functions expanded with histograms, interpolation, percentiles and descriptive measures.

1.13.8

Plugin sandboxing

Plugins gained restrictions over which classes they can access, improving runtime safety.

1.13.9

Archives and calendars

ICS encoding and file ZIP operations added practical support for common interchange and archive tasks.

1.13.10

Version 1.14

First release: 1 January 2026 · Last change: 31 December 2026

ZPE 1.14 was a major platform generation. It improved the compiler, runtime, language, web tooling, native applications and developer experience, while adding many of the objects and modules used by modern ZPE programs.

Performance

Faster parsing, compilation, startup, function calls, loops, object access, caching and runtime execution.

1.14.4โ€“1.14.11

LAMEX3

An improved generation of LAME was introduced experimentally and then received further performance improvements.

1.14.7โ€“1.14.8

Templates and scopes

Expression templates, block scopes, private variables, improved debugging and clearer local-state rules.

1.14.1โ€“1.14.2

Security

Plugin vetting, trusted JAR loading, lockdown improvements, permission checks and stronger native-plugin handling.

1.14.3โ€“1.14.11

Modules

Built-in modules replaced static objects, with module-aware manuals, compilation support and custom plugin modules.

1.14.5

Types and TYPO

TYPO 3 and 3.1 brought typed objects, collection types, aliases, fixed-size arrays and stronger runtime checks.

1.14.7โ€“1.14.10

Modern expressions

Arrow expressions, predicates, immediate functions, floor division, indexing results and improved assignments.

1.14.4โ€“1.14.10

Storage and maps

Versioned ZPE storage, ordered maps, compact binary formats and Java-serialization-free persistence.

1.14.8โ€“1.14.11

Databases

SQLite, JDBC database access, Database and DatabaseStatement objects, prepared statements and bundled drivers.

1.14.6โ€“1.14.9

Web applications

Web routing, annotations, YWP pages, PHP blocks, sessions, cookies, request data and richer response bodies.

1.14.4โ€“1.14.11

ZPE-PM and Apache

Process-managed web execution, multipart uploads, automatic startup, Apache installation and compiled-page handlers.

1.14.4โ€“1.14.11

ZenLang and frontends

JSON-defined languages, cached execution, the bytecode builder, ZenTypeScript, ZenC and broader ZPEKit support.

1.14.9โ€“1.14.10

Compilation

Project manifests, bundled resources, native compilation, binary plugins, static methods and recompilable decompilation.

1.14.3โ€“1.14.10

Native UI

ZUI added native windows, controls, layouts, menus, dialogs, tabs, charts, events and standalone native applications.

1.14.10

Graphics and media

Graphics windows, sprites, collisions, physics, asynchronous events, video controls, audio improvements and browser controls.

1.14.10

Image processing

Image copying, cropping, flipping, colour effects, blending, drawing, pixel access and renderer-neutral RGBA operations.

1.14.11

File and sync objects

The File object unified filesystem operations, while ZSync added previews and structured file-change handling.

1.14.10โ€“1.14.11

Mail and URI

SMTP mail delivery and an RFC 3986 URI object with RFC 2396 compatibility, parsing, queries and transformations.

1.14.11

Validation

Built-in validation for email, phone, URLs, IP addresses, UUIDs, dates, JSON, lengths, patterns and passwords.

1.14.11

Parser and manuals

Custom parser callbacks, nested object-method manuals, expanded native-method documentation and improved diagnostics.

1.14.9โ€“1.14.11

Cryptography

Hashes, HMAC, secure random values, AES-GCM, constant-time comparison and X.509 certificate information.

1.14.5โ€“1.14.11

Components and requirements

Reusable YASS components, {{...}} interpolation, @requires return and permission requirements.

1.14.11
Comments

There are no comments on this page.

New comment

Comments are welcome and encouraged, including disagreement and critique. However, this is not a space for abuse. Disagreement is welcome; personal attacks, harassment, or hate will be removed instantly. This site reflects personal opinions, not universal truths. If you canโ€™t distinguish between the two, this probably isnโ€™t the place for you. The system temporarily stores IP addresses and browser user agents for the purposes of spam prevention, moderation, and safeguarding. This data is automatically removed after fourteen days. Your email address is stored so that replies can be sent to your email address.

Comments powered by BalfComment