In designing the Mimix domain specific language, MSL, I have come to realize that there is a significant benefit in looking at everything backwards, including the most basic form of representing computer instructions which is operator operand.
In order to explain why this advantageous, I must retrace a few steps from history. The earliest stored
In designing the Mimix domain specific language, MSL, I have come to realize that there is a significant benefit in looking at everything backwards, including the most basic form of representing computer instructions which is operator operand.
In order to explain why this advantageous, I must retrace a few steps from history. The earliest stored program computers had a list of operators defined in hardware. These operators, combined with their parameters or operands, would perform the imperative statements desired by the programmer.
For example, in the IBM 1401 computer, storing the value XXX into the XX register would be specified by:
Of note here is the fact that the operation or operator is specified first, followed by its value. Since the beginnings of stored program computers, this has been the method of representation: that the operations were canonical and the data variable.
In reality, this is an artifact of the hardware limitations of the first computers. Access to data was severely limited. The first digital computers required several stages of manual processing by separate machines, each of which was really a computer in its own right, in order to produce input acceptable in the time domain to the running processor.
The physical circuitry of the earliest computers required that operations be defined in advance. Indeed, the earliest form of “programming” was wiring panel inputs and outputs together with physical cables to describe the operations that should be performed on some later data. The data itself was far away on a card, tape, or disk which required some massaging to become available to the processor running all these commands or operators.
In other words, the availability of operators was assumed (because it was built in to the machine or, before, that, wired into a panel), but the operands or data these operators might act on were variable and might or might not be there.
It’s shocking to realize that early computers required several physical tape drives (each costing thousands of dollars) in order to access several files. Today, we think nothing of having many files open at one time. An average web page might contain more than 100 separate files, all of which must be “open” in order to display the page. But, at the beginning, this was not possible because the physical limitations of the tape drive and the core storage that backed it prevented accessing multiple files at the same time.
In order for more than one file to be accessed, the tape drive would have to close the first file and then physically relocate the tape to the position of the second file. Even if this were instantaneous, the core memories of the first computers prevented this from being a real solution. There simply wasn’t enough memory to hold the values from file 1 and file 2 in memory at the same time, so a physically separate tape drive was supplied to hold the second file. In order to write and run a program in ALGOL, one of the earliest programming languages, the computer’s owner would need as many as 4 separate tape drives in order to access four separate files at the same time.
Historically, many problems (and solutions) developed from the limited core memory of early computers. Our current ideas about indexing and finding content, for example, are all derived from the early difficulties in finding and indexing content on tapes and the punched cards that were used to create them.
But what if we fast-forward and see where data is today? Do we still need to be bound by the limitations of punched cards and the tapes that were used to hold them? No. Today, the data itself is easy to find… it’s in Google or on your own drive or in your Dropbox, or an email, or a Word document, etc. The computer or smartphone you use today has access to lots of data which is the same but it can applied in a variety of ways which are different.
Now, the data itself is the important part and there are number of different ways in which you can use it. You could take a song and watch the video on YouTube, share the link in Spotify, or lookup the lyrics in Google. Early systems had to define all of the possible operations without knowing about the data because it was so hard to get the data into those systems with their limited memory and peripherals. But today we can start with the data and then apply additional information to it (metadata) or apply functions to it — the exact opposite of what we did before.
Why would we do this? Because it better represents the world as it is. The earliest computers defined all of the possible operations that could be performed on data in advance and then waited to see what kind of data might be applied to those operations. But a new system could reverse that principle and take the world of data as it exists and define new and always changing operations to be performed on that set of data.
If we create a computer system that starts with the idea of fixed data and variable operations, instead of the other way around (fixed operations and variable data), we can continue to evolve new operations on top of the existing data. For any particular operation, the data isn’t changing! If we need to know if a soybean exchange is profitable, the price at which we bought and at which we sold aren’t changing. But if we invert the operator operand format into operand operator, we could apply a number of different analyses to this value which already exists, such as how the price of soybeans for sale has changed over time.
Of course, data changes over time. Not only the price of soybeans on a certain exchange, but also the number of moons of Jupiter. Any reference to a real world transaction can only refer to the values that exist at that time, so it’s perfectly safe to decide that atoms are fixed. They are fixed, at that time! Later, they may change but future transactions (later trade of soybeans) will use the future values.
If we record the data values as fixed and then, if they change, record a new fixed value going forward, we can apply any operations available to us on any of these values, past, present, or future.
Mimix inverts the entire paradigm of computer instructions by assuming that data are fixed (at the moment of the imperative instruction) and that operations are variable and may have variable results. New operations can be defined at any time which operate on the last known values of the data. Values can also be updated in time (as new moons of Jupiter are discovered, for example), and future operations will invoke the new values.
In the Mimix language, MSL, the traditional form of operator operand is reversed, resulting in operand operator. This offers several advantages. First of all, the data in operand is canonical and can be determined from previous MSL expressions. The data already exists; it is only being massaged into a new form by the operation. Second, the list of possible operations or operators is infinite. New operators can be defined which work on existing data without affecting any previous operations on that data. Data can be displayed in terms of the operators which exist at one point and then again later with new operators.
Previous systems weighted all of their storage and processing decisions around the limited availability of what we would today call “offline storage” and the reliance on a single master control program to know all of the possible operations on the data. Today, this is no longer the case. The data itself has been solidified. We already know Walt Disney’s birthday, the distance to the moon, and the last paragraph you wrote in your screenplay. The variable today items are the operators or what we can do with the text, video, image, or binary data you’ve provided.
computers had a list of operators defined in hardware. These operators, combined with their parameters or operands, would perform the imperative statements desired by the programmer.
For example, in the IBM 1401 computer, storing the value XXX into the XX register would be specified by:
Of note here is the fact that the operation or operator is specified first, followed by its value. Since the beginnings of stored program computers, this has been the method of representation: that the operations were canonical and the data variable.
In reality, this is an artifact of the hardware limitations of the first computers. Access to data was severely limited. The first digital computers required several stages of manual processing by separate machines, each of which was really a computer in its own right, in order to produce input acceptable in the time domain to the running processor.
The physical circuitry of the earliest computers required that operations be defined in advance. Indeed, the earliest form of “programming” was wiring panel inputs and outputs together with physical cables to describe the operations that should be performed on some later data. The data itself was far away on a card, tape, or disk which required some massaging to become available to the processor running all these commands or operands.
In other words, the availability of operators was assumed (because it was built in to the machine or, before, that, wired into a panel), but the operands or data these operators might act on were variable and might or might not be there.
It’s shocking to realize that early computers required several physical tape drives (each costing thousands of dollars) in order to access several files. Today, we think nothing of having many files open at one time. An average web page might contain more than 100 separate files, all of which must be “open” in order to display the page. But, at the beginning, this was not possible because the physical limitations of the tape drive prevented accessing multiple files at the same time.
In order for more than one file to be accessed, the tape drive would have to close the first file and then physically relocate the tape to the position of the second file. Even if this were instantaneous, the core memories of the first computers prevented this from being a real solution. There simply wasn’t enough memory to hold the values from file 1 and file 2 in memory at the same time, so a physically separate tape drive was supplied to hold the second file. In order to write and run a program in ALGOL, one of the earliest programming languages, the computer’s owner would need as many as 4 separate tape drives in order to access four separate files at the same time.
Historically, many problems (and solutions) developed from the limited core memory of early computers. Our current ideas about indexing and finding content, for example, are all derived from the early difficulties in finding and indexing content on tapes and the punched cards that were used to create them.
But what if we fast-forward and see where data is today? Do we still need to be bound by the limitations of punched cards and the tapes that were used to hold them? No. Today, the data itself is easy to find… it’s in Google or on your own drive or in your Dropbox, or an email, or a Word document, etc. The computer or smartphone you use today has access to lots of data which is the same but it can applied in a variety of ways which are different.
Now, the data itself is the important part and there are number of different ways in which you can use it. You could take a song and watch the video on YouTube, share the link in Spotify, or lookup the lyrics in Google. Early systems had to define all of the possible operations without knowing about the data because it was so hard to get the data into those systems with their limited memory and peripherals. But today we can start with the data and then apply additional information to it (metadata) or apply functions to it — the exact opposite of what we did before.
Why would we do this? Because it better represents the world as it is. The earliest computers defined all of the possible operations that could be performed on data in advance and then waited to see what kind of data might be applied to those operations. But a new system could reverse that principle and take the world of data as it exists and define new and always changing operations to be performed on that set of data.
If we create a computer system that starts with the idea of fixed data and variable operations, instead of the other way around (fixed operations and variable data), we can continue to evolve new operations on top of the existing data. For any particular operation, the data isn’t changing! If we need to know if a soybean exchange is profitable, the price at which we bought and at which we sold aren’t changing. But if we invert the operator operand format into operand operator, we could apply a number of different analyses to this value which already exists, such as how the price of soybeans for sale has changed over time.
In the Mimix language, MSL, the traditional form of operator operand is reversed, resulting in operand operator. This offers several advantages. First of all, the data in operand is canonical and can be determined from previous MSL expressions. The data already exists; it is only being massaged into a new form by the operation. Second, the list of possible operations or operators is infinite. New operators can be defined which work on existing data without affecting any previous operations on that data. Data can be displayed in terms of the operators which exist at one point and then again later with new operators.
Previous systems weighted all of their storage and processing decisions around the limited availability of what we would today call “offline storage” and the reliance on a single master control program to know all of the possible operations on the data. Today, this is no longer the case. The data itself has been solidified. We already know Walt Disney’s birthday, the distance to the moon, and the last paragraph you wrote in your screenplay. The variable today items are the operators or what we can do with the text, video, image, or binary data you’ve provided.