Saturday, June 14, 2008

Rhinos and Tigers

I will once again plagiarize myself by transcribing a talk I gave.

First: be warned! I offer this gesture of respect to you — yes, you! — when I say that this is at least 20 minutes of reading. This is long even for me. If you're surfing reddit, gobbling up little information snacks, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it's best to think of this entry as being more like a big downer cow. Unless you're really hungry, you should wait for it to be sliced into little bite-sized prion patties before consuming it.

If you do read it, you'll see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CJD analogy is surprisingly apt. I ramble even more than usual, and lose my train of thought, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides might as well be scenes from a David Lynch movie for all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 relation cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have to my actual talk.

But once again I find myself astonished at how much I agree with myself, by and large. Funny how that works. And I made a few decent jokes here and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. So I'm transcribing it.

If you're impatient, and I wouldn't blame you a bit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best part is probably "Static Typing's Paper Tigers". That might be worth reading. As for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest... *shrug* If you're really starved for content, you might find some of it entertaining.

The Setting

I gave this talk at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Google I/O Conference in San Francisco a few weeks ago. My talk was boringly titled "Server-Side JavaScript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Virtual Machine", and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were initially only about 40 or 50 people in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 room (out of a 2500-person conference) when I started cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talk.

Even though I personally thought cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talk was pretty boring, people kept trickling in, and I estimate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were about 400 people stuffed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 room by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end. It was standing-room only, and people were spilling out into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hall. The conclusion? The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r talks must have been really boring.

After my talk it became pretty clear to me that it should have been titled "Rhinos and Tigers", so that's its new name. I've tried to make it flow well by splitting it into arbitrary sub-sections, whose titles aren't really part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talk. But ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise it's pretty much a word-for-word transcription, except with most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 umms and aaaahs elided. I've included cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides that seemed relevant; you can find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Google I/O site.

So enjoy! Or not. I've given you plenty of warnings. You'll see!

Rhinos and Tigers



Hello! I'm Steve Yegge. I work at Google. I've been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re about three years, and it's real nice.

I'm going to be talking about server-side scripting in general, and talking a lot about Mozilla Rhino and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technology behind it. I'm going to try to get through it in maybe 20-25 minutes, maybe 30 if I start ranting, at which point I'll open it up for questions. I kind of want you guys to help drive how this goes.

Make sense? (Ed: Well, it made sense at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time. Sigh.)

All right, cool. Let's get started.

Sooo... I'm going to be talking about Server-Side JavaScript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Virtual Machine.



Yes. We've got this big animal. Rhino.

So let's see... who here has used a JVM language before? Oooh! My god, lots of you, almost all of you. Great!

Well I'm going to be talking about Rhino in particular. I'll be making reference to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r JVM languages. I want to kind of help you see how this fits into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 landscape, why you might use it, why you might not use it.

But for those of you who haven't used a JVM language, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Virtual Machine is sort of like .NET: you can run multiple languages on it. You can write an interpreter in Java, or you can compile your language down to Java bytecode. Or you can compile it down to your own bytecode; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are different ways to do it.

But typically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se languages are sort of drop-in replacements for Java. Which means you can implement classes, you can implement interfaces, you can subclass things. It gives you an alternate syntax and semantic layer on top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libraries, and on top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual machine.

I'll assume that this makes sense... well, actually, I won't!

FOO Chaos

There's this dude named Walter Bright, who wrote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 D programming language, among many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things. (Raise hand) Has anyone heard of Walter? He's this really smart dude. He wrote Symantec Cafe, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game Empire [and Zortech C++].

He told me cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r day, [talking about] one of my blog rants, that he didn't agree with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point that I'd made that virtual machines are "obvious". You know? I mean, of course you use a virtual machine!

But he's a compiler dude, and he says cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're a sham, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're a farce, "I don't get it!" And so I explained it [my viewpoint] to him, and he went: Ohhhhhhh.

Virtual machines are great for language interoperability. If everybody in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world used his language, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n yeah, you probably wouldn't need a virtual machine. You'd probably still want one eventually, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 just-in-time compilers, and all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime information cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can get.

But by and large, we don't all use D. In fact, we probably don't all use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same five languages in this room. And so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM, whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CLR, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java VM, or Parrot, or whatever... it provides a way for us to interoperate.

Now I'll tell ya — I was at Foo Camp last summer. I've been wanting to tell this story... I'm telling you guys; it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 coolest story. And it's relevant here. Heh. Very relevant.

So I was in this tent... you know what Foo Camp is? It's O'Reilly's, you know, Friends Of O'Reilly invite thing that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do each summer. It's coming up in a couple of weeks. And people give presentations; people show up and just wander into your [presentation] tent, and wander back out if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't like it.

So I was in this discussion at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last day, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple LLVM guy Chris [Lattner] was hosting a talk on dynamic languages running on different VMs. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Smalltalk Squeak guy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was Charles Nutter for JRuby and representing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM. John Lam was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re for IronRuby and CLR, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Parrot people. I can't even remember cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole room was packed with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM implementors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VMs today, and people who are implementing languages on top of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

This was a smart group of people, and well-informed. And you know, I was like a fly on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wall, thinking man, look at all [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se brains].

And Chris, well, he let everybody go around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 room and talk about why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir VM was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were all right! That's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 weird thing: every single one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m was right. Their VM was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best for what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y wanted cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir VM to do.

Like, Smalltalk [Squeak]'s VM was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sense of being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purest, and it was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cleanest. Whereas cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java one was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best because, you know, it has Java! Everybody's was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best. Parrot's was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best because it was vaporware. Ha! Ha, ha ha. Sorry guys.

So! He [Chris] asked this really innocent question. He goes, "You know, I don't really know much about this stuff..."

Which is bad, you know. When somebody says that to you at Foo Camp, it means cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're settin' you up.

He says, "So how do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se languages talk to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r?"

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 room just erupted! It was chaos. All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se people are like, "Oh, it's easy!" And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rest of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are like "No, it's hard!" And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're arguing, and arguing, and arguing. They argued for an hour.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y stood up, still arguing, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y kept talking about it, heading into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dinner tent. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sat down, going at it for like three hours.

It was chaos.

Because some people were saying, "Well, you know, if Ruby's gonna call Python, well, uh, you just call, right? You just share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same stack, right?"

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs are like, "Well, what about different calling conventions? What if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y support optional vs. non-optional arguments? What if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y support default arguments? What about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 threading model? What about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 semantics of, you know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 this pointer? What about all this stuff?"

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're like (waving hands) "Ooooh, we'll gloss over it, gloss over it, smooth it over." And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reply is: "You can't. This is fundamental. These languages work differently!"

And oh my god, it was really interesting. And it was also very clear that it's ten years of research and implementation practice before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y get this right. Before you'll be able to have a stack of calls, where you're calling from library to function, library to function in different languages.

So today, VMs are good for interoperability, but you've gotta use a bridge. Whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r it's JRuby, or Jython, or Rhino, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y provide a set of APIs — you know about javax.script, right? It's this new thing introduced to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JDK, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y try to formalize just a couple of APIs around how you call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scripting language from your language... you know, it's a sort of "reverse foreign-function interface". And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y call each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, maybe.

But it's all done through... kind of like serialization. You marshal up your parameters as an array of arguments, and it's a heavyweight call that goes over [to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script runtime] and comes back, and it's like... it's a pain! You don't want that. But today, that's kind of what we're stuck with.

At least we have that, though, right? I mean, try having Ruby call Python today, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have different FFIs. You can do it, but you definitely want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 VM's help.

So, Walter, that's why you need VMs.

Power to your users



So! Yeah, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a lot of stuff I could talk about. I gave a practice of this talk to Mike Loukides, an editor at O'Reilly, and it completely changed what I wanted to talk about.

I do want to talk about Rhino's technology; I want you to come away understanding it. But more importantly, I want you guys to understand where this fits in this Google conference. And where it fits in your plans, going forward.

See, it's really interesting. We all know, or at least most of us I think agree, that server-side computing is finally starting to make inroads onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desktop. Fat clients aren't so much cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 norm anymore. You've got applications like Google Maps, GMail, Google Docs, those kinds of apps, that are doing "desktop quality" applications in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server handling your storage.

That's kind of one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 messages of this conference. Everybody's doing it, right? It's not just Google. And it makes a certain amount of sense, so I'm not going to go into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons why you'd do that. I'm assuming it's sort of a given. (Editor's Note: you'd be amazed at how many emails I get from people who maintain it's a fad of some sort, one that's going away, which is why I bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r to make this disclaimer.)

The interesting thing is this: all applications... who was it who said "All apps will eventually grow to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can read mail, and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'll be replaced by ones that can"? (audience: "JWZ") JWZ? Jamie Zawinski. Yeah. It's a variant of somebody else's quote [Greg Kuperberg's], but...

So it's true, right? Apps grow. If you like an app, you're gonna want to start doing more and more stuff in it. If you like it a lot, like I like Emacs, heh... you know, you like your editor. Everybody here is a programmer, right? You all use development environments? Do you ever find it kind of annoying that you have to switch from your IDE to your browser? Why isn't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDE cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser too? Why aren't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se unified?

I mean, let's face it: I only run two apps. Unless I need to run, like, OmniGraffle or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Gimp, or something to do a document, or Keynote here to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presentation — I just switched to Macs, so I'm learning all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se names, but, this PowerPoint thing — most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, when I'm developing, I'm running shells, and I'm running Emacs, and I'm running a browser. That's it! So you kind of wish cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'd be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same.

Well, once cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y get big enough, your IDE and Emacs and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser have this thing in common, which is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are scriptable!

That's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 magic point at which your application becomes sort of alive. Right? Because people can change it, if it doesn't work cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y like it.

GreaseMonkey! Perfect example. You don't like our web page that we give you? Write a GreaseMonkey script and change it all around, right? That's cool! Scripting is really important.

I mean, Emacs, it stands for "Editor Macros", and it started off as a really thin engine, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole editor was written in scripts. And now it's huge. It has a million lines or so of Emacs-Lisp code floating around.

So it's weird... you go through this transformation, where your scripting languages are originally for, well, scripting. And it eventually grows into application level/scale development. OK?

Now we all see this happening in clients. Excel, for instance, is scriptable. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason that Excel is so powerful, I mean cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason that you can go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bookstore and get a book that's this thick on Excel, and scientific computing people use it, whatever, is that it has a very very powerful scripting engine.

In fact, all of Microsoft Office has it. Right? You can fire up Ruby or Python or Perl, and you can actually control, though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 COM interface, you can actually tell IE to open a document and scroll to a certain point in it. Or you can open up Microsoft Word and actually... I mean, if you want to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 work, you could actually get to where you're typing into your Perl console and it's showing up over in Word.

Server-side computing has to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. It's gonna get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

But how many server-side apps are user scriptable today? Precious few. Google has a couple, you know, like our JotSpot acquisition, which is [scriptable] in Rhino...

So we're talking about something that's kind of new. I mean, we can all see it coming! But it's still kind of new, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea, right? Why?

Because this is scary hard, from a security perspective. Heh. You're going to run code on my servers? Uh... OK...

I mean, Yahoo! Store, you know, Paul Graham's Viaweb that went on to become Yahoo! Store. People have done it, right?

I wrote a game that was really cool. Scriptable! I mean, high school kids were teaching cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves to program so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could write areas and monsters and spells and quests for this game that I wrote, which was written in Java and scriptable in Jython.

It's a big deal! I mean, people want to be able to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se apps.

However, I had to live with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that I didn't personally have enough bandwidth to come up with a decent security model to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m from... it's a trust-based security model in my game. They write a script, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could erase my hard disk, right? So I've got to be very careful, and recognize that I can only let certain people that I trust do it. And that I've got to be prepared for really big disasters.

Because also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's denial-of-service. It's inadvertent: oh, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir script is taking up all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bandwidth [or CPU or memory] on my server, and everybody else in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is paralyzed. Right? I mean, how do you deal with it?

You've got to deal with user [i.e., programmer] throttling: memory usage, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 database or datastore usage, like Amazon's computing cloud, you know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have a lot of this stuff in place. But usually it's pretty coarse-grained when it gets started, right? You get a box, and a certain amount of disk storage, and you get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole CPU, because how are you gonna allocate CPUs out to people when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 languages cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves that are being used for scripting don't support that? (Editor's Note: obviously you can just use process scheduling, but I'm talking more about multithreaded processes like my game, or Second Life, where many users may be scripting within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same processes. It makes things harder.)

We're getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re; it's happening. But it's new. And it's hard. Because you don't want people to be able to go and get access to your company's proprietary code or resources and wreak havoc. You just want to host cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir computing.

So when you decide you're going to take your server-side application, with its beautiful Ajax app talking to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server, and now you want open it up: to add extensibility for your end users — cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're not just scripting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's scripting happening on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server that's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365irs — you have to make a decision!

Namely, what language are you going to give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m?

We have... see, unfortunately it's hard for me to talk about Google products, because all I know are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir internal code names, and not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir launch names. I can never remember cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. But we have... something like that. Heh. Called... Promecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365us, I think? Uh, wha... what is it?

(audience member: Google App Engine) Ahem, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Google App Engine, of course! Yes. The Google App Engine. Ahem. Yes. (me: embarrassed)

And I think it's... Python. Right now. But of course cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y want to open it up, because, it's like, you don't really want to force people to switch editors, unless you want a real fight on your hands. You kinda don't really want to force people to switch languages eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, right? People want to use whatever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're comfortable with.

So again, you wind up with this hosted environment, where you're supporting multiple languages; which one do you pick [first]? They picked Python. You can pick [anything], but you've got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se problems to deal with. And I'm going to argue today that Rhino is actually a really good choice for this particular problem space.

OK, we've got people pooling up in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 back here. Is it time to invite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in? Come on in, sit down, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's space! All right, cool. Yeah. Welcome!

So yeah. That's what I'm talking about today. Do you guys understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 perspective now, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context? I'm talking about server-side scripting, that eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r you do yourself inside your company, because you feel like you've got some logic that needs to be kind of "glue" logic — "scripting" — or, more importantly, you're opening it up to your users. Which means you need to sandbox it, and you need to meter it and throttle it.

Advantages of scripting on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM



All right. Yeah. So this is a JVM language. A JVM language can share cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java libraries, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Virtual Machine. It's really cool, right? And really powerful.

Right off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bat, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se JVM implementations of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages, like JRuby vs. Ruby, Jython vs. Python, right? They get all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se free benefits, that may not necessarily exist in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C runtimes for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se languages.

Example? Java has a really good garbage collector cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days. A generational garbage collector that's becoming an incremental [and/or concurrent] generational garbage collector... I mean, it's good! Whereas for a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se [C-based] languages, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y use mark-and-sweep, reference-counting...

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one is native threads. It's veeery nice to have native threads, and also have well-defined semantics for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 threads and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y interact with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory model. I mean, a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se [non-JVM] languages are like, "Well, we have threads, but you probably... don't want to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m." Because you're kind of on your own.

So what happens is people use process-switching; it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 share-nothing model. And that's great too, for certain situations. Provided you've got good engineering library support around it, like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java.util concurrency libraries. They can help you design something without having to do a formal proof around it to get it to work.

That helps a lot in multicore. It helps! JavaScript has no [language-level] threads, because Brendan Eich says "over his dead body". I totally understand where he's coming from on this, right? There's certainly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "promise" of better concurrency out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. Erlang, you know, and maybe STM...

But hey man, today? I mean, right now? You want to write something with high throughput, and you've got a lot of I/O to do, and it's parallelizable? And you want to get a lot of throughput on one box, because it's got multiple cores?

(shrugging) Well, threads get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 job done. So if you've got it in your so-called "scripting language", it's a big win.

We've got garbage collection, threads... and asynchronous I/O, right? When Java first came out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole "one thread per socket" model [actually, two], which meant that you couldn't write a webserver that could handle ten thousand concurrent requests. It didn't matter how much memory or CPU your box had. Anyone here ever tried to fire up 10,000 threads on one box?

Yeah... yeah. What happens is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scheduler and task-switching resources for managing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 threads swamp your machine. So eventually Java wrote a wrapper around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Unix or Windows or whatever native interfaces so you could get super-high throughput.

So all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sudden, by sticking something on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM... Sure, you initially get a bit of a hit in performance. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se people first port a language to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Virtual Machine, it's usually about twice as slow, right? BUT, it's got async I/O, and it's got [native] threads, and it's got better non-pausing (by and large) garbage collection. And from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can make it smarter.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've also got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT. I don't know, I mean, did anybody here... I gave a talk on dynamic languages recently at Stanford, but I don't want to rehash that if you guys already know about that.

Basically I argued in that talk — successfully at Stanford, so I think that was... something — that for just-in-time compilers, it's becoming pretty clear, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have a lot better access, a lot better data at runtime about how you're actually using your program right now than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiler ever had.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JITs can do all kinds of inlining and optimizations that you just can't do in a compiler. And what that means is that everybody running on this VM gets to benefit from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are lots of advantages to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se JVM languages. Or .NET, if you happen to be using Microsoft stuff. It's a good model.

But why Rhino?



So why Rhiiiiino? Why JavaScript?

(loudly) Who here thinks JavaScript is kind of icky? Come on, come on, be honest. Yeah, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re we go, a couple of people. Yeah.

Yeahhhh... and you know what? It is! Right? Because, well, because of vendor implementation issues. That's one [reason]. Also, Brendan was kind of forced to rush it out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 door. You guys know... back at Netscape, when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y built JavaScript, it was called, um, LiveScript?

And Brendan was building Scheme for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser. Scheme!

Everyone in here who knows Scheme, raise your hand. (Many people, at least fifty, raise cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir hands.)

Holy... smokes! A lot more than I would've guessed. Wow.

OK, well, as it happens, you guys are not "representative". (laughter)

And so, Netscape kinda looked at it, and said: "Yeah, well, we did say Scheme, but, uh, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's this Java thing, this giant marketing thing, and we want to be involved with it." And some back-door deals happened, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y came to Brendan and said: "Make it look like Java."

So now it's Scheme with Java syntax, right? So he had to pull a lot of all-nighters for a couple of weeks, and he came up with JavaScript.

So, you know, it's got some flaws. Some of which make you want to go scrape your teeth on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sidewalk because it's less painful. So it's true, but what language doesn't have some flaws?

The interesting thing about Rhino, which is an implementation of JavaScript in Java, is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's only one language. You don't have to worry about vendor-implementation or cross-platform problems because... it's just Rhino. So right out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 starting gate, that's a win.

Plus, Rhino gives you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to work around some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems. A classic one is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem in JavaScript where you can't define non-enumerable properties. Right? You know how you can go for (i in foo) ..., and it'll enumerate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 keys of your object as if it were a hashtable.

Nice feature, right? And you can add properties to objects; you can go to Object.prototype, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 root object of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole system, and add your own function(s) cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. But what happens is, you've added a function that's now enumerable in everybody's arrays, and everybody's data structures, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir for..in loops break.

Which means that fundamentally you can't install a library that's completely seamless and emulates Ruby or Python or some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r really expressive set of library functions. Like, you want your map and collect, and your String.reverse, and... you know what I mean?

You can't do it in browser JavaScript, so people wind up going different routes. They eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r do what Prototype does, and just install it, and you're screwed if you use for..in, but you don't use for..in, right?

Or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y use functions. They don't use object-oriented programming. And you know, functional programming is great and everything, but OOP, as we've discovered in programming in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 large, is a nice organizational tool. Putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function or method togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing that it's operating on is a nice way of organizing things.

So it's kind of unfortunate when you have to use functions, because if you have to say, you know, HTMLElement.getChildren.whatever, it gets inverted with functions: whatever(getChildren(HTMLElement)). You have to call from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 innermost one to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outermost... it's "backwards", right?

Rhino winds up getting around that problem completely. We did, anyway, internally. Because it's written in Java. So you can call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino interface. You can call Parser, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime; you can do whatever you want.

So I wrote this little defineProperty function, that's like five lines of code. It calls into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script runtime Java class that implements JavaScript objects, which has a non-enumerable defineProperty.

JavaScript has non-enumerable properties; it just doesn't let you add your own. It's just a language flaw, right?

That [defineBuiltin function] enabled us, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project I'm going to be talking about a little bit later here, to implement all of Ruby and Python's runtime — all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions we liked — in [server-side] JavaScript, in a non-intrusive way. We were also able to implement a class system, and all this ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r stuff.

So Rhino is not browser JavaScript.

Man, we've got more people pooling up at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entrances. You guys are welcome to come in, squeeze in and sit down... come on in... welcome. There's still space. Especially up here kinda in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 front, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle, where nobody wants to sit. But trust me, it's better cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

So yeah. Rhino's history: it's like ten years old. Or more? More than ten years, maybe. It started inside Netscape, side by side with SpiderMonkey. A lot of people have been hacking on it. Rhino's pretty robust.

Rhino at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shootout

I have a question for ya. I did this "JVM shootout" like three and a half years ago. I was kind of tired of using Java for scripting, and I wanted to look at all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM languages. So I did this game. You know about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game Sokoban? I would have done Sudoku if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 craze had hit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n. It's a little dude who pushes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se blocks around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se mazes?

Well, I reimplemented this thing, which is about, you know, six or seven hundred lines of Java code. It had a [user] interface, and a little search algorithm that had him chase your mouse. It was just big enough of an application that I could reimplement it in like 10 different languages, and actually compare how it was speed-wise, how to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 languages], how well cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y interoperated with Java... it was an actual apples-to-apples comparison.

Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m really, really, REALLY stank. It was baaaad. I mean, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are like 250 JVM languages out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, but most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are just complete toys. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were ten or so that were actually pretty good. You could do anything in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y had decent performance, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were good, right?

And it [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shootout] kind of petered out, because it started looking like Rhino-JavaScript was going to win. I had this sort of solution selection matrix of criteria where... it was kind of a heuristic function where I weighted all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se terms, right? Just to kind of get a feel for which one [was best].

And I wanted JRuby to win. You should never go into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se comparisons wanting one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to win, because, you know, you're eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r going to bias it or you're gonna be disappointed. JRuby at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time was really slow. It's much faster now, and everything, but at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, it was so new.

Jython was good, but it wasn't fast enough, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author of Jython had gone off to greener pastures.

Rhino! Rhino had good tools, and it had good performance, and it was... JavaScript! Eeeeww!

So I never even really... I published it, but I didn't leave it up. I'm actually going to bring it back up again soon; I'm going to update it and do a couple of new languages. Because I find this an eternally fascinating question, which is: what is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next big language, especially on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM, going to be?

Domain-specific languages

Java will always have a place. But I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are domains, like Java Swing, you know? The Java GUI stuff? Java's really not very good for that. We've kind of figured out that Object-Oriented Programming doesn't work that well for UIs. You want it to be declarative. HTML showed that you want a dialog, with a title bar, and a body, and it nests, to match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 [UI] tree.

That works really well. It's succinct. Even in HTML it's succinct, right? Whereas with a [Java-style] object-oriented language, you've got to say, you know, createContainer(), addChild(), addChild(), addChild(), 'til cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cows come home. And it doesn't look anything like... you can't pattern-match it and say "ah yes! this looks just like my UI!"

So people write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se wrappers around Swing. Like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's Apache Jelly, which wound up with this XML framework to do Swing programming, that was 30% less verbose than Java.

What are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 odds that XML's going to wind up being less verbose than anything? (loud laughter) Really! I mean, I was shocked. 30% less verbose. And I looked at it, too. They weren't cheating. I mean, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best Swing implementation in Java that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could, but Jelly was better.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are domains for which Java is just not appropriate. But you still maybe want to use a VM for all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons that I outlined earlier.

So yeah! There's room for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages. But which one? All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m? Are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y going to solve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem I brought up from Foo Camp earlier? To where it doesn't matter which language you're using; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can call each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, and [mix however you like?]

I mean, how's your editor going to feel about that? How's your team member going to feel about it? A lot of people don't like learning new languages.

Who here doesn't like learning new languages? Come on, be honest... (A few people raise hands) Yeah! New languages. No fun!

It's actually kind of... you should try it. (laughter) You know? It is. It's a good idea.

There's this dude — has everyone heard of The Little Schemer? The Little Schemer, The Seasoned Schemer, The Reasoned Schemer? Cool books, right? Teach you functional programming in this really bizarre format that hooks you in.

Dan Friedman, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 guy who [was] one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 collaborators on those books — I was reading an article he wrote. Early in his career he realized that languages are fundamental to computer science and to engineering; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're really important. And he wanted to be able to learn a new language every quarter.

And after he did that for a while, he said, you know what? I want to learn a new language every week. OK? And you can actually get to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point where you can do this. Now it probably takes 2-3 months before you're actually as comfortable with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new language as you were with your favorite old one. This happened to me with JavaScript; I was freaking out for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first couple of months, thinking "this is never gonna work".

But eventually you get over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hump, and you're like (relieved sigh) "aaaah, yes." Right? You learn how to work around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems. It's just like learning Java or whatever your first language happened to be. You've got to learn your way around all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se problems, and you've gotta learn how things work, and how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libraries are laid out. And all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sudden it becomes like breathing.

So Dan Friedman, after he said he was learning a language a week, I thought, "wow, that's pretty macho." But he said, nah, that wasn't good enough: he wanted to be able to implement a language a week. And he got pretty serious about it. Spent years researching how to do this effectively. (Well, now I'm just speculating – Ed.)

This is where I'd love to see engineers today. Knowing languages will make you a better programmer. It will! It will even if you're not using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. Just write a little application in it, and it opens your mind. [Each new one] opens your mind. And now suddenly you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 superset of all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 languages out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. So it's not scary to learn new ones.

And you can also recognize situations where a language is actually cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right tool for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 job. Not a library, not a framework, not some new object or some new interface. A language!

Case in point? Regular expressions. (raise hand) Who likes to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own giant deterministic finite automata to do string matching? Heh. It's weird — nobody raised cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir hand.

Who likes to do lots and lots of manual DOM manipulations, as opposed to, say, XPath? XPath is a language, right? DOM manipulations, you know... it depends, but usually, no: not if you can get away with using a language for it.

I could talk for hours about that, so I'm not going to. But, you know... it's good to learn new languages. So I'm gonna teach you JavaScript today. I'm gonna dive in. So let's go!

The right way to do unit testing



Oh yeah. So unit testing. I mean, like, all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r stuff on this slide is like "blah blah blah", but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n Unit Testing [in Rhino] — this was a real surprise to me.

I write a lot of Java code day to day, [out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365] probably five different languages I code in regularly. And unit testing was always a chore. Unit testing is a chore.

I mean, come ON. Unit testing's a chore, right? (raise hand) Who here thinks unit tests are just a poor man's static type system? Eh? (some laughter) Yeah!

Well, not really, since you have to write unit tests for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static languages] too. (more laughter)

You need to write unit tests, and unfortunately in Java it's very painful. I'm speaking into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mic now, so that everybody can hear. Unit testing in Java is painful!

It's so painful that people, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java... community, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java world, has evolved around it. OK? They've said: "Don't use constructors. Constructors are baaaaad."

(pointed pause) I mean... what!? (laughter)

I mean, like, if you program in Ruby, say, you know that you can actually change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metaclass produces objects. So if you want it to be a singleton, or you want it to meet certain... you want it to be a Mock object, you just replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new function on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fly, and you've got yourself a Mock constructor, right?

But Java's set in stone! So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y use factories, which leads to this proliferation of classes. And you have to use a "Dependency Injection Framework" to decouple things, right?

And it's just, like, (panting)... We were doing business logic early on in Java. When Java came out, it was like: "Ooooh, it's a lot easier to write C code", basically, or C++. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than focusing on your memory allocation strategy, or which of your company's six conflicting string classes you're gonna use, you get to focus on "business logic".

But unfortunately that only took you so far. Now you're focusing on Mock object frameworks. It [Java] only took you a little farcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

Now I swear, man, doing Mock objects in Rhino is so easy! It's easier, even, than in JRuby or in Jython, because JavaScript has JSON. I didn't even know, like, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of it when I started doing this, right? But JSON... I've gotta show you guys this. This is so cool. (flipping through slides)

Yeah, tools, blah blah blah. We'll come back to it. Oh, it's way down in here. Urrggh. Come on... here's one!



OK. Down on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bottom we've got some code here. Actually on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top, too. So I do a new Thread with a new Runnable, and, uh... it sure looks a lot like Java code, huh? This is one advantage of JavaScript, actually. Java...Script, right? Ten years later it's finally becoming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scripting language for Java?

So that syntax (with an obj literal following new Runnable()) is a little weird, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one here that says:

js> obj = {run: function() { print('hi') }}


So I've declared an object literal, using "JSON style". Now JSON doesn't let you do — does JSON let you do functions? Probably not, right? But I mean, fundamentally you're doing this declarative property-value list, right?

And so what I've got is this anonymous thing that has a named "run" property whose value is a function! That prints "hi". And now I can create a new Thread, with a new Runnable that wraps it, and what effectively I've done is I've used that thing as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Runnable interface [implementation], which expects a function called "run" that takes no arguments and does whatever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread's supposed to do.

This is how you do mock objects!

I have this huuuge legacy system, right? With hundreds of static methods. Static methods are also bad cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se days, right? Noooo static methods. 'Cuz cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're not mockable. Right? Java has changed Java. Because Java's not unit-testable. So now you can't just go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 store and [buy a book and] learn Java. You have to learn all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se... fashions. You have to learn what's in vogue.

Subclassing! Not in vogue right now. You talk about subclassing, and people are like "NNnnnnnooooo, you should use manual delegation even though it's really hard and cumbersome and awkward."

And you're like, "but I just want to change this one method, and plus it's built into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's syntax for it, and it's kind of well-understood..." And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just say "NO!"

It's out of favor. For similar reasons. Oh my god...

And I'm telling ya: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason unit testing is easy, is, fundamentally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way you develop in a dynamic language is different from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way you develop in a static language: C++, Java... OCaml, Scala, whatever. Your favorite static language.

To a large extent, especially in C++ and Java, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way you develop is:
  1. you write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
  2. you compile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
  3. you load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
  4. you run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
  5. it doesn't work
  6. you back up
  7. you change it again

So it's this batch cycle, right? 1950s. Submit your punch cards, please.

In a dynamic language — and this is clearest when you're writing in Emacs Lisp [because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 *scratch* buffer] — but it's somewhat clear when you're developing in a console, in Python or Ruby, Perl, Lua, whatever, you write an expression, and you give it some mock data.

You're writing a function, you're building it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fly. And when it works [for that mock data], you're like, "Oh yeah, it works!" You don't run it through a compiler. You copy it and paste it into your unit test suite. That's one unit test, right? And you copy it into your code, ok, this is your function.

So you're actually proving to yourself that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing works by construction. Proooof by construction.

Obviously you still need your unit tests (er, I meant integration tests – Ed.), because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's going to be higher-order semantics, you know, calling conventions between classes and methods...

Whew! This room is really filling up. Um, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re anything we can do to help here, guys in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 back? (Tech guy says something inaudible in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video) Yeah, please! There're more seats here. I just want to... I don't want to get to where people can't even make it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 room.

Yeah, so unit testing. I know you guys all hate unit testing. So did I. Or you say, "I looooove unit testing," but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n, you know, your test coverage is still sitting at like 80%.

I'm telling you, man, this is a huge, huge thing. It changes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way you do your development.

Rhino's not Ruby



And oh, yeah... I'm going to be talking shortly here about Rhino on Rails, which is this thing that I did... it's not Rhino on Rails, actually. It's actually, I called it "Rhino's not Ruby". Because I got kinda burned at Google for using Ruby. Yeah. Uh, for good reasons, good reasons. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were like: "No."

And so of course I called it "Rhino's not Ruby": RnR. Because people know JavaScript; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're kinda comfortable with JavaScript, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were OK with it. So I had to port Rails; it was kind of a lot of work, but, you know, well it works! We're using it here internally; it's nice. I mean, I actually know it's nice, because six months went by and I didn't look at it for those six months. And for this recent project, I picked it up, and I was, like, is this gonna be gross?

But actually, it's really pretty nice. Because you've got all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java libraries, and all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integration with Google stuff. It's cool. I'll try to open-source it this year, if I forget to say that later on.

Anyway, I was writing unit tests for this thing, and... uh... (I completely blow my stack. Who am I? Where am I?)

Have I lost where I am on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides? (Duh.)

I've diverged from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slides. I'll come back to RnR shortly. Basically, I got unit-testing religion. That's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end of that sort of stack.

If you can do it easily, and you don't have to rewrite your application to be unit-testable? Man. That's a big difference.



So why would you not use Rhino for server-side scripting?

Well, it's not super-duper fast right now. It's on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 order of about twice as slow as Java, depending on what you're doing. So if it really has to be super, super fast — use C++! Right? Naaaah, you can use Java. Like I was saying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r day [at Stanford], it's widely admitted inside of Google — cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's this whole discussion, is Java as fast as C++, right? And Google Java developers definitely admit that it's as fast as C++. The C++ people, well... yeah. (sigh)

Let's see... if you're writing a library, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n Rhino's actually not so good right now. There is no standard library interface for scripting languages. We haven't got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re yet. It's all, it's all related to what I told you about before, you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calling interop. A lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se [languages] have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own package systems: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own import, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own require, right? So if you're gonna write a library, you should probably still write it in Java. Maybe.

If you're doing a framework, where you're defining how things are called: whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r we're calling you, or you're calling us, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it's OK.

And if you really hate JavaScript, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n that's, you know, that's fine... But keep in mind, again, that you may be providing something for your end-users. If you go out to a high school and you survey people, and you ask, "So what language are you learning? How are you teaching yourself programming?" It's a sure bet that a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are doing Ajax stuff. Right? A lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are doing JavaScript.

If you want to make your end-users happy, and you want to immediately capture a very big user base, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n no matter how you detest JavaScript (and again, Rhino-JavaScript's really not as bad as browser JavaScript, it's much better), your users probably will prefer it. It's something to keep in mind.

All right.

Static Typing's Paper Tigers

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we've got Scala. I've gotta mention Scala. Who here knows... you've heard of Scala? Yeah? (a few hands go up) Mmmmm, yeah, getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re... looks like some people, OK.

Scala is a very strongly typed language for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM. It's from researchers in Switzerland; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're professors. It's from sort of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same school of thought that static typing has evolved with over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last fifteen years in academia: Haskell, SML, Caml, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se sorts of H-M functional languages.

And Scala's interesting because it actually takes a functional static type system and it layers... it merges it with Java's object-oriented type system, to produce.... Frankenstein's Monster.

I've got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language spec here in my backpack. Oh, my god... I mean, like, because it's getting a little bit of momentum, right? So I figure I've got to speak from a position of sort of knowledge, not ignorance, when I'm dissing it. (Heh heh.)

And so before, I was like: "Oh yeah, Scala! Strongly typed. Could be very cool, very expressive!"

The... cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365... cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language spec... oh, my god. I've gotta blog about this. It's, like, ninety percent [about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system]. It's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 biggest type system you've ever seen in your life, by 5x. Not by an order of magnitude, but man! There are type types, and type type types; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's complexity...

They have this concept called complexity complexity Meaning it's not just complexity; it's not just complexity-complexity: it's parameterized complexity-complexity. (mild laughter) OK? Whoo! I mean, this thing has types on its types on its types. It's gnarly.

I've got this Ph.D. languages intern whose a big Haskell fan, and [surprisingly] a big Scheme fan, and an ML fan. [But especially Haskell.] He knows functional programming, he knows type systems. I mean, he's an expert.

He looked at Scala yesterday, and he told me: "I'm finding this racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r intimidating."

I'm like, "THAT sounds like it's gonna take off!" (loud laughter) Oh yeah!

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 funny thing about Scala, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 really interesting thing — you guys are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first to hear my amazing insight on this, OK? — is: it's put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java people in a dilemma. There's a reeeeeeeal problem.

The problem is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java people say, "Well, dynamic languages, you know, suck, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't have static types." Which is kind of circular, right? But what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y mean, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y say: No good tools, no good performance. But even if you say, look, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools and performance can get as good, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y say, "Well, static types can help you write safer code!"

It's... you guys know about those talismans? The ones, where, "What's it for?" "To keep tigers away"? (some chuckling) Yeah? And you know, people are like, "How do you know it keeps tigers away?" And your reply is: (sneering) "Do you see any tigers around here!?" (minor laughter)

So this is what... OK, so for a long time, for many years... and you know, I've written more Java code than most Java programmers ever will. (Editor's note: nearly 1M lines in production. Ouch.) So trust me. I tried. OK? I'm not just coming in and saying "I don't want to learn Java." No. I know Java as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next person.

But I come to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m and say, let's do proof by – say, argument by example! You know, an existence proof. IMDB is written in Perl, right? Yahoo! – many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir properties are written in PHP. A lot of Microsoft stuff's written in VB, right? ASP .NET? Amazon.com's portal site is Perl/Mason.

A lot of companies out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are building big, scalable systems – and I mean scalable in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sense of throughput and transactions, stuff like that, but also scalable in terms of human engineering — in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se dynamic languages with no static types. [Using nothing more than good engineering principles.]

So... isn't that a demonstration that you don't need cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static types to keep those tigers away?

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're like: "Well! But! What if... what if a tiger came?" (laughter) Right? "People need shotguns in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir house in case a bear comes through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 door, right?" The Simpsons made fun of that. (laughing continues)

Yeah. So, you know, for a long time, I was like: "Yeah, yeah, yeah. OK. So tigers could come. Fine."

Scala, now, is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tiger that's going to kill Java. Because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir [type-talisman] argument now has become a paradox, similar to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Paul Graham Blub Paradox thing, right? Because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're like, "Well, we need static typing in order to engineer good systems. It's simply not possible ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise."

The Scala people come in and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y go: "Your type system suuuuuucks. It's not sound. It's not safe. It's not complete. You're casting your way around it. It doesn't actually prevent this large class of bugs. How many times have you written catch (NullPointerException x) ... in Java? Our type system doesn't allow [things like] that."

Our type system does what you said your type system was doing.

So, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore, you should be using it! ∴

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java people look at it and go: "Wehellll... (cough cough)... I mean, yeah, I mean... (*ahem*)" (running finger under collar, as if sweating profusely) They say, "Welllll... you know... it's awfully... cummmmmbersome... I..."

"We can actually get around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems in practice that you guys say your type system is solving through Good Engineering Practices."

(laughter begins to grow)

HA!!! (I point accusingly at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 audience, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's more laughter)

Yeah.

So Scala is creating a real problem for [Java's] static typing camp now. Because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir last little bastion of why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're using it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole tigers argument, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're like, "Ah, well... we... we keep shotguns in our house." [This is what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y've been reduced to.]

OK? Yeeeeahhhh...

So back to dynamic languages!

But my point was — from a previous slide actually — it's very interesting. See, I wrote this Rails port, and it wasn't... I never got it to where it was quite as succinct as Rails, because JavaScript has curly braces and a little bit of extra syntactic cruft. But it was close!

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n we used this framework to build this web app internally. It was for external consumption. It's kind of a long story that I won't go into. But we had like 20 engineers on this thing, for close to a year. And we had a huge application. I mean in terms of user functionality: Ajax-enabled pages, server-side persistence stuff... it was a big app.

And it was, like 40,000 lines of code, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 templates and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 client-side JavaScript. The whole thing! OK? I mean, you add in unit tests, you know, you add in everything, including build files and stuff, and this thing was up to like, maybe 55,000 lines of code.

Thousand.

I mean, Java programmers would be saying, "We haven't hit 55 million yet. (Looking at feet) But, well... we're gonna." (laughter)

And it's like, I tell 'em that (shaking head), I tell 'em that, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're like: "Well." (avoiding eye contact)

That's what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y say. "Well."

And that's, you know, that's pretty much it. (laughter)

Behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino



So unfortunately we have thirteen minutes left. I'm sorry. So let's really quickly go through some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 really cool things about Rhino, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 technology here.



You can JavaScript from Java, and Java from JavaScript. Guess which one's easier?

Obviously calling Java from JavaScript is easier, because Java's really cumbersome. It doesn't have anything to help you, so you have to do basically what I was talking about with Swing earlier. JavaScriptObject j = new JavaScriptObject() You know. JavaScriptObject, Context.enter! You've got all this stuff on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java side. 'cuz it's Java.

But, uh... but it works! And you can do both directions. Here's an example of a Java program to bootstrap... actually I believe this is completely standalone; it works out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 box. It's a Rhino Demo:



This is what you need to do to create a JavaScript object called foo that has a function called a. A property called "a", sorry, whose value is "hello".

So what you do is you call Context.initStandardObjects(), which sets up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript runtime. You only have to do it once. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you call newObject to create a new JavaScript object. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you call evaluateString to evaluate it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of this object.

It's one example of how you do it, but it's not too hard. You can call back and forth.

So that means that anything that was written in JavaScript that you feel, oh Gosh this really needs to be componentized, you need to stick it down in a Java library for whatever reason: you can do it! You can migrate code back and forth between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript layer and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java layer. This is true for all JVM languages, I think.



Uh... this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual code that I was referring to earlier, where you can define non-enumerable properties. I called it defineBuiltin. There's some closure stuff going on here... I don't want to bore you guys. (Editor's note: Function.bind() based on Douglas Crockford's original)



Runtime delegation: this is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reasons unit testing is really easy. You guys know about Smalltalk, uh, method-missing? [doesNotUnderstand actually] It's method_missing in Ruby. It's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365... if you call an object — I think Objective C probably has something like this too.

You call an object, and you say: "I'm calling foo", and it says: "I don't have a foo". Right?

Normally, what happens when you do this? In Java it goes *BARF*. As it should, probably... unless what you really wanted to do was delegate to some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r object. Right? "Design Patterns". Say you want to write a Bridge that says: "Oh! You're calling foo, but you don't want to call it on me. You want to go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game server, call it cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, marshal it, send it back. We'll pretend it's a remote method call."

Right? There's a lot of stuff you've got to go through in Java to do stuff like this. In JavaScript — as you all know, if you're using dynamic languages...

Man, we've got a huge pool of people in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 back. It's getting pretty rough. But we're almost out of time! Fortunately. Heh.



OK, so let me tell you a little bit about embedded XML. It's kind of interesting, kinda neat. This is supported in Firefox, in some browsers. It's a spec that Adobe and some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r people, BEA, put togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

And it's cool! Because you can say stuff like

var company =

Now of course cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's this weird, big religious debate going on, between JSON advocates and XML advocates. It's weird! They're, like, locking horns.

When I was a kid — when I was a kid, jeez... When I was twenty, it feels like when I was a kid — I used to have tropical fish. And my brocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs and I noticed two things about tropical fish.

One is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y die, because we're not in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tropics. (some laughter) Sad.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r is that if you put a bunch of different species of tropical fish in a tank togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y ignore each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r... except for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones that are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same [or nearly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same] species. They bite each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. That's what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y do. Fish bite each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. They have a pecking order, right?

JSON and XML are muscling in on each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs' space, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are bristles, OK, and it's so silly! It's silly. The whole thing, right? I mean, XML is better if you have more text and fewer tags. And JSON is better if you have more tags and less text. Argh! I mean, come on, it's that easy. But you know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a big debate about it.

Nevercá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365less, sometimes XML is appropriate [in JavaScript], especially if you're loading it from a file or whatever. These literals are interesting. And so it provides new operators and new syntax for actually going in and... it's kind of like XPath. Except it's JavaScript-y.

And I tell you: it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 worst documented thing on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 planet! It's horrible, man, working with E4X initially. But... eventually you can figure it out. And I have a document that hopefully I'll be ready to release pretty soon, that actually covers it pretty well. And Adobe has some good documentation for it.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n eventually it clicks, like learning any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r language. This is a minilanguage. And you go: "Ha, I get it! I get it. It's not as crazy and dumb as I thought. It actually works."

It's kind of a neat feature. You guys know ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages that embed XML? Scala does. I don't see all of you using that, but C# 3, I think, does XML? Coming [soon]? (Editor's note: it's apparently been deprioritized by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C# team, although VB 9 has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.)

Anyway, it's kind of an interesting approach.

Inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino



All right. So this is Rhino. Now you know. After I explain this diagram, you'll know what you need to know about Rhino to talk to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r people about it.

You start with some JavaScript code. It goes to a parser. That turns it into a tree. A syntax tree.

Rhino's parser today, currently, immediately begins cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next step of rewriting it as code generation. Right away, as it's parsing. Now this is a problem. Because if it takes an if-statement or a switch-statement or a for-loop, and it generates sort of assembly-language like jumps to targets? And generates labels, you know, converts it into sort of three-address code, that's eventually going to actually become three-address code: assembly or bytecode.

Then it kind of sucks if you're trying to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parse tree for your IDE. To, like, syntax highlight, or pretty-print, or show errors and warnings, or whatever. Unfortunately a lot of languages — most languages — do this because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're written by compiler guys and compiler gals. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value. But unfortunately we're all doing more and more processing of code. Language tools, right? Frontend stuff.

So I rewrote Rhino's parser recently, and I'm currently fixing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code generator. And I'm gonna get it out into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino mainstream in a couple of weeks here. Because my project at Google is doing a lot of code processing. And it's a faithful representation. So if your big beef about Rhino is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no Visitor over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AST: I'm fixing that.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are two paths here: you see one on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 left that goes code generator to bytecode. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytecode, or pseudo-bytecode, for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript code up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n it goes to an interpreter. The interpreter is a big loop. Bytecode is this [roughly] postorder traversal of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tree, that flattens it in a way that allows you to push onto a stack to evaluate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operands.

It's all actually very important; you should go read up on how it works if you're not familiar with it, or if you've forgotten since you first learned it.

And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter is actually pretty fast, because it's a loop. There's not a lot of calling out. I mean, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some calls out into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime, but mostly it's this loop: push, pop, push, pop. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT picks it up and can optimize it pretty well.

The reason that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's two code paths here, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y wrote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interpreter — cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y originally had just a classfile compiler — was that compiling to a classfile is this batch/static operation, where you want it [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 resulting bytecode] to be fast. You want to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 standard, classic compiler optimizations. You want to generate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 control-flow graph, you want to eliminate dead code, you want to do good register allocation.

In JavaScript's case, it's often possible not to generate a closure. You can actually use Java instance variables and Java local variables instead of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se heavier-weight JavaScript [activation objects]. Because at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 logical level, JavaScript doesn't really even have a stack. It has object allocations on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap; those are your Function invocations. Sloooow. Right? Because [in comparison] cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java stack translates to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C stack.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiler can go through and optimize away a lot of this JavaScript dynamic stuff that's provable you're not gonna need, well, that's nice! But it takes time. The interpreter is a path that allows you to dynamically develop: load code in and see how it's gonna work right now, at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unfortunate expense of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino people having to maintain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se two code paths. But, you know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a lot shared between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

And that's it! The script runtime implements all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JavaScript, you know, Ecma spec stuff: Array, String, Boolean, Date, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Math functions. And a lot of it just delegates down to Java where possible.

Pretty clean! Pretty standard. It's a pretty standard compiler, interpreter and runtime. You're gonna see this if you dig into your favorite JVM language. You'll probably see something similar to this. This is actually more mature than a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. A lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m start off by interpreting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parse tree, and it's slow from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method calls.

So this is why Rhino's fast. Now it could be a lot faster, and we're working on it. Hopefully, you know, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se things can be as fast as Java, in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way that Java made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 claim that it can be "as fast as C++". And for long-running applications, that's usually true. Especially with parallelism, right? Threads. And especially if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT has a chance to look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actual code paths being used and compile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m down into machine code specific for that code path, as a fall-through.

Obviously for benchmarks, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y fire something up and run a loop a thousand times, or whatever? C++ is faster because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT hasn't had any time to kick in and evaluate what's going on. But for long-running services — which is what we're all writing, yeah? At this Ajax conference — cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT will kick in. And your Rhino code now will get very close to where Java's performance is. (Provided you're not doing number-crunching - Ed.) So don't worry about that so much.



So RnR, I already talked about it. It doesn't have a database backend yet, because we're using Google's internal store, like Bigtables. Which is why I haven't open-sourced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing yet.

It's weird: somebody told me cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r day, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sent me mail and said: "I think you're today's Paul Graham". And he meant this in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most negative connotation possible. "You're today's Paul Graham, and RnR is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next Arc."

I was like, "What!?" And he said, well, he's a server-side JavaScript guy. I mean, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re aren't that many, right? Most of us are thinking client-side. But he's a server-side JavaScript guy. And he goes to people and says, why aren't you using server-side JavaScript? And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y say: "We're waiting for Steve Yegge to release RnR."

And I'm... this is news to me! I'm working on... stuff, you know. Work. And this [open-sourcing RnR] is part-time and everything.

This year, now that we know people are interested in it, we will release it. (At least we'll try for this year - Ed.)

It's just a little weird, right? Because Sun hired cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JRuby guys, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're doing JRuby on Rails, and it's eventually going to be part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java Development Kit. It's gonna be, you know: it's Sun's lightweight answer to EJB and all those giant frameworks. You want to build something quickly and use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rails model, well, run Rails on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM!

So I thought: if JRuby on Rails had been (a) ready when we started using it [i.e. writing RnR], and (b) Google would let me use Ruby, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I would have used that! So RnR was like a transitional thing.

But... again, you know, I think that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r people in situations where you really prefer to use JavaScript. So yeah, I guess I'll... open-source it. We're working on it.



This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last slide, by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way; I know you guys are tired. We're doing a lot of work on it. I'm working on it personally, I mean working on Rhino. Because I think it's all right. I'm used to JavaScript now, and I think it's a good implementation. It's a good compiler, so it's good practice for me, to learn how compilers work.



We've got a debugger, but we're making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debugger better. We've got a sandboxing model, but that could definitely be wrapped up and made available to you folks.

We'd like to open-source our JSCompiler: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing that compresses JavaScript for Google Maps and GMail and stuff. I know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some open-source ones out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. We don't think that it's competitively in our best interest to keep cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing internal. It'd be better to get it out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re so you all benefit from it, and so you can all hack on it, right? We're working on open-sourcing our JSCompiler and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r stuff.

So that's it! I wanted to cover Rhino, but I also wanted to leave time for questions. And I've left you (looking at big LED clock in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 back) one minute and sixteen seconds for questions. Sorry about that.

So really quickly, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are any burning questions, I'll repeat cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question and try to answer it. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise feel free to come up afterwards and chat.

Q&A

Q: Why won't Google let you use Ruby?

Yeah, that's a good question. Um... uh... I kinda wrote that up in a blog. Isn't that stupid? "Read my blog!"

The short answer is: it imposes a tax on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 systems people, which means that it's not completely self-contained within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 team that's using it. And for that reason, primarily, it's really not a good idea right now.

Any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r burning questions?

Q: Do threads suck?

Well, you know... cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're... you know... Yeah. But I mean, what ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r options do you have? I mean, you have multiprocessing/share-nothing, which is heavyweight and it requires more work.

So I use threads. I'd prefer something better, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're what we've got today.

Q: There are some guys that I work with, and one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir comments on JavaScript lately, since I've been wanting to use Rhino because I love JavaScript... what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y brought up is that JavaScript is becoming a lot like Python, and that may or may not be such a great thing. I wanted to know what you have to say about that.

Ah. OK. Well, yeah, it already has borrowed some stuff from Python in JavaScript 1.7: yield, Array comprehensions, destructuring assignment. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se are good features. They're good. They're not going to change it to be syntactically whitespace sensitive, right?

I don't know. The guys working on it have really taken off in completely different directions from Python. They're looking at an optional static type system, so in that sense it's maybe more like Groovy. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're looking at maybe fixing some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs.

But I don't know how that's going to evolve yet. Because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's obviously a lot of people who have skin in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game, a lot of people interested in affecting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec evolves. So it's all kind of up in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 air right now.

All right, so we're really out of time. I'd like to thank you for coming. And please come up afterwards. Thanks!

94 Comments:

Blogger Nuno Job said...

Nice talk. I'm currently taking a masters on languages engineering just wished some (any?) of my teachers would go anywhere near all this juice you always show in your presentations.

Kind of wonder why you never referred to yacc or antlr in your blog :) Really agree with you on learning new languages. I love it. Ruby, java, python, erlang, haskell, ruby again, prolog, perl. I'm not a guru at haskell but i like it a lot and I'm really thinking in trying scala.

Scala is like ruby and erlang and haskell all togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Sounds delicious.

8:31 PM, June 14, 2008  
Blogger TrevorFSmith said...

Rhino on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server? This has been in Ogoglio for two years, though it is limited to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simulator scripts.

You may also find my new project, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ignant server, interesting.
Concepts: http://tinyurl.com/5nwz24
Prototype:
http://tinyurl.com/5lwtja

8:36 PM, June 14, 2008  
Blogger Ajai Shankar said...

rhino.010.jpg:


function assertIntEquals(msg, x, y) {}
testBasic: function() {
assertIntEquals(4, 2 + 2, "addition broken!");
}



That's why you need static typing!

Just kidding :-)

Microsoft is working on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLR to get dynamic languages talk to each ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

As for Javascript talking to Java and back, IE had this undocumented functionality way back in '99 I think...

Good and long post as usual...

9:23 PM, June 14, 2008  
Blogger Unknown said...

Hello 2008, 1996 is calling, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir appserver back. Welcome to BroadVision 1998
Been cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re done that.... Except in 1998 everyone wanted Java and we already had an entire application system that could be scripted in JavaScript

http://www.internetnews.com/dev-news/article.php/55431

10:12 PM, June 14, 2008  
Blogger Lucidquiet said...

Also, ASP has had JavaScript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server-side since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of ASP. Which is like 15 years or so now. But of course cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no embedded XML, or plans for it eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. But through COM you can optimize with C++. Several smart companies do this still today even if this kind of ASP is considered "classic".

Aren't scheme and smalltalk classic? Is it a refusal to die, or withstanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 test of time?

10:28 PM, June 14, 2008  
Blogger Steve Yegge said...

page_failed: actually Scala is a pretty cool language. It's amazingly clever, and as far as I can tell it has all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hallmarks of being written for "real" programming use. I love cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implicits and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case classes. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language is frighteningly huge, so I'll stick with my assertion that it's going to have trouble taking off.

ANTLR's cool - I've been doing stuff with it for years, and I may even try writing an elisp backend for it at some point.

trevorfsmith: sorry, I should have mentioned that lots of folks have been doing it for years.

ajai: check out "LiveConnect" - I think IE may be using something like that, and yes, it's been around a while.

bleached: your url is cut off - can you try resubmitting?

11:15 PM, June 14, 2008  
Blogger Stevi Deter said...

bleached_anus: are you trying to cause me flashbacks?

I'd about convinced myself that I was crazy, thinking I used to write server-side javascript.

12:06 AM, June 15, 2008  
Blogger Ray Waldin said...

I can see it now...

Introducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Google Web Server Toolkit. Now you can write your server code in Java and have it compiled down to Javascript so you can run it in Rhino on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM. Need access to raw platform APIs? Just use JJSJSJNI!

I better stop. I'm getting dizzy...

1:17 AM, June 15, 2008  
Blogger Tomas said...

Hi Steve, love your talks, love your posts.

I wanted to ask if you have actually used Scala for anything semi-serious (a couple thousand kloc)? I have, and while cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 description of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system is scary, it is pretty intuitive to use and seldom seems to get in your way. I mean, I like dynamic languages as much as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next guy, but I gotta say Scala's type system works pretty well if you're into that kinda stuff.

Personally, my biggest beef with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language is actually that so much is implicit, it makes it hard to read sometimes.

All cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best to you!

2:25 AM, June 15, 2008  
Blogger joao.rafael said...

You know that you can see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talk on video.
Just go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conference site, click videos and search for steve yegge.

3:18 AM, June 15, 2008  
Blogger Anonymous said...

Steve: thsnks for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transcript. Your blog posts often give food for a language developer's thought.

My question: have you changed your opinion on Groovy since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sokoban shootout, how and why?

3:54 AM, June 15, 2008  
Blogger Tony Morris said...

This shit rant almost triggered me to respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overwhelming amount of under-qualified nonsense... almost.

sigh I guess you'll leave it up to people like us (e.g. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Scala IRC channel, Haskell community, etc.) to respond to all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 misconceptions that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 learners come to us with sourced from 'guess who'.

The straw man was a delightful classic.

Here's a quiz for you Steve. I have a terminating function that has this signature:

forall A. A -> A

Now write some unit tests for it. You can't, can you? That's because this type signature is called 'once type inhabited'. There is only one implementation for this function. This is called a proof of correctness Steve. Yes, unit tests are a poor man's type system Steve. However, sadly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a well known problem which I expect you do not understand called cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'Turing Halting Problem'. This means we cannot obtain a proof for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correctness of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 *general* program Steve. So, for some programs we can, but not for all.

That's why we unit test Steve - to get a failed proof of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contraposition of a property of a function; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next best thing after proof of correctness of a function - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y serve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same purpose. Now you might dilute your unit tests with some impoverished method (assert this and assert that perhaps?), but this does not take away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that you are indeed seeking out properties of your function.

Quick Steve, which function am I talking about:

f :: forall a. List a -> List a
f [] <-> []
forall x. f [x] <-> [x]
forall x. forall y. f (x ++ y) <-> f y ++ f x

Have you ever looked at automated testing Steve? You know, QuickCheck or Reductio (No, JUnit is not automated Steve, despite cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hijacking of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 adjective). There is a lot to learn cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re Steve. You do embrace learning don't you? Are you interested in learning about software correctness verification?


Have you ever seen a type-safe sort Steve? You know, it fails to compile if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function is not a sorted list. Think about it Steve. This is a proof of correctness as opposed to a failed proof of incorrectness (unit tests). Would you like me to elaborate Steve? I'm more than happy to, but it is going to challenge most of what you believe, because it is wrong; vastly wrong and this is fine Steve; I'm not out to correct every idiot in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world, but please think of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 noobs; PLEASE, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't deserve to be misled by an amateur posing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contrary. It's just not fair to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

My patience is running thin; I wish you'd get a clue before opening your trap Steve. Please stop it. No really, I am begging you to learn "some stuff" before making wildly erroneous claims about it. It's only fair don't you think?

3:58 AM, June 15, 2008  
Blogger Bernard said...

http://dev.helma.org/ng/Background+and+History/

Helma - java web application server using Rhino for server-side scripting. "Started life in 1998..."

Bernard Devlin

4:08 AM, June 15, 2008  
Blogger Calum said...

Steve: I think actually trying using Scala a bit more might colour your opinion a bit more favourably. In essence cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language specification is complex because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language works - largely cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static typing issue - but also because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language hides so many of those complexities from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 coder.

Generally speaking I'd say that Scala's language complexity stems mostly from its focus on being practically useful - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language spec is complex because it lets you use a static language in more-or-less cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way as you use a dynamic one. I don't think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec document is a good introduction to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best I've seen is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 book that is coming out soon (available on one of those pre-release PDF schemes) being written by Odersky and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language. It comes much more from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 perspective of how you use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than how its guts work under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hood.

4:12 AM, June 15, 2008  
Blogger Anocka said...

"We can actually get around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problems in practice that you guys say your type system is solving through Good Engineering Practices."
That one made me laugh.
Oh, sure, I'm sure I will not forget to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuzzy "Good Engineering Pratices" thing because I'm such a good programmer !
Seriously !
But here's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing : as a programmer you CAN'T trust yourself ! You can't trust ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. That's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 n. 1 lesson of good engineering !
You need a way of eliminating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic errors of your code *automaticaly*. Basic error means : things like adding an integer and a string.
That's why you need a type system. Simple.

5:05 AM, June 15, 2008  
Blogger Dan said...

It's so painful that people, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java... community, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java world, has evolved around it. OK? They've said: "Don't use constructors. Constructors are baaaaad."

Steve, interesting post, but I'm not sure that this quote is accurate. There may be some people who take this view, but I don't think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y constitute a majority.

Personally, I'm all for constructors. Constructor-based dependency-injection is preferable to using setters.

5:20 AM, June 15, 2008  
Blogger Stephan.Schmidt said...

" 1. you write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
2. you compile cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
3. you load cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
4. you run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
5. it doesn't work
6. you back up
7. you change it again"

Hmm. Not when I write Java code. It's more like.

1. you write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
2. cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDE complains
3. you fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
4. you run cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code
5. it works

The IDE finds syntax errors, type errors, unused code, null references.

Optionally you have

0. write a test

Peace
-stephan

5:30 AM, June 15, 2008  
Blogger 米国人 said...

For those that always bitch about Steve's long posts (I love cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m long!), I found cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video for this talk on Google Video, http://tinyurl.com/6z3ozf

Keep up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good work Stevie :)

6:46 AM, June 15, 2008  
Blogger Big Rick said...

Most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments for a JVM are arguments for libraries, maybe like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLR. Generational garbage collection and threads can mostly be in libraries. Yeah, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generated code has to be written to be compatible with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GC and threads, but that's doable.

The exception is JIT. But if you like JIT, why not just compile to machine code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first place? Eval will be slower, of course, but for long-running services, machine code is smaller and faster than an app + JVM, often enough.

6:47 AM, June 15, 2008  
Blogger Unknown said...

You might like to take a look at Clojure, as well, if you haven't already. It's a weird Lisp-1 for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM, and has both an STM system and something vaguely similar to Erlang message passing. It has also recently become racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r fast, and it someone has written a backend for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 (Common Lisp) SLIME Emacs thing for it.

7:06 AM, June 15, 2008  
Blogger Taavi Burns said...

Some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain-specific language bits you talked about remind me of a PDF on Steps Toward cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Reinvention of Programming (First Year Progress Report)I read recently from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Viewpoints Research Institute (headed by Alan Kay). The kind of stuff cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y talk about suggests that programmers should create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own languages to express cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem domain at hand, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n go solve that problem in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 domain itself. For a first year, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have some very intersting, concrete results (e.g. TCP/IP in 200 lines, and Cairo in 500 lines).

7:40 AM, June 15, 2008  
Blogger Michael Terry said...

Why are you so insecure, dibblego? The condescension didn't make your comment any more convincing dibblego, I promise.

9:48 AM, June 15, 2008  
Blogger Unknown said...

Ah, I was GOING to comment on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole repeating 'Steve' twice per sentence; I thought it was a cheap shot, though.

10:04 AM, June 15, 2008  
Blogger Dr Loser said...

Interesting, as always.

(BTW: There's more to Internet Computing than finding The Next Great Language. Visually, thins thing blows chunks. It's difficult enough to encourage people to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 erst of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 comments, without cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Leave your comment" box being in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 upper left-hand side. But I digress.)

You kinda miss out "beauty."

Now, I'll admit that C++ isn't beautiful. Hell no. Given two years or so (and it's still relevant in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real world, so two years is quite possibly what you'll get), it has an ecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365real almost beauty. Which ECMA/Javascript derivatives don't have. They're just plain butt-ugly. We're left with a choice of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most beautiful language that anybody out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re will let us program in -- which I would suggest is Python, with all its faults -- or dealing with crap.

Java is full of crap.

Javascript (in all its flavours) is full of crap.

I think you're missing at least two points about Scala.

(1) Like C++ in 1985 or so, you don't have to suck cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole lot up in one go. Nobody but you cares whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language reference manual could be used as a door-stop for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 palace at Nineveh.

(2) There's a huge number of Java prorammers out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re who are looking for something slightly less brain-dead. Scala seems to me to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first realistic JVM language that can give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 option. Think Perl, think Python, thin Ruby if you will. I predict that Scala will do this for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next eighteen months.

I also predict that your version of Rhino will die inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same period. (Nothing personal -- I just don't see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point of it. Well-crafted, JIT, optimised, server-side glue for morons? Huff it up...)

And you really, really, should stop posting links to things like http://en.wikipedia.org/wiki/Greasemonkey.

That's an exceptionally bad idea for somebody working at Google.

On furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r prdiction: inside two or thrree years, Google's business model will be dead, precisely because people will block out advertisements.

10:23 AM, June 15, 2008  
Blogger Tony Morris said...

I am not insecure Michael. I am annoyed when an innocent beginner comes in to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Scala IRC channel with a question that makes no sense whatsoever, because he read some rubbish claims on Steve's blog. I also wish Steve would clue up a bit on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topics he talks about since I expect he is also misleading ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. I don't think Steve realises how out-of-his-depth he is, so strong language is necessary to somehow ram cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point home.

I hope he will think about my questions and perhaps have a couple of "oh crap, I'm so wrong" moments and subsequently shift position.

All of his arguments have been debunked over and over (mostly because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are so easy to do due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir lack of sophistication), though he continues to ignore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m - assumingly because he doesn't understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m - he seems capable of mocking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fool's arguments. I think a bit of brutishness is in order.

If it means I am condescending because I claim that Steve is full of shit and his under-qualified words are detrimental to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 programming community, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I accept cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 charge. I assume cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best of Steve and that he will address cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 truth value of my propositions (though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are very weak at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 moment - he ignores cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 evidence, so I'd I'll only be preaching to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 choir) racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than worry about whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r his feelings have been hurt by hicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rto "condescension".

Aah, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 age of pragmatism and anti-intellectualism.

1:01 PM, June 15, 2008  
Blogger Unknown said...

dibblego: I can, off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of my head, think of two Haskell functions with that type signature. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, GHC compiles cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m both without errors (I have tested this).

However, one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m is almost certainly not what you want.

1:07 PM, June 15, 2008  
Blogger Tony Morris said...

Hi Miles, consider a terminating subset of Haskell. Note that I qualified with "terminating". If I didn't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are infinite implementations.

1:13 PM, June 15, 2008  
Blogger Chris Handley said...

Anocka said "Basic error means : things like adding an integer and a string."

You obviously haven't ever used C :-)

2:47 PM, June 15, 2008  
Blogger Chris Handley said...

dibblego: SteveY doesn't need to qualify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things he says, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 title of his blog: Stevey's Blog **Rants**

You're SUPPOSED to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m with a pinch of salt.

It's a bit like taking Wikipedia articles as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir sole source of information - something that some people do, even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y shouldn't.

2:54 PM, June 15, 2008  
Blogger Tony Morris said...

Chris, That is a very poor excuse for making wildly false claims. I sure hope Steve doesn't try that one.

Can you please inform those who are untrained on this topic that it is nothing more than "a pinch of salt"?

3:16 PM, June 15, 2008  
Blogger Dan Lewis said...

Okay, I'm about halfway through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 video, but this obviously needs to be said before I continue:

"It's... you guys know about those talismans? The ones, where, "What's it for?" "To keep tigers away"?"

http://www.snpp.com/episodes/3F20.html
===========================
[Later, a full-force Bear Patrol is on watch. Homer watches proudly.]

Homer: Not a bear in sight. The Bear Patrol must be working like a charm.
Lisa: That's specious reasoning, Dad.
Homer: Thank you, dear.
Lisa: By your logic I could claim that this rock keeps tigers away.
Homer: Oh, how does it work?
Lisa: It doesn't work.
Homer: Uh-huh.
Lisa: It's just a stupid rock.
Homer: Uh-huh.
Lisa: But I don't see any tigers around, do you?
[Homer thinks of this, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n pulls out some money]
Homer: Lisa, I want to buy your rock.
[Lisa refuses at first, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n takes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exchange]

3:47 PM, June 15, 2008  
Blogger Unknown said...

Alright, you've convinced my to give rhino a whirl. Javascript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server sounds like a lot of fun.

So I have rhino up and running, and I've played around with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shell for a good 10 minutes. It seems pretty rough compared to say irb or python's shell. No history or tab completion is pretty weak. Also cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re doesn't seem to be any good builtin introspection tool.

Do you have any suggestions on how to make this better? Are people working to improve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shell, or could it use some more attention?


By cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, thank you for js2-mode. It has significantly improved cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 javascript development experience at my company (all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers live emacs).

5:06 PM, June 15, 2008  
Blogger Steve Yegge said...

Hi Mongoose,

Yeah, it's a little rough. I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very latest version of Rhino may have history and completion, but it's a pretty new addition.

If you're already a JRuby aficionado, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I'm not going to try to sell you on Rhino. It's really more suitable for people who are most familiar with Java and JavaScript syntax.

I'm hoping to open-source some stuff this summer that should improve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interactive shell situation for Rhino a bit. We'll see.

6:48 PM, June 15, 2008  
Blogger Praveen said...

What's your current take on Groovy (& Grails), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 coding is very simple & also has success stories (LinkedIn...).Definately deserves attention from you.

10:56 PM, June 15, 2008  
Blogger Steve Yegge said...

dibblego, once you've calmed down a bit, please share with us:

- what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IRC channel asked, and exactly how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir question was my fault.

- which of my claims are "erroneous" and "wildly false".

I'm assuming you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 difference between an opinion and something that's formally provable. So I ask you: which of my claims is formally provably false? We're all ears.

Right now it sounds to everyone reading, and I do mean everyone, like you're throwing a tantrum because of a perceived slight, and it isn't helping your credibility.

As it happens, I like Scala, so far at least. But I actually got a note verging on a death threat from a colleague for considering using it at work. This was a smart person at a smart company. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r places I suspect I'd have encountered even harsher resistance.

There's far more at stake here than you realize. For every person trying to advance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cause of Scala, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a thousand who will fight it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 death. People won't listen to academic arguments over something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y feel threatens cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir livelihood, and most folks feel that new languages (especially complicated ones) do just that.

I've been beaten up and down by coworkers at enough companies over trying to use languages like OCaml and Haskell that I'm not about to stick my neck out for Scala. I'm done with being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flag-bearer for academic static languages. If everyone starts using it, sign me up. But Scala enthusiasts have a much longer road ahead than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could possibly imagine, in trying to make this thing successful.

My primary advice to you, and I'll assume you deserve it, is this: learn marketing. Learn everything cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is to know about it. Then learn sales. A good salesman doesn't freak out. A good salesman is calm, funny, friendly, inviting, and persistent as all hell.

You're not off to a good start, but it's not too late to make a change.

11:41 PM, June 15, 2008  
Blogger Matthias said...

We are using helma (helma.org) since 2000, which provides a server side javascript framework (using rhino). I also started to grow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of porting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rails framework to helma/rhino, and i was excited about reading about your efforts at google. Would be nice to learn from your project, which is pretty hard as long as it's just "something you would like to open source". maybe cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ways than open sourcing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole thing. maybe you could start to share just some parts of it. Would be realy interesting to learn from your work. If you are interested you can take a look at my efforts at: dev.helma.org which relies on helma-ng

2:14 AM, June 16, 2008  
Blogger Nicola said...

I'm sorry, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Scala argument in Paper Tigers is incorrect. If Java-style static typing catches 90% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bugs that can be caught with 5x more complex type system, I would say some trade-off for simplicity is acceptable and it is reasonable to just use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simpler type system.

I think types should be optional. ECMAscript actually supports optional types, doesn't it?

The whole argument of static vs dynamic typing seems wrongheaded. It should be all about minimal code size. Normally you want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shortest program possible. But you also want some confidence that your program works, hence you write unit tests. If tigers are too scary, than you can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 optional static typing, write more unit test, etc - all at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cost of increasing code size.

6:25 AM, June 16, 2008  
Blogger toast said...

Hi Steve,

We've been trying to write testable javascript at http://guardian.co.uk/ for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last six months, and have come up with some good results (see pluck.js, included on most pages).

I was wondering how you write your tests? I ended up writing a unit testing framework which can be found at [shameless plug]

http://code.google.com/p/rhinounit

If you had a chance I'd appreciate any feedback on that project (marketing or code), or on how you do your stuff.

I also wondered what your approach was to object definition/construction in JS. We ended up going with a quite Java like construct, mainly so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 devs didn't have to venture too far from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir comfort zone, mixed in with a bunch of object literals.

Finally, what would you do to fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language? I'd love to get rid of 'this' defaulting to global, and things like that.

Cheers,
Tiest

6:27 AM, June 16, 2008  
Blogger Jack Lloyd said...

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security front, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are actually some very elegant solutions to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem of running arbitrary untrusted code, namely POLA and capabilities. Check out:

E (http://www.erights.org/): The majority of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 modern work on objcap systems has been done with E (it also offers some very nice solutions to distributed computing).

Joe-E (http://code.google.com/p/joe-e/): Objcaps for Java

Caja (http://code.google.com/p/google-caja/): Objcaps for JavaScript (I'm surprised you don't know (or at least didn't mention) this one, as it is an ongoing Google project)

Mark Miller (now at Google Research) wrote a great cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis that is well worth reading.

8:28 AM, June 16, 2008  
Blogger David Pollak said...

I find, as both a Scala library author (lift) and a Scala library consumer (a bunch of apps), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a material difference in how much time and effort cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system takes.

As a library author, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system requires a lot of work and I often spend a whole day writing very little code, but define complex types (this is especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case when I'm designing DSLs.)

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, I find that when I'm consuming libraries, I spend very little time knowing or caring about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system... it's a lot like coding in Ruby or JavaScript.

I also see lines of code numbers for apps similar to those I saw when I was doing hard-core Rails coding. I see tests that are actually shorter because I'm testing for logic, not for types, method names, etc.

Like Ruby's meta-programming, Scala's type system is complex and powerful. It's used by people who spend time and effort designing things.

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand, library consumers rarely have to care.

10:45 AM, June 16, 2008  
Blogger martin said...

Thanks for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blog, which is very entertaining, as always. Let me just take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opportunity to correct a couple of inaccuracies:

You write: Scala is a very strongly typed language for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM. It's from researchers in Switzerland; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're professors.

No. Scala is from one EPFL professor and his team. Besides being a professor that person has also done a lot of Java stuff. Among ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things he wrote cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 javac compiler that almost everybody in Java-land uses to this day.

You write: It's from sort of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same school of thought that static typing has evolved with over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last fifteen years in academia: Haskell, SML, Caml, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se sorts of H-M functional languages.

Not really. Scala does not have H-M type inference. It adopts closures, pattern matching, and a lot of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r constructs of functional programming, but very little of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir types. The bit that tends to scare people (like your Prog Lang doctorate friend) is that it has a very advanced *object-oriented* type system. That's something racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r new, so I'm not surprised some people are scared.

You write: The language spec is, like 90 percent about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system. That's true, but it does not mean what you imply. First, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec is intended for compiler writers, not for programmers wanting to learn cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language. It cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore trades readability for precision. If you want to learn Scala, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some books coming out soon, including one I co-wrote.

Second, Scala's spec is built around types, because types are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mechanism we chose to speak precisely about programs. Since a spec should do that (speak precisely about programs) types are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 natural vehicle for that. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r language specs cover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same ground, but in different terms. I give you an example: Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages talk about methods and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir signatures. The Scala spec talks instead about method types. That's just a notational vehicle, because that way we could get more uniformity in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec. There are no method types that you can write down in a Scala program; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are purely internal to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spec and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiler.

You write that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many types in Scala. Again that's true, but I believe it's conceived to be scary only because people are not used to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. It's a superficial reaction, that usually disappears pretty quickly when people get to know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language a bit better.

People usually are not scared of many different forms of statements or expressions in a language. There's no reason to be scared of many different forms of types eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, in particular, because most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m are just abbreviations. For instance, you need not be scared of a ``pair type'' such as
(Int, String) because that's just an abbreviation for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameterized type Tuple2[Int, String]. Now, if you'd racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r not learn new notation you might prefer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameterized Tuple2 type over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shorthand, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n your programs would look more bloated and ugly. It's a tradeoff between specialized notation / short programs and minimal notation / long programs. Because Scala takes types seriously, it offers specialized notation to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir notation convenient.

Even if you omit all shorthands, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system of Scala is still pretty powerful. It's certainly nontrivial to specify and to implement. Dynamic languages are much, much simpler to define and to implement (at least as long as performance is secondary). But is that a reason to shun static languages? In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end, it comes down to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r one should refuse a powerful tool because one finds it hard to understand all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inner workings of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tool. Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r industries have made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 step from craftsman to engineer, where more formalized learning lead to higher precision and productivity. It remains to be seen whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software industry will do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same transition.

-- Martin Odersky

10:47 AM, June 16, 2008  
Blogger Ola Bini said...

Martin: I totally agree with your corrections, and Steve maybe exaggerated a bit in his presentation (remember that it's actually a transcription of a talk. I know that I for one have a tendency to be more inaccurate while talking, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n when writing).

The one part I take offense to is your implicit assumption that dynamic languages equals craftsmanship and Scala equals engineering. I dislike it even more when you polarize cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question on a one dimensional value scale.

Yes. Scala is an extremely powerful tool. It has definitely got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 potential of being useful in many places . But it's not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end all of computer languages, and it's not a replacement for many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing paradigms. Languages without compile time type verification fulfill a very different niche, and I don't see much gain in trying to put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in competition with languages like Scala.

You pose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question if it's valid to shun a powerful tool if you don't understand all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inner workings of it, and yes, in many cases I think you should.

When you need to understand how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exposed type system of Scala works to understand a line of Scala code, and that line utilizes lots of Scala features, it might sometimes be too much. In contrast, dynamic languages generally are very easy to reason about and understand intuitively how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y will act, meaning it's easier to be productive both while reading and writing it.

I'm not really arguing about absolutes here, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are definitely circumstances where Scala should not be used, because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complexity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language. The main problem is that a language is never a complete black box. You can't completely separate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inner workings from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 outwards behavior, and if you could, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n what's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point of having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complicated inner behavior?

11:10 AM, June 16, 2008  
Blogger martin said...

Ola, I did not mean to imply that dynamic language programming equals craftsmanship (besides, I have a lot of respect for craftmanship!). What I was aiming at was cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 all-too-common sentiment that all of programming needs to be dumbed down to be understandable without any intellectual effort. That's not at all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as programming in a dynamic language. In fact, some aspects of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se languages (such as Ruby's meta-programming) look pretty intricate by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves to be.

You write: You pose cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question if it's valid to shun a powerful tool if you don't understand all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inner workings of it, and yes, in many cases I think you should.

I would also refuse such a tool if it meant I could not understand how my program behaves. But for a static type system, I essentially have a cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem prover that tries to find inconsistencies in my program. I need not be able to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 intricacies of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prover to profit from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error diagnostics it provides.

Let me compare to bridge building: Even if I am not an expert in numerical analysis, I might still use a finite elements package to prove that my bridge will not fall down. I need not understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 intricacies of that package, it's sufficient to trust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 people who wrote it.

Likewise, an application programmer can simply trust cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type checker to find trouble spots in his or her code, without needing to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 precise reasoning that led to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 diagnostics.

However, as David Pollak has pointed out a couple of messages earlier, things change when you progress from application programmer to library designer. Then you might need to spend more time to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 types right, and you might save time using a dynamic language instead. However, your statically typed library tends to provide more to your clients than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamically typed version: Not only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic functionality but also a set of proven properties (embodied in types) which your clients can use to guide cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir coding and to find problems in it.

11:46 AM, June 16, 2008  
Blogger Unknown said...

dibblego: Show me a terminating subset of Haskell, and I'll show you a language in which 95% of programmers can get no useful (read: billable) work done. Or better yet, try to explain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 difference between structural recursion on data and guarded recursion on codata (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 monads which wrap it all up in a pretty surface syntax) to your average web developer. Then, watch cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r ignore you, or die painfully as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir head explodes.

Regardless, my sense was that Steve was not attacking Scala so much as he was pointing out how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Scala type system's formality provides cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reductio ad absurdum counterproof to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Java's community's long-held disdain for dynamic languages. Arguing for even furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r adherence to macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matical purity disregards cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basic cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis Steve puts forward in almost all of his writing (at least as I read it): namely, that simplicity of mechanism wins over almost everything.

Exposed type systems, aspects, compiler annotations, pragmas, etc., all increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mental overhead involved in programming. There may be cases where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trade-offs are worthwhile, but every bit of attention taken away from implementing programs is precious, and should be carefully and actively defended.

1:27 PM, June 16, 2008  
Blogger Ola Bini said...

Martin: OK, now I'm feeling a bit like mr negative here. You might not have done it intentionally, but in your last paragraph you wrote "Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r industries have made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 step from craftsman to engineer, where more formalized learning lead to higher precision and productivity. It remains to be seen whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software industry will do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same transition." just after doing a comparison between dynamic languages and more advanced statically typed systems. It came off as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correspondence was intentional, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 part I quote also makes it include a value judgment.

"But for a static type system, I essentially have a cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem prover that tries to find inconsistencies in my program. I need not be able to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 intricacies of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prover to profit from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 error diagnostics it provides." Now, this statement is totally true, as long as you have no failures. But as soon as you have a failure, you need to understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem checker sufficiently to understand why it gives you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 failure message and how to correct it. This can be partially rectified with good error messages, but not completely. This brings to mind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lovely examples from H-M style systems where you can get things like "expected signature Int*Int->Int but got Int*Int->Int".

Having a cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem checker that you don't understand why it fails on you means that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefit is quite small.

The same thing is totally true with your bridge example. Yeah, if you use your finite elements package and it responds negatively, that is just an indication that your bridge probably will fall down at some point. If you don't understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matics behind it you have no idea how to actual fix cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem and strengcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bridge where needed, or change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 angle, or whatever.

Finally, I find that making a distinction between applications and libraries are getting to be more and more of a disservice. If you design an application and don't think like a library designer, you will almost guaranteed write worse code, that someone else will have to maintain. I think that fundamentally cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re shouldn't be a difference. An application is just a number of libraries glued togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, and that means that when writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 components of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application you should approach it as any library development.

Finally, I agree with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sentiment that programming should not be dumbed down. That doesn't mean that you need to complicate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools. The interactions between seemingly simple components give rise to extreme complexity and possibility for expression - just look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Lisp family as an extremely simple model.

(And incidentally, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main difference between something with internal complexity, and without it: Ruby's metaprogramming capabilities are extremely simple to understand based on understanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internals of Ruby (which is quite simple in this area), while understanding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type system of Scala is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inverse: easy on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 surface, but gets more complicated if you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corner cases and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se.)

3:10 PM, June 16, 2008  
Blogger Tony Morris said...

Thank you Steve for your response. I will address your points below.

> once you've calmed down a bit

I was never not calm. That you think I was is worrying, because it means you have sidestepped what I have said in favour of how you'd like to perceive my current emotional state.

> what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IRC channel asked, and exactly how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir question was my fault.

Let's not concern ourselves with this unless you *really* are interested. It was one example of many. To be honest, this shit rant is far less offensive to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 scientific community than many of your ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. I'd racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r address false claims than attribute blame. I'm merely bringing it to your attention that it is happening (as are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things that you seem unaware of - see below).

> which of my claims are "erroneous" and "wildly false".

Well this is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 key point; where shall I begin? I'd like to start right at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning; try answering a couple of my questions above. You need to realise that you are significantly undermining a huge body of scientific knowledge here mate. I'm more than happy to introduce it to you. I think Chris Smith said it most succintly in his document "What to Know Before Debating Type Systems". Have you read that? I strongly suggest you do and adopt its recommendations.

> I'm assuming you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 difference between an opinion and something that's formally provable. So I ask you: which of my claims is formally provably false? We're all ears.

This would be fun. Before I get started, could you please find a tutorial of your choosing on formal logic, Goedel's Incompleteness Theorem and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Curry-Howard Isomorphism (off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top of my head - just to get started). I am not being sarcastic here Steve; I love teaching and learning and I hope you do too. A good dose on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topic of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type lambda calculi (of which cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 untyped lambda calculus is one instance) would also be helpful.

> Right now it sounds to everyone reading, and I do mean everyone, ...

No you don't; you mean "everyone in your little circle". There are many counter-examples to your claim because I am talking to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m right now, on IRC, in my office, etc. All of us agree on my position except cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y believe that I am foolish to bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r with pursuing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue as I am where I am being more optimistic. They seem happy to shrug it off as "just anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r fool making silly claims on his blog" and I am taking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 position of "a smart person making a silly mistake".

Steve, I want to make it clear, I am not referring specifically to this blog post (though it is one that has misled at least one learner), but all of your claims collectively - especially about static type systems and specific programming languages (which brings up a misunderstanding that you have - see below).

That people think I am throwing a tantrum is what I hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sise to be a symptom of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ages in which we live. I reject this culture completely as do many people who I consider to be of intellect higher than my own. They are just words; use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir English meaning instead of imposing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of "if I were using those words, I'd be throwing a tantrum, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore, this person must be too". This narrow-mindedness fills me with sadness.

> As it happens, I like Scala, so far at least. But I actually got a note verging on a death threat from a colleague for considering using it at work. This was a smart person at a smart company. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r places I suspect I'd have encountered even harsher resistance.

Yes Steve, I have worked in large corporations too. They are full of stupid people who are afraid of exercising cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir brain. You're not one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m Steve - clearly - but you're making a grave mistake and perpetuating this form of anti-intellectualism by failing to acquire cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 required level of understanding to make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 claims that you do. Your intentions are good; your execution is incredibly poor.

> There's far more at stake here than you realize. For every person trying to advance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cause of Scala, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are a thousand who will fight it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 death. People won't listen to academic arguments over something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y feel threatens cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir livelihood, and most folks feel that new languages (especially complicated ones) do just that.

No Steve, I am perfectly aware of "what is at stake". I simply have no ambition whatsoever to have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world use Scala or Haskell or whatever you decide is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 so-called "NBL".

Here is how I see it. This industry is full of people who have very sophisticated neurological mechanisms that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y employ when faced with "something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't understand". This is because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y have a heavy investment in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir self-worth so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proposition "I don't understand much at all" is threatening to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir well being. This is when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned mechanism is deployed in a variety of forms. Psychologists have spent a great deal of effort studying this behaviour. I concede that this will always be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case and have no ambition to change it.

However, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry also has some inquisitive people who turn to people like you and I in order to attain a higher understanding. I embrace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se people. My most favourite job ever was as a university lecturer; not during class but after class when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 truly curious students would probe me for knowledge. They loved it and a couple of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m today can even teach me a thing or two; how wonderful!

This is my objective Steve. I don't care about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various programming language memes; "oh, I know how to use Scala or Haskell or O'Caml; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best!". I couldn't give two hoots about this behaviour. You might, but I do not. I care about knowledge sharing and I am bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ring here because your silly rants prevent this. People internalise and repeat what you say like little myth spreaders. They are not capable of thinking for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves; again, a symptom of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ages in which we live.

> I've been beaten up and down by coworkers at enough companies over trying to use languages like OCaml and Haskell that I'm not about to stick my neck out for Scala. I'm done with being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 flag-bearer for academic static languages. If everyone starts using it, sign me up. But Scala enthusiasts have a much longer road ahead than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could possibly imagine, in trying to make this thing successful.

You are doomed so long as you stay at Google. It is an inherent attribute of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se large corporations to perpetuate a culture of anti-think. (btw, please don't give me this "yeah, but Google is different" nonsense). Just wtf is a "Scala enthusiast"? Why are some people so ready to assign a memetic membership? Am I a Scala enthusiast? I use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language quite a lot as I do many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages, including Java even! I wish to be relieved of any subscription to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se silly little clans as do many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs that I know for that matter. It's simply a misnomer perpetuated by an overhwhelming majority of amateurs.

> My primary advice to you, and I'll assume you deserve it, is this: learn marketing. Learn everything cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is to know about it. Then learn sales. A good salesman doesn't freak out. A good salesman is calm, funny, friendly, inviting, and persistent as all hell.

Thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advice Steve, but please be aware that it would violate my intention. Indeed, I spend a great deal of time in my armchair reading about various topics that I expect are most appropriate to marketing, but to employ cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in a way that you intend, would not assist me at all.

> You're not off to a good start, but it's not too late to make a change.

I'm off to a great start; I've asked that you stop making false claims and you have responded in such a way to indicate that you are open to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 possibility. I'm wondering if you're ready to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next step?

PS: rcoder, you have missed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 point completely

4:05 PM, June 16, 2008  
Blogger Ray Cromwell said...

Eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r-or fallacy. Static type systems do not prohibit REPL-style iterative programming and testing.

Secondly, I had a presentation at Google I/O as well that provides a counter point. Javascript may well be great for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server, but ironically, if you want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smallest possible download code, that starts up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 quickest in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 least latency (that is, best user experience, as opposed to developer experience), than GWT shows how Java does a much better job than Javascript. See http://www.youtube.com/watch?v=2ScPbu8ga1Q, where I demonstrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reduction of a jQuery-like API from 100+kb down to just 712bytes of compiled Javascript.

4:11 PM, June 16, 2008  
Blogger Yitz said...

dibblego, you may have noticed that Steve asked you if you, dibblego, have any specific points to refute. But dibblego, you evaded and gave Steve a reading list instead. How are we supposed to take you seriously, dibblego, if you can't answer a direct question like that? Well, dibblego?

Honestly, based purely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overriding tone of condescension I'm inclined to believe dibblego's a troll. Especially cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bit about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 terminating subset of Haskell. Har! You had me going for a moment cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re... dibblego.

1:03 AM, June 17, 2008  
Blogger Tony Morris said...

Yitz,
Steve did ask that and I answered; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 answer is yes. I'd like Steve to understand that refutation.

I also asked Steve some questions which are yet to be answered. I hope he will try.

I'm not sure about your comment regarding a terminating subset of Haskell. Do I need to change cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example for you? The point is, to provide an answer greater than "one" requires someone to draw on something that does not exist (i.e. _|_). The language is inconsequential. Programming language cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orists talk about terminating subsets of turing complete languages all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time.

1:35 AM, June 17, 2008  
Blogger martin said...

Ola: Again, I'm sorry to have given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impression that I equated dynamically typed languages with craftsmanship and statically typed languages like Scala with engineering. Believe me, that's not what I wanted to say. The phrases before this comparison said that dynamic languages are simpler to define and implement that statically typed ones. Simplicity is good, and we should go for it whereever feasible. But sometimes we need to invest in a more complex solution, to achieve a goal. For me, a sign of engineering is that one can ponder and evaluate such solutions without dismissing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m out of hand as being overly complex.

1:41 AM, June 17, 2008  
Blogger Steve Yegge said...

Martin: thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corrections and overview. I am in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of learning Scala and look forward to using it more.

4:20 AM, June 17, 2008  
Blogger Steve Yegge said...

Dibblego: Thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 slightly less incensed, albeit no less condescending response.

You and I live on different planets, that much is clear. I do know far more about your pretty formalisms than you realize; I've made a detailed study of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m for many years. They're just lovely. But I consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir current type-system reifications to be little better than Security Theater in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real world.

Your attitude betrays you as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 programming equivalent of a neocon. Your basic mode of operation is fear tactics: trying to scare people into thinking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can't live without your straitjackets, without curtailing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir "civil liberties" as programmers; for instance, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 liberty to run a program containing code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiler doesn't like or doesn't understand. Real-world systems are large, and messy, and very much alive. They are living things. Rigorous type-checking is almost always an impediment at some point in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 evolution of any system. Yet you advocate refusal to compile!

This approach is not "human-scalable": in systems with hundreds of people contributing code, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 daily build will be broken perpetually. This is already crippling many C++ and Java-based organizations; your neoconservative approach would kill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m outright. This, I believe, is why your camp has never produced any meaningful real-world software. Oh, you have? Show us! Name *any* ubiquitous piece of software written in one of your languages. The glove is off; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gauntlet is down; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ball is in your court.

We all know what your answer will be.

It's certainly not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case that all static typing aficionados share your fundamentalist bigotry, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are enough of you out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re to poison cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 well pretty thoroughly.

You have tried to give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 impression that you represent all academics, and that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y represent all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smart people. As it happens, and I say this for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefit of our readers, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are many academics who loacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static typers", as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're called. The practical utility of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "huge body of scientific knowledge" you refer to is a subject of some controversy even in academia. Your lack of successful software outside ICFP contests doesn't help your cause.

Though for what it's worth, you haven't articulated your concern clearly enough for us to identify a cause. I'm inferring from your outrage that you believe strongly statically-typed languages are much better than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir freewheeling peers. But you've also complained indirectly that I'm somehow responsible for decreased student interest in type cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory classes. If that's your main complaint, well, we have no disagreement: I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y should take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 classes.

But I think your objection is more to my general claim that your languages will never be widely adopted. That's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heart of it, n'est-ce pas?

I stand by my assertion.

I live and work in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real world. It's ugly, but I'm happy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. And I will continue to present real-world viewpoints. I'm not educating people; I'm echoing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m! It's a genuine opportunity for you to hear what real people think, what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're saying. But you want me to stop talking, as if somehow I'm cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 source. Once again, this is a pretty clear neocon-style sentiment: silence those with whom you disagree.

The picture you've painted of "industry's" neurological mechanisms that trigger when one's self-worth is threatened is quite accurate, and, ironically, is also an equally accurate portrayal of your own reactions. Funny how that works, isn't it?

I will continue to treat static type systems as an interesting experiment until you folks have done something interesting and compelling with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. I'm not talking about a shorter way to write QuickSort. Lord knows we have enough of those. When you guys write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world's most popular web browser, or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next iTunes, or a great video game, or a web service my friends and I simply cannot live without -- cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n I'll pay more attention to you.

And now, I'm happily heading back to my far-left commie pinko liberal Lisp programming.

5:18 AM, June 17, 2008  
Blogger Anocka said...

The problem of many programmers out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did not do enough maths. They lack rigorous thinking. They're cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of people that say : let's just call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method, i'm sure it's here !
What we need is reliability. The real reliability is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matical one. Functional programming brings us closer to it.
Here's a real world example : cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 electric flight control of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Airbus A380 series is a C program, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole code is checked by ASTREE, an ocaml static analyser, to PROVE cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absence of Run Time Errors.
You may argue that such a strong reliability is not needed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Real World", but I think that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that personal computer software is crippled with bugs today is due cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry's inertia.
The thing is, Steve : you are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conservative one. As a no-type-system advocate, you are to static typing programmers what alchemists are to scientists.

6:00 AM, June 17, 2008  
Blogger Stephan.Schmidt said...

I'm confused, how does "ocaml" as an implementation language for a static checker matter to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 project language, which was C?

Peace
-stephan

6:06 AM, June 17, 2008  
Blogger Ola Bini said...

Martin, very good. In that case I totally agree with you.

6:26 AM, June 17, 2008  
Blogger Steve Yegge said...

anocka: very nice fear mongering. Good to bring airplane software in when you want to make it extra scary, even though those systems account for an infinitesimally negligible percentage of all software.

I can't help but look around at all my applications and notice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're not crippled with bugs. In fact, I'll bet you used a computer to enter your comment. And I'll bet even more than NONE of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software between your keyboard and my screen (a long, long path) is written in a strong validating language.

You people are making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole static-typing camp look bad. You need to keep your trap shut and let Martin do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 talking for you; it's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best thing you can do for your cause.

If I get any more of this nonsense from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 far-right wing of static typing, I'm closing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 comments. I don't want you people hurting yourselves anymore.

10:29 AM, June 17, 2008  
Blogger Dan Shoutis said...

Defending scala:

I imagine this comment is belated enough that it will be completely missed. And on top of that, it's responding to a (very long) aside and not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main topic.

But still. You weren't very fair to scala, Stevey.

The big one is that you judged scala based on its specification document, which is indeed very long and complex. However, compare to Ruby, which shares w/ scala a huge syntax in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of useful & readable shorthand. (Insert crickets chirping here.) Ah, that's right. Ruby never had a formal (or informal) specification! How about Python? Ah, hmmm. I'm not as familiar with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Python community, but I believe no spec exists cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. Javascript -does- have a spec, and a reasonably simple one... but does anyone learn/judge javascript based on its spec? No, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y write some code in it.

Since I have, unlike you, written code in scala, here's my assessment:
- The language is a superset of Java. You can restrict yourself to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java-like portions of it and produce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact same code, but with many, many, fewer keystrokes. If you do this, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 big scary type system stays completely out of your way.
- If you wish to go beyond, it has some stupendously useful tools for doing so. E.g.: The (unfortunately-named) "pimp my library" pattern, which gives you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 benefits (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n some) of ruby-style open classes over any/all java APIs. Which means you can, with a small amount of work, wrap those hugely verbose enterprisey libraries into a succinct and to-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-point form.
- If you go too far beyond "basic java", you will have to wrestle with understanding some somewhat tricky type issues that have a quite steep learning curve. (In particular: covariance & contravariance.)
- The existence of strong types enables a fantastically powerful style of programming that I will hand-wavingly call 'type-directed metaprogramming.' The most useful and practical example of this, ironically given your opinion that static typing impedes it, comes into play with unit testing: scalacheck (a haskell quickcheck clone) uses static type information to automatically and reasonably-exhaustively test correctness properties. 1000% awesome and way, way better than handwriting unit tests when it's applicable.
- The language is still young, probably too young to be promoting widely. They are still tweaking syntax & semantics from time to time.
- There is an unfortunately huge gap between writing 'novice' business logic code (essentially java w/ a nicer syntax & type inference) and writing 'wizard' library code.
- The community is being settled mainly by static typing Haskell wizard immigrants, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language allows that style of programming. I think this is unfortunate as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir heavy leaning towards monads, category cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 like artifically steepens cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 learning curve.
- Scala's really, really, sweet spot: writing complicated algorithms (particularly functional ones) for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 java ecosystem.
- Of course, since it's a kitchen sink language, it has many 'sweet spots'; anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r is wrapping APIs up into a vastly simplified embedded-dsl-ish form.

Enough rambling from me, although to match your output I'd have to go for anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r several pages.... ;)

10:31 AM, June 17, 2008  
Blogger Tony Morris said...

Steve,
I have explicitly asked to be admonished from your agenda and do not accept any assignment to your artifcial cliques. I am not a "static typer" or a "Scala programmer". I use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less well-typed languages too. I also know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of a type system. It is becoming quite apparent that you do not. I implore you to read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned Chris Smith's take on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "debate" that you think is raging. It is most accurate.

I am beginning to give up; my colleagues can have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir laugh at my expense. You throw straw man arguments like it is perfectly acceptable and reasonable. Keep your head in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sand; I'll take care of your victims.

5:00 PM, June 17, 2008  
Blogger Unknown said...

I read about Appjet has built cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir own virtualization engine for running untrusted code in Rhino. Could you elaborate on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxing model that you were talking about?

5:58 PM, June 17, 2008  
Blogger Script Uncle said...

dibblego: Was it so hard to actually list one point that you disagreed with? Or two?

7:06 AM, June 18, 2008  
Blogger Cameron D said...

Excellent talk; it's a shame one has to get assaulted by overzealous, closed-minded types when sharing information on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web, though.

It still amazes me that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's so much religion and so little pragmatism in selecting tools (languages, frameworks, etc.) for software projects. A strict, proven-formally-correct type system might be ideal for a mission-critical flight system. but it's probably too cumbersome for a twitter client. How hard was that?

It's like telling everyone to wear a 50lb. bulletproof vest every day because we should have that kind of protection. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 day you build that protection into my t-shirt, sure I'll wear it every day.

Don't get me wrong, I'm not discounting so-called 'academic languages' at all; I adore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m. I've studied my lambda calculi and my Curry-Howard isomorphism, I just don't think we need to tell gymnasts, for instance, to wear bullet-proof vests.

11:01 AM, June 18, 2008  
Blogger lewy14 said...

Steve, regarding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 advantages of VMs - runtime info available to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JIT etc - I'm surprised in light of this blog of yours that you haven't already put forward this pithy formulation:

Machines are not acceptable machines.

4:41 PM, June 18, 2008  
Blogger Chris D said...

dibblego:

Anyone discounting you is likely doing so because your writing style recommends it, not because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're "anti-intellectual". Ad hominem attacks--among which I include your quite silly claim that Steve, an advanced software engineer with a strong computer science background, doesn't know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Halting Problem--don't really bolster your point, to him or anyone else.

It reminds me of a thread over on Lambda cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Ultimate, where a poster was lamenting that he had given a talk and someone had asked him what covariance and contravariance were. This was clearly a guy with an advanced CS degree or two, and I got cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 distinct feeling that his idea of "properly educated" was that someone should know what he knew, and be able to discuss it at his level. And for CS graduate students, I'm sure he's right; but not for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r 987238974 people who write code.

Unfortunately, that's not really how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world is, nor does it need to be; and it's a lot more helpful to respect what people *do* know and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 level cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y *can* engage on. I think Steve knows quite a lot, even if he lacks your expertise and probably wouldn't always agree with you if he did. So maybe entering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discussion with calmness and courtesy, with a starting premise ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than that you are inescapably correct, might generate a more productive conversation.

8:08 PM, June 18, 2008  
Blogger DF said...

I'm one of those Java programmers who clings to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static typing even though you rail against it in every post (roughly: "a small codebase is more important than static typing").

Three thoughts that I'd enjoy a response to:

1. A new principle: PAT. "Protect Against Typos." At least 10 times a day I type "nmLevels" instead of "numLevels". I want a language that tells me immediately that I have a typo. I want a wavy red line under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variable name that tells me "TYPO". Eclipse has that. Perl in strict mode at least makes it possible, though I've never seen cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 red wavy line (although types allow anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r level of red wavy: type mismatch, which catches more of my typos). What do dynamic languages do about PAT and red wavy lines?

2. Unit tests guard against mistakes at runtime. Programs have a large number of possible runtime paths .. combinatorially many. So, to produce enough unit tests to protect myself against typos (PAT) I potentially have to fight cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "curse of dimensionality" (i.e. write a lot of damn tests). However, a compiler has a damn fast way (linear, small-polynomial .. whatever, fast) of protecting me against all possible typos of a certain class. Type checking seems faster and more complete than unit tests.

3. Cross-cutting changes in code. Several times I've had to change a fundamental behavior in a reasonably large system. When it's in a dynamic language (e.g., Python), I grep like a madman and hope that I've stumbled on enough of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 runtime paths to be reasonably safe, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re can often be painful misses. In a dynamic language, I can change a signature or make something private, and all of a sudden cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a helpful nag forcing me to at least examine every one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 500 places that change. How does one gain comfort in cross-cutting changes?

DF

10:32 PM, June 18, 2008  
Blogger Ray Cromwell said...

I think Steve's point, that dynamically typed languages can be made to run fast was significantly diluted by his "bash static languages" tangent. Had he stuck to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject at hand, I don't think people would disagree with his points. I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire line of Scala bashing simply was not needed and did not serve to enforce his JS/Rhino on server-side Java VM subject matter.

I also think that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is too much myopia in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se static vs dynamic wars. Steve wants to beat back FUD from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 static camp that dynamic languages are slow, by saying "look, write a sufficiently advanced JIT and most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issues go away", but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n he adopts a similar myopic attitude that static typing requires batch compilation. The sort of interactive incremental development, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 equivalent of evaluating lisp in emacs, he advocates is not outside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 realm of typed languages. You can use scala-mode.el today in Emacs and hit ctlr-c/ctrl-b to eval Scala in a running interpreter for example. It's just not available with Java, because no one has bocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365red to engineer a sufficiently advanced IDE/VM, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem is tractable.

Even cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 issue of "dynamic with optional static typing" and "static typing with optional dynamic" isn't an eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r-or situation. I could certainly imagine a language, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type-check policy is library or module specific.

Too often people want to category languages into polar opposite categories, when it's more of a continuum, and it doesn't help to cherry pick anecdotal examples and claim that X is impossible in a static language, or a dynamic language, simply because it hasn't been done, or is hard.

Scala may turn out to be too complex for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Joe Sixpack programmer, but if so, it isn't an indictment of static typing, and claims that "static typing has failed" just seem ludicrous.

10:38 PM, June 18, 2008  
Blogger Weston said...

"Welcome to BroadVision 1998... we already had an entire application system that could be scripted in JavaScript"

I'm curious. Did anyone get to use this? My employer circa 1999-2000 announced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'd be migrating to it, and I'd just recently learned enough Javascript to be excited about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea ("Hey! First-class functions! And this prototyping stuff is cool! And objects can be hashes!").

The actual adoption process was slow and pointy-hairedness was becoming endemic, so I left, but I always wondered.

I found Rhino about 18 months ago. Wish I'd found it earlier. I'm excited about its prospects.

11:21 AM, June 19, 2008  
Blogger Ray Cromwell said...

Welcome to 1997 :), I was using Netscape Enterprise Server and Server-Side JS ("LiveScript") back cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n. We were even using it in a 3-tier architecture, with presentation rendered by JS libraries (View/Controller) and making RMI/CORBA calls from JS to Java for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle tier. This was partially done to work around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory limits of NES (max-heap of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NES JVM was fixed at something ridiculous like 16mb and unchangeable) We had a Swing-like set of widgets written in JS that would swallow up Swing-like models returned by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 RMI calls, e.g. a RMI DAO call would return a TableModel, which would be consumed by a paginated JS table widget.

I do remember being frustrated that LiveScript, IIRC, had a compile step, so you had to recompile JS, and restart cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server everytime you made a change. :(

11:57 AM, June 19, 2008  
Blogger Tony Morris said...

Chris,
I admit that I may have had a jerky knee. After all, I am usually one of those people who just sighs and thinks "oh no, Yegge is talking nonsense again". It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r newbie came looking for help because he had been misguided that provoked my response.

However, I did not use ad hominem fallacies. I've had to point out what an ad hominem fallacy is before and I'll happily do it again. It should be noted that a statement of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, "you are clueless" is not an ad hominem. However, a statement of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form "you are clueless, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore, q" (for some q) is ad hominem. However, it is not to be confused with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 converse "p, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365refore, you are clueless", which is *not* ad hominem. I may have made statements of this latter form. I'll expand if required

Second, you are using a logical fallacy where you state that (paraphrased) "I should expect Steve to have knowledge of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 halting problem because he is advanced/experienced/etc.". It may be true that Steve possesses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 properties, however, it has no bearing on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 truth value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proposition at hand.

Steve's gross misunderstandings of proof/correctness verification systems have a direct implication that convinces me that Steve has no idea about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fundamental implications of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 halting problem. Not that I wish to pick on Steve at this point; I merely wanted to give him a term that is related to his misunderstanding so he can explore it furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r if desired.

Of course, it may be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case that Steve has a thorough understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topic at hand and exists in a state of "double-think" i.e. holding two contradicting positions at once, however, although double-think is often a good default candidate on many issues, I have assigned it to "improbable" it out in this case (though, I think it is highly probable that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is double-think in some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r context here on this blog).

In any case, I want to put it to rest. Steve has his head comfortably in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sand and I have spent more effort here than I have dealing with Steve's victims. There is nothing more to be gained.

5:03 PM, June 19, 2008  
Blogger Cedric said...

dibblego writes:

It should be noted that a statement of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, "you are clueless" is not an ad hominem.

You're wrong:

"ad hominem: marked by or being an attack on an opponent's character racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than by an answer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 contentions made"

By cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, you sound remarkably like Tony Morris, you know? If you're not him, you guys should definitely hang out.

11:43 PM, June 19, 2008  
Blogger freegnu said...

Let's all just put some time into learning APL since it solves all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se syntax, type, and speed issues by computing racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than programming.

6:07 AM, June 21, 2008  
Blogger jmags said...

I am glad that dibblego continues to gibber like a maniac. Gives me a reason to come back here during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 gaps between blog posts.

1:35 PM, June 22, 2008  
Blogger Oisín said...

Interesting talk; I hadn't considered cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 interoperability benefits of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JVM before.

It'd be nice to see your compiler/interpreter work open-sourced; for one thing, more eyes and brains on it might bring it closer to Java speeds, which would promote adoption, since lots of people reject possibly-superior languages due to relative slowness even when it doesn't actually matter in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y end up writing.

p.s. dibblego:
"It is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r newbie came looking for help because he had been misguided that provoked my response."

I haven't seen cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 'misguided' position held by this newbie, in any of your comments (= vitriolic diatribes).
So it's not really fair to say with no qualification at all that "some newbie was misguided and specifically because of you".

Post cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 misconception he came to you with, as well as a reasonable proof that it is Steve's fault (for apparently promoting incorrect ideas/assumptions).
Ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise, you'll just continue to sound like a rude, arrogant twat.

5:00 AM, June 23, 2008  
Blogger alibeyad said...

http://axiomstack.com/

This is a fully-functional, standalone app server with server-side Javascript using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Rhino interpretor, including built-in data storage with Lucene.

7:39 AM, June 23, 2008  
Blogger Brad Buchsbaum said...

Static typing advocates may be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 neocons of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 programming world ... but I could swear I just saw you "swift-boat" Scala, no?

Programming language pundit numero uno, Steve Yegge, has a big readership and he knows it. And if JavaScript is going to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NBL, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n something had to be done about this young upstart, Scala.

But unlike John Kerry in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2004 US presidential election who failed to respond to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Swift-Boat ads, Martin Odersky was on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case, responding in measured tones in a dignified and scholarly manner, striking just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right contrast with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 semi-serious rant-style of pundit numero uno.

One can almost hear a slight quaver in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 normally cocksure voice of a slightly chastenend super-pundit:

"Martin: thank you for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corrections and overview. I am in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of learning Scala and look forward to using it more."

What Scala really needs right now is name identification and buzz. All publicity is good publicity, at this point -- even a little swift-boating helps cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Scala cause.

Point Scala.

10:41 AM, June 23, 2008  
Blogger Sony Macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365w said...

Turning into a nasty biz ... this.

Java has struck cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right balance or compromise between static vs. dynamic in terms of performance, dynamic meta-data reflection, re-factoring tools, etc. not too complex (except maybe ??generics??).

11:28 AM, June 23, 2008  
Blogger Sony Macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365w said...

But, I do like Rhino and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 idea of writing quick prototypes with it.

11:39 AM, June 23, 2008  
Blogger Ray Cromwell said...

Have you tried scala-mode in emacs? You can write scala code and instantly eval/test it, just like elisp. No compile step, no refresh browser step.

11:56 AM, June 23, 2008  
Blogger Unknown said...

Although you say that it will take 10 years of work to get language interoperability, I'd just like to point out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 i OS (formerly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AS/400, or System i) from IBM has what is called an Integrated Language Environment (ILE) that provides a framework within which you can make all kind of cross-language calls, share data, etc. Here is a link to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public documentation.

http://publib.boulder.ibm.com/infocenter/systems/scope/i5os/topic/books/sc415606.pdf

12:33 PM, June 25, 2008  
Blogger Stefan Kanev said...

Thank you for this article.

4:54 AM, July 05, 2008  
Blogger Paul Morrison said...

Wonder if Flow-based Programming will help with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language communication issue - Justin Bozonier pointed me at your talk (which he must have attended). I have posted a conversation about this with him at http://www.jpaulmorrison.com/cgi-bin/wiki.pl?JustinTalk . I'd be interested in your reaction to FBP.

12:31 PM, July 17, 2008  
Blogger Paul Morrison said...

That's wiki.pl?JustinTalk - looks like it got chopped :-)

12:34 PM, July 17, 2008  
Blogger Unknown said...

This is a nice talk. Steve does highlight some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best features provided by Rhino.
He also tries to convince his audience that Javascript is a great language (having himself being convinced). It's a pity that he fails to mention anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r opensource (built on top of rhino)
called seppia. (http://www.seppia.org)


In my opinion cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topics should not always revert around javascript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 serverside vs.
javascript on a web-browser but it should just be emphasized how javascript can well combine its strengths with java.
For example, Seppia uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir relationship to provide an environment to build up applications. But unfortunately not many people know about it...

2:27 AM, August 01, 2008  
Blogger Doug said...

Steve- I think I've read everything you've written, both here and on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old rants site. I'm a CS major interested in languages and systems programming, and I find that nothing inspires my interest in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 field more than your posts.

I imagine that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 negativity and rudeness from commenters can be very discouraging, so I'd just like to humbly thank you for your work. I eagerly await your next post.

9:43 PM, August 20, 2008  
Anonymous Anonymous said...

Thanks! That worked perfectly.Dvd Box Wholesale Tin Containers Cd Box Supplier Flash Drive| Flash Card

1:44 AM, September 08, 2008  
Anonymous Anonymous said...

good post! -

2:29 AM, September 10, 2008  
Blogger Unknown said...

Waiting to see JavaScript on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GAE via V8

9:30 AM, September 12, 2008  
Blogger Rob said...

Netscape pioneered server-side JavaScript (called LiveWire) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir Enterprise Server 3.0 product (released in 1997).

http://cgi.netscape.com/newsref/pr/newsrelease334.html

6:04 PM, September 15, 2008  
Blogger Lucian said...

Js being actually nice is a very intriguing idea.

Personally, I haven't seen a language or a web framework as nice as python and django yet.

Jython is being supported by sun (and already has alpha support for 2.5, soon ctypes) and django just hit 1.0, so I'm curious to see how RnR and Jython+Django stack up.

And about threads, shared memory concurrency is very low-level and error prone. Share nothing message passing works great, in both erlang and stackless python and hopefully will get more mainstream.

6:41 AM, September 16, 2008  
Blogger Paul Morrison said...

Flow-Based Programming is also a message-passing approach - using a separately defined network...

7:20 AM, September 16, 2008  
Blogger Ryan said...

I desperately hope that dibblego will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 strength, dedication and goodness of heart, to protect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 poor innocent victims of Steves lies and secret agenda.

And, I would like to thank dibblego for helping me understand why trolls are so disdained. I have heard of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se trolls, and seen cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir activity, but never fully grasped how annoying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y could be.

And Steve, despite this illusion of being entertained, informed and a tad inspired from your talks, etc, I now must try to figure out how to purge my brain from your filth...wish me luck.

5:29 AM, March 23, 2009  
Blogger Aaron said...

Maybe this has already been addressed, but I've been feeling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 need to ask.

You've made reference to developing Rhino on Rails as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 framework for a a huge web project. Was that project Google Wave? If not, what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heck kind of project are you doing that it needs a bigger, more powerful framework than Wave does?

8:53 AM, December 05, 2009  
Anonymous Anonymous said...

The problem of many programmers out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y did not do enough maths. They lack rigorous thinking. They're cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of people that say : let's just call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method, i'm sure it's here !
What we need is reliability. The real reliability is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matical one. Functional programming brings us closer to it.
Here's a real world example : cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 electric flight control of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Airbus A380 series is a C program, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole code is checked by ASTREE, an ocaml static analyser, to PROVE cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absence of Run Time Errors.
You may argue that such a strong reliability is not needed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "Real World", but I think that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that personal computer software is crippled with bugs today is due cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 industry's inertia.
The thing is, Steve : you are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conservative one. As a no-type-system advocate, you are to static typing programmers what alchemists are to scientists.
seslisohbet

1:26 PM, June 23, 2010  
Blogger Unknown said...

dibblego:

I know this is an old thread.

You and Tony Morris(are you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same person? You both have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same condending and boring approach to beating down heacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ns) are a big reason why FP hasn't taken off. The community flat out sucks. It is full of arrogant, self-important, psuedo-intellectuals.

Funny how you can't name a single FP program that is successful. Even two years later, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is nothing noteworthy from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Haskell and Scala camps.

Actually, it is not funny it is sad. You guess are so busy circle jerking to your self-importance to actually do anything of substance.

Yeah. Java as a language sucks, not as bad as PHP, but still quite sucky. But at least cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are more than a few significant and successful projects written in it. Scala and Haskell programmers can't say that.

12:50 PM, December 24, 2010  
Blogger sesliekip said...

Rhino on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server? This has been in Ogoglio for two years, though it is limited to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 simulator scripts.

12:02 AM, January 12, 2011  

Post a Comment

<< Home