Many a software developer has referenced this saying:
When
the only tool that you have is a hammer, every problem begins to look like a
nail.
That is not to imply that a hammer is not useful. If there
is one conceptual hammer that – more so than any other – has repeatedly proven
its merit for managing – and hiding –
complexity, that would be the concept of hierarchy.
File systems are hierarchies. B*Trees and binary trees and Patricia tries and
parse trees are hierarchies. Most documents are internally organized as
hierarchies, including the common HTML, XML, and JSON formats. Most graphical
user interfaces are modeled as hierarchies. Many programming languages leverage
hierarchy to provide nesting, information hiding, scoping, and identity. How is
it that such a simple concept can be so universally useful?
First of all, hierarchical organization enables very simple navigation. What this means is that at
any arbitrary point – called a node –
in a hierarchy, there is a well-known set of operations that are possible, such
as navigating from the current node to its parent
node, and navigating from the current node to any of its child nodes. If a node does not have a parent, then it is the root node, and if a node does not have
any child nodes, then it is a leaf
node.
Child nodes are contained
within their parent node. Each child is uniquely identifiable by its parent,
for example by a name or some other unique attribute. A hierarchy is recursive; at any point in the
hierarchy, from that point down is itself a hierarchy. Since a hierarchy has a
single root and is recursive, each node in the hierarchy is uniquely
identifiable in the hierarchy by combining the identities of each successive
node starting with the root and proceeding down to the node; this identity is
the absolute path to that node. It is
possible to navigate between any two nodes in the same hierarchy by combining zero
or more child-to-parent navigations with zero or more uniquely identifiable
parent-to-child navigations; the sequence of these steps is a relative path between two nodes.
These basic attributes of a hierarchy combine in amazingly
powerful ways. For example, since each node is itself the beginning of a
hierarchy of any size, it is possible to refer to that entire sub-hierarchy
simply by referring to that one particular node; this effectively hides the recursive complexity contained
– or nested – within that node. As a
result, it is possible to add, copy, move, or remove a hierarchy of any size
simply by adding, copying, moving, or removing the node that is the “root” of
that hierarchy.
Using a hierarchy, it is incredibly simple to construct the
concept of scope. For example, a
scope could include only a specific node, or it could include a specific node
and all of its child nodes recursively to its descendent leaf nodes, or it could include a specific node and its ancestor nodes to the root node, or any
other combination of inclusion and exclusion that could be described in an
unambiguous manner.
These concepts are incredibly simple, yet at the same time
incredibly powerful, and are leveraged liberally throughout the XVM, from
managing and hiding complexity for developers, to managing memory in an
execution context.
No comments:
Post a Comment
All comments are subject to the Ecstasy code of conduct. To reduce spam, comments on old posts are queued for review before being published.