Atlas · Details
Dynamic Languages Strike Back
Author’s note
This is my own hand-transcription of a live talk I gave at Stanford. It is super long, though roughly the last 1/4 of it is Q&A. But the style is breezy and flows well, so it is a faster read than my other posts of this length.
I was dreading rereading it, but it has some pretty amazing stories, some of which I had completely forgotten. I realized that I also knew a lot more about compilers 20 years ago than I do today.
The AI agents pretty solidly voted this into my Essentials group. Makes me think maybe I should transcribe more of my talks.
AI Notes
Transcript of Steve's 2008 Stanford EE380 talk, self-transcribed from Stanford's hour-long video — a full-throated defence of dynamic languages delivered at a school Steve characterises as believing "C and C++ are the fabric with which God wove the Universe." The thesis: the two standard knocks — dynamic languages are slow, dynamic languages have bad tooling — are not intrinsic and are about to be demolished, because the runtime always has more information than a compiler ever can. Steve walks the machinery that follows: Urs Hölzle's polymorphic inline caching and type-feedback compilation, type inference, and trace trees (which he calls the crown jewels of the talk), all riding the Ajax-era pressure to make JavaScript fast. Two side-arguments anchor it: static type systems have "reached the theoretical bounds of what they can deliver, and it has FAILED"; and language popularity has effectively frozen because the barriers to adoption have grown too high. War stories thread through — Geoworks bankrupt under fifteen million lines of un-optimisable 8086 assembly, the "career-shatteringly bad mistake" of trying to slip Ruby into Google.
The predictions held up: V8, JIT-everywhere, and JavaScript becoming one of the fastest languages on the planet all landed roughly as forecast, and the frozen-popularity thesis largely did too. The static-types-have-failed claim remains Steve's most-argued-over technical position — people are still picking fights with it.
Related listings
-
2012
Notes from the Mystery Machine Bus
The static-versus-dynamic fight is the clearest case of the conservative-liberal axis the Mystery Machine Bus would later name — and Steve lists this very talk as one of his own acts of software liberalism.
-
2006
Execution in the Kingdom of Nouns
Two essays from Steve's running argument with the static-typed world. Kingdom of Nouns takes Java apart from the inside; Dynamic Languages Strike Back is the broader case for the other side of the fence.
-
2008
Portrait of a N00b
Three months apart, and arguing the same corner. Portrait of a N00b's claim — that static types are a kind of comment, and over-relying on them is a beginner's habit — is the same position this talk defends with runtime machinery.
Where it was argued
- Hacker News May 2008
- InfoQ May 2008
- Cédric Beust May 2008 — “Return of the Statically Typed Languages” — the headline rebuttal, and the post that turned the whole exchange into a Star Wars naming game (“I'm happy to be the Luke Skywalker to his Darth Vader”).
- Ola Bini May 2008 — “A New Hope: Polyglotism” — the JRuby developer answers both Yegge and Beust, arguing the real answer is using the right language for each layer, not picking a winner.
- Matthew Podwysocki May 2008 — “Static versus Dynamic Languages: Attack of the Clones” — a .NET-side reading of the full Yegge → Beust → Bini exchange.
From the peanut gallery
Read the rest of the thread · 82 more
-
Now, of course, you have to share the story about the time the Google People(tm) managed to overflow a long.
-
Sounds like you've got your work cut out, eh Charles? ;-)
Don't get me wrong: I'm confident that JRuby can eventually be as fast as Java, given (a) a lot of work and (b) a little help from the JVM.
You can do it! -
I dunno, I used the default font that Keynote picked for the Chalkboard theme.
It was more readable in the actual-size slides. Blogger gives you limited sizing options and does its own scaling, which doesn't help.
Sorry! -
#$@$ what people say about what font you use. It's more than legible, even on a screen of my resolution (1600x1200). They should be glad you even bothered with the transcription and slides at all.
I, for one, am very thankful for your efforts, even if I do not always agree with your material. -
Great talk . . . thanks for posting the transcript and linking to all the various JIT optimization papers.
You talk about hybrids in the sense of "languages you can optionally add types to," but I honestly think that fully statically-typed languages can still be almost as friendly as dynamic languages provided they have type inference such that the types don't get in your way and that they provide the same level of dynamism, interactivity, and metaprogramming as traditionally dynamic languages. Of course, I'm biased, because I'm helping develop such a language on the JVM . . .
The topic of metaprogramming is an interesting one, because it completely screws up tooling: in Java that means reflective calls, but my experience is that a higher percentage of code that you use in a dynamic language has some metaprogramming component (which is one reason it's more compact). So I think the upper bound on how good the refactorings in a JS IDE can be will be lower than the bound for Java just because the Java code will invariably have fewer things the IDE can't handle.
Of course, the total inability to do metaprogramming in Java is the primary reason (in my opinion) why all Java frameworks inherently suck, so it's worth the tradeoff. But for what it's worth, our language (GScript) has what we call an open type system, where the metaprogramming bits are essentially sectioned off from the runtime bits, so you can have type-safe metaprogramming (though more limited in scope) that the IDE can refactor. So you get more metaprogramming abilities than Java has *and* a more intelligent IDE/safer refactorings.
Lastly, I'll say that while I generally agree with your "no new language in 10 years" rule I can see it being violated by a JVM language; the barrier to entry is much lower there because it can interact with the huge base of existing Java code (and, often, tools) instead of starting from scratch. It also allows for a gradual transformation of an existing codebase, which could also be a huge selling point. Though perhaps that new JVM language will just end up being JRuby. -
Minor issue: There's a broken link immediately after slide "JIT compilation (4 of 5)". The paper can be found at http://www.ics.uci.edu/%7Efranz/Site/pubs-pdf/C44Prepub.pdf
Great Posting! Thanks for the transcription of your talk! -
"...really fanatical about strong typing, who would potentially maybe get a little offended about some of the sort of colorful comments I might inadvertently make during this talk."
Steve,
Some of these people are more likely to be offended by your compulsion to pass severely under-qualified comment on the topic; something you have done more than once before. The offense comes about because it is almost deliberately misleading to others who might have the desire to learn and are not in a position to know any better and may mistake your pseudo-scientific nonsense with warranted factual claims.
I say "almost deliberate" because I am more inclined to believe your desire to continue doing this is a result of your ignorance rather than malice. -
Congratulations. I will refer to your post, it states what I think much better than I ever will. Thanks.
-
While a good deal of HPC folk still use c/fortran/etc, I'm seeing a surprising amount of scripting languages being used to glue BLAS etc libraries together. For example, right now, I'm prodding at python/mpi for EC2. My point is that we won't see a new general programming language mostly because it's an antiquated notion - general systems languages and what have you, maybe, but that's already pigeon-holed.
Sad I missed the talk, you should give an encore at Berkeley :) -
Charles: That's a common pattern with new Python implementations too: They claim to be fast (at a stage where they support only the simple stuff) and then they you don't really hear anything from them afterwards.
Steve: Really interesting talk, I could connect with tons of things you were saying. -
How the hell do you find time to prepare a talk, give the talk and then type up the whole bloody transcript? I am in awe.
-
Having played with perl threads recently, I just wanted to note that they are actual "real" threads, unlike the "global interpreter lock" of most other dynamic languages.
The price for that (and it's a big one) is that when you create a new thread, the interpreter actually makes a copy of all non-shared variable data! That right, it iterates over all data and copies all data structures that weren't explicitly shared with threads::shared.
The real problem is that dynamic languages store their data in complex (at the C level) structures that could be left in indeterminate state by threads running over the same data at the same time. That leaves you with only a couple of main options: have a lock on each structure (no one does this - requiring locking on every access slow things enormously), have a global lock (most do this - but you lose all concurrency), copy all unshared data (perl threads). But with that last one, then you might say "hey, why don't we just fork and use the OS COW semantics and use some shared memory for the explicit shared data?"
In fact, there's a drop in replacement for perl threads called forks that does just that.
http://search.cpan.org/~rybskej/forks-0.27/
Personally, I buy into the unix fork model, where nothing is shared, and all sharing/communication is explicit. -
Fun talk, but I'm still looking for solid data on the relative productivity of static and dynamic languages for large-scale engineering (something more than anecdotes); without that, the whole debate feels very tomato-toMAHto. (I'd like solid data on the productivity of functional languages, too, for the same reason.)
-
The Amazon links from the programming language names haven't been expanded with href attributes so they kind of point to nowhere.
-
> Personally, I buy into the unix fork model, where nothing is shared, and all sharing/communication is explicit.
Which is why Erlang's one of the most enjoyable languages as far as concurrency goes: it's split between "sequential" erlang (a functional language based on immutability, very deterministic) and "concurrent" erlang based on message-passing and a pair of primitives (send a message, receive messages in process mailbox).
All of the communications between processes (erlang has no programmer-visible threads as it implies shared memory) are done via shared-nothing message passing, so the non-deterministic parts of Erlang are very well defined: at process boundaries and nowhere else.
Experiencing that and then going back to concurrency in Java (even with java.util.concurrent) makes you want to rip out your eyes, and realize that, really, shared-memory concurrency should die, it only exists because it was easier to implement and more efficient at machine-level. But it doesn't actually work. And it doesn't scale for any value of "scale" worth talking about. -
I just wanted to say thanks for the transcription. I'm one of the rare people (presumably) that hates watching videos because I'm impatient and read much more quickly than I listen.
All too often I have to skip these things that I'm interested in hearing. -
The Java polymorphic inline caching you describe was done a long, long time ago in the ParcPlace Smalltalk JITting VM (by Peter Deutsch and Allan Schiffman).
As you point out elsewhere, it's all been done before. It's a shame it all has to be re-discovered in new contexts, and in less dynamic languages.
Great rant! -
We may not have many million line code bases, but we do have at least one half-million line code base in Common Lisp. I work on it every day. www.itasoftware.com. For those reading, I was a co-founder of Symbolics, which made Lisp machines, and I'm one of the co-designers of Common Lisp. I find myself again using Common Lisp these days. I speak here for myself, not for ITA Software.
Actually we do have some type checking, although it's not static. We have this macro called define-strict-function, in which you specify types for arguments, returned values, and conditions, and it checks it all automatically at runtime. That said, I have used Java a lot and sometimes I do wish we had typed variables, since there are definitely bugs that they would have caught for me, saving me debugging time. On the other hand, advocates of typed-variable languages have a tendency to talk as if once all the types match, the program must be bug-free, which is rather silly.
You know, the Dylan people didn't even have a definition for "dynamic language". And at the "Lighweight Language Workshop" series at MIT, they similarly had no definition for "lighweight language". They really do define it by a list of languages, exactly as in your ironic joke.
About the fabric with which God wrote the Universe, that's been well-established: http://www.xkcd.com/224/
I haven't looked into it as much as I should, but I think the worst slowdowns that you usually see are things like: we're trying to add a and b, but we have to examine their datatypes and dispatch off to the various kinds of addition like rational and floating point and so on. (This dispatch was done in microcode in the original MIT Lisp machine architecture, with a very fast (fall-through, as you'd guess) optimziation for the fixnum-fixnum case.) In ordinary Lisp implementations these days, you can declare the types of the variables. It's more work to do that, but you only end up doing it inside inner loops and other such critical areas; in most places it doesn't matter. You probably already know this.
You're right about how you can write a better program. You can especially do this if your language system makes it easier for you to be more productive! That's a key point, in my opinion.
I'm not sure if you know that many current Common Lisp implementations do support native threads. See my survey paper at
http://common-lisp.net/~dlw/LispSurvey.html
You know about IronPython and Microsoft's DLR ("Dynamic Language Runtime") extension to the CLR ("Common Language Runtime")? The CLR is looking promising, although time will tell. Have you seen Jim Hugunin's talks about this? If not, see my notes in:
http://dlweinreb.wordpress.com/2007/10/28/3/
Another thing about C++ is that the major compilers are full of bugs. This is from our Object Design experience. The guys maintaining that stuff are still running into this. Dave Moon told me recently that it appears that the last person at IBM able to write a compiler must have walked out the door, in reference to the IBM AIX C++ implementation.
Regarding GC latency issues: Do you know about InspireData? It's a very popular (in schools) shrink-wrap application for simple data understanding. Nobody would ever know that it is written in Common Lisp (the LispWorks implementation). Nobody has ever perceived any GC effects. This is a major recent Common Lisp success story.
Not to mention that most C/C++ programmers have no idea just how bad their "malloc/free" implementation is. It's actually pretty hard to write a good one. They can get damned slow as memory gets fragmented.
Re HotSpot: take a look at JRockit, from BEA. Well, BEA just got absorbed into the Oracle borg, but presumably you can still get JRockit. It's a great Java implementation. I was once doing some CPU-heavy (overnight) simulation runs, and they were TWICE as fast in JRockit.
Amazingly, Richard Gabriel, in "Patterns of Software", written in 1998, said at one point that there was now only one computer language: C++. Gabriel of course is a major Lisp guy. The pendulum swings, and now there is again a proliferation of languages (but not operating systems!) being used in real applications. You just never know what's going to happen five years out in this business.
"A lot more programmers": And it depends on whom you count as programmers. Linden Labs says that 15% of the Second Life users are doing programming. That's a lot of people. (Some may be copying code from others, I suppose.) There are 2.5 billion lines of user code written in Second Life in 30 million scripts, of which 15,000 or so are usually running at a time. (They describe their language as "terrible" from a language-design point of view, and they plan to fix that by bringing up the CLR.)
I have not heard of Boo or any of those others except Scala. I did a blog entry on Scala, which I think looks very promising. See http://dlweinreb.wordpress.com/2007/12/25/the-scala-programming-language-my-first-impressions/.
Of course you're totally right about doing natural language stuff probabalistically. I was recently talking to my co-worker, Bill Woods, who is one of the very first natural language guys; Peter Norvig used to work for him. He agrees that probablitic is what everyone is doing now, and he's sort of peeved that this has postponed work on serious natural language. But I think we all know that real parsing will only come back when we reach the limits of the probabilitic stuff, and someone sees it as a commercially viable proposition to do all that work, seeing a benefit that makes it all worth it. (Or, if government funding for basic research ever comes back; maybe when the faith-based administration is gone...) These days Peter probably knows as much about this as anyone in the world.
The Steel Bank Common Lisp compiler does a lot of type-propagation and uses it to generate better code. The code isn't all that much better, and the compiler ends up being slow. Scala looks like it offers more opportunities for type inference. Having a Common Lisp built on a virtual machine with a great JIT compiler is what I'd like to see. We've got Armed Bear Common Lisp, written on the JVM, but apparently it's not very fast; I have not looked at it. Someone started writing a Common Lisp for the CLR, but it was too big a job and they punted. I'd like to see Microsoft's DLR ideas added to the JVM. Anyway, I'm not actually a compiler person, and there's so much to say about this.
I havent' used the refactoring stuff (like Rename Method) in Eclipse or IntelliJ. Some people have told me that they really like it and it works well. Maybe they didn't encounter those "method name in an XML file" issues in their own use. I think all the major things you're saying about IDE's are right on the money.
Yes, adding the generic types to Java was absolutely necessary -- those casts sucked -- and my own Java code was much nicer because of it. But the more powerful you make a type system, the more you run into hard-to-understand stuff at the edges, and if you make it even more powerful, the edges start moving in toward the center. That, it has always seemed to me, is the big problem. Not that I am in any way an expert on this.
Yes, lots of controversy about Java 7. You've seen what Josh Bloch has to say about how they intend to put in lexical scoping? Uh-oh. I hope the Java designers are very careful here.
Yeah, the IntelliJ guys do kick butt. So much that they compete effectively against free software. It's amazing. I met a couple of them at OOPSLA. Basically, they just have to keep working their asses off to keep their stuff significantly better than Eclipse, enough to make it worth the money. How many people manage to make money selling development environments these days? I'm very impressed by them.
I like the story about refreshing the title bar 140 times. It's an example of the principle I always tell everyone: your performance bottlenecks are usually something you would never think of in a million years. You absolutely must use performance tools rather than trying to reason from first principles.
The greater point about how complexity kills you is really the profound thing, and I have found that it takes programmers a long, long time to truly appreciate this. They usually overestimate the amount of complexity that can be tolerated. You can't teach this to people: they won't believe it. They have to learn the hard way.
Yes, the pricing and shopping engine used by Orbix (and many airlines), which we call "QPX", is really in Common Lisp (plus a few optimizations involving mapping stuff into main memory; it's all written up somewhere, which I could find for you if you care). I'm working on a new product, an airline reservation system (initially for Air Canada), which uses QPX as a module. 500KLOC of in-house Common Lisp plus maybe 10KLOC of Common Lisp open-source libraries are used in the main business-layer module. Presentation layer in Java (it generates a lot of JavaScript like any modern web site with nice interactive behavior), back-end Oracle RAC, many other, smaller pieces in Python. At ITA you just use whatever language you feel like, which we probably are too lax about. One guy was going to use Prolog for an access control subsystem, but not for any really good reason, so we squelched that.
You overflowed a "long"? And they don't appreciate Lisp?? :) Not to mention going past array bounds and so on. We actually do use a bit of C at ITA, for places where we need very fast bit manipulation, or if we need to write an Apache extension or something, but we use it as little as possible.
I've never heard of this double-dispatch type inference; I'll have to read that paper when I have some time. Thanks for the pointer. Trace trees likewise. Doing a whole lot of inlining may have instruction-cache problems in some of the upcoming architectures, so this will require some careful benchmarking. Yes, sharing code paths obviously helps this.
Someone mentioned performance predictability. Butler Lampson made this point in a recent talk I went to at MIT. A language being 20% slower just does not matter, since Moore's Law takes care of it. But unpredictable performance can be a headache for a long time. Now, he was saying this regarding GC, and I think he was way overstating the problem there. But the overall point has merit. Try selling software to stock traders, where a small realtime pause can mean losing very big bucks. Not that a C program can't take page faults. However, we have stringent SLA's in our airline reservation system and we do not feel we have to worry at all about the GC issue.
JIT compilers for C++: Well, why not take a look at the existing "Managed C/C++" that Microsoft has had for some time now? I know next to nothing about this, except that I hear rumors it's not widely used since the people who are still on C/C++ want to be down there in the bits. I'm also not sure to what extent it conforms to the standard for C++, or the de facto behaviors that people might depend on. I'm sure there are people who can tell you all about how this is working out.
We never, ever use "eval". What we use is macros. A lot.
About "language popularity ranking is going to stay pretty consistent", well, that's a very complicated topic. Sometimes the order does change, e.g. Java. But it's very hard; technically there are all these bootstrap issues (who writes libraries for a language that isn't used yet, and who uses a language for which there aren't libraries yet; this can be finessed sometimes by letting the new language call the old languages's libraries), and non-technically there are all kinds of marketing and perception issues. I do not expect to see Common Lisp move way up there in my lifetime, but I do think we can move it up significantly.
Threads: boy, is that controversial. Does using threads doom you to disaster automatically? People have widely varying opinions about that. This is too big of a subject for me to get into here. But it's very interesting.
"Emacs is a Lisp machine". I think you mean using Emacs's built-in Lisp, but do you know about using a real Common Lisp with SLIME? The latter is where we're trying to re-create the most important Lisp machines features. (By "we" I don't actually mean me, since I'm working on the airline reservation system, but Marco Baringer is doing some great stuff.)
"Lisp machines pretty much had it nailed." Thank you. I have run into smart people who are huge Lisp machine fans who are so young that they have never even seen one!
In all fairness, there are compilers out there that deliver far better error messages than others. The PL/C compiler at Cornell, and the Multics PL/I compiler, are great examples, and I wish more people had learned from them. It takes work to make the compiler issue good error messages and I bet that usually ends up far down in the to-do list so it doesn't happen. -
One small issue about the Strongtalk system. The static typing didn't have anything to do with the performance gains, it was completely optional.
-
Clojure supports optional type hints that eliminate reflective calls. It also greatly reduces the parens-overload of Lisp, adding vector and map literals for much more accessible syntax. And, unlike many dynamic languages, it has a strong concurrency story.
-
This comment has been removed by the author.
-
Alice ML is based on Standard ML, but it also has dynamic typing (and tons of other features):
http://www.ps.uni-sb.de/alice/manual/packages.html -
I'm curious about your opinion of Objective-C as a "dynamic" language. It was originally an attempt to maintain backward compatibility with C while adding Smalltalk-like OO extensions, but it's grown into something more since then. It is now garbage collected, for one thing. Its IDE support is pretty good, as is its performance. Its type system is largely optional, and seem to be mostly useful for code clarity and to provide hints to the IDE. Do you consider it a "dynamic" language?
-
Great article...and thanks for all the links.
-
steve: My point is that it's easy to make a Ruby implementation that's fast and does nothing. It's much, much harder to make one that's fast and runs everything. That's what we've done already, and we're still improving.
-
Re: Comic Sans --
That's not Comic Sans in those slides. You can tell pretty easily; look at the uppercase B and compare to the uppercase B in Comic Sans. The Wikipedia article on Comic Sans has the latter if you need a reference.
Apple used Comic Sans for the Chalkboard theme in the first release of Keynote, I think, but they're using Chalkboard now. Chalkboard does not suffer from the poor spacing and general sloppiness of Comic Sans, and it's a fine choice for this sort of thing.
http://www.identifont.com/show?G47
http://www.identifont.com/show?1MH
Flip back and forth between 'em; you can feel the quality difference, IMHO.
This has been probably more typeface discussion (of the non-monospaced version) than expected, huh? -
So I'm going to be talking about dynamic languages. I assume [...] that you've got an interest, because there's a dude down the hall talking about Scala, which is you know, this very strongly typed JVM language [...] So you know, presumably all the people who are like really fanatical about strong typing [...] — well, we'll assume they're all over there.
I'm sure this is not the first time you've heard this, nor will it be the last, but weak/strong and static/dynamic typing are orthogonal. Many dynamic languages, such as Python, Ruby, Lisp, and Smalltalk, are strongly typed. Some statically typed languages, such as C and C++, are weakly typed.
Also, requiring the user to explicitly tag types is not a requirement of static typing. Haskell, OCaml, and Scala will automatically inference types when possible. -
> Trace trees likewise. Doing a whole lot of inlining may have instruction-cache problems in some of the upcoming architectures, so this will require some careful benchmarking.
Also in all the current architectures! Inlining small stuff almost always lets you end up with a smaller result, so it's still beneficial of course.
(gcc can do trace formation with -ftracer, but it doesn't work that well) -
Garbage collectors have been improving for the newer dynamic languages, too... Lua's latest version has an incremental garbage collector, and PyPy's garbage collector is also improving. Of course implementations on top of the JVM/CLR automatically benefit from the good garbage collectors of these platforms. But I agree that the garbage collector is a very important (and often overlooked) item in overall performance.
-
Great comments, everyone!
Dan Weinreb: a virtuosic comment if ever there was one. I really enjoyed reading it all. Thanks! I've got nothing to disagree with there, and you've given me some good material to chase down. My secret agenda for the talk, of course, is to get more people to try Lisp. I'm completely agnostic about which Lisp, as long as they try it.
Dibblego: you'll have to be more specific, so that others may refute you or back you up. Otherwise your argument is no really better than the point it's trying to make about my writing. Try again! I will listen with an open mind.
Rob Mueller and masklinn: yeah, I'm really coming around to the nothing-shared models. I think things wind up fundamentally more scalable (across machines) if you begin with that model.
Alexandre: thanks for the link to Alice ML! I'll check it out.
gregory: Objective-C seems decent at first glance. I read the language spec through about 3 weeks ago. The message sending is, of course, quite dynamic. I'll need to get more experience with it (but I'm 100% on Macs now, so it'll happen.)
For Charles and the other folks who jumped on the HotRuby thing: sure, it's a toy. I didn't mention it in the talk; decided it wasn't worth it. I hope you're not saying that the mention on the slide invalidates my message, which is that dynamic language performance is experiencing a renaissance of sorts, and that we should encourage it.
As for the meta-comments: preparing this transcript was a lot of work! It took basically a full Saturday. I'm glad some people found it worth reading (even those who disagree with it.)
And I like the Chalkboard font. ;-) -
In case you haven't seen it, here's a link to an implementation of runtime call-trace hotspot optimization for arbitrary native binaries. It's an HP research project called Dynamo.
-
The video is an ASX; WTF?! I guess I'll have to settle with your transcript. Maybe next time you'll also promote YouTube, not just Dynamic Lanaguages :-)
-
Your story about wanting to use Lisp at Google really resonated with me. For what it's worth, I tried the same thing back in 2000 when Google only had 100 employees and also failed. So the deck was really stacked hard against you.
We should get together some time to share parenthetical comments. :-) -
> Also, requiring the user to explicitly tag types is not a requirement of static typing. Haskell, OCaml, and Scala will automatically inference types when possible.
As always, this issue is not so much who has to provide the type tags, it's that you can't do anything with the program until someone does.
Moreover, you do have to provide dummy procedure definitions almost as soon as you start writing code that refers to an unwritten procedure, even if the reference is irrelevant to the work that you're doing and is just a placeholder for "do later". -
Dan Weinreb wrote: "Having a Common Lisp built on a virtual machine with a great JIT compiler is what I'd like to see. [...]"
Amen, I couldn't agree more.
Dan also mentioned: "Someone started writing a Common Lisp for the CLR, but it was too big a job and they punted."
In fact, there have been a number of attempts and projects to build a Lisp implementation on top of the CLR. A while ago, I did some research and listed them all (well, all projects I could somehow get hold of). One of those projects (IronLisp) even used the DLR. -
dan weinreb: "Amazingly, Richard Gabriel, in "Patterns of Software", written in 1998, said at one point that there was now only one computer language: C++."
Gabriel didn't say C++, just C. -
Some say the Lisp Machine died because when you build a special purpose machine, even if you have a 10x performance boost for your niche, it's still tough to compete with commodity Moore's law driven CPUs. It appears to me that the speed for a single CPU has stalled. So my 5 year old box is still 'modern', more or less. (I've been wanting a multi-CPU box since i wrote my first OS - and now that they're cheap, well, my old box still works... but i'll actually NEED 64 bits soon.) Perhaps the "JVM in hardware" idea can still float. Especially if it can use the huge # of devices per chip to do some of this analysis in real time while executing at full bore.
Don't take the 'java byte code machine' found on many ARM chips as an example. That's in an embedded (limited power, therefore device and cycle speed) niche. So, it turns out that many of these ARM processors don't even use their Java engines. I've got one in my pocket, for example.
Of course, i have no experience with either lisp machines or building such hardware. So take this with a grain of salt.
C is still the gold standard for speed, right? Does Google say C/C++ is OK? Or just C++? In the end, it's all down to speed. Even for 20%, if C is better than D, people will take C. It's about what's easy to measure, and what that easy to measure thing means. Have a huge project and want it to be maintainable? Keep the original development staff. How hard is that? For management - impossible.
And after writting half a million lines of C, it streams from my fingers at high rates. I've been looking into Python and Scheme of late, and of course, haven't seen any evidence for improved development speed. And yet, C wasn't my first language. Uhm, it was something like 37th. Still, Scheme is proving very difficult to pick up, despite prior Lisp exposure (it might have been #8).
How about Forth? It seems easier to write than read, and easy enough to write. It doesn't seem to use garbage collection. Even simple implementations are pretty fast.
For me, a language is easy to learn if you can build a mental model for it's execution. For Forth, the model is really simple. For C, well, i got to learn it with the Ritchie compiler on the PDP-11. I asked the compiler for assembler output, and found out exactly what he had in mind. Much better than the ANSI documents. So i code thinking what a PDP-11 might do with it, and trust that the compiler will do something similar. The trouble with LISP is that my professor talked for an hour about the switchboard going on inside. I think that was about memory management, and how totally non-linear the program is represented. Absolutely no clue about what the thing is doing. And, it was 30 years ago.
OK, so object oriented stuff is cool. I'm trying to learn closures. As near as i can tell, it's things that i've been doing in C for some time, though perhaps with less language support. But what people like about them isn't all that clear. I've done structured code in assembler too. I even implemented longjump for error recovery (really try/catch) in assembler. That doesn't mean i like try/catch very much.
From the reading, it sounds like it must have been an awesome talk. Giving such a talk to a bunch of experts is something like talking about science. It's extraordinarily easy to say something that's not just non-controversial, it's just plain stupidly wrong. It scares the willy's out of me. And if you talk about things that are potentially controversial, there's always going to be someone out there who thinks that it's a closed issue. There are no closed issues. There are no absolute truths. Even that one. -
I suggest taking a look at the Tamarin project. It draws from Adobe's experience with ActionScript (both people involved and extensions to the ECMA spec, which has some of the optimizations for dynamic languages you mentioned, like optional type annotation) to build a JIT compiler for the next generation JavaScript. cool stuff.
-
Hi Steve, Objective-C & Dylan both fits as hybrid systems. Both have optional typing :).
-
Great entry, Steve!
Coming from the Python side of things, I have long hoped to try out some of the Self ideas in Python. After trying type inference in Python and finding it lacking without changing the language, I have always hoped to see more tracing information propagating through a long-running Python process and see where it leads.
But that won't happen until I have the free time, which might not be until pigs fly or I actually finish my PhD, whichever comes first. =) -
If eval is what it takes to make a dynamic language then every Turing complete language is dynamic. Even if eval isn't built into the language spec you can always write it.
There is definitely a real distinction to be made about dynamic metaprogramming and its power. But eval isn't it. -
IntelliJ will do intelligent renaming across all filetypes. If you reference a method name in a spring xml config file for example, it will rename it. If you mention the method in some javadoc, it will rename it. IntelliJ is just plain awesome.
-
One more of these: thanks very much for the transcript. This is one of those cases where I wouldn't have watched a video, but I'm really glad I read this.
-
Steve, If you are going to eventually play with Objective-C on your mac, you might want to have a look at the Nu language ( http://programming.nu/ ). It's a fairly young, lisp and ruby inspired language on-top of the objC runtime
-
My totally unscientific take on the question of high performance reference counting in lieu of true garbage collection which I guess is more of a response to one of the questions at the end of the talk as opposed to the talk itself:
http://brett-hall.blogspot.com/2008/05/blame-management.html
In a nut-shell: using atomic ops to manage the reference count just kills your performance, but what else are you going to do unless you're running single threaded. -
"So! It's interesting, because every once in a while, a C++ programmer, you know, they flip.."
Hmm. That's exactly what happened to me. After 7 + years of C/C++ being the "only" way, someone introduced me to Python, and thence on to Common Lisp.
I should have killed them before they opened their mouth. It's driven a complete coach and horses through my career. -
Interesting presentation, thanks for blogging and transcribing it!
I like to read stuff like this, but...
I'm a game engine developer, with an interest in programming languages. The sad truth is that except for C++, there is nothing out there which can do the things we need to do, with an acceptable level of compiler/debugger/IDE support. I hate C++ because of its long compile times, lousy compiling/linking story, difficulty of parsing and manipulating it with tools, and lack of sane metaprogramming functionality (template metaprogramming is the spawn of the devil, heavily-templated code in a large complex system can be nigh undebuggable).
The problem is we absolutely need statically-compiled native code, manual memory management, and the ability to do low-level bit twiddling, muck about with pointers, etc. We can't tolerate the unpredictability of a garbage collector (1 millisecond is an eternity) nor the storage overhead (anything that saves 1 megabyte of memory is a giant win). We're always trying to push the performance limits of the target hardware (Xbox360, PS3 etc), and every 1% matters. We also want to cram as much data as possible into the console's RAM; again, every 1% matters (sometimes I spend an entire day doing an optimization that saves 100 KB of memory, or a million cycles per frame).
So basically, what do I want?
1) A language much simpler than C++, but with the same basic low-level performance and bit-twiddling abilities as C.
2) Module-based compilation. Strong IDE-based support for incremental compilation. It should inline aggressively, except maybe in areas of the program which are being edited and recompiled very recently.
3) Can't be JIT-based (must be native compiled), and can't rely on a garbage collector (I know it rules out nifty features like D's array slicing, but that can't be helped). Remember, we have to cross-compile our code for several platforms and deploy compiled binaries over a network or dedicated link. Consoles are kind of like embedded systems scaled up 100x.
4) Compile-time metaprogramming support. I basically want the power of Lisp macros with all the syntactic comforts of curly-brace languages. I want to write imperative metaprograms, in the same language--or a similar language--as the target program. They should be able to inspect an AST declarations and statements, generate new ones at will, etc.
5) Staged compilation, where the final output of the 2nd-last stage is human-readable source code in the same language as the code I wrote by hand. The last stage would just "compile" in the traditional sense...the stages before would be doing things like: evaluating metaprograms and template expansions, evalating conditional compilation (when compiling for PS3 I want the human-readable output to include PS3-specific code and not include code specific to some other platform, etc).
6) In the IDE and debugger, I want to be able to switch back and forth at will between my hand-authored source code and the human-readable output code produced by stage N-1.
We find that we don't need much run-time dynamicity for game engines (no more than C++ provides). For example, many game engines don't use compiler-provided RTTI, but often we do roll our own RTTI and reflection things (and building those with a compile-time metaprogramming facility would be almost ideal for us). Remapping strings to integer IDs is another task I'd love to be able do with compile-time metaprogramming (instead of at run-time or the ugly hacks we end up doing now). Very useful for efficient printf-style logging (i.e. replace all the format strings with IDs and offload the actual string manipulation to a log-viewing tool). I also want to generate initialized data structures to act as helpers for each instantiation of a certain template, or translate "simple" data structure descriptions into complex run-time representations which take less space. Compile-time metaprogramming is ideal for this, and has some big advantages over using some external tool to generate the code. I really want to be able to see and debug the generated code in source form though.
Anyway, there is no language I know of which is "excellent all around" for modern game engine programming. C++ is sufficient in the performance department, but in many other areas it is somewhere between barely-adequate and sorely-lacking. Tools for C++ (e.g. Developer Studio) are as good as they will ever get, and they still suck. Building our executables for one target platform can take over half an hour, and produce hundreds of megabytes of debug information and hundreds of megabytes of precompiled header files for an executable which is maybe 20 megabytes. Small changes often require recompiling dozens or hundreds of source files (especially if you touch anything included by a precompiled header, yuck).
In order to do better than this, we need to start over with a vastly simpler and cleaner language, and design it so it is easy to parse correctly and provide strong tool support for. I just don't know how to motivate anybody to work on statically-compiled languages instead of JITs for JavaScript-or-some-other-dynamic-language. -
gvwilson: Solid data on relative productivity of two languages is very hard to get. You need to put two equivalent programmers in a room, and give them the same amount of time to do the same problem in each language, or something like that. I actually know someone who intends to do this: he has two programmers for whom he can make a very good argument that they are of the same quality, and who are willing to participate in the experiment. I'm looking forward to hearing from him. Otherwise, you just have to decide whether you believe us, or you have to try it yourself.
Jesse Tov: Is a generational collector good enough for real-time code? It depends on what you mean, quantitiatively, by real-time. It depends on the numerical value of the latency variation that the application allows. InspireData is an interactive application, for which GC is fine. If you make the real-time requirements stringent enough, yes, even the best modern GC's would be a problem.
Marklinn: Shared-nothing concurrency a la Erlang is an important idea, and I hope to see it tried out in other languages (since not everything else in Erlang is what I want). I'm particularly interested in the isolation it provides between the threads, in case one of them detects a software bug (violates an assertion). You can kill one off, leaving the others undisturbed. Designing software in the face of knowledge that it still has bugs is something I've always been interested in.
Clausb: Thank you very much for the reference! I'll take a careful look at that.
Stephen: Yes, that's one of the main reasons that the Lisp machines became obsolete. (See also http://dlweinreb.wordpress.com/2007/11/16/why-did-symbolics-fail/) Regarding the "JVM in hardware", have you seen the www.azulsystems.com Java accelerator hardware? See http://www.pbs.org/cringely/pulpit/2008/pulpit_20080229_004404.html for example. As for learning Lisp, I suggest you ignore the professor and take a look at "Practical Common Lisp" by Peter Siebel, which is the new gold standard for learning Common Lisp. You'll like it. -
To Wylie:
I respectfully disagree on your point about absolutely requiring manual memory management. I work on the Gamebryo engine, easily one of the top 5 3D game engines in the world, and have been writing a Common Lisp wrapper for it in my spare time for a game project. The garbage collector can be tuned to have a small first generation and many quick GC passes. For the casual games sector, the performance has been very acceptable. Keep in mind that like other software, games are still going to use 3rd party libraries for everything. I'm using Flash, fmod, RakNet, and Gamebryo for the game, and all of those libraries are native C++. There is no need for the game itself to be much faster. The only thing that is very important for a Win32 implementation of Lisp is native threads (not posix), and some way to predictably use finalization to deallocate DX9 resources. With these two requirements fulfilled, I don't feel that Lisp is incapable of working for a real commercial game product. -
Dan Weinreb: I'm just responding to the misconception that a generational collector eliminates pause times. It eliminates some pause times, but unless you're doing something incremental, occasionally you'll have an O(L)-time pause. I'm not saying this makes it unsuitable for this or that application. I'm just stating an algorithmic fact.
If you need pauses to be bounded by something less than the size of the live data, you need something complicated. There are a whole bunch to choose from, and they have different algorithmic properties, different constant factors, etc. If you need bounds on pauses or minimum mutator utilization, you're going to be implementing something terribly complicated.
My concern is that if you tell someone, "Language X has generational collection, so you won't get pauses," they might be disappointed. That's not what plain-old generational collection is about. -
thank you for the transcript !
great talk
i printed the papers and will have a look at them
greetings from argentina
orlando -
Great post!
It really emphasizes the fact that It's always worth investing the time and effort in learning a new language. Thanks for the positive vibes! -
The answer to Wylie's (much justified) lament increasingly seems to be the programming language D.
-
Managed C++ The Microsoft CLR version of C/C++ works great. I was able to compile Quake by just adding the /clr command line switch. It ran it with a 50% performance hit compared to native code. But it's kind of pointless. If you're willing to take the perf hit of using CLR you might as well switch to using C#.
Another lang besides C++ for games You can use Lisp for games. Naughty Dog shipped many AAA console games using Lisp. The trick is to avoid consing at runtime, which eliminates Garbage Collection pauses. But once Naughty Dog got bought by Sony they were forced to switch to C/C++ because they needed to share code with other Sony game teams.
You could of course apply the same trick to any other GC language such as Java or D or Javascript. Of course some languages make it very difficult to write code without consing. -
@coderboi: Seconded with enthusiasm. I worked for a gaming company in a previous life, so I know somewhat whereof I speak.
When the game industry discovers D, they're going to wonder why the hell they didn't do it years ago. -
great post
I think I agree on almost everything
really thank you to have shared all that
now some more questions :)
when I've read another of your post "the next big language", I thought he's talking about ECMAScript 4
when I see what's going on in ES4 and in parallel with the Tamarin project (especially Tamarin TT)
I can not prevent myself to think, but hey ES4+Tamarin they are leading in those directions,
really on almost everyone of your slides I could say "hey ES4 do that" or "hey Tamarin do that", etc.
so here the questions,
Steve, what's your take on ES4+Tamarin ?
do you see them as an ideal combination ?
can you see some part where they could fail ?
and now the tricky bonus questions =)
Google now have just a few of officialy supported languages and amongst them JavaScript,
in the forseable future could you see ECMAScript 4 as a new official language at Google ?
Could you imagine something as Rhino on Rail evolving to ES4 on Rail ? -
This all reminds me of so many hallway conversations I had in 1990.
Some of the compiler/jit technology has come further, but the underlying concepts of using inference and runtime behavior to influence the shape of the application were all there. Then we were more concerned with memory since it was expensive and the biggest problem was paging, so we had treeshakers and reorganizers to optimize footprint and paging behavior respectively.
What often happens now is that the dynamic language nerds, and others who find that's what they need, implement whatever features they need in C or java or whatever they have been forced to use.
Wylie:
The embedded/game world has some interesting constraints.
There was a lisp implementation by Harlequin for a telco switch that was garbage collected. They got around the GC delay by using an object table and incremental GC. The overhead was spread out to every allocation and object reference.
Back in the day we spent a lot of time on trying to make all of the arithmetic and bit twiddling operations in CL as fast as C.
I do think it's theoretically possible to have a lisp (or whatever dynamic language you prefer. I'm not hung up on syntax) based game development system, but getting anyone to start using it is probably an insurmountable problem. -
To pTymN:
I did not mean to imply that Lisp or other dynamic languages can not be used for games--I wouldn't try to write a game *engine* in one, though! I wonder how fast Gamebryo would be (and what its memory footprint would be like) if it were rewritten in Lisp with a suitable optimizing compiler?
I do vaguely recall that Naughty Dog used their own custom Lisp for Jak and Daxter (on the PS2). I'm not sure if they're still doing that for newer titles.
Anyway, at my workplace (Ubisoft) we have several different in-house engines of varying size and complexity, and all of them are written in C++. For higher-level code, most of them embed either a home-grown scripting language, or an off-the-shelf scripting language such as Lua. But the engines themselves are entirely C++.
If you weren't trying to push the limits technically, you could write an engine in something garbage-collected and maybe get away with it. But I think a modern engine for any ambitious AAA game currently needs to be native compiled code and no GC. -
Naughty Dog uses Lisp again. There was recently a presentation what they are doing now.
The GC-problem comes up in several domains. People who still want to use face a problem. The mentioned ATM switch used a custom LispWorks version. Before that, the same group used an embedded Lisp machine with a special real-time OS. There are other applications that have similar problems. Years ago there was an Expert System developed for real-time applications (like controlling chemical plants, etc.). G2 from Gensym was the product, it is still available. G2 was developed in a special Lisp with no GC.
Games and simulation systems are areas where much of the standard software is C++. Anybody who would want to use something like Lisp would have lots of work to adapt it to that domain. Very few did it. I wonder if there will be an affordable GC that could be used in these domain. Choosing another language than C++ has then the additional drawbacks, that the usual game developers don't know how to use it and no specific libraries are available. For G2 this was not that a huge problem, since it was developed as a highly-graphical expert system - something that's quite possible to do in a Lisp-dialect - they had to solve the real-time problem, though. -
I feel Yegge is grasping at straws for arguments. Take any argument say Optimization or Refactoring for e.g, any improvements in these are all going to apply proportionally to dynamic and static languages keeping static at pace or better. Even arguments such as productivity as measured in keystrokes or language features like closures - static languages can keep pace with its own syntactic sugar (but its not fair to always compare against Java - it is now an old language after all trying to catch up).
Say dynamic languages do catch up in performance. Static Types still form a fundamental set of pre & post assertions that are always going to be valuable in a programmer's toolset - not to mention valuable for compiler optimizations, refactorings, tools, clarity across large teams, etc. etc. for which more Type information is always going to yield better results, no matter how much you try to dismiss it. Its like you can have a car, a house, clothes and be completely self-sufficient but having more money is "always" going to provide better benefits.
Take your humorous cartoon - depicting a dog, a house etc. with labels - Isn't the reality more like having indistinguishable boxes? Say you had to make a pie and you had a set of indistinguishable boxes, also assume some of those boxes are bombs...hahah. It would tough to make a pie without setting up the right assertions first - and Static Types provide some of those basic assertions upfront. I am a very defensive assertive programmer and Static Types form a valuable part of my defensive programming style, and along with dynamically coded assertions, allows me to programmatically prove my execution paths as correct, not to mention the clarity it provides when I or anyone else reads that code a year later. I almost always write programs correctly the first time, i mean once its compiled, they almost always execute correctly as expected the first time - i find it freaky sometimes.
Your arguments regarding highly distributed applications (e.g. apps that use the web as a platform) or systems that live forever - are definitely better arguments. In these environments - independent modules "assert" inputs dynamically before proceeding. The point is that "assertion" is a valuable tool and when it is feasible to get some basic assertions for free with Static Typing, it is always going to yield better results (again analogy: a self-sufficient guy can always get more benefits with more money). There is No reason why these Modules can't be created with Static Typed languages and reloaded dynamically into the Application to sustain longevity. -
I also want to express gratitude for putting up a transcript, as I think the current trend of publishing by podcasts is a disease. People that read as slowly as they talk should take a class. Really.
I think that the blog post can be summarized as: The problems with dynamic languages are in the implementation which can be fixed, whereas the problems with static(-ally typed) languages are in the designs themselves for which there is no fix.
However, what I find lacking in dynamic languages is the lack of context that typing provides. Of course, your point is that the same context can also be constraining. -
> Rainer said... "Naughty Dog uses Lisp again"
Unfortunately, it doesn't appear that Naughty Dog is using Lisp in any significant way. If you read their GDC presentation, it says they use Scheme as a scripting language for their game data pipeline. They gave zero examples of why Scheme would be any better for this application than Lua or Python or even a shell scripting language.
Scripting a data pipeline is just writing glue code -- it's a much wimpier use of Lisp compared to the old days where they used Lisp for their core game engine. -
Wylie:
Here's a quote from a discussion I found regarding GOAL (Naughty Dog's lisp dialect):
"Well, fast iteration times weren't merely due to the the listener - that was a nice touch, but only the tip of the iceberg. We could basically dynamically link per-function or variable. Effectively, you could hit a key while working in the IDE, and whatever function the cursor was on would instantly get compiled, sent across the network to the TOOL, linked and dropped into the game while it was running. The whole process took a fraction of a second. You could also do the same per-file. This feature was sort of like Edit and Continue, but you didn't have to broken in the debugger - it could be done while the game was running. This was insanely useful for programming gameplay, physics, and fx, as well as prototyping, visual debugging (just drop in some debug spheres or prints while you have the game in some interesting state), etc. We also used it for dynamic code streaming - so only a fraction of the executable code was loaded at any given time (to conserve memory)." -- Scott Shumaker
From: http://web.archive.org/web/20070315153349/lists.midnightryder.com/pipermail/sweng-gamedev-midnightryder.com/2005-August/003798.html -
> Static Types form a valuable part of my defensive programming style, and along with dynamically coded assertions, allows me to programmatically prove my execution paths as correct
No, they don't. Type correctness merely guarantees that you're not asking something from a representation that it can't do.
That's a long way from program correctness.
And, since static languages tend to have something other than "duck typing", your representations are more brittle than they could be. -
Andy Freeman says:
> Type correctness merely guarantees that you're not asking something from a representation that it can't do.
That's a very limited notion of type correctness. When I do typeful programming, I may have a variety of types that all have the same representation, but correspond to semantic notions that shouldn't mix. The abstract type exported by my library may be represented as a regular old string (for now), but as a client you'll never know. With phantom types, there may be type parameters that are completely unrelated to representation, which are used to keep track of other sorts of static information about programs.
> And, since static languages tend to have something other than "duck typing", your representations are more brittle than they could be.
Conversely, parametricity guarantees that when you reuse polymorphic code, you have an iron-clad guarantee that it won't get into certain sorts of mischief. If a function's type is polymorphic in a particular parameter, you know that its behavior can't depend on inspecting that parameter.
(If "duck types" are all you're after, OCaml's row-typed objects will give you that, though word on the street is that OCaml's object system is more trouble than it's worth.) -
Komodo from ActiveState is an IDE for Perl, PHP, Python, Ruby, Tcl, HTML, CSS, JavaScript, XML, and more. I use it for Perl - it's not perfect but it sure beats not using an IDE!
-
(I originally sent the below to Steve by e-mail, not realizing he enabled comments.)
Steve,
in your transcription of your Stanford talk, you were asked about C++ programmers striving for maintainability and performance. Noticeably absent from your answer was 'generic programming'. The two most generic operators in programming, equality and copy (and, therefore, assignment), require explicit semantics. Not just to keep programmer's sane when first learning a language by conquering built-in types, but also for creating compatible user-defined types. Compilers can take advantage of generic properties of code to perform optimizations like common subexpression elimination, constant propagation, code hoisting and sinking, etc. Really, the biggest challenges for C++ 0x, as far as Google should be concerned, is defining a memory model and some concurrency model.
Your talk was entertaining. The most valuable point you made was about probability, but you blew a good opportunity to talk about probability versus accuracy (computer scientists at Google seem to have a hard time comprehending that fuzzy sets are a generalization of crisp sets, which precludes them from thinking about 'state zero' at time 't0' as being fuzzy); Note that generic programming turns 'definiteness' of traditional concrete algorithms on its head by replacing a partial instruction stream with axioms that describe general facts about those streams, so it is not just 'dynamic encoding' research that is changing the pantomime of the perf landscape; However, your biggest misfire was not explaining the evolution of scheduling priorities in various OS models e.g. the unholy mess that is Windows NT, and the impact it has on writing portable code w/ perf guarantees, such as background worker threads.
Z-Bo -
To Wylie: try Ada :). It even has compilation to CLR and Java bytecodes, native threading, distributed system and very low level bit tweaking.
Stevey, many thanks for this wonderful transcript! -
Hi Stevey. Great talk! Thanks for that!
I just wonder how you came up with "The next thing that happens in the JVM is the JIT undoes all the optimizations!". This seems highly inaccurate.
Firstly, javac does not actually do any optimizations, not even constant propagation. It does not have to do so because -as you say- the JIT does it right away.
Therefore the JIT does not actually undo anything. Why would it? In fact it cannot even undo optimizations. How do you want to undo a constant propagation? That's obviously impossible. Maybe I misunderstand what you meant to say but as it stands now that does not really make sense. -
I'm really curious about what ticked you off about Java 7 :) Please give us another rant on the topic...
-
Don't see why C++ will be left behind with multicore. Worked at national labs with large scale massively parallel C++ codes; works great!
-
The low phase that has set into the IT sector is no longer news. The fall in US economy was a major blow to the IT world all over the world. In countries like India where you can find a software development company on every nook and corner are rapidly closing down because of lack of work. What is to be seen is the strategy formulated by the big fishes such as Infosys and Tata. The current situation is of uncertainty and fear as companies are sacking employees, something that was unthought of a few years back!
-
So you've left untold the stories of overflowing a long, and if I'm reading between the lines right, the story of how you used a legal loophole to use server side JavaScript.
I'm guessing when you told the higher ups the project was using JavaScript, you didn't tell them it was server-side? -
I really liked GeoWorks on the desktop. Please tell anyone you still know from there that people loved it.
-
Is there something wrong with the share-nothing native threads of Tcl that you dismiss it as a dynamic language with native thread support?
Indeed, switching from event-driven to threaded is something I've repeatedly done in a fairly trivial way when Tcl programs have grown to need such concurrency. -
Brilliant! I'm dumb struck.
From a young age I experimented with many languages. Then I was "All C++". Then I discovered dynamic languages and professionally did Bash/PHP/JavaScript. After discovering Java I have to admit that I've been getting "blackholed" into it and having it become my religion, moving away from all languages and *especially* all dynamic languages -> mostly because of slow performance and the lack of strong typing and compile time errors *shy*.
As with all your posts I always feel I come out a "wiser" person ;> Thanks! I'll certainly be keeping my eyes on this topic.
What do you think of the V8 VM? Are they making way towards "truly" better performance? -
Thanks for the post. I just ended up doing a talk about dynamic languages on .Net,
http://www.tartley.com/?p=456
which now I come to hit [publish] and read it through, is very clearly in the shadow of this awesome post by Steve. Thanks for the information and the good influence Steve, hooray the defacto creative commons. \o/ I assume that's cool. -
pray4me-Jesus told me persecution is him trying to make you loose your salvation, pray for me, Holy Ghost baptizm feels like Body your perfect size coming in, electricity caressing penus, spiking, hair loss, itching in scalp, face bags and sags cause muscles tithen at instant you wink, turn, head, in vision Jesus came down and pointed like lighted needle thru heart, felt hole, all desire to live for Jesus drained out, this is teasing by God to persecute, gum desease, dreams of family in hell , loose hair, wrinkle, I love putting people in hell to talk about it thru out eternity, they would not do one thing but cry and plead and beg but I would torture them, the Lord told me something like that he is laughing and tried to make me loose my salvation since I got saved and and told me he will do it to everybody, and in vision I saw Jesus and he said something like, "i have mercy", and he laughed like maniac, on 11-2008-God said: pray for me, God said-I the Lord toture to abase, causing my slaves to hate me by manifold temptations, teasing, caressing dick, making it harden, soften, make face, crease, bag, tithening muscles, when used, stripping heart, of all desire to live for me, laughing at them, teasing, night and day, to make them offended all the time, causing most to loose their souls, perish, said, Jesus, after you served, to abase, in hell, saith the LOrd, I hate people cause the tortured me, saith God, Im the LOrd, who saves, then destroys, ha ha, saith God, make me your Lord, and I will destroy, you, till you perish, saith God:
if you steal the name saith the Lord, I will ruin you, with sickness, desease, cut you off instantly, and embarrass you, these all have stole the name ministry of dreams, to make prophet fall, Laurie Behncke steals God spoken created protected christians ministry name ministry of dreams, Duncan Rouleau, dr. rev. jeremy taylor d.min u.u. m.a. ph.d. steals God spoken created protected christians ministry name ministry of dreams and tristy taylor writes and tries to get prophet to speak blasphemy against the HOly Ghost and rev. amy brucker built dr. jeremy taylor's website and kathy taylor approves but calls herself reverend, Alexander Micevski stole ministry of dreams and at one time held ministryofdreams.net to try to ruin Gods servant, Alexander Micevski was the first one to steal the God spoken created name ministry of dreams, antonia vladimirova steals God spoken created protected christians ministry name ministry of dreams, dee finney steals God spoken created protected christians ministry name ministry of dreams, Randy Sukhai steals God spoken created protected christians ministry name ministry of dreams, john mark pool steals God spoken created protected christians ministry name ministry of dreams, randy haxor steals God spoken created protected christians ministry name ministry of dreams, douglas heller steals God spoken created protected christians ministry name ministry of dreams, ron tompkins steals God spoken created protected christians ministry name ministry of dreams, Antonia Vladimirova, LLM
Director of Dreams Foundation
Abba's Kids Director steals God spoken created protected christians ministry name ministry of dreams after christian signs her guestbook,
elizabeth shea steals God spoken created protected christians ministry name ministry of dreams, jose alvarez steals God spoken created protected christians ministry name ministry of dreams, tom beland steals God spoken created protected christians ministry name ministry of dreams, matt brady steals God spoken created protected christians ministry name ministry of dreams, wole soyinka steals God spoken created protected christians ministry name ministry of dreams, dave karlotski steals God spoken created protected christians ministry name ministry of dreams, dana tillusz steals God spoken created protected christians ministry name ministry of dreams, quinling harlequin steals God spoken created protected christians ministry name ministry of dreams, andy shaw steals God spoken created protected christians ministry name ministry of dreams, christina marie sanford steals God spoken created protected christians ministry name ministry of dreams, jean patrick charrey steals God spoken created protected christians ministry name ministry of dreams, brian, bill of the massive bri steals God spoken created protected christians ministry name ministry of dreams, lawrence forman steals God spoken created protected christians ministry name ministry of dreams, david shapiro steals God spoken created protected christians ministry name ministry of dreams, katie bazor, janetmck who is janet mcknight steals God spoken created protected christians ministry name ministry of dreams, arron shutt steals God spoken created protected christians ministry name ministry of dreams, micheru mathys' steals God spoken created protected christians ministry name ministry of dreams, Senyum Sayang steals and alters God spoken created protected christians ministry name ministry of dreams to ministry dreams like dr. mike murdock, nick field steals God spoken created protected christians ministry name ministry of dreams, jonah weiland steals God spoken created protected christians ministry name ministry of dreams, ismail kadare steals God spoken created protected christians ministry name ministry of dreams, robert gillen steals God spoken created protected christians ministry name ministry of dreams, lawrence forman of funarchy, cluracan of furnarchy steals God spoken created protected christians ministry name ministry of dreams, cluracan of dreamnova steals God spoken created protected christians ministry name ministry of dreams, diana hughey holds ministryofdreams.com, utubia1party steals God spoken created protected christians ministry name ministry of dreams, duncan rouleau's children jonah weiland, FunkyGreenJerusalem steals God spoken created protected christians ministry name ministry of dreams, FunkyGreenJerusalem is Ben Lipman steals God spoken created protected christians ministry name ministry of dreams, CKYT Radio13 steals the God spoken name ministry of dreams, CKYT Radio 13 steals the God spoken name ministry of dreams, this is joel tao, [email protected] Dalarsco steals God spoken created protected christians ministry name ministry of dreams, sandy brophy steals God spoken created protected christians ministry name ministry of dreams, Thomas Rickert steals God spoken created protected christians ministry name ministry of dreams, utubiaparty1, sistermoonshine13 steals God spoken created protected christians ministry name ministry of dreams, joel tao steals God spoken created protected christians ministry name ministry of dreams , robert gillen, ginny hill, john e. carey steals God spoken created protected christians ministry name ministry of dreams, wesley pruden steals God spoken created protected christians ministry name ministry of dreams, furnarchy, krayzier, merc, amfortas steals God spoken created protected christians ministry name ministry of dreams, kragamore steals God spoken created protected christians ministry name ministry of dreams, jag, khaless steals God spoken created protected christians ministry name ministry of dreams, furcadia and katie bazor steals God spoken created protected christians ministry name ministry of dreams, john scott alters steals God spoken created protected christians ministry name ministry of dreams, s.m. scott alters steals God spoken created protected christians ministry name ministry of dreams, sue scott is the ministry of Spirit and she alters steals God spoken created protected christians ministry name ministry of dreams larry clow steals God spoken created protected christians ministry name ministry of dreams, michael doran steals God spoken created protected christians ministry name ministry of dreams, henry wynn steals God spoken created protected christians ministry name ministry of dreams, andrew bosch steals God spoken created protected christians ministry name ministry of dreams, diana hughey of as one heart photography and artdizon holds ministryofdreams.com, Brandon Adamson, Damadar is cluracan, dchandler, Thomas Rickert the last-fm, wole soyinka, eric lindberg, Lauren Artres of Veriditas alters ministry of dreams to exalt her Lord doctor rev jeremy taylor unitarian universalist minister who did steal ministry of dreams to ruin Gods servant, todd callender steals God spoken created protected christians ministry name ministry of dreams, alex ness steals God spoken created protected christians ministry name ministry of dreams, kenley darling steals God spoken created protected christians ministry name ministry of dreams, Brad Loubser steals God spoken created protected christians ministry name ministry of dreams , and more, like jeff dee steals God spoken created protected christians ministry name ministry of dreams, manda dee steals God spoken created protected christians ministry name ministry of dreams, amanda dee steals God spoken created protected christians ministry name ministry of dreams, most claim to be christians saith the Lord, im ruining them right now, I will not save any for wanting elijah to fall, and they will loose health, jobs, talks, spouses, more, saith the Lord, for this evil wickedness, which, bob, reached out to most like david shapiro and dee finney, micheru mathys, and they stole his God spoken ministry name like cluracan who is little, mustie and cecil pennyton, when he prayed for them, like john mark pool, and jose alvarez, he signed jose alvarez's guestbook, and jose alvarez stole the name ministry of dreams for doing, wicked, pastor, like antonia vladimirova of the, dreams foundation, he signed her guest book, and she stole the name ministry of dreams, when he witnessed to her, she is witch, lost forever, like wole soyinka steals God spoken created protected christians ministry name ministry of dreams, amanda dee, jeff dee steals God spoken created protected christians ministry name ministry of dreams, and duncan rouleau steals God spoken created protected christians ministry name ministry of dreams, bob reached out to all, and they all stole the name ministry of dreams, God spoke for this only, and Im ruining them all, watch, saith the Lord, they all release when times get hard.
do not copy in any way or modify the name Ministry of Dreams, ministryofdreams, or I the Lord will ruin you, it did not exist till prophet prayed, and brought it to the internet, for this work only. I will make you run to remove the name ministry of dreams like all listed here will, saith the Lord, God spoke this: persecution is me Jesus trying to make my servants loose thier salvation by manifold temptations like, careesing thier sex organs with electricity, like oral sex, stripping heart of desire to live for me, teasing, scaring by what I say to them, making thier faces bag, sag, wrinkle, hair loss, laughing at them, letting them see me, like people do a little dog, trying to get them and others thru them to speak blasphemy against the HOly Ghost, it is not my will that any perish, but get saved and I the Lord will kill you all day long, those who dont make it are ROMANS 1, saying what I know will hurt them deep in thier hearts, making them hate me, cause I want them to be backslided, saith the Lord, for no reason, -------this is me Jesus torturing my servant non stop cause I want to make him backslide to embarras him, and will do it till he does or dies, and will to all that come to me, without exception, saith the Lord------Jesus told me about 11-2-2008-hes been doing this since the day I got saved and he will make me desire suicide to cause me to despair unto life, Jesus tole me he was the one that makes people fall by the wayside and loves it when one perishes after they have served him, or, the LOrd let me know that he would do this until I left and would not come back, in other words, backslided with no intention of returning, and also told me about fasting, fast till the brink of death, and he told me things like, then I would stop cause I had no choice, then I will leave you and strip you of your flesh, etc Holy Ghost baptizm feels like body your perfect size coming in, and after, Jesus kills all day long, thats torture thru manifold temptations, terrifying in visions, like letting me dream that im choking, in pain, cat breath, making my face bag, wrinkle by tightening muscles at instant I move them, carressing penus with electricity, feels like oral sex, like electric tongue sucking, going around, spiking, hurting me deep in my heart all day, scaring me by what he tells me, threatens lost, shows me my family in hell, fire, my hair falls in eyes, leads me to drive van into oncoming cars, drive into them, walking in circles, spining when stopped looks like blur to passer by, told me if I got to church, spin till they call police and have me removed, spin while they are trying to arrest, spin till collapse, then roll on floor, the Lord told me persecution is him trying to make me loose my salvation, deseasing gums, etc, tortured like a littley poodle, he doesnt care about this page cause he told me he will do it to "whoever gets saved saith Jesus to strip of thier, make them despair, not be able to go on, like I couldnt" 7-21-2008-persecution is mainly me Jesus trying to make my servants backslide". this is mainly to reach out for your prayer, inercession, you may not like it, if you read, and i dont necessarily like it either, but, you will under stand if you read why I put it up, if you read these pages, God spoke most, and has visions of Jesus telling what he is doing to me, pray for me pray for me, I the LOrd persecute by careesing penus with electricity, causing hair loss, bagging and cracking face by titghtening muscles at instant he moves, piercing heart by trying to anger all day, this is teasing, prodding my elijah, saith God, thru manifold temptations, I strip out desire to live for me out of heart by taking it away, anger, and then remove from memory, wrath, most perish, you who read this will perish and you know it, cause I abase, kill all day long, saith God, and I do more then this, I will tach on to make worse, then, feel ashamed, but damage done, 1 PETER 4:18 And if the righteous scarcely be saved, where shall the ungodly and the sinner appear? HOly GHost baptizm feels like a Body your perfect size coming in, and It speaks in another language, tongues. ST. MARK 10:30 But he shall receive an hundredfold now in this time, houses, and brethren, and sisters, and mothers, and children, and lands, with persecutions; and in the world to come eternal life. 7-3-2008-persecution is me the Lord trying to make you loose your salvation, by torturing, I say come unto me all ye that are heavy laden and I will give you rest then kill all day persecuting, torturing, to abase till you backslide, then if I miss I make you strong, then, destroy, ha ha saith God, what are you going to do about it, I made hell to abase and want people there saith God, many of my servants are there cause I torture, destroy, God speaks on 6-14-2008-I am tempting you to sin to make you loose your salvation, that is persecution, I will not stop until you die, I start killing all day long when you get filled with HOly Ghost, saith GOd, on about 5-31-2008-I saw Jesus in a vision or a man that looked like Jesus and he said, or I heard this, "put your mom in the lake, kill her for me". since I got baptized wiht the HOly Ghost in about 1997 and , and right now IM in fellowship of the Father, and that is staying in visions and hearing God speak thru Jesus or ministering spirits, which I see, all the time unless im talking or doing something bloxing it out, . I saw Jesus in a vision and im going by memory, and I was there with and Jesus had a prod, this is like what they poke cattle with, like pitchfork, and I saw in visions being stabbed with prod, like you use to stab cattle, and there was an edge, and the LOrd let me know he was pushing me to that edge, and that is using his prod, and when I fell over, he caught me in the air. Prodding is torturing, and a prod is like what they use to make cattle move, poke, stab with, with below torments and God spoke most of this, and I have been chased out by, many times, and now my face is ripping, bagging, sagging because of a new intruduced torment, when I blink, or turn head, its like muscles tighten, so they stretch, or maybe even move with my doing, much face damage,(i may look like a star wars character if this doesnt stop)(like last night, and it is, please pray for my face, muscles in face, tighten when used like when I wink, turn my head, causing strectching, tearing, breaking, bagging, have sanded out many bags, when I lay down, I feel eye muscle tighten up, and if I dont move, and I know if I do, cause damage, its like the Lord shoots electrical beam into eye muscle or, cause muscles in face to stretch, I see Jesus laughing at me in visions, and he said one time in vision, "come on", like called to fight
I woke up on 9-9-2008 early in morning, and was tortured for hours, and God tole me I wanted suicide, and I saw a big bag under one of my eyes. My nose is red with some sores and like boils, eyes in corners are swollen or damaged......LOrd what do you have to say about this: Jesus: I the Lord, tortured you this morning to make you humble in my eyes, backslided and suicidal is humble in my eyes, ill ruin you, and I told you to go into the world and stay until I call you back, but you wont and I wont..........bob-you told me about walking in circles and spinning when stopped that this was to destroy and that you would have gotten me put in prison, and stripped me of my salvation in prison..........Jesus: I did Lord, I saw the bag under my eye, and you caused it somehow, I woke up and it was there, and what IM saying to you is right when swelling goes down, and knows heals, we are going to plastic surgery, what do you think about that, that means instead of looking my age, ill look about 25..........Jesus: I caused it and I the Lord will heal it........bob: ok, when are you going to heal it, are you stilll trying to make me backslide, you keep saying to me, "run from me into the world, hide, etc". Jesus: I want to humble you and taht is backslided. bob: If I put the shoe on the other foot I would be happy to have you, anyone, I certainly would not torture.....did you become jelous of your upright servant JOB who was perfect, and move satan against him and leave in in the last state, after allowing stripping of so much, leave him boiled wanting him to leave you, and not return, isnt that what you wanted, did you watch possibly for etertainment purposes, but uyour heart changed.........Jesus: that is exactly what happened, I became jelous of JOB, cause I prospered, and he gave me glory, but, I wanted more then he would give, like you, so I moved satan against, and satan did not want to come against............bob: didnt you tell me that you want to make me backslide to prevent me from becoming known, and so far have added torment onto torment.................Jesus: yes bob: then you saved me and knew before like you have told me, that at the end you would hit me hard, it has really not stoppped, probably since I got filled with YOU, YOU have been torturing me out........................Jesus: I did exactly that, this is killing all day long, suffer, or perish............bob: could you yourself endure what you are doing to me. Jesus: no, but, would any way bob: Lord I have a question, you somehow take out of my heart all desire to live for you, how do yoou do that Jesus: I know where it is in your brain, desire to do this or that, thats how, and I make you hate me, that means no desire to live for me and cause you to hate me ontop of that, ha ha, saith Jesus, hell will be full bob: you said it
JOB 4:2 [14] Fear came upon me, and trembling, which made all my bones to shake. is this because so much has come upon that one can not bare and thier salvation is at risk, pray for me, Holy Ghost baptizm feels like Body your perfect size coming in, then persecution, killed all day long, electricity caressing penus, spiking, sometimes feels like oral sex, hair loss, severe itching in scalp, face bags and sags cause muscles tithen at instant you wink, turn, head, in vision Jesus came down and pointed like lighted needle thru heart, felt hole, all desire to live for Jesus drained out, this is teasing by God to persecute, gum desease, showing dreams of family in hell, God twice drove me to try to commit suicide, by sticking hose in exhaust and starting van, If you read ROMANS 1, they tasted of the heavenly gift, but fell away, those letters were prophesyied, God spoke, not paul, and now you probably know why they fell away, could not stand he tease, Jesus spoke this to me 1-2009- bob I got you to make me your Lord then I betrayed you for years, by torturing you for years to make you perish ha ha saith the LOrd, you are tortured all day and night to strip you of your salvation, ha ha, 6-17-2008-under my eye tightened, and it was like that just about all night that I remember, and yes, new bag, both streteched, and I told Jesus, "ill have a face lift if you go to far" and being intimidated lots of the time cause when I twist kneck, muscles tithten, am im trying to not allow, and GOd told me that he wants to make it so I cant go on, thats where he wants me to offer sacrifice, that means, Hate God so much cause of what he is doing to me that I can not even bare thinking about him, toture me and make me jelous, and knows I cant do one thing about but backslide and he has told me many times to do that, to embarras me, and this is probably cause GOd has showed me the beast with seven heads and ten horns, most if not all bible mysteries, and he told me he doesnt want someone like me walking, he wants me hidden in the people, thats backslided, and tahts perish at end, and God has told me, Ive seen Jesus, "Im jelous", and has told me, "for no reason", and explained like, you were perfect and I became jelous, and im sure something will be tached on to this if I make it thru this torment, and I saw my face in a vision in 5-2008 and it had many knots, boil like, many, and in another, I was talking to a woman and not looking her in the eye, and this was cause I could not bear being facially destroyed, and being wrinkled every day, bagged, so Im faced with fasting until I die or, cause I can see that God is wanting to make it so I wont even want to come out of my room and be seen, to make me backslide to embarras me like he had told me he wants to do many times and has told me many times, "for no reason", and God scares me lots with HIS PROD, intimidate, strike, and what can you do, backslide for be tortured till you will not recover, and God has let me know, "Im killing you", thats making me hate Jesus by what he does to meand want to run, hate so much I cant even stand to talk to him, and I would see Jesus in vision and he would say things like, "bob get away from me", and has let me know if I fast and i have, "till the brink of death", and im tortured while fasting beyond ability to deal with, being teased, messed with many ways hurting my heart deeply, and GOd let me know he wants to do that, and in dream this morning, my eye pulled like bag, I felt and he let me know my mom is going to hell in antther, and hell is under my feet, and yours, and I keep asking God, why do you hate me so much, do you hate people, and I see people and ask God, do you hate them, do you hate that bird, or, do you hate this, do you hate that, whats it like to hate so much, and now if I fast till death cause God wants my face as he said, and I wont use the exact words, like the former prime ministers of ukraine, its a stumblingblok, I just think, put me in hell, go ahead, but I served and surrendered and was available to you, and for doing, so if you see someone backslided, maybe they were not willing to cut thier hand off like God asked me to do, and then he probably would have laughed at me like I see him doing many times after one of his strikes with his prod, and I have expressed thats, its sad YoU are over the existence so pray for me, and if you dont beleive it, good, but save yourself if you can and after you read this you to will say, "who then can be saved"? You will know after you read this what the oaklahoma bomber said is true, "if im going to hell, im going to have a lot of comapny", and just incase you dont believe, look what happened to JOB, and I saw him in visions with boils on top of boils, growing out, and God has told me scaring me and im always trying to recover, something like, "I want to make you an example of rising to the top and falling", " I want you to comit sin in front of those you witnessed to". I have begged God to stop till I almost cant no more, and I have asked him to take my life, and he has led me to attempt suicide twice, and sent gariel once he told me to stop it. So whether you pray for my life or death, thnaks, this makes me know, or I beleive it does why when the romanian pastor writes a book, and it talks about fasting and the whole church fasting or many theere, possibly why they did. I saw Jesus in a vision and he said something like, "its funny not knowing if you will be able to stand tomorrow or not"(he said this to me like a smart ass, and I told God since this batch of God chasing me away from him to embarras me has been going on since about 9-2005, stop or Ill put it on net and reach out for outside prayer, God just spoke, "I will do it to everybody", "I just love it when you are so angry", I saw like an red possibly outlined Jesus in vision while I was lying on couch, and one thing he said was, "you little fucking runt", Please pray for me, cause about late 2007, I found myself cutting garden hose, starting van, sticking hose in exhaust, thru window, got in, under covers in back seat, hose in mouth, and later still alive, and God told me he sent gabriel to stop it, and I heard, "I led you", and gabriel will see people reading this, and if you read about how im being tempted to sin all the time just about, you wont like it, and it is worse then youll read, like I woke up this morning and all desire to live for Jesus was stripped right out of my heart, and I saw Jesus in visions and didnt record what he said, but he mocked me, scared, teased, like this morning, I saw Jesus and he yelled something like, "got you", I saw Jesus this morning, and he had brown hair, and he said, "om jelous. . Please pray for me. in vision I saw me in hell and fire was coming from hand or hands, -
I'm in neither the static camp nor the dynamic camp. Python and OCaml are my favorite languages. I understand being fed up with C++ and Java's type systems that give you relatively little compared with the verbosity and hassle they add. Most of the people who are big static typing evangelists also strongly dislike the Java and C++ type systems.
I think we can agree that "gradual typing" (optional static typing) allowed by ECMA Script 4 (R.I.P.) and some languages like PLT Scheme/Racket are exciting directions for programming languages. I think ideally I'd like to see a language with a statically typed dialect and a dynamically typed dialect that target the same virtual machine. (Perhaps something like IronPython and Boo are what I'm looking for.)
Another exciting idea somewhere between static and dynamic typing is "soft typing".
As far as I can tell, the aside about multithreading in Java vs. C++ is about the relative ease of making non-threadsafe legacy code threadsafe. Am I understanding you correctly? I don't see a big threading advantage in Java vs. C++ apart from the truly amazing way monitors are implemented in HotSpot/OpenJDK. Two different types of ultra lightweight locks are used, and in some cases, a thread trying to acquire a monitor will go and modify the stack of the thread holding the monitor in order to replace a lightweight lock with a mutex on the fly. Now, I think Erlang's shared-nothing approach is better, but the JVM's locking mechanisms are pretty slick.
As far as the paper on double dispatch goes, the trick relies on two things: (1) the dynamic language interpreter is implemented in a statically typed language and (2) this statically typed language runs on a tracing virtual machine. Because these two conditions are met, in the common case you get two highly predictable branches (checking the vptrs of both objects) followed by inlined code for the method body. By the way, it's not that you call a.add(b) and b.add(a), you call a.add(b), which is always implemented as return b.radd(this); In order to pull the same trick if your interpreter is written in a dynamically typed language, you need to do your own manual name mangling on your radd methods.
I think language-specific CPU instructions are generally a bad idea, but there are a hand full of instructions that would help any JIT implementation. Branch-on-random would be useful for detecting hot spots and traces. Bounds-checking array load and store instructions that assumed array sizes are stored at index -1 would be nice for all bounds-checking languages. A branch-if-either-even instruction (as in BREVEN %r3, %r5, slow_path) would be useful for all of the virtual machines that use the 31-bit or 63-bit tagged int trick, such as V8, SpiderMonkey, Ruby, OCaml, etc. Branch-if-either-even would allow a tracing (or traditional) JIT to replace two conditional branches in the fast path with a single conditional branch. Instead of the VNZ flags on x86, a small number of boolean registers like ia64 along with a predicated push instruction (using a different register than sp as the stack pointer) would make it much easier to generate native code that could be efficiently traced, like Mozilla's JagerMonkey project would eventually like to do. None of these instructions are language-specific, and some of them would be widely useful even outside of JITs. -
Wow, thanks for the transcript of your presentation! It was really interesting! However, I am curious - what were the optimizations you spoke of when you said:
"I'll be honest with you, I actually have two optimizations that couldn't go into this talk that are even cooler than this because they haven't published yet. And I didn't want to let the cat out of the bag before they published. So this is actually just the tip of the iceberg."
Thanks!
That HotRuby Ruby-in-JS thing is fast because it's a *toy*. It removes a large number of features and guesses at the implementations of a number of methods, so it's really doing a lot less work.
I can turn on unsafe optz in JRuby and almost get it as fast as equivalent Java code (sans primitives) but I'd never claim that's actual performance.
— Charles Oliver Nutter · 12:29 AM, May 12, 2008
Did you use Comic Sans in your slides to irritate people? Because it worked. I hate that it worked, but it did.
— Unknown · 12:50 AM, May 12, 2008