Elevate Software


Login Login

ProductsBulletSalesBulletSupportBulletDownloadsBulletAbout





Home  Elevate Software Blog  Elevate Web Builder 3 Progress Update for April 2019

Icon Elevate Web Builder 3 Progress Update for April 2019

Posted by Tim Young on Fri, Apr 26 2019
Just a quick update on Elevate Web Builder 3. I almost done with the new compiler/interpreter, and just need to implement the new external interfaces to native Delphi code (modules) over the weekend, and then I'll be starting on re-integrating the compiler/interpreter back into the new EWB 3 IDE. After that, I need to finish up some aspects of the server-side application run-time support code and then I'm done with the initial beta candidate. I'm trying like crazy to get this all completed by the middle of May.

So, just to revisit all that I've been working on:
  • EWB 3 has a new IDE, which you can see here:

    Elevate Web Builder 3 IDE Screen Shot

    You can manage any number of EWB 3 web servers directly from within the IDE, including managing all deployed content and content folders. There is no longer any distinction between the "internal server" web server built into the IDE and an "external server" web server, as far as the IDE/deployment is concerned. The only difference is that the EWB 3 internal web server is in-process as part of the IDE. But, even the internal server stores its database and content in a special AppData location. And, you will be able to migrate the settings of any web server instance to any other web server instance with a simple IDE context menu option.

    There is also a new component navigator in the IDE, and the component library has been moved to the left-hand side of the IDE. Also, all of the ancillary IDE panels can be moved into the gutters by simply double-clicking on the title bar of each panel or the special move icon on each panel's title bar.


  • EWB 3 has a new web server:

    The new web server has a lot of new features, including user/role/privilege management (including anonymous access), built-in, transparent TLS support (just need to specify the cert name you want to use), automatic authentication and session handling, remote content management, support for existing EWB web server modules (native code), and support for new, interpreted server applications.

    The new server applications rely on the new EWB 3 interpreter (see below) and can be created/compiled/deployed/debugged directly in the IDE. You run them similarly to a DLL in Delphi, in that you can specify a client application to run that will make requests to the server application and trigger any breakpoints, etc. The server applications also have support for features like encrypted payloads so that vendors can require a license key in order to permit execution, but these features will most likely be released at a later time.

    The database support has also been improved quite a bit, and uses a new REST-ful API that is easier to access for non-EWB client applications. In addition, the database support now includes the ability to echo back generated/identity columns to the client application for inserts/updates, which has been sorely missing for a while.


  • EWB 3 has a new compiler:

    The new compiler has a brand-new front-end (parsing/identifier resolution) that is much, much better at symbol/identifier resolution and doesn't have issues with odd constructs like the existing compiler. The existing compiler was created primarily as a JavaScript transpiler, and it did an okay job, but it was inadequate for emitting instructions for an interpreter (see next).

    After the conversations on the support forums about the code editor improvements, I went ahead and took a week and a half of time in April to move the parsing/tokenizing for the code editor into the source manager for the IDE. What this does is streamline the parsing/tokenizing process and remove the necessity of having both the code editor and the compiler parsing the same source (improves performance). Instead, the parsing/tokenizing is now handled once in the source manager and can be incrementally updated as the source code is changed, which makes it possible to implement the code editor improvements very soon after the initial EWB 3 release. In addition, this change allows me to expose these services in the IDE for plugins and IDE add-ons in the near future so that plugin code can response to changes in the source code, etc. This also opens up the possibility for different source parsers for JSON, HTML, etc. in the IDE with syntax highlighting. Finally, this change moves the undo/redo into the source manager, where it can track such changes for history tracking/source control (again, future feature).


  • EWB 3 has a new interpreter:

    The existing EWB interpreter uses an AST-walker implementation where it simply walks the abstract syntax tree nodes generated from the compiler. This is sufficient for IDE usage, but is/was woefully inadequate for server-side production usage.

    The new interpreter includes some neat new features like much better constant folding and memory safety. It is impossible for EWB code to generate an AV in the new interpreter: all array/string indexes are checked for validity, all object references are checked for validity to ensure that they are not invalid, and the interpreter can do post-mortems that will show any memory leaks in an application (memory management is still manual and deterministic).

    The new interpreter also uses a special design and instruction set that allows it to be fairly fast. For example, the following code (1 million object array initialization and iteration) executes in ~407 msecs on an i7:

    program AssignTests;
    
    type
    
       TSubObjectType = (sotNone,sotString,sotInteger);
    
       TMySubObject = class(TObject)
          private
             FSubObjectType: TSubObjectType=sotInteger;
          public
             property SubObjectType: TSubObjectType read FSubObjectType
                                                    write FSubObjectType;
          end;
    
       TMySubObjectArray = array of TMySubObject;
    
       TMyObject = class(TObject)
          private
             FName: String;
             FCount: Integer;
             FSubObjects: TMySubObjectArray;
             procedure SetName(const Value: String);
             function GetSubObject(Index: Integer): TMySubObject;
          public
             constructor Create(ACount: Integer); virtual;
             property Name: String read FName write SetName;
             property Count: Integer read FCount;
             property SubObjects[Index: Integer]: TMySubObject read GetSubObject; default;
          end;
    
    constructor TMyObject.Create(ACount: Integer);
    var
       I: Integer;
    begin
       inherited Create;
       FCount:=ACount;
       SetLength(FSubObjects,FCount);
       for I:=0 to FCount-1 do
          FSubObjects[I]:=TMySubObject.Create;
    end;
    
    procedure TMyObject.SetName(const Value: String);
    begin
       if (Value <> FName) then
          FName:=Value;
    end;
    
    function TMyObject.GetSubObject(Index: Integer): TMySubObject;
    begin
       Result:=FSubObjects[Index];
    end;
    
    var
       TempObject: TMyObject;
       TempValue1: Integer;
       TempValue2: Integer;
       I: Integer;
       TempResults: TMySubObjectArray;
       TempCount: Integer;
    begin
       TempObject:=TMyObject.Create(1000000);
       try
          TempObject.Name:='Assignment Tests';
          TempValue1:=Random(0,999999);
          TempValue2:=Random(0,999999);
          TempObject[TempValue1].SubObjectType:=sotString;
          TempObject[TempValue2].SubObjectType:=sotNone;
          SetLength(TempResults,2);
          TempCount:=0;
          for I:=0 to 999999 do
             begin
             if (TempObject[I].SubObjectType <> sotInteger) then
                begin
                TempResults[TempCount]:=TempObject[I];
                Inc(TempCount);
                end;
             end;
       finally
          TempObject.Free;
       end;
    end.

    A basic array population (1 million elements) like this takes ~172 msecs:

    program ForArray;
    
    function UserIntToStr(Value: Integer): String;
    begin
       Result:=IntToStr(Value);
    end;
    
    var
       I: Integer;
       TempStrings: array of String;
    begin
       SetLength(TempStrings,1000000);
       for I:=0 to 999999 do
          TempStrings[I]:=UserIntToStr(I);
    end.
So, things are looking good now, and I'm working very hard to get a beta out ASAP. I will keep everyone posted as things progress and the beta gets wrapped up.


Tags: Elevate Web BuilderPermanent Link

Comments Comments (12) You must be logged in to comment

Comment Steve Gill said... Reply
Very impressive, Tim.  Looking forward to the Beta.

= Steve

Comment Allen W. Hunt said... Reply
I'm really looking forward to it.  The IDE screen shot looks great.  Nice job!

Comment edwinyes said... Reply
Well done! Will the code editor in the new IDE have code-complete support?

Comment Tim Young [Elevate Software] said... Reply
@Edwin

Probably not initially.  However, as I said above, I've laid the groundwork for getting the code editor improvements in place ASAP after the initial release.

Comment Bruno Larochelle said... Reply
Thanks for the update! Lots of information packed into your post! I'm really looking forward to it. I especially like the addition of the component navigator.

Comment Rolf Frei said... Reply
The IDE looks great. Are the Docking windows written by yourself or do you use any 3rd party for that? I'm searching such an nice docking solution, so I just wondering what you do use there.

But... I'm not so exiting about the Office like menu system. I hate this type of menu as all is much more complicated, than it was with the traditional menu, where we were able to find what we need much faster and we were able to select a command with one click. This new Office Style is much more user unfriendly and needs more than one click to find what we need. So i'm not realy happy that you have implemented this bad UI style.

Comment Tim Young [Elevate Software] said... Reply
@Rolf

The panels don't dock, exactly.  They are either visible or effectively minimized off-screen, and can be recalled by simply clicking on the tab.

The menu system is a hybrid and not exactly like the Office menus, so the shortcut keys work pretty much like a normal menu.  I don't exactly love the Office-style menus, either, but they *are* better for new users and I've gone to great lengths to keep them small and uncluttered.

Comment Henri said... Reply
Looks great, Does EWB 3 also contains a tree component?

Comment Steve Gill said... Reply
Personally, I think the menu/toolbar system looks good.  I sometimes use something similar in my software (I call them tabbed toolbars).  Eventually you just can't fit everything on one toolbar, so I believe a tabbed toolbar approach is the best way to do it.  Also, it allows you to group toolbars by category which, makes it easier to find what you're after.

Comment Steve Gill said... Reply
Tim, now that it's getting close to the middle of June, would it be possible to get another update?

Comment Masino Sinaga said... Reply
Any update for EWB 3? When will it be released? I will buy it once it has been released.

Comment Thomas said... Reply
The new interface looks really slick and I'm very much looking forward to this!

Image