Monday, April 16, 2007

Claudius is Creepy

CLAUDIUS: 'Tis sweet and commendable in your nature, Hamlet,
To give these mourning duties to your father:
But, you must know, your father lost a father;
That father lost, lost his, and the survivor bound
In filial obligation for some term
To do obsequious sorrow: but to persever
In obstinate condolement is a course
Of impious stubbornness ....
-- Hamlet, I.ii

I must have read or seen Hamlet dozens of times before I grasped one of the implications of this passage. I've always seen the obvious one, that Claudius is attempting to distract Hamlet from his grief. (He goes on to literally promise him the kingdom, for Pete's sake.) It's not hard to see why Claudius, the murderer, doesn't want anyone -- least of all Hamlet -- dwelling on the murder of Hamlet's father. Move along, Danes; nothing to see here!

What I noticed only recently is something Claudius himself doesn't mean to reveal: his own casual, brutal attitude toward death. When he says airily that "your father lost a father," he as Hamlet's paternal uncle is speaking of his own father's death. And it means nothing to him. Death has never meant anything to Claudius, except lately as a means to an end.

More deeply, he's unconscious that death could mean something to other people. He's unaware he's revealing anything about himself because he's unaware that he's unusual -- practically sociopathic. No doubt the way he counsels his nephew Hamlet to experience the elder Hamlet's death, and the subsequent natural grieving process, is simply the way Claudius does it himself: you put on some black clothes, walk around pretending to look sad for a while, and then have a nice sandwich.

He's manipulating Hamlet, to be sure, but I think he's also genuinely puzzled by Hamlet's behavior. Why are you acting this way, kid? Don't you know this isn't how you play the game?

Claudius is creepy. Claudius is cold.

Friday, April 13, 2007

Wii: Blazing Angels: Squadrons of World War II

I like games that let you play at doing things you've always thought about but would simply never be able to do in real life. This is one of those games. I'll never be a World War II fighter pilot (or so I assume), and getting a chance to sample that experience without all the icky noise and blood and danger and death -- you know, without all the reality -- was terrific. For me personally, this game was worth the purchase price for the "Battle of Britain" scenario alone: chasing a Messerschmitt squadron through the Tower Bridge? Awesome!

But I wouldn't expect most people to feel that way. For most people, this game would be a rental at best. It was repetitive and uninspired, and the Ice Canyon segment in particular was needlessly frustrating. If it hadn't spoken to my particular daydreams, I'd have quit well before finishing.

Wii: Rayman Raving Rabbids

Great fun. Didn't take me that long to complete it, but worth the money all the same.

I realized while playing it that I dislike, indeed I downright hate, games with sloppy control schemes. They drive me insane. Most of RRR's mini-games have a perfectly crisp, tight feel to the controls, but some deliberately don't. Specifically, there are a couple of warthog-racing games, and a flying game or two, where your mount has a sort of inertia and doesn't respond immediately to your input. That's on purpose; a galloping warthog doesn't turn on a dime. But I found it frustrating, all the same. Later on I relaxed and started consciously compensating for it, which helped.

Still, that was an aberration. Mostly, the thing was just plain goofy fun. My favorites were the first-person-shooter scenarios where you run around with a plunger gun and a chain, snaring and shooting rabbids as they jump you. Unlike most FPSs, your character follows a predetermined course through these mini-games -- you don't control your position or point of view, you just react as the scenario proceeds. It was great, but without putting it down in any way, I'll add that I'd pay real money for a true FPS with the same concept -- Quake Rabbid, if you will.

The rhythm games on each level, in which you shake the Wiimote and nunchuck in time with a series of songs (increasingly complex, of course), were also a lot of fun but were almost too easy to enjoy. Almost, but not quite. As it was, I enjoyed them tremendously.

Great fun.

Wii: The Legend of Zelda: Twilight Princess

While I admire this game's breadth, I'd have traded a lot of that breadth for a little more depth. To me, it seemed less a great epic, more a rambling assortment of individually shallow puzzles.

There's nothing inherently wrong with that; Rayman Raving Rabbids is a large collection of mini-games, and it's one I had a lot of fun playing. But unlike Rayman, the puzzles in Zelda aren't particularly fun. They just seem to go on, and on, and on, endlessly. (Fishing, for example, was just about as much fun as the real thing.) I got about a half or a third of the way through, found myself in yet another dungeon or temple or whatever it was, and just put it aside. And I haven't felt like picking it back up.

Shallow fun is OK (in all honesty, that's exactly what I bought a Wii for), but this is shallow non-fun. It's just tedious. There are lots of people who passionately love this game -- I think what they get out of it is the sense that they're inhabiting a huge world, following exciting (for them) quests through it. I understand that, but it still didn't float my boat. I didn't hate it -- I sort of wish it well; I had some fun playing it. But I don't really want to play it any more.

Thursday, April 12, 2007

Free Java Compilers for GNU/Linux

For some time, free Java compilers for GNU/Linux have been disappointing. (As with anything in the world of free software, I want to moderate my criticism: if you really don't like something, at least you can fix it, and besides, you should be only so rude about stuff you get for free.)


Where We Stand

The state of things as I see it is this:







CompilerSpeedWarnings/ErrorsLanguage Coverage
javacSlowLousyGreat (1.5)
gcjMediumGreatLousy (1.1/1.2)
jikesBlazing fastOutstandingGood (1.4)
ecjPainfully slowVery goodExcellent (1.5)


So each of these has at least one problem that will drive you crazy. Sun's own javac is slow and gives you the same error message ("unknown symbol") for practically everything. GNU's gcj supports only an older version of the Java language: no generics, no enums, etc. IBM's jikes, too, is falling behind on the language feature front, and is apparently no longer maintained, so that's only going to get worse. Finally, the Eclipse project's ecj is so slow, you can actually brew a cup of java every time you run it.

(Kaffe's compiler, by the way, is just plain hopeless.)

As a result, I wasn't really happy with any of these. For a long time, I stuck with jikes as being the overall best contender, but I was increasingly unhappy about its lack of support for generics, enums, annotations, and other new language constructs.


Finding a Better Solution

When I looked at the alternatives, I was least repelled by ecj. If only there were some way to make it faster ....

Happily, there is. A little investigation showed that the problem was in the JVM startup time. Ecj itself is written in Java, and thus it must start up a JVM every time it runs. So a native-code version of ecj has a chance of being the Holy Grail of free Java compilers: fast, with good feedback and up-to-date language support.

And there's even a way to produce such a thing: gcj. Gcj can't compile ecj itself, because ecj's own code uses language constructs that gcj doesn't support. But one of gcj's many nice features is that it can compile a .class file, or a .jar file full of .class files, to native code. After a bit of experimentation, I was able to compile ecj's .jar files to native code. The resulting compiler is about as fast as jikes, offers feedback almost as good as gcj or jikes, and supports the language as well as javac. It's a winner.


Regrets

There are still some things I miss about using jikes:
  • Spell-checking. If you mistyped a symbol (a method name, variable name, class name, etc.), jikes offered reasonable alternatives. If you accidentally typed mystring.substrng(...), jikes would suggest mystring.substring(...). Its suggestions were nearly always correct, and the feature was a huge time saver. Ecj has nothing like it.
  • Jikes also behaved better when compiling multiple files. It correctly detected and compiled dependencies, didn't care if you specified a file more than once on the command line, and would compile file N+1 if file N didn't compile (more useful than you might think). Ecj does none of this.
Still, a natively compiled ecj is a really nice option, definitely the cream of the current crop.