ZPE is now coming up for it's five year mark, but it's actually stemmed from something I started 8 years ago.
In this article, I am looking back at ZPE through the years, asking myself questions.
Why did I start ZPE?
BlackRabbit Script, the predecessor to ZPE, was written only for use on Windows computers which were originally my own development base. It was written in C#.NET. When I learned a bit more about parsers and making them efficient I decided to rewrite the BlackRabbit Script parser in C#.NET using the new knowledge I had obtained. It received a decent performance gain. In 2015 I decided to give it a go building it from scratch as part of a university project. I gained huge performance improvements.
What was the biggest hurdle for ZPE?
There were two very big hurdles when developing ZPE. The first of those was the mathematical parser. I knew that writing this in an efficient manner would be difficult, however, not so difficult that I would need to rewrite the mathematical and logic parsers three times to get them right.
The second hurdle was that I wrote BlackRabbit Script using my own class library that I began writing when I was 13 (in my second year of high school). It contained a bunch of different tools that formed the basis for BlackRabbit Script and made it really easy to develop functions for it. Unfortunately, that class library is not available in Java and since ZPE was rewritten in Java I had to redevelop a bunch of those features for the basis of ZPE. When I moved from BRS to ZPE, BRS had around 100 built-in methods. ZPE only got this as of about version 1.5.x.
What is my favourite feature of ZPE?
The web parser and ZEN. ZEN is a bunch of networking features for ZPE that make it well worthwhile. It also allows ZPE to act as a web server and it's a rather efficient web parser. ZPE powers my webserver at home as it allows me to easily create plugins for it to automate things around the house.
What is coming up for ZPE?
There's a bunch of new performance improvements planned for ZPE that have been in the works since about version 1.5 that are finally going to get the time needed. Version 1.8 will start with version 1.8.1 (Quinn) which will develop the foundation for these improvements to go through.
There will also be improvements to the MySQL library over the next few months.
Primrose Lake, also known as version 1.7.12 will be the last version of version 1.7 to be released. Despite this, it's a huge update.
1.7.12 not only brings single line if statements using the if...then statements but it also brings performance improvements in two areas.
The first area for a performance improvement is the When-Is statement (aka the case statement). The improvement in performance comes from statements that are long in size but unfortunately smaller statements get a performance penalty. For performance gains statements need to be around about 6 or more options.
There have been a few parser improvements too.
But the most significant change is the way in which libraries are now imported. Any ZPE compiled library is no longer imported at startup and is now deferred. They are now imported only through the import command.
ZPE 1.7.12 is now available from my Download Center.
ZPE 1.8.x might still be over six months before it's initial release following the 1 minor version per year system, but I always like to have my codenames for the versions lined up. So here's the list:
- 1.8.1 - Quinn
- 1.8.2 - Hunter
- 1.8.3 - Reynolds
- 1.8.4 - Evershed
- 1.8.5 - Carter
- 1.8.6 - Younis
- 1.8.7 - Portman
- 1.8.8 - Myres
- 1.8.9 - James
- 1.8.10 - Kaplan
- 1.8.11 - North
- 1.8.12 - Levendis
- 1.8.13 - Bailey
- 1.8.14 - Reed
- 1.8.15 - Watts
- 1.8.16 - Pearce
Now try and tell me where these names come from.
ZPE 1.7.8 focuses on a bunch of things but it's main focus is on the compiler.
ZPE 1.7.8 has new compiler optimisations that take a bit of strain from the interpreter and put more on the much faster compiler. These changes do not affect interpreted programs but affect ones compiled to a file such as the standard library. One of the first things that was changed is that compiler now removed assertions from a compiled program (these are only needed when the program is tested). Secondly, mathematical operations are now optimised so that operations that would come first are moved to the first place in the operation. Finally, inherited structures now are created at compile time rather than runtime.
I'm hoping to have 1.7.8 out by the end of the month, but it will all depend on how much other work I end up having to do as I'm quite a busy web dev at the moment.
ZPE 1.7.6 is just around the corner. As part of this, the ZPE engine gets a new logo for each version as shown above.
ZPE 1.7.6 brings minor performance improvements, a few fixes, 64-bit number representation, negative exponents in numbers (I am surprised this isn't in it already) new object features and I am also introducing an updated GUI which now uses an output console window. I'm hoping it will be available within this month.
From the beginning of version 1.4.0 ZPE has taken codenames pretty seriously. Now it's a major thing as you'll see from version 1.7.x since each version goes by a different name. Originally, codenames were given when the parser changed underneath, whereas now it is actually if there are changes to any part of the whole package. Major releases are denoted by a change in codename. The following is a list of all codenames used to date as well as future planned versions.
The official ZPE codename roadmap to date is as follows.
- 1.4.0: Tummel
- 1.4.20: Tummel
- 1.4.0.23: Lyon
- 1.4.1.0: Lyon
- 1.4.2E: Tummel
- 1.4.2H: Experimental
- 1.4.3: Rannoch
- 1.4.3.10: Isla de Muerta
- 1.4.3.40: Isla de Muerta
- 1.4.4: Black Pearl
- 1.5.0: Black Pearl
- 1.5.0.1: Black Pearl
- 1.5.1: Black Pearl
- 1.5.2: Pelegosto
- 1.5.3: Isla Cruces
- 1.5.4: Port Royal
- 1.6.0: Severus
- 1.6.1: McGonagall
- 1.6.2: McGonagall
- 1.6.3: Dumbledore
- 1.6.4: Potter
- 1.6.5: Potter
- 1.6.6: Weasley
- 1.6.7: Waverley
- 1.6.8: Haymarket
- 1.6.8.1: Haymarket
- 1.7.0: Reindeer Lake
- 1.7.1: Kasba Lake
- 1.7.2: Nueltin Lake
- 1.7.3: Yathkyed Lake
- 1.7.4: Dubawnt Lake
- 1.7.5: MacKay Lake
- 1.7.6: Wollaston Lake
- 1.7.7: Nettilling Lake (planned)
- 1.7.8: Cedar Lake (planned)
- 1.7.9: Cree Lake (planned)
- 1.7.10: Dubawnt Lake (planned)
- 1.7.11: Baker Lake (planned)
- 1.7.12: Primrose Lake (planned)
- 1.7.13: Aberdeen Lake (planned)
Ever since objects were introduced in version 1.3.x they have been gaining more and more attention. They became a huge part of ZPE as the move towards making ZPE/YASS an object-oriented language became more and more clear with the need to be able to develop and teach simple object-oriented methodologies became more important.
ZPE 1.6.4 (August 2018) made a huge change that aligned structures and objects in a better way than before.
Now, with version 1.7.4, objects gain even more power. Previous versions of ZPE from 1.6.4 focused on using new object creation functions such as the generate_image
, generate_ui
and file_open_sequentially
functions, but now ZPE in-lines the creation of objects such that it becomes possible to use internally created ZPE structures in the same way that user-defined structures are used. By this I mean using the new keyword:
function main() $v = new ZPEImage() $v->display() end function
This is positively one of the most important syntax changes that have been made for a while. As a result of it, certain functions such as the above-mentioned ones have now been removed.
ZPE 1.7.4 will be out in the next few days, bringing this new feature amongst many other fantastic features that will make this another one of those amazing releases. Other features coming include a much better GUI and ZPE Online features, lazy/short-circuit evaluation, the removal of an old version 1.3.x hack that affected performance, better-designed structure and object generation, and a few new functions.
For the first time in however many years, I have been spending a lot of time on working on making ZPE talk to my website and web server. As a result, I have been working on making a shared community that will allow users to save their work to the cloud.
The cloud will be powered by my own website engine that allows the posting and getting of user contributed content. This will not only be very good for clients who would like to access scripts elsewhere, but it will also allow sharing of code.
This is no where near finished, but it's got some traction already. You can find out more here.
ZPE 1.7.3 which is another major update to ZPE, is available from today. Major changes include the way that arrays work in ZPE, along with ordered associative arrays. Binary, octal and hexadecimal values have changed (see the changelog to find out more), structures are now less like standard objects where values can be set on them (see the previous post) and there's now several new documentation styles (@author
, @date
and @doc
).
Also the update changes the parse_json, parse_csv and parse_xml functions to json_decode, csv_decode and xml_decode and there is now a new csv_encode function.
Overall, the tweaks made should make development even simpler than before.
ZPE 1.7.3 now brings a big change to the way in which structures work in ZPE. Originally, objects were extensions to the design of structures but as time went on it actually became structures that were extensions to objects.
Now, the object has become such a major part of YASS that the language itself has become largely object oriented. As direct result, structures have formed a major part of the design with much of the language being developed to take advantage of them. Now, with ZPE 1.7.3, structures differ from objects for the first time.
Structures were always blueprints or templates of objects that were yet to be defined, much like in an E-R diagram and entity is a description of a record that has yet to be implemented. But structure instances always allowed you to add properties like in JavaScript which in my opinion was plain silly.
So:
structure tester $name = "" $dob = "1970-01-01" end structure $person = new tester() print($person->$name) $person->$test = 10
This was valid in ZPE as it is in JavaScript where a previously undefined property (in this case $test) can be defined at runtime. Not any longer. ZPE 1.7.3 changes this an enforces the structure on the user. Another major update that comes with this is the new class
keyword that can be used instead of structure.
There have also been significant changes to the standard library that is now available on ZULE too. This update to the library makes it no longer backward compatible with ZPE version 1.6.x and before but it makes it better for the newer versions.