Jamie Balfour

Welcome to my personal website.

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

Jamie Balfour'sPersonal blog

ZPE 1.13.8 is only just out, and we've already got the headline feature of ZPE 1.13.9, and it's all about security. 

Plugin security has been non-existent over the last few versions due to changes and deprecations in the underlying Java language. Anyway, today I decided it's time to relook at this and I've come up with my own way of doing this. Simply put, it forces plugin developers to develop an alternative way of accessing files, and that's using the new ZPE Sandbox Security file system. It also prevents access to certain other things, like running commands on the command line through the shell and restricts users to the built-in ZPE shell. 

Overall, this is the first step to a more secure plugin-based environment and I'm really happy with it.

Most of the focus of the new Colliergate release is on the new and improved parser. The parser claims up to 24% increases in performance, and that's because it finally brings a new means of peeking.

What I'm talking about is that the Zenith Parsing Engine version 1.5 no longer wastes parsing time when peeking - once a token has been read, it is stored and it's never reparsed. Because of this, when ZPE asks the parser to peek ahead, the parser checks if the token has been parsed, and if not, it parses it, then returns that token. See, whenever you do a K(n) peek ahead, you parse n tokens, but in previous versions of the Zenith Parsing Engine, these tokens were discarded and reparsed again when the parser re-peeked at them or tokenised them, thus, storing a token cache, we can easily discern its value without reparsing it.

It's just astoundingly fast, and this improves CSV, XML, JSON, TOML, JBML and INI parsing too.

What this means is that ZPE is catching up to competitors for parsing speed, and there's still room for further enhancements that are planned for version 1.6. 

The new version of ZPE will be released on Friday, marking one of the most exciting updates to date. Spanning three months rather than the usual one, it brings a slew of new features and changes designed to improve performance, add functionality, tighten the syntax, and enhance the UI.

It contains several significant changes, including the headline feature: a new parser, the Zenith Parsing Engine version 1.5, which offers up to 24% faster parsing speed by reducing backtracking in the parser. 

Constructs

Labels and GoTo have been added to YASS. This is something I have tried to implement in the past, but have always disliked the way I've done it. I also think that, given YASS is meant to be object-oriented and unprocedural, it's not something that fits in with the standard, but it is here anyway.

YASS
$i = 0
label openloop
print($i++)
if ($i < 10)
  goto openloop
end if
print("Done")

Assertion has seen a massive change to make it more like other languages:

YASS
assert($a == [5, 8, 13, 21, 34])

Not only that, but the error identification is so much better than before when using assertions.

Bugs

Many bugs have been fixed, including:

  • All properties of anonymous objects are now always accessible.
  • Fixed a bug in the list_zpe_properties function to ensure it always returns all functions
  • Added a new and more effective means of determining whether the program is run from a command line/headless
  • Fixed the JSON parser to ensure it no longer double-checks every string for quote marks

Functions

Several new functions have been added:

  • get_environment_variables
  • get_percentile
  • base64_encode
  • base64_decode
  • histogram

The beep function has also been significantly improved with more accurate frequencies.

Objects

Added two new objects:

  • Colour
  • Point

GUI

The GUI has been updated considerably:

  • The rogue white line at the bottom has finally been removed!
  • The curved UI has been improved further, as has the menu.
  • The macOS icons are now manually rendered rather than relying on PNGs (this was always temporary)
  • There's now support for BalfLaf Themes (blt) files
  • There's now a property editor dialog for changing properties of ZPE
  • There's now a lockdown option that can be set on individual installations of ZPE
  • Symbols are no longer highlighted as part of the keyword set in the editor
  • Built-in objects and imported objects are now highlighted
  • New, clean and straightforward white icons are used at the top right of the GUI instead of the multi-coloured ones
  • There is now an option to run ZPE Native if it is found in the correct place
  • There's no longer an option to run code locally, and without running it through a separate ZPE process, which makes it easier to work with and prevents the GUI from crashing. The 'local' option is only used as a fallback.

The Quick Fire Command Window (-q) has also undergone significant improvements in both form and functionality.

ZPE Macro Interface Editor

There's a lot to discuss here, but in short, the macro editor has improved significantly over the last few months to the point that it's now become a key part of my other software. It has always been able to act on an object provided to it, but now it can give information on functions provided in the object, it can be used to not only make simple code and execute it, but also provide code back to the calling program that can be used call a macro when a button is clicked for example. See eTraxion for more information on how this is used.

Other changes

ZPE now stores data in a new folder on the system. For macOS, this is the Library/Application Support folder; for Windows, it is AppData; and for Linux and other operating systems, it remains the home directory. 

Mathematical functions have been split into two separate categories: Numerical and Arithmetic, and Scientific Mathematics. This is because the Mathematics category was getting too large.

New ZPEKit methods have been added to provide more comprehensive access to the ZPE Core. 

That's just been a quick overview of the main new features coming to ZPE in version 1.13.8, which will be released on Friday. I'm exceedingly excited!

Ten years ago today, in May 2015, I rebuilt ZPE from the ground up, developing a parser that still powers it today. That parser, the Zenith Parsing Engine, completely changed ZPE and made it possible to create large programs that didn't experience slowdown. It also allowed me to develop more complex constructs and statements and build in backtracking, a once fundamental step in ZPE as a program. 

It was also the day I introduced the YASS language (known back then as Zenlang). 

ZPE 1.3 was the foundation of what ZPE is today. It completely changed ZPE. It's incredible to think how far it's come, and it's also amazing to believe that it's been a project for ten years!

I also intentionally timed it so that the next version of ZPE would be released today. So, ZPE 1.13.7 was also released today. This is an anniversary edition since it marks the ten-year anniversary.

You may also notice that I pushed a few more versions this year to try and get to 13.7 for this release, and that's because my birthday is 13-7-1991, so I wanted that to coincide with this release. 

I will launch modules for the YASS language in a very near future release. These modules will further compartmentalise the YASS language and add to its object-oriented paradigm. 

Modules are the parents of structures, objects, and functions. Their primary purpose is to use static methods, like the library system currently does, but in a far more flexible manner. This will involve many underlying changes to the systems of the ZPE Programming Environment core. It's currently planned for a July release. 

After a weekend of looking at my whiteboard, this is what I've come up with.

I'm pleased to announce that after nearly ten years of using hash maps in ZPE, I've switched to using my new binary search tree implementation. This improves performance further than before since in some cases my hash map, which is some 8 years old, would lead to collisions that in turn presented a O(n) case. This was not good. 

The worst case for a binary search tree is indeed O(n) also and it's best case is actually worse than that of a hash map, which is O(1), but I've been testing out a new binary search tree I've developed and it performs marginally better. What's really cool about the binary search tree implementation is that it is actually a drop in replacement for the hash map I've been using for the last few years with methods like put, get and so on. 

Throughout the next few weeks I'll continue to assess this. 

The latest version of ZPE is here. And it's met the original target set out. This might be a small update in terms of features, but the features are pretty big. 

First of all, we've got the new ChatGPT model. This model allows for direct communication with ChatGPT using an API key. The setup is simple and is done within the properties file. It can be used to assist in the editor as well as can be using as an object in code.

Second, we've got two new parsers; TOML and INI. Both formats are similar but offer advantages. I like TOML as a format and have considered using it as the main form of property storage in ZPE. INI is simple and basic and less likely to find use with me but it's great to finally have two new data formats that can be decoded by ZPE. 

ZPE 1.13.2 will be released very soon and I'm also planning for two releases in February. The first new features that will come to ZPE are the encoders for both TOML and INI files. I also want to release an XML encoder by the end of February as well.

ZPE has increased in file size however, and this is due to the inclusion of ChatGPT. It's worth it though.

Over the next few months I want to add more to ZenPy to make a more complete representation of Python from YASS.

As well as that, I intend on developing ZenLua and ZenPHP. Both of these are in early stages and will be fully open source and available on my GitHub. 

ZenLua will transpile YASS to Lua. This is something I've been thinking about for a while now as I use Lua quite a bit. My plan is to make it very easy for myself to write Lua with a language I think is considerably easier to understand. 

ZPE now has ChatGPT integrated. The new ChatGPT object is available within the language and requires you to set up your own API key. 

I'm also working on the editor AI features, including AI Suggest, AI Assistant and AI Improve. All of these will connect to my webserver but will require a subscription. 

I'm really happy with this being the first feature of 2025.

ZPE 1.12.12 is now available. Sadly, not everything I had planned to bring in managed to be brought in. However, this version paved the way for further performance improvements with ZPEC (ZPE Performance Enhanced Cache), which precompiles code before execution and can make a serious difference to the program's performance.

Another nice new feature is that aliases are now stored in a file that is read on startup, meaning you can easily add or remove aliases to ZPE.

ZPE 1.13.1 will be released in January, and one of the significant features to be added is additional data formats, including the INI file format, TOML and JBML. I also aim to improve the caching system further.

Some bugs still need to be ironed out, such as the popups in the editor on Windows.

Also, I'm no longer doing ZPE throughout the year posts as they are actually reflected in the history of ZPE anyway.

Powered by DASH 2.0