Global Ruby is a project implementing the GELP paradigm of software design: Globally Extensible Local Programming.
This paradigm envisions a Ruby program as a flexible, global, continuously running entity capable of:
-
EXTENSIBILITY. Ruby methods can be sent for execution to any machine in the world, as if they were executed locally.
-
HOTSWAP. Dynamically patching a Ruby application at runtime.
-
VERSIONING. Maintaining a global history of program state: variables, methods, and more.
-
DATAFLOW-BASED PROCESSING. Ruby methods are triggered implicitly by data conditions, rather than explicit calls.
Global Ruby rethinks traditional boundaries in software development and removes outdated limitations like:
-
Where should this application run?
-
When should it be started or stopped?
-
How should remote parts of the system be orchestrated?
With Global Ruby, you embrace the paradigm of global computing — an evolutionary step beyond distributed computing. Your program doesn’t just run somewhere — it lives everywhere, persistently. The whole world is limit.
-
Zero-effort head/worker or client/server architecture.
-
Moving code to where the data is (next-gen Big Data).
-
Automatic parallelization of bulk operations across multiple hosts.
-
Automatic extension of an application to the most suitable compute resource (by RAM, cores, etc.).
GELP keeps a Ruby program local and holistic from the developer's point of view — a single namespace, as if it were a conventional script. Behind the scenes, however, the program can extend its methods to remote hosts, including all their dependencies.
The “extensibility” paradigm is defined by two principles:
-
Zero modification: The code doesn't need to be written in a special way to become extensible.
-
Stateless extension: When a method is sent and executed on a remote URL, it leaves no trace — it disappears entirely from the remote host until the next time it is invoked.
Take a look at the conventional application that counts CPU cores using its method collect_info. With Global Ruby, however, you can send the method to any remote host:
Global.run(binding, host, :collect_info)Global.run extends the collect_info to the host host, executes it (with respect to its execution dependencies such as header, @prefix, etc.), and returns result back to the program, as if it were local execution.