[ Jocelyn Ireson-Paine's Home Page | Publications | Dobbs Code Talk Index | Dobbs Blog Version ]

Plain Language

This morning, I was berating my brain. If I were supple enough, I'd have given it a good kick. Because it couldn't remember how to open and print to a Unicode file in Java. (You create a new FileOutputStream pointing at the file, then create an OutputStreamWriter from the FileOutputStream and the name of your encoding, and then create a PrintWriter from the OutputStreamWriter. While doing this, you have to keep in mind the difference between the "write" methods, which most output streams can execute, and the "print" methods, which fewer can. I don't know why.)

But then I decided that it isn't my brain that's at fault; it's Java. Because look how Java makes you define an associative table:

static {
  defaultPorts.put( "http" , new Integer(80) );
  defaultPorts.put( "shttp", new Integer(80) );
  defaultPorts.put( "https", new Integer(443) );   // ...
  UsesGenericSyntax.put( "http" , Boolean.TRUE );
  UsesGenericSyntax.put( "shttp" , Boolean.TRUE );
  UsesGenericSyntax.put( "https" , Boolean.TRUE ); // ...
}

Which is ludicrous, insane, crazy, preposterous, risible, ridiculous, farcical and absurd, as well as every other synonym you can think of. An associative table is a mapping, and a mapping is a function, and function is the most fundamental notion in mathematics. Also the simplest. Functions are sets of ordered pairs, so any decent language would let you write them using a notation whose primitives represent the primitive parts of a set of ordered pairs, clearly arrangeable to describe the whole.

It's analogous, or should be, to the control knobs on my cooker. The layout of the knobs is a scaled-down picture of the layout of the hotplates, and the set of possible rotations of each knob is a curved picture of the set of its hotplate's possible temperatures. The parts of the controls match the parts of what they control, and the arrangement of these controls matches the arrangement of the things they control. Except if I program in Java, when my cooker controls would look like this:

static {
  CookerControlPanel cp = 
    my_cooker.addCookerControlPanel( new CookerControlPanel("CookMaster 
CP141","UK version") );
  cp.setLanguage( "English" );
  cp.getLabelTextGenerator().setTextReadingDirection( 
TextReadingDirections.LEFT_TO_RIGHT );
  CookerHotplateControlKnobPosition front_left_pos, front_right_pos, 
back_left_pos, back_right_pos;
  front_left_pos = new CookerHotplateControlKnobPosition( new Integer(0), 
new Integer(0) );
  front_right_pos = new CookerHotplateControlKnobPosition( new Integer(6), 
new Integer(0) );
  back_left_pos = new CookerHotplateControlKnobPosition( new Integer(0), 
new Integer(6) );
  back_right_pos = new CookerHotplateControlKnobPosition( new Integer(6), 
new Integer(6) );
  CookerHotplateControlKnob front_left_knob = new 
CookerHotplateControlKnob( front_left_pos );
  front_left_knob.addLabel( "Front left" );
  CookerHotplateControlKnobTemperatureScale 
front_left_knob_temperature_scale = 
    new CookerHotplateControlKnobTemperatureScale( 
CookerHotplateControlKnobTemperatureScaleBaseScales.FAHRENHEIT, new 
Integer(50), new Integer(350) );
  front_left_knob.addTemperatureScale( front_left_knob_temperature_scale 
);
}
And on and on and on, until your brain turns to toast.

Moreover — returning to the associative table — why must I tell Java that 80 is an integer? Does it know an 80 that isn't? Why must I tell it that TRUE is a Boolean? Does it know TRUEs that aren't? Perhaps they're TRUES used by visitors from another universe whose logic is different from ours, so that when they come here, they have to switch. Like an internationalisation-resource-bundle, except that you carry with you not your time-zone and alphabet, but your universe's truth values.

I copied the associative-table code from a video called "Public Static Void". This was one of the keynote speeches at OSCON 2010, the O'Reilly Open Source Convention, and is by Rob Pike, co-designer of Google's Go programming language. Pike doesn't like the verbosity of Java and C++, and gives examples that demonstrate it, as well as ridiculing the spurious packaging around 80 and TRUE. At the beginning of the video, he quotes Lisp expert Dick Gabriel:

I'm always delighted by the light touch and stillness of early programming languages. Not much text; a lot gets done. Old programs read like quiet conversations between a well-spoken research worker and a well-studied mechanical colleague, not as a debate with a compiler. Who'd have guessed sophistication bought such noise?

I'm sure Gabriel was thinking of Lisp. And maybe also of APL, Algol 60, BCPL, Comit, Simula 67, Snobol, and even Fortran. But then, perhaps somewhere in the years that began with Pascal and Modula and Clu, and ended with C++ and Java, something went awry. What? And why?