John, >Where else should I look?
In my opinion what is "missing" in the languages formulations is sustainability of the system. [*] In case of formula/abstract based declaration of systems all alternatives make people put on the idea(L) side and not in the system itself (the natural side). Smalltalk is the only alternative of sustainable system development used commertially today. What is missing in your interesting email and also in interesting projects like fonc is the consideration of the development of open systems; also called complex systems in literature, but I prefer to do not use that word; and use "open" that is unfortunatelly used for propaganda, but is more acurate to define sustainable systems (open in contents and through time). imho the real value of Smalltalk is not it's formulation, nor the "contents", it is the evidence that a sustainable system for software development is available today (and during the last +30years) and people can start to surpass the limits of object orientation. Today there is not too much information about sustainable systems, the most valuable source are the smalltalks systems (the evidence). And also I should say that a lot of distractive publications can be found in literature and internet, e.g. promoting confusion between auto-booting/defining a system and sustainability of a system... cheers, Ale. [*] been more rude I would say "what is missing is the system" ;-) The system exists in the future. ----- Original Message ----- From: John Zabroski To: fonc@vpri.org Sent: Friday, February 26, 2010 8:15 PM Subject: [fonc] Reading Maxwell's Equations I've been following this project for a long time, and only recently joined the mailing list. For a long time, I did not fully understand Alan Kay's thoughts on software architecture, despite reading many of his press interviews and watching his public presentations. What I've come to feel is that Alan has a partially complete vision, and some inconsistent viewpoints likely blocking a complete vision of computer science. For example, I had heard Alan refer to Lisp as Maxwell's Equations of computer science, but did not fully grasp what that really meant. When I first played around with OMeta, I described it to a friend at MIT as "ridiculously meta". This idea was pretty much confirmed by Ian Piumarta's "widespread unreasonable behavior" whitepaper, which basically argues that we can't truly do "software engineering" until we actually know what that means, so the best approach to go with is extremely late-binding. The idea to use syntax-directed interpretation via PEG is an obvious way to achieve this, as it addresses one of the three key stumbling blocks to building real "software engineering" solutions -- size. But I am not convinced VPRI really has a solution to the remaining two stumbling blocks: complexity and trustworthiness. In terms of complexity, I think I'll refer back to Alan Kay's 1997 OOPSLA speech, where he talks about doghouses and cathedrals. Alan mentions Gregor Kiczales' The Art of the Meta Object Protocol as one of the best books written in the past 10 years on OOP-work. I don't really understand this, because AMOP is entirely about extending the block-structured, procedural message passing approach to OO using computational reflection. From what I've read about Smalltalk and the history of its development, it appears the earliest version of Smalltalk I could read about/heard of, Smalltalk-72, used an actors model for message passing. While metaobjects allow implementation hiding, so do actors. Actors seems like a far better solution, but it is also obviously not covered by Goldberg and Robson's Smalltalk-80 Blue Book. To be clear, I very much dislike Kiczales model and think it says a lot about current practice in Java-land that most people abuse reflection through the use of tools like AspectJ. Yet, aspect-weaving is also seen in the Executable UML realm, where you draw pictures about a problem domain, and separate concerns into their own domains. But it seems way more pure than AMOP because a model-driven compiler necessarily will bind things as late as necessary, in part thanks to a clockless, concurrent, asynchronous execution model. The aspect-weaving seen here is therefore different, and the entire model is "connect the dots" using handshaking protocols. For me, besides the execution model, the other most basic measure of complexity is, for how much complexity you add to the system, how many more features can you produce? UNIX hit a blocking point almost immediately due to its process model, where utility authors would tack on extra functions to command-line programs like cat. This is where Kernighan and Pike coined the term "cat -v Considered Harmful", becaise cat had become way more than just a way to concatenate two files. But I'd argue what K&P miss is that the UNIX process model, with pipes and filters as composition mechanisms on unstructured streams of data, not only can't maximize performance, it can't maximize modularity, because once a utility hits a performance wall, a programmer goes into C and adds a new function to a utility like cat so that the program does it all at once. So utilities naturally grow to become monolithic. Creating Plan9 and Inferno Operating Systems just seem like incredibly pointless from this perspective, and so does Google's Go Programming Language (even the tools for Go are monolithic). Apart from AMOP, Alan has not really said much about what interests him and what doesn't interest him. He's made allusions to people writing OSes in C++. Fair enough, as C++ is a block-structured, procedural message passing solution that also features language constructs like pointers that tightly couples the programmer to a specific memory model. Moreover, C++ has concurrency glued on via threads. These three physical coupling issues (block-structured, procedural message passing; manual memory management; manual concurrency) are things the average programmer should never have to touch, and so that is all sort of an Original Sin that harms the complexity and trustworthiness of any application written in C++. Edward A. Lee has a pretty good argument against threads from a complexity standpoint, in a paper called The Problem With Threads, where he talks about threads like they killed his whole family, and it's fantastic. The argument is so simple and so dead-on accurate. And for trustworthiness, C++ stinks because portability is pretty much a myth. The language itself can't deal with portability, so programmers delegate it to the preprocessor. So I am fairly convinced PEGs are a good way to bring down size, but not complexity or trustworthiness. So I've been looking around, asking, "Who is competing with VPRI's FONC project?" What I've basically come up with is UI-Urbana-Champagne and SRI International's term rewriting project, Maude. Like OMeta, Maude does a pretty good job shrinking down the size of code, but it is fundamentally geared for executable specifications and not late binding, and also requires the programmer to think of 'valid programs' as confluent and terminating. Maude is pretty much the Smalltalk of term rewriting languages, and nothing really appears to compare to it. People have interest in other term rewrite systems like Pure, but only because it leverages the "big idea of the decade" compiler-compiler concept LLVM. I don't think LLVM is a good long-term solution here, so long-term Pure will have to write something like LLVM in their own host language. Currently, Core Maude is written in C++ and everything about Core Maude is written in Maude in terms of Core Maude. This is obviously upsetting to anyone with half a brain, since the one thing VPRI has gotten right so far is the fast bootstrap process. On the complexity and trustworthiness end, Maude layers Object Maude and Mobile Maude on top of Core Maude. To achieve trustworthiness, you need to think upfront about your requirements and pick which layer of Maude to write your solution in. The other competition I see is more language-agnostic, and is based on Yuri Gurevich's evolving algebras idea (aka Abstract State Machines). These are covered in two books by Robert Stark, that are both very readable. Abstract State Machines do handle trustworthiness fairly well, but I dislike the fact it is based entirely on hierarchical decomposition. This criticism could be unjustified, but intuitively I dislike it and prefer to reason about systems in terms of correctly emulating parts of a problem domain, with objects as peers interacting with each other. If I have to decompose things, then I have to also start looking at a different problem domain entirely. Right now, I'd say it takes time to become an expert, and I'm not an expert in OMeta, Maude, or ASMs. But I clearly grasp the size issue and how all these approaches appear to have solved the size problem. What I have yet to grasp is the complexity and trustworthiness issues. On the trustworthiness front, I've been reading Vladimir Safonov's two books, (1) Trustworth Compilers (2) Using Aspect-Oriented Programming for Trustworthy Software Development. Where else should I look? What do FONC people like Alan and Ian have to say? ------------------------------------------------------------------------------ _______________________________________________ fonc mailing list fonc@vpri.org http://vpri.org/mailman/listinfo/fonc
_______________________________________________ fonc mailing list fonc@vpri.org http://vpri.org/mailman/listinfo/fonc