You may be looking for the book How To Design Programs. I haven't read (all) of this book but I've learned a lot from the guys who wrote it.
The complete text is online so take a look.
If Sun went to the maintainer of GNU tar and said "integrate these patches and we will use your app as the primary Solaris TAR," how quickly do you think the GNU people would wet themselves? They'd leap at the chance.
I think it's more likely that the GNU maintainers would piss on Sun than wet themselves. Why would s/he give a damn what Sun ships by default? GNU doesn't need Sun's blessing for legitimacy. GNU tools are already used by hundreds of thousands of people.
StorageWorks is all about enclosures, FC switches, RAID controllers and the like. StoryWorks does NOT make its own drives (tapes or disks).
Um, drives are commodity. Drive companies have razor thin margins. Enclosures, FC switches, RAID controllers and the like are where the storage industry makes money. Well, that and software.
Just to be clear, all processors out there have bugs. The pentium bug is in no way exceptional. The only reason it deserves to be there is beacuse the list is called "a collection of famous software bugs that caused large scale disasters.
What is exceptional is that instead of just announcing a new erratum (which is what Intel and most cpu makers normally do in such a case), Intel tried to bury the problem, initially denying that it existed and then denying that anyone would ever run into the problem. This really pissed off the numerical computing community and destroyed confidence in the accuracy of intel's floating point unit. That's why it was a public relations fiasco.
> Do I call these Anonymous Classes and interfaces in Java?
No, but you do call them inner classes (anonymous or not).
My trivial example was the sort of thing lisp people tend to use to show that you can do objects as a subset of functional programming (albeit in a somewhat ugly way -- Lisp and [some dialects of] Scheme have real object systems which are much, much nicer). It's sort of like using structs and functions in C to approximate objects.
> Am I missing something? This seems more obvious and less error prone than the lisp way.
Your example is more obvious and less error prone because you're using OO mechanisms to do OO stuff, whereas I was using functional mechanisms to do OO stuff. In hindsight it wasn't the best example.
Is a function which returns a function which increments and returns a counter value. Each time you call the outside function you get a new distinct counter and increment function.
Functional closures can be really handy. You even see poor man's closures in some C programs. Ever notice how many library callbacks in C have an extra void pointer argument?
You call do_something which eventually calls the callback function a bunch of times with an int argument derived from elsewhere and the void *opaque passed into the do_something call. This way you can pass in whatever extra state your callback needs to do its processing.
In Lisp, you don't need to monkey around with all of this void * cruft. You can just create a function inside of a let which declares the variables you need to share in your callback. Most often the variables you want to share are already locals so you just write your callback function in place and get on with your life.
Excel doesn't teach you anything about this, nor does VB.
Actually, I think that unless you're copying some non-free RedHat stuff, the only thing that would get you here is trademark law. You can't use RedHat's trademark to sell your product without permission.
IMO, the right thing to do is to have/opt (or/usr/site) contain a directory for each package, with normal/usr/local-ish directories under each package. I.e. you'd have/opt/gnome/bin,/opt/gnome/man, etc... Then symlink everything you want from/opt/*/bin, etc. into/usr/local/bin, etc.
This lets you keep multiple versions of packages online, have simple paths for users, and even (if you're clever) keep things architecture independent. (i.e. you could have/opt/gnome/bin-i386,/opt/gnome/bin-ppc, but still share/opt/gnome/man). If you're administering a bunch of workstations, this setup + NFS is probably the only way to fly. You can nfs mount/opt as well as/usr/local this way.
It's possible to get GNU configure to build into this kind of setup with appropriate commandline switches.
I hate to disagree with such a well written post, but I seem to remember reading that Stanley Kubrick and Steven Spielberg were close friends and that when Kubrick was close to death he asked Spielberg to finish the film.
The language *is* the bytecode. The syntax of the language is just details. It's the semantics of the language and the semantics of the bytecode that have to match (or you have to shoehorn somehow). Fixing a particular bytecode forces you to go to great lengths to implement programming languages with greatly different semantics (imagine you wanted to allow pointer arithmetic in Java).
So in practice fixing a universal bytecode forces you to a subset of the possible programming languaes out there.
The astute reader will now be asking: "But doesn't assembly language force you to a particular semantics in exactly the same way?"
The answer to this is yes. It's exactly the same case, except at least in assembly your code is being executed at native speed. Languages like Scheme and LISP have to use whole subroutines for primitive list operations whereas on a specialized machine you could make car and cdr primitive operations (this was actually done in the early eighties).
I guess the point is that as long as you are forced to use an intermediate representation like bytecode, you may as well tailor it to be as efficient as possible for your language.
All that being said, there's no reason for a bytecode for each language out there. One could image say a half a dozen bytecodes for the different major types of languages out there.
What exactly was he protesting and what did he hope to accomplish by his protest? How did any of his actions further his goals?
So you went out and dissented and got arrested for being suspicious. Why? The only reason to go out and do these things is to raise awareness of some issue. The author obviously failed because I don't know what he's so upset about.
Going out to play rebel just distracts from the protesters who have something important to say.
If you're interested in Scheme and in particular MzScheme, then DrScheme is the way to go. It's a graphical editor for MzScheme with a variety of cool features. An interesting Scheme text is The Little Schemer. It teaches the functional way of thinking in a relatively painless way.
You may be looking for the book How To Design Programs. I haven't read (all) of this book but I've learned a lot from the guys who wrote it. The complete text is online so take a look.
Um, drives are commodity. Drive companies have razor thin margins. Enclosures, FC switches, RAID controllers and the like are where the storage industry makes money. Well, that and software.
What is exceptional is that instead of just announcing a new erratum (which is what Intel and most cpu makers normally do in such a case), Intel tried to bury the problem, initially denying that it existed and then denying that anyone would ever run into the problem. This really pissed off the numerical computing community and destroyed confidence in the accuracy of intel's floating point unit. That's why it was a public relations fiasco.
see:
> Do I call these Anonymous Classes and interfaces in Java?
No, but you do call them inner classes (anonymous or not).
My trivial example was the sort of thing lisp people tend to use to show that you can do objects as a subset of functional programming (albeit in a somewhat ugly way -- Lisp and [some dialects of] Scheme have real object systems which are much, much nicer). It's sort of like using structs and functions in C to approximate objects.
> Am I missing something? This seems more obvious and less error prone than the lisp way.
Your example is more obvious and less error prone because you're using OO mechanisms to do OO stuff, whereas I was using functional mechanisms to do OO stuff. In hindsight it wasn't the best example.
>you can write functions in C!
>you can even do stuff like:
>do(something(else(again(and(again()))));
Don't embarass yourself. Being functional isn't about calling lots of functions. It's about being able to create functional closures. To wit:
(lambda ()
(let ((foo 3))
(lambda ()
(set! foo (+ foo 1))
foo)))
Is a function which returns a function which increments and returns a counter value. Each time you call the outside function you get a new distinct counter and increment function.
Functional closures can be really handy. You even see poor man's closures in some C programs. Ever notice how many library callbacks in C have an extra void pointer argument?
Something like:
typedef void (*callback_t)(int, void *);
void do_something(some_data_struct *t, callback_t cb, void *opaque);
You call do_something which eventually calls the callback function a bunch of times with an int argument derived from elsewhere and the void *opaque passed into the do_something call. This way you can pass in whatever extra state your callback needs to do its processing.
In Lisp, you don't need to monkey around with all of this void * cruft. You can just create a function inside of a let which declares the variables you need to share in your callback. Most often the variables you want to share are already locals so you just write your callback function in place and get on with your life.
Excel doesn't teach you anything about this, nor does VB.
Actually, I think that unless you're copying some non-free RedHat stuff, the only thing that would get you here is trademark law. You can't use RedHat's trademark to sell your product without permission.
IMO, the right thing to do is to have /opt (or /usr/site) contain a directory for each package, with normal /usr/local-ish directories under each package. I.e. you'd have /opt/gnome/bin, /opt/gnome/man, etc... Then symlink everything you want from /opt/*/bin, etc. into /usr/local/bin, etc.
/opt/gnome/bin-i386, /opt/gnome/bin-ppc, but still share /opt/gnome/man). If you're administering a bunch of workstations, this setup + NFS is probably the only way to fly. You can nfs mount /opt as well as /usr/local this way.
This lets you keep multiple versions of packages online, have simple paths for users, and even (if you're clever) keep things architecture independent. (i.e. you could have
It's possible to get GNU configure to build into this kind of setup with appropriate commandline switches.
The DC only has one expansion port. You can either have a modem (which it comes with, I believe) or an ethernet adapter.
Still, it does have a keyboard and mouse, so if not a firewall, maybe a cheapo terminal?
I hate to disagree with such a well written post, but I seem to remember reading that Stanley Kubrick and Steven Spielberg were close friends and that when Kubrick was close to death he asked Spielberg to finish the film.
You are missing some big point here.
The language *is* the bytecode. The syntax of the language is just details. It's the semantics of the language and the semantics of the bytecode that have to match (or you have to shoehorn somehow). Fixing a particular bytecode forces you to go to great lengths to implement programming languages with greatly different semantics (imagine you wanted to allow pointer arithmetic in Java).
So in practice fixing a universal bytecode forces you to a subset of the possible programming languaes out there.
The astute reader will now be asking: "But doesn't assembly language force you to a particular semantics in exactly the same way?"
The answer to this is yes. It's exactly the same case, except at least in assembly your code is being executed at native speed. Languages like Scheme and LISP have to use whole subroutines for primitive list operations whereas on a specialized machine you could make car and cdr primitive operations (this was actually done in the early eighties).
I guess the point is that as long as you are forced to use an intermediate representation like bytecode, you may as well tailor it to be as efficient as possible for your language.
All that being said, there's no reason for a bytecode for each language out there. One could image say a half a dozen bytecodes for the different major types of languages out there.
What exactly was he protesting and what did he hope to accomplish by his protest? How did any of his actions further his goals?
So you went out and dissented and got arrested for being suspicious. Why? The only reason to go out and do these things is to raise awareness of some issue. The author obviously failed because I don't know what he's so upset about.
Going out to play rebel just distracts from the protesters who have something important to say.
If you're interested in Scheme and in particular MzScheme, then DrScheme is the way to go. It's a graphical editor for MzScheme with a variety of cool features. An interesting Scheme text is The Little Schemer . It teaches the functional way of thinking in a relatively painless way.