Software Development

Correcting The Future

The Programming Language of the Future is in /dev/null

A few years ago, a time traveller came by and gave me a copy of the most popular programming language from around the year 3254. He asked me to take a look at it and after I did, he asked me what I thought of it. I typed "mv FuturePL /dev/null" and promptly pressed the "Enter" key. Then I looked at him and said: "That's what I think of it." True story! He said his name was John Titor and that he was looking for an IBM 5100 portable computer.

If someone were to ask me what I believed in more, future (or current) programming languages or John Titor, I'd say John Titor 100%!

I don't know exactly how future programs will be created, but I know one thing with 100% certainty. It won't be done with programming languages. I can guarantee it.

Why do I say this? Because programming languages have provided nothing new when it comes to designing software, only more confusion. I would say that I'm surprised that no one is worried about being able to program multi-core machines, but the truth is that I was the same way. I was too busy to notice. The free ride that is Moore's Law is over for sequential machines. Multi-core machines are here to stay. And yet we still have no "language" that supports dynamically adaptable concurrent programming. Not ONE! That is a dismal state of affairs for the computing community.

Ok, so that's in the past. What about the future? Well, the picture can't improve if we still believe that programming languages are the answer. We've tried it for 50 years and look at the results. It's a common thread that if we built cars like we build software, we'd all be dead. Proving the correctness of your software with the current writing style is like trying to prove that the Sun won't set. You can circle the Earth, but I'm sure it's not worth the trouble. My issue isn't with proving the correctness of your software. Quite the contrary, I do believe that it should be possible. This should surprise quite a few people. Anyhow, what I have issue with is WHAT is being proven. The way we write software is not very conducive to proofs. The entire computing community is with me on this one. Or rather, I'm with them. There's even proofs of things that can't be guaranteed in distributed computing. Should this not be an indication that perhaps the way we are writing software is completely off base?

You just plain don't need a programming language to create software. So when someone from the future hands me a programming language from the future, I already know it's a kid's project on extinct software design practices. There is absolutely no way that I can believe we will still be using programming languages in the future. Every piece of literature on the subject points in the same direction. That it is inadequate for our needs. Memory allocation, memory deallocation, persistent storage management, execution priority, race conditions, deadlock, livelock, starvation, failsafe and many more are all issues that are unique to programming languages. They are human made problems that need not exist. If you use programming languages, of course you're going to get these problems. They're all sequential.

I am stating now for the record that any programming technique that tries to handle concurrency with a programming language will never be free of the problem mentioned in the last paragraph. I also state that trying to write software with concurrency in mind will likewise have problems. If our future cannot come up with something better than the notion of a programming language, then we are doomed to repeat the last 50 years. We've already repeated the last 20. Doesn't look like it will change. Also for the record, the problems in the last paragraph need not exist.

If you're still reading this, you may be wondering how software will be created in the future. I don't know for sure, but I do know that many of my ideas in past entries will be used. Not because I'm arrogant, but because it is supported by evidence and because many have written about these solutions. Unfortunately, NOT ONE single person is prepared to admit that perhaps programming languages aren't the answer. They haven't been for the past 50 years, yet we continue to use them. Imagine if the pyramid builders had the same stubborn mentality. Every time their pyramid came crashing down, they would try and rebuild it in the exact same fashion. Wouldn't be too bright, now would it? But that's what programmers are doing. We are master wheel re-inventors. A broken wheel, but a wheel regardless.

Another thing stopping us is that everything is written in procedural code. There is ZERO out there that is different. It's all based on the sequential processing of instructions.

Ok, let's take a scenario from the future. Let's take a loading dock (on the ground or in space) where there are machines that will load and unload your vehicle's cargo. In our current way of programming, we want to give the "robot" a list of commands. Use object recognition to detect what is cargo, detect its size, adjust grappling or lifting mechanism, move robot to destination and continue like this. Well, I'll tell you right now that this is absurd. Instead of telling the robot HOW to move the cargo, we should be telling it WHAT we want moved and where to. It's already configured on how to move cargo, so that should stay the same. But the cargo's manifest and each item's specification should be given to the robot.

Now, you may think that we can do that kind of thing now. The key word here is "can". What if I change the robots wheels into anti-grav propulsion system? By today's programming style, we would never think of adding that into the programming. We can't think of everything that "CAN" be configured. So in the future, the way software is written is where everything can be configured. You don't actually write in "if (box)... if (ball)... if (nuclear waste)... if (config.cargo[X])"... That's poor man's programming. Forget that shit!

In the future, the robot's motor control will be swapped out with alternate controls. And when designing the software, you don't have to take this into account. It will be inherent in the way software is constructed. Any software you write, any part of it will be swappable without having to write it in. Ever write a program that loaded a file? BAD! Ever write a program that took input from the keyboard? BAD! Ever write a program that used sockets? BAD! Don't get me wrong, I'm not criticizing your programming style. I'm criticizing the fact that you have to be so specific because of current programming languages. What if the input no longer comes from the keyboard? The programmer has to rewrite the software. What if there's a new kind of network that runs in parallel with the Internet, but is handled quite differently? Again, rewrite the software. That's crazy talk.

This new kind of software development is possible. It's been possible for over 50 years. Well, maybe some of the physical resources may have been a hindrance, but at least since 1980. I don't know what the state of computing was before that time, so I can't really comment. But I do know that from what I've seen in videos from the 60's, that a lot of this was possible back then.

I don't pretend I'll be able to create this new kind of programming. All I'm hoping for is getting it started. 100% of software design today is the same no matter what language. It is true that if you know one language, you pretty much know them all. Maybe not APL though. However, my design will be based on WHAT you want done, not the HOW. The HOW will be at the lowest levels where software meets hardware. It's long overdue where we shouldn't be dealing with this stuff anymore. At the higher levels, we'll only deal with WHAT we want done. The computer's execution handler can figure out HOW to do WHAT you want done and load up that code and put it together. You can still write code on HOW to do things, but those are non-portable hardware specific constructs. These should never be mixed with the overall logic of your software. So if you want your software to run on another computer, you only need tell it WHAT you want done. Portability without any of that VM, GC, simulation or any of that jazz.

And don't for one second believe that bytecode is stating what you want done or that programming languages state what you want done. Threads, files, socket and GUI’s are all things that specify HOW to access certain inputs, outputs or other hardware specific operations. What if I don't want to use a GUI, or a socket or whatever else? I should be able to plug in my own access methods without having the programmer redesign the software.

Even in 20 or 40 years, if someone hands me something that is supposed to be some kind fancy new programming language, off to /dev/null it goes. We should all be like /dev/null and never ever let garbage get back out. Now where's my 101 Java directories and why does it need so many installations? More important, how does it sneak it's way back? More malicious than the worst of viruses.

Dijkstra, Proofs and Non-DeterminismWhat If's of Software Development

Comments

Anonymous Monday, August 6, 2007 12:54:34 AM

Anonymous writes: wow... itz amazing...

Anonymous Monday, August 6, 2007 12:55:04 AM

Anonymous writes: fuck..

JKjonkvh Tuesday, September 18, 2007 3:40:52 AM

Got this from GLP. Very good article. Agree 100%. Modular based programming, snap in abilities/utilities that tie into a function only when needed. Excellent.

Anonymous Friday, March 21, 2008 10:19:47 AM

Anonymous writes: Take a good look at the processor board of the IBM 5100. One of the 'proms' does not function unless its only used as a 'backup' recall. This "accidently installed Mercury Project" 'prom' chip has the most unusual instruction set ever! It contributes to this in some ways. I am not going into details of how I know this, etc... find out for yourself.

Anonymous Monday, February 16, 2009 1:02:21 PM

Anonymous writes: Very inspirational essay

Anonymous Wednesday, February 25, 2009 2:10:56 PM

Dan writes: So, you're talking about prolog then?

Anonymous Wednesday, February 25, 2009 3:43:57 PM

Anonymous writes: A computer is a dumb stateful machine that takes a set of instructions from somewhere and performs actions based upon those instructions. It doesn't understand what, or how. Whatever way you look at it, someone is going to have to program the underlying interpreter for your magic ability to tell the machine what you want done. So yes, he's talking about prolog.

Vorlath Wednesday, February 25, 2009 10:13:51 PM

No, Prolog shows a complete lack of understanding about the topic at hand. Prolog is not powerful enough, or even in the same ballpark, for what I'm talking about.

And a machine doesn't have to be a stateful machine that executes instructions. That's von Neumann and isn't the only way to do things. Spatial computing (vs. temporal) is much more powerful.

If you don't have an understanding about the different fundamental styles of computing, you'll never understand what I talk about on this blog. Most of what I talk about cannot be found in books and certainly isn't taught in any school, University or college. The funny thing is that much of it has been known for at least 30 years though and is slowly becoming more prevalent.

There's a whole world of computing out there that 99% of programmers have never seen.

Anonymous Thursday, February 26, 2009 2:59:48 PM

Dan writes: First of all, I apologize for the rant ;-) I agree that a lot of the "cutting edge" programming technology is actually shockingly old now and I certainly dont't disagree with 99% of programmers not having seen most of what computing has to offer. I even agree with your fundamental point about how programming languages are lacking. Yet somewhere amongst your post (this specific one, I admit that I have not yet read any of your other blog posts) is something I can't quite agree with.. Its probably just a bunch of little things that bug me. For example, you state "if you know one language, you pretty much know them all", but that isn't true. If you know one language of a particular paradigm, then you pretty much know all languages of that paradigm - that I can agree with, but there are many completely different paradigms. Example time: do you really think that a C programmer pretty much knows Prolog? Or haskell? Or Forth? Or Lisp? Or.. *shudder* FP? (Or J is you prefer, since I don't know of any FP implementations) FP is so fundamentally different from C that you couldn't possibly expect a C programmer to "pretty much know them all". Imperative, OO, declarative/logic, functional, function-level, concatenative... they are all quite different. My point here isn't to nitpick your blog post (maybe a little, but just cause I'm not a nice person :-D), but rather to point out that all programming languages are not fundamentally the same and languages certainly aren't born equal. Therefore, I think that you are overgeneralizing. Perhaps that was the point though. Maybe its your wording more than anything else: saying programming languages are bad and cant cope with problems is a little vague. How else are you going to program your computer? Switching to a declarative modal (even if its much more advanced than Prolog) is still using programming languages - its just more powerful than what we use now. What about something like this: http://www.rebelscience.org/Cosas/COSA.htm Personally, I think the problem with computing isn't programming languages. Yes, they are partially at fault - or rather, the "popular" ones are - but the problems are much deeper. If we were all using Lisp, running Genera on a Symbolics Lisp machine, I think we'd be a lot better off than we are now. Yes, the popular programming languages are very much lacking, but they aren't exactly the cutting edge of programming technology either. A quick glance at any recent SIGPLAN publications would show this. The biggest flaw is that using my computer requires too much work on my part. Like you said, why do I have to tell it exactly what to do? But apply this across the board - not just to programming. Why am I concerned about what programs are running? I'm not - I only care about editing that text or whatever I need to get my work done. Why am I concerned about saving my files and work? I shouldn't need to be - the system should employ some form of orthogonal persistence which would handle it for me in the background. With versioning. etc etc Why don't we have these things now? The technology certainly exists! The problem is, IMHO, that people have got used to having crap software and having to perform stupid mundane tasks which the computer could easily do for us and because people are used to it, there is no demand for change. It is the same with programming languages. People are so used to the current ways of programming that theres little demand for change. Or they're so reliant on legacy software that they cannot afford to risk changing. This can easily be seen among existing programming languages. So much software is STILL being written in the mess of a language known as (and I apologize, fans) C. Every day people are writing yet more buffer overflows and whatnot. But C isn't very advanced at all. Compare it to, for example, Objective Caml - a functional, imperative OO language with type inference, parametric types, pattern matching, a decent module system and garbage collection, amongst other things. It can also be compiled to bytecode OR efficient native code. Why aren't more people using OCaml instead of C? Or how about (arguably, depending on who you ask, I guess) Lisp?? Or one of my more recent favorites, Factor. There are plenty of languages out there which are more advanced and powerful than the popular languages. We could have a similar discussion about operating systems. Or hardware. Back to your blog post: How do you propose the computer will magically know how to accomplish what you want? Using your robot example, would somebody not need to implement the motor logic which your main control program conveniently overlooks? Some sort of interface to it still needs to exist. It sounds to me that you are envisioning a modular, tiered high level language where the higher tiers don't care about the lower tiers - just that they exist. You give a high level specification of what you want done and the system delegates this down the tiers of software until the low level instructions are reached. This sounds familiar.. yep, it was discussed in Structure and Interpretation of Computer Programs and I believe video lecture 4b (I guessed the number from looking at the list, so I may be wrong) covered that issue too. In fact, Lisp is exceptionally good at this! Of course, SICP discusses it in terms of a math library which doesn't care about the underlying representation of polynomials or circles or fractions or whatever it happened to be, but you can apply the concept to pretty much anything. So, in conclusion, I think, programming wise at least, you really want a modern Lisp with a cleverly designed and powerful standard library upon which you can write higher level tiers of software. Maybe if Lisp machines were to return, everything (hardware and software) could be controlled by the Lisp system and all those difficult problems like concurrency could be automagically managed for us.

Vorlath Thursday, February 26, 2009 4:01:14 PM

saying programming languages are bad and cant cope with problems is a little vague. How else are you going to program your computer?



This is a telling statement. Until a few years ago, I thought it was impossible to write software without functions. I did know about declarative languages and other less known ways to produce software, but generally functions are It. Spatial software development requires no functions at all. And programming languages would be inadequate toward this kind of development.

(edit: corrected second last sentence to say "Spatial software". Used to say "Temporal software" which isn't right.)

What about something like this: http://www.rebelscience.org/Cosas/COSA.htm



That has many similarities to what I'm working on, but only superficially. COSA still has a trigger mechanism and is event based. It's a step in the right direction, but there are many areas where you will get into a bottleneck and someone who hasn't dealt with this kind of stuff will have no idea why they are stuck in the first place.

If we were all using Lisp, running Genera on a Symbolics Lisp machine, I think we'd be a lot better off than we are now.



I hope you're joking. Functional languages have an identity crisis. They don't know whether to be data flow or imperative. And using functions creates its own set of limitations.

As an example of a limitation, map and reduce must have all of its input beforehand. It can't deal with dynamic data unless the program itself uses monads or the list is computed. If the data comes from an external source, then that function would be deemed unpure. Enter the monad.

But an equivalent dataflow transformation would remain pure no matter the source of the data. (edit: I should add that a monad is a dataflow concept bastardized to the point where it appears to be imperative. But since it is dataflow, functional programming can use a monad to retain purity to get around the limitations of functional programming).

This sounds familiar.. yep, it was discussed in Structure and Interpretation of Computer Programs and I believe video lecture 4b (I guessed the number from looking at the list, so I may be wrong) covered that issue too. In fact, Lisp is exceptionally good at this!
Of course, SICP discusses it in terms of a math library which doesn't care about the underlying representation of polynomials or circles or fractions or whatever it happened to be, but you can apply the concept to pretty much anything.



A while back, I actually watched every single one of those lectures just cuz I look at almost everything that comes my way. But talk about boring. Can't believe I made it through the whole thing. Lots of bogus stuff in there.

I don't remember anything in there about hierarchical modularity. I do remember how you could have different implementations, but while watching this, I could not help but think "Who manages the interfaces?" The answer is that it isn't. The teacher even talked about it briefly. For a second, I thought there was hope. I was really interested in what he'd say. But he didn't say anything. Just continued on.

Sorry, but Lisp SUCKS at this. There's a reason why Java has a gigantic library and why perl has a repository. To be fair, I have no idea if Lisp has fixed this issue since then. Even if they got to the point of having a common repository, it'd still be wholly inadequate for true advancement of the computing field because functional programming itself makes it impossible.

I have an article on ONE aspect of this:

http://my.opera.com/Vorlath/blog/2008/07/25/hierarchies-and-equivalence

Note that there are many more factors as to why Lisp cannot do what I need/want. I can try and find those articles too if you'd like.

So, in conclusion, I think, programming wise at least, you really want a modern Lisp with a cleverly designed and powerful standard library upon which you can write higher level tiers of software.



HAHAHAHA

Now THAT is what I call funny. Nice one.

Maybe if Lisp machines were to return, everything (hardware and software) could be controlled by the Lisp system and all those difficult problems like concurrency could be automagically managed for us.



Lisp can only do hierarchical concurrency on local hardware. It cannot do implicit distributed concurrency which should be available on all software development tools from here on out.

Anonymous Tuesday, March 3, 2009 10:22:12 AM

Dan writes: I will reply to your last comment later, when I have more time to do so. I was wondering though, what you think of Subtext as a concept for a programming language? http://subtextual.org

Anonymous Tuesday, March 3, 2009 4:42:59 PM

Dan writes: SICP & hierarchies: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-17.html#%_sec_2.4 "Note that there are many more factors as to why Lisp cannot do what I need/want. I can try and find those articles too if you'd like." If its not too much trouble, then yes, I would like. I am always interested in learning more about this subject and certainly don't mind being corrected if I'm wrong. I had started to reply to the rest of your comment, but decided not to. Instead I would rather admit defeat and ask you this: What is your definition of "Programming Language"? From looking at the rest of your blog, it is obvious that dataflow seems to be the direction you personally lean, in respect to software development and Project V appears to be a visual dataflow system. But how is this NOT a programming languages? Visual programming languages are programming languages just as much as textual ones are, whether they are data flow languages, functional, imperative, declarative, or anything else. On this note, what do you think of LabVIEW? I know that I'm asking a lot of questions, but I'd really like to understand your view better (and I am working my way through your older posts).

Vorlath Tuesday, March 3, 2009 9:17:27 PM

I remember the first version of SubText. It was very weird seeing all that linking within the code itself. I see he's revised the user interface. To me, it still looks like linkage of data dependencies within a temporal programming environment. I'm not sure what this is supposed to give you. I support his attempt at trying different things though. We need more of that.

To me, a programming language is rather all encompassing. I tend to use it for software development environments that require text files. I also tend to narrow it down to those languages that allow temporal execution though I'm not too strict about it. But yeah, mostly in the temporal execution realm with text files.

The only reason I try not to use the term "programming language" for Project V is that the term "programming" involves sequences of events. Like television programming means the sequence of shows. When you go see a play, you get a program that will lay out the acts and maybe other social events that will take place that day. The term "programming" is very much rooted in the temporal sequencing of events. So it's not really appropriate for dataflow environment, but I really don't have any issues with considering it a programming language if they wish. I've probably done it a few times in the past before I really looked at the definition of "programming".

About Lisp not doing what I need is mainly rooted in its substitution model. The result must be used where the function itself is used. IOW, there is no different between the data and the function. I think this was a goal of Lisp. But that completely stops me in my tracks. I think you already looked at hierarchical differences where Lisp uses stacked and I'd rather have a flat hierarchy which is more conducive to modularity.

I'll try and find those articles again. Some of my older articles I don't really like anymore because back then, it was a learning process as to the differences between temporal and spatial computing. Functional programmers tend to think in imperative vs. functional. But it's really temporal vs. spatial. Functional is very much rooted in the temporal aspect (as well as spatial to a certain extent). So it's more like imperative programming than one would like to admit. Back then, I didn't fully understand these differences. And also how the substitution model fit in with all of this.

BTW, I should mention that my original attempts at a new way of programming actually led to me to a variation of Lisp on several occasions. That's why I had to laugh when you mentioned that I'm looking for Lisp. It reminded me of all the work I've done to correct those mistakes.

This is probably the best short article that explains why Lisp won't work. The summary is that the Internet is the best computing model for concurrency that we have, so the "programming language" has to fit that model. Lisp simply doesn't fit. Project V can use the Internet itself as the machine it runs on.

http://my.opera.com/Vorlath/blog/2007/11/01/when-it-starts-to-click

Although I talk mostly about imperative programming, the following article is specifically about why the function cannot be used. It's a VERY old article, but probably one of the best ones on the topic of functions.

http://my.opera.com/Vorlath/blog/show.dml/285699

Here's a good article as to how parallelization is better with data flow. It should also explain a little bit about modularity and reuse.

http://my.opera.com/Vorlath/blog/2008/01/06/simple-example-of-the-difference-between-imperative-functional-and-data-flow

This is an article I just wrote not long ago. It shows different techniques in Project V and also has a section on automatic component updates. I'm sure you can note some differences as to why Lisp wouldn't be able to do many of the things mentioned there.

http://my.opera.com/Vorlath/blog/2009/02/13/project-v-development-techniques

There are other articles, but these should provide the basics of why functional is not good enough. I'll recap.

1. Functions require the use of a stacked hierarchy. I need a flat hierarchy because this is best suited for modularity and being able to spread computations amongst computational nodes (like the Internet computing model). IOW, flat computing hierarchies are best suited for concurrency and Lisp doesn't fit that model because it uses functions.

2. Concurrency. Lisp can only handle specific types of concurrency and its substitution model is yet another hindrance.

3. Purity in Temporal vs. Spatial software development. Lisp combines BOTH temporal and spatial development together into a single unit called the function. So it retains an imperative component. This is why certain functional languages have implemented things like monads and arrows. These are dataflow concepts that can remain pure when the functional equivalent is non-pure. So there are more opportunities to use pure components in dataflow than there are in functional because functional retains an imperative aspect. I know most functional programmers don't like this, but it's a fact.

4. Interfaces. I have a plan for having the machine learn over time. I have no idea how Lisp or any other language could even approach the topic.

There are probably more points, but hopefully this gives you enough information on why I can't use Lisp or functional languages. The 'function' is a flawed concept IMO.

Anonymous Wednesday, March 4, 2009 2:40:03 PM

Dan writes: First of all, thank you for the clarification and for the links! It was indeed helpful. I guess it makes sense to avoid the word "programming language" since it gives one a specific preconception which isn't necessarily true. Programming does have a historical attachment to temporal sequences. Perhaps "software language" is a better more general term? Yes, I can see how the root "problem" then is due to the reliance on functions and the temporal construction of software which they imply. I don't think that the function is a flawed concept though - it serves its purpose quite well (mathematical functions: dump input in, get result out - a substitution as you said). The issue then is that they have been misapplied to problems which they were never really suited for. I suppose this happened because A) it was easy and B) a lot of software, especially early software, is used to perform mathematical computations, so functions made sense. I can also agree that spatial software development is much better suited to parallelism and parallel systems is the way computers are moving, so this is certainly an important issue. Interestingly enough, a project which I have been intending to work on (and am now more motivated to do so, so thanks!) is actually a spreadsheet of sorts. It was originally intended to be a "more powerful spreadsheet" tuned towards a specific set of users to bridge the gap between what these users are used to (Excel) and software specifically designed for their tasks (which generally have too steep a learning curve because the target user is used to using... Excel). However, now I see that this has a lot more potential (I had thought about it before, but discarded the idea for whatever reason) as a general purpose spatial software development system. Spreadsheets are inherently spatial - just much too clumsy and brittle IMHO. They also lend themselves well to dataflow systems. I think perhaps its time to gather my ideas together (dependency stuff, flat component architectures, concatenative languages, spreadsheets) and design a spreadsheet-based spatial dataflow software language. I am very interested in learning about how you intend on having the machine learn and am going to read your comment on that as soon as I hit the Submit button :-P I guess I'll stay quiet now until I have finished reading your links :-D but I must congratulate you on changing my view on these things - it can be difficult to do sometimes (and my first reaction seeing this blog post was "what a twat" - I take it back now).

Vorlath Wednesday, March 4, 2009 3:47:29 PM

I believe it's been acknowledged that the spreadsheet is one of the most successful mainstream dataflow application. I doubt most people fully understand the principles behind it. I can now see why those involved in its creation believe it to be quite the accomplishment.

About your last comment, don't feel bad. I think the vast majority of the everyone online has called me names at one point or another. I actually revel in it. But the reason I write my articles is because I want to make sure my theories are correct and also to present my conclusions. What really is a waste of effort are those that don't want to understand the topics I present. They never present anything about the facts. So even though I'm called a nutjob, it's the name callers that I feel are losing out.

I enjoyed responding to your comments, but I hope you will speak up if you find something you disagree with. Doesn't mean I'll agree with you, but I'm not here to convince anyone. I'm here to share ideas. That's why I was happy to see you have your own ideas and projects in mind.

Good luck!

About machine learning, that's in the future. I need to finish a beta of Project V before I get into that. It's a simple concept, so I'm not sure what else to say about it. Have a repository of interfaces with different implementations. When developing software, you would mostly use interfaces. The main concept is that one layer's interface is another layer's implementation.

For example quicksort is an interface. You can implement it in many different ways. But the quicksort interface is also an implementation for the sort interface.

The result of this is that you can specify implementation as high up as you wish. For example, if your application is meant to play videos, then in contemporary programming, you main function would be an implementation for the VideoPlayer interface. If a user wants to play a video, the machine will load up the implementation that the user has previously set up. But VideoPlayer can be used as an implementation in other software as well. Do you see how an interface can be used both as an implementation and an interface? Project V will use the highest level implementation possible. Most high level implementations will end up using more lowel level interfaces, so the process repeats until Project V sees a machine specific implementation available to its own database on the machine itself (external to the software). The software would only supply these generic implementations that use other interfaces. Project V would extract these generic implementations and store them locally.

Also, you can provide machine specific implementations if you wish directly within the application, but you'd normally simply supply a link to your site for Project V to retrieve implementations from. If they apply to the current machine, it will extract this as well and place it in the local implementation repository. So another program that uses the same interface will know how to do that task without having to fetch it.

What this also means is that your software will be continuously updated if many different software developers use the same set of interfaces. I'm hoping to have a global official standard set of interfaces that people can use.

The purpose of this is that no one is locked to ONE set of opcodes like the JVM and all other virtual machines. So interfaces are your new opcodes. In the future, if certain interfaces start to have widespread use, hardware manufactures may provide hardware implementations. Won't be limited to video codecs and the like. ANYTHING that is in widespread use could be put into hardware. Not only that, but you could have technology where you can add these on. You can have interface modules. If you want an xvid codec, plug it in. If you want a 3D renderer, plug it in. If you want a faster quicksort, plug it in.

It could significantly change the way we produce software. At least I hope so.

The main point I hope you take away is that ALL software that uses any of these things would AUTOMATICALLY start using the hardware versions since they would be better (or they should be anyways).

Project V doesn't care WHAT or HOW the implementation works. Heck, a human being could provide computions with pencil and paper if provided with a way to input data. So humans can be implementations as well. Project V software could span different architectures. You could have machine1->human->machine2 and be a valid network. I've never heard of such a thing, but it'd be perfectly acceptable, if terribly slow. In fact, this is EXACTLY how user interfaces are going to be constructed. The human user is PART of your software.

Hope this helps see the bigger picture, and that yes, maybe I am crazy. But maybe you can also see why being called names brings out a sense of pride. wink

Anonymous Sunday, May 24, 2009 7:30:20 PM

Anonymous writes: I like your comments. I am going to quote to to conclude the paper I have written about computer programming languages.

Vorlath Sunday, May 24, 2009 11:51:32 PM

Go ahead!

Anonymous Monday, May 25, 2009 5:03:17 PM

Dan writes: Hi again :-P I'm just wondering what you think of the Oz programming language? (I'm sure you know it, but if not: http://en.wikipedia.org/wiki/Oz_programming_language its an interesting multi-paradigm language which has some dataflow elements) I started reading Concepts, Techniques and Models of Computer Programming, which uses Oz for the examples and was wondering what your view of this language is. Its obviously nothing like Project V, but surely its closer than most languages, or? Looking forward to hearing your thoughts. Dan.

Vorlath Thursday, June 4, 2009 5:13:03 PM

(Posting because of captcha problems)
Dan writes:

Speaking of CTM, the first chapter dealing with concurrency states "Concurrency need not be difficult" and then proceeds to talk about dataflow. Coincidence? Of course not.

Even more interesting, in the chapter about storing internal state, it briefly mentions that in the next chapter they reintroduce concurrency, this time in a stateful model, like the one we know and love from mainstream programming languages. It then states that "programming in this model is extremely difficult".

So CTM agrees: dataflow makes concurrency easy, traditional models make it hard! No surprises there, but interesting to see stated so clearly by someone who, presumably, is not biased (because, lets face it, even though you've been saying it all along, you're clearly biased (for good reasons, I admit) towards dataflow).

Vorlath Thursday, June 4, 2009 5:19:31 PM

But what does bias mean in this case? I like dataflow because it suits concurrency. If that's bias, then so be it. But trust me, I'd use something else if it worked. I only stumbled upon dataflow when I was trying to make something work with the Internet as the computing model. It's what naturally came out. In fact, I refused to believe it for months afterwards. Only in the following year did I delve into the techniques and concepts that explain WHY dataflow is better.

As to Oz, I only looked at it briefly. I wasn't impressed, but it's been too long, so I can't mention specifics right now. It's nice to see dataflaw being recognized as a valid tool though. Thanks for mentioning the reference.

Anonymous Monday, July 20, 2009 6:38:33 PM

Dan writes: Hi. Only saw your response now.. oops. I see your point. Personally, I stumbled upon dataflow when I was trying to fix code dependency issues (and was also thinking about dataflow). I didn't know it was dataflow until much much later (until I came across this blog??). In fact, its because of the accidental discovery that I'm certain that dataflow IS what I've been looking for. The fact that you discovered it in a similar way - out of necessity, almost - I think just verifies that dataflow is an underused mostly unknown paradigm which does, in fact, help us achieve what we cannot with conventional programming. Regarding CTM, its interesting to see that the concepts are slowly becoming known. Like you said, its slowly spreading. Excellent! Not there yet, though. Regarding Oz, its an interesting language and has supports a nice mixture of paradigms, though I admit its dataflow capabilities are somewhat limited and the rest still suffers from the same issues as all other languages. The fact that it has some dataflow capabilities, though, I think is a good sign. Perhaps in the future, more languages will catch on. Like you, however, I'm not willing to wait that long.

Anonymous Tuesday, April 13, 2010 12:57:41 PM

Anonymous writes: Gone of the MEDs again have we?

Anonymous Wednesday, April 14, 2010 1:22:42 AM

Anonymous writes: Memory allocation, memory deallocation, persistent storage management, execution priority, race conditions, deadlock, livelock, starvation, failsafe and many more are all issues that are unique to programming languages. They are human made problems that need not exist. If you use programming languages, of course you're going to get these problems. They're all sequential. Only in 'Imperative Languages'! Functional languages do NOT! 1. MUTATE DATA!!!!!!!!!!!!!!!! 2. Worry about order of execution. 3. Are implicitly parallel I am stating now for the record that any programming technique that tries to handle concurrency with a programming language will never be free of the problem mentioned in the last paragraph. What? How do you do concurrency without a programming language? Oh I get it, the pixies assemble your code and put it in memory for you! Spatial computing (vs.temporal) is much more powerful. (Temporal Computing ==> Time ==> Concurrency) i.e. Any attempt to remove time from the sequence of concurrent events will leave you deadlocked in swift succession. True parallelism is in the 'TIME DOMAIN"!!!!!! Spatial Computing ==> DataFlows ==> Storage (Mutability of Variables):(Locking etc) i.e. Any Spatial Computing is just Data Parallelism!!! NOT TRUE PARALLELISM!!! You seem to have a mix up with your terms. Concurrency is a subset of Parallelism! Concurrent processes can operate simultaneously or in pseudo parallelism. True parallelism is naturally in the time domain! Any idea that it is the Spatial Domain, means you are performing Data Parallelism not Procedural Parallelism! To clarify, Data Parallelism is many concurrent procedures operating on the same data. True Parallelism is many concurrent procedures operating on many data sets concurrently, which may/may-not be from the same sequence of execution. Data Parallelism is in the Spatial Domain, True Parallelism is in the Time Domain! Functional languages have an identity crisis. They don't know whether to be data flow or imperative. And using functions creates its own set of limitations. No! Functional languages are forced to run on IMPERATIVE PROCESSORS! And unless you have designed and manufactured a NON IMPERATIVE PROCESSOR then you are going to have to run your programs on one too. SO YOU WILL HAVE THE SAME PROBLEMS!!!! Using functions is what makes Functional Programming so powerful and the only paradigm with implicit parallelism! The Internet is the best computing model for concurrency that we have, so the "programming language" has to fit that model. Hold on!, you aren't allowed to use a programming language :). The Internet is driven by programming languages, many of them! (Including Lisp ones!) In summary, you bag Lisp and Functional Programming without even explaining the following very important points! "Dataflow languages are attractive for parallel computation because of their expressive power - their high level, machine independent, implicitly parallel notation - and because of their fine- grain parallelism, which seems essential for effective, scalable utilization of parallel machines." "Dataflow languages are based on functional programming languages." "In functional languages we do not have to specify what can be done in parallel. In principle, everything can be performed in parallel, limited only by data dependencies." Therefore, the Dataflow language you hold so dearly is really just "Functional Programming with controlled Mutation", and LISP being the language that you have attacked so violently, means that you are attacking the aren't of your hallowed language. This is a form of self-referential transparency, so beautifully encapsulated in functional languages. Oh, hold on you haven't got a programming language because you can't use one in your model. Oh well, I give up then!

Vorlath Wednesday, April 14, 2010 2:58:17 AM


Only in 'Imperative Languages'!
Functional languages do NOT!
1. MUTATE DATA!!!!!!!!!!!!!!!!
2. Worry about order of execution.
3. Are implicitly parallel



Functional languages do worry about order of execution. The data dependencies are tied to the execution, so the order is manipulated that way.

Functional languages are not implicitly parallel. Some of them can do certain things, but many of them implement specific functions like 'par' to execute things in parallel.

Also, this kind of parallism (whether automatic or by a built-in function) can only do certain kinds of parallel operations. For example, functional languages cannot send data without being impure. This is somewhat related to I/O, but only somewhat. Suppose a function is processing some data, but the called function suddenly receives data. Both functions cannot process data at the same time since the invoker uses the return value of the invoked function. This is the return to sender restriction that inhibits certain kinds of parallel operations. What languages like haskell have done is implement dataflow constructs to get around this. Dataflow can do things and remain pure whereas functional languages can only do them if they become impure. I/O being the most well-known culprit. But it applies to all sorts of situations requiring parallel processing.


What? How do you do concurrency without a programming language?
Oh I get it, the pixies assemble your code and put it in memory for you!



Computing isn't restricted to programming languages. Learn about circuits and dataflow. Two common ways to compute something without a programming language.

Any attempt to remove time from the sequence of concurrent events will leave you deadlocked in swift succession. True parallelism is in the 'TIME DOMAIN"!!!!!!



Actually, it isn't. If you have operations that are coupled time-wise, then you cannot execute them at the same time. OTOH, if you have operations that aren't coupled in the time domain, you can execute them in parallel.


Concurrency is a subset of Parallelism!



Incorrect. Concurrency is the ability to execute different operations at the same time. Parallelism is executing the same operations at the same time.

Note that many people use the word "parallel" to mean anything that executes at the same time (or through task switching) in general. I'm ok with that use as well.


Any idea that it is the Spatial Domain, means you are performing Data Parallelism not Procedural Parallelism!



This is incorrect. You can distribute tasks based on spatial domain.

To clarify, Data Parallelism is many concurrent procedures operating on the same data.



So you're running different tasks on the same data? Ok, but that's just one subset of what is possible.

True Parallelism is many concurrent procedures operating on many data sets concurrently, which may/may-not be from the same sequence of execution.



You're contradicting yourself with your terms.

Parallel = ONE VERSION OF CODE.
Concurrent = DIFFERENT CODE.

Please get this straight.

And true parallelism, whatever you mean by that, is inferior to concurency. It is also inferior to distributed computing where different code on different machines work together.

Data Parallelism is in the Spatial Domain, True Parallelism is in the Time Domain!



It depends on how the data is coupled in the spatial domain. Same thing with the time domain. You can't just issue a blanket statement like you did.

If I have two pieces of data A and B where B is a child node of A, then you need to traverse A before getting to B. There is no way to process both nodes at once. It is impossible. As such, even though they are in the spatial domain, there is no data parallelism possible here.

OTOH, a 2D image has its pixels coupled in position only. In the real world, we have to go from point A to point B as mentioned before. But in computers, we can jump to any pixel in the image. So the spatial coupling is actually removed. And when you can use data that is NOT spatially linked can you achieve parallelism.

But it's not the only way. You can achieve parallelism even in the first case if you have a development environment that can use the spatial domain. For example, pipelining is where one piece of data is dependent on the next piece of data and yet we can split up the steps so that step 1 is operating on data C while step 2 is operating on data B and step 3 is operating on data A. This is not possible in imperative or functional languages.

Also, your time domain assertion is likewise flawed. I could go through examples, but this is long enough as it is.

No! Functional languages are forced to run on IMPERATIVE PROCESSORS! And unless you have designed and manufactured a NON IMPERATIVE PROCESSOR then you are going to have to run your programs on one too. SO YOU WILL HAVE THE SAME PROBLEMS!!!!
Using functions is what makes Functional Programming so powerful and the only paradigm with implicit parallelism!



I'm afraid you've been brainwashed. There are only two kinds of processing possible. Imperative (von Neumann) or dataflow. That's it. There is nothing else more basic than that. Everything else is built on top of either one or both. Yes, even functional languages. I'll tell you right now that you cannot have a functional language without an imperative core.

Please tell me how this non-imperative processor would be designed? I'm all ears.

I won't have the same problems as you because dataflow is having multiple processors that only do ONE thing connected together. The Internet has millions of machines connected together that would work great for dataflow programming. Not only that, but multicore systems are commonplace now. Again, dataflow can live quite nicely here. And get this... The processors on these multicore machines can execute DIFFERENT THINGS!!! So I can reuse them for whatever operations I need in my dataflow network.

Functions have the return to sender limitation. There is no way that this is the most powerful design while that limitation is in place.

Oh, and dataflow is inherently parallel and distributed. It's one of its properties. With functional programming, this is certainly not the case as there are severe restrictions to what kind of parallelism is possible.

The Internet is the best computing model for concurrency that we have, so the "programming language" has to fit that model.

Hold on!, you aren't allowed to use a programming language smile.



Did you miss the double quotes?

The Internet is driven by programming languages, many of them! (Including Lisp ones!)



I was talking about the hardware layer that the software would run on. Dataflow is the only thing that can natively operate on the hardware of the Internet. Everything else is programmed to specifically talk to other nodes on the Internet. It's the difference between executing on many machines vs. executing on the Internet itself.

If you like the word "abstraction", then a better explanation is that dataflow abstracts away the individual nodes of the Internet and treats it as a single machine.


In summary, you bag Lisp and Functional Programming without even explaining the following very important points!



Actually, I did go into all these details at several points in this article and in other articles on my blog.

If you have any questions, I'll be happy to answer them. So don't think I'm hiding or refusing to provide any information
you may want.

Dataflow languages are based on functional programming languages.



Nonsense! This is ridulous. Functional proponents have been keen to claim ownership of anything they start including in their languages even if it has nothing to do with functional programming. Dataflow was invented by John Paul Morrison in the early 1970's when he worked at IBM. Functional programming was alive and well at the time and no one would have claimed that it was based on functional programming.

So please do everyone a favour and stop spewing nonsense like this. It doesn't help your credibility.

"In functional languages we do not have to specify what can be done in parallel. In principle, everything can be performed in parallel, limited only by data dependencies."



More nonsense. Functional programming is also limited by the return to sender limitation.

Therefore, the Dataflow language you hold so dearly is really just "Functional Programming with controlled Mutation"



HAHAHAHA!!! This is laughable. This shows a great deal of naiveté on your part. You've been thoroughly brainwashed.

and LISP being the language that you have attacked so violently, means that you are attacking the aren't of your hallowed language. This is a form of self-referential transparency, so beautifully encapsulated in functional languages.
Oh, hold on you haven't got a programming language because you can't use one in your model.



Unfortunately, the premise of your argument has been thoroughly debunked. So your attempt at cleverness has unfortunately fallen flat on its face.

Anonymous Wednesday, April 14, 2010 4:58:43 PM

Anonymous writes: I'm sorry i am so "unlearned" and "brainwashed", I am sorry that i have wasted the last twenty years of my life pursuing bullshit, OH! let me bow before your greatness, oh mighty VORLATH. I followed the link and this is what I found: John Paul Morrison (born John Paul Rodker in 1937) is a British-born Canadian computer programmer, and the inventor of flow-based programming (FBP). In computer science, flow-based programming (FBP) is a programming paradigm that defines applications as networks of "black box" processes, which exchange data across predefined connections by message passing. Please, oh please, don't tell me that it is based on "message-passing". Anybody who knows will tell you of the implicit dangers in message-passing systems. I'm willing to give it a go, though. (Not really) I will read your other posts and get back to you. In solving the multicore/concurrency issue, there have been many ideas put forth. Intel thinks they can solve it with their "Spawn more Threads" idea, but they still face the same problems. Google thinks they have it with their Map/Reduce, but as they stole it from Scheme, we already know it won't work for "TRUE Parallelism". It is a form of "Data Parallelism". The only way to solve it is to completely rethink our idea of what computing is at the basest core. This means giving up the Turing Computing Model, Trashing the Von Neumann Processor and strating again. You accused me of not knowing what I was talking about, and being "brainwashed". Well, the kettle calling the pot black! Dataflow, or any paradigm you wish to insert, is just a "level of abstraction" on an IMPERATIVE PROCESSOR. So instead of spawning more abstraction, the solution lies in less abstraction.

Anonymous Thursday, April 15, 2010 2:16:34 PM

Anonymous writes: Oh yes, i found some papers from MIT dated 1964. In them they describe the Functional Data Flow abstraction idea. So what are you now going to tell me that it's a new idea? Are you going to tell me that Functional Programing can't do it? Could it be possible that Paul Morrison stole these ideas from functional programming? This is what i love about the "Thieves" that steal others work, they are no better than "rapists". Then their groupies extol their virtues and try to destroy the links with the parent of the idea. May the Programing Gods bestow upon you all the gifts that you deserve!

Anonymous Thursday, April 15, 2010 3:46:15 PM

Anonymous writes: You stupid fiucking dweeb

Anonymous Thursday, April 15, 2010 5:26:48 PM

Anonymous writes: Ha, ha, ha, Rapist LOL Yes i know about that MIT paper, it was my Professor that wrote it! He wasn't very impressed, i can tell you! I guess it's like that in all the Computer Industry, Linux stole most of UNIX's code, and Microsoft steals everybody's. I'm not saying it's right, just seems to be a flaw in human character. Maybe this Vorloth guy works for Microsoft? So what punishment should rapists get? The death penalty? It would stop them from even thinking about it.

Vorlath Thursday, April 15, 2010 9:04:30 PM


Please, oh please, don't tell me that it is based on "message-passing". Anybody who knows will tell you of the implicit dangers in message-passing systems.



It's unidirectional message passing. Not the likes found in any other "paradigm". But you knew that, didn't you? Ahem.

Google thinks they have it with their Map/Reduce, but as they stole it from Scheme, we already know it won't work for "TRUE Parallelism". It is a form of "Data Parallelism".



Map/Reduce is a dataflow concept. Not a functional one. This one has been repeated so often that I don't know whether it's just for laughs or what. But it's completely baseless. Plus, the functional way of doing map/reduce is highly limiting. Again, you knew all this. Ahem.

Dataflow, or any paradigm you wish to insert, is just a "level of abstraction" on an IMPERATIVE PROCESSOR.



No it isn't. It can make use of them, but it requires a multitude of processors where each one can do only ONE operation (heck, it only needs a NAND or NOR operation, either one will do.). But if that processor can accomplish more than one operation, then all the better.

So you see that dataflow has NO REQUIREMENT for von Neumann.

But you knew that too. Ahem.

I don't know who's replying to who in the rest of the comments. Accusing me of working for Microsoft is hilarious.

I'll respond to the following though.

So what are you now going to tell me that it's a new idea?



From 1970's? Why would I think that the 70's are new?

Are you going to tell me that Functional Programing can't do it?



That's exactly what I'm saying. Remove I/O from functional programming to keep them pure and see if you can get anything done.

Could it be possible that Paul Morrison stole these ideas from functional programming?



No, because they are not functional in nature. Maybe he was inspired by something he saw in functional that could be improved. I don't know. But anyone that thinks dataflow is in any way functional in nature doesn't understand computing at all.

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

If you can't read the words, press the small reload icon.


Smilies

February 2012
S M T W T F S
January 2012March 2012
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29