Thursday, December 24, 2020

How indispensable is Z++ ?


Introduction

We will look at engineering process and contrast that with the notion of software engineering. In doing so we will find similarities that will clarify the need for Z++.

Engineering

Over the years, mostly through hard work and trial and error, we have discovered some of the laws of nature. Think of electrical engineering. We have also learned how to formulate these laws mathematically. Now, when we need to design an engineering product that involves electricity, we think in terms of laws of nature, through their mathematical formulations. The design is then submitted for implementation.

An engineering product must be tested. First, during implementation we could have missed any number of things, especially when the product is a whole new item. Second, during implementation we might have had to make adjustments to the design. Basically, testing is a must whenever there is an implementation. I would not want to be the first passenger on a plane that was just rolled out of a factory.

So, the main points are that, we deal with a formulation of laws of nature, and that testing is part of the process of engineering a product.

Software Engineering

The first observation is that, we are still dealing with formulations of laws. However, these are not natural laws. Instead, the operating system for the platform we are creating software stipulates the laws as well as their formulations, usually in the form of system calls in C language. These conceptual laws are already formulated and are the product of research by computer scientists.

The abstraction provided by an operating system for developing software will be called a platform in this article. Since each operating system is an implementation, platforms present the formulations of laws, the system calls, in their own unique ways. Thus, each platform is like a distinct physical world with its own laws and their formulations. That is as it should, just like the notions of vehicle and airplane have many implementations.

A system programming language, C and C++, can only provide abstractions for some of the formulations of a platform, such as the input/output streams. Otherwise, they must allow direct access to system calls. A partial solution towards software engineering is a third party library. Thus, C++ equipped with a third party library provides a unified platform for multiple operating systems. That means, one can think in terms of one set of formulations for the laws of several operating systems. However, note that one has to build the same software on each actual platform, like Windows or Linux etc. That implies that the build on one platform will not run on another platform.

So now, considering something like C++ equipped with a third party library, we can speak of software engineering, as opposed to programming. We can think in terms of a set of formulations of the laws and create an implementation of the application software we have imagined. This is not the same as programming a particular operating system to perform a certain function. We are presenting a concrete realization of an idea we imagined in the form of an application without thinking, or knowing, about the formulations of laws on the actual platform on which the application will eventually run.

The testing of an application must be done for each platform on which it is built. Since this is obvious, there is no need to digress on this, or the fact that testing must be done for a build for an update of third party library, even if there was no change whatsoever to the implementation.

Compared to engineering, it seems that there is something missing in software engineering. In engineering, we design before implementation. But for software, it seems like we go straight to implementation. That however, implies that a software engineer is a monkey trying to type "To be or not" on a type writer via trial and error. Computer scientists have created notions and methods for the design phase, such as Abstract Data Types, Information Hiding, etc. They have also clarified the notions of algorithms and their efficiency.

An algorithm is a mathematical view of an implementation of a component/part of an application. For instance, when building a car, we design engine, body, wheels, lights and so on, separately. In the same vain, a software application comprises of many components, each designed (algorithmically), in its own right, prior to its implementation.

Nonetheless, the implementation of an application involves direct use of the laws of the platform, as opposed to creating objects, such as a car engine, in accordance to laws of nature. In former case, algorithms replace the engineering designs and drawings.

Z++

So, C++ equipped with third party libraries provides a unified platform for software engineering, for applications targeted to multiple operating systems. One characteristic of Z++ is to generalize this idea to all operating system from desktop to smartphones, without the complications of a third party library. That is, you only build the software once for all equivalent operating systems. For instance, all desktop operating system, or all phones, etc.

As good as it may be, this generalization does not make Z++ indispensable, though it certainly helps reduce the development costs.

More detailed discussion of software engineering, and the role of Z++ is at: 


Distributed Computing

Distributed computing implies the cooperation of multiple, possibly heterogenous, nodes (operating systems). That is, the process that represents the application is distributed, with each part of it executing independently on one of the nodes. That simply means, the distributed process cannot be a process of any of the nodes. It must be a process of a distributed operating system. Z47 is a distributed operating system that powers Z++ language. See Requirements for Distributed Computing for a detailed discussion of Z47.

The client-server model is a limited form of distributed computing, where the server provides a specific set of services. The Z++ model is a realization of the notion of distributivity, without restrictions.

Now, this alone makes Z++ indispensable. One universal abstraction for building application that will run on any platform, as well as, applications that can simultaneously execute on any number of nodes, without the designer having to deal with any of the nodes outside the abstractions of Z++ platform.

But that is not all that Z++ delivers. In what follows, we will only cover a few Z++ abstractions, some of which are indispensable. However, to keep it short we will not introduce several significant Z++ platform formulations, such as, object-oriented Structured Query Language (SQL), the exception mechanism with resumption, library packaging in the form of extended namespaces, invariants and constraints, global and object-oriented threading, etc.


Autonomous Agent

An autonomous agent is a process that can travel from one node to another, while maintaining its state. Thus, an autonomous agent is inherently a concept within distributed computing, in that it needs a distributed operating system so it can travel as a process. A process of an operating system on one node cannot become a process of another node with same or different operating system, with or without preservation of state.

Z++ provides a simple abstraction for the notion of autonomous agent in its fullest generalized form.


Interoperability

Z++ is a superset of C++, not its extension as C++ is to C. That means one cannot include C++ header files in Z++. However, Z++ links with static/dynamic libraries of C and C++. In fact, should there be any need, the same linkage mechanism can be used to link with any valuable language like ADA, or Eiffel.

Component Orientation

Any Z++ program can execute on its own as a process, as well as, become a component to be loaded and executed by another Z++ program. Indeed, Z++ components can execute on local and remote nodes. This allows not only distributed execution, but also distributed engineering (development) of complex distributed software.


Conclusion

Z47 is an abstract platform for engineering applications on all platforms in the same category, such as the category of desktop, or smartphones. Even more importantly, Z47 is the infrastructure for distributed computing.

Z++ presents software abstractions via linguistic formulations for the Z47 platform.

Z++Visual is a modern IDE for building and debugging Z++ software.

ZHMicro is the home of Z++Visual.

Labels: , , , , , ,