Gosling gets it --- but a little late.
Jeff Bone
jbone at deepfile.com
Fri Jun 13 23:10:52 PDT 2003
Gosling's a great bellwether. He's *almost* never among the very first
to clue into things --- mobile code in NeWS being a possible exception,
translated slowly into Java, though they missed on the ANDF thing that
C# / .Net got right, despite Sun's centrality in participation in ANDF
in the early 90s --- and he's usually on the trailing edge of the
bleeding edge in applicability. But he's almost always among the very
first to *deeply* grok various things.
Gosling's recently grokked the fact that *programs are graphs* and
*graphs can be manipulated algorithmically.* Of course Koza (and
others) grokked this years ago. But IMHO, this more than any other
thing is one of the very few key technologies / insights that will make
automated general reasoning (aka Strong AI) possible. (Moreso than the
naive connectionist / neural net efforts by themselves, and more than
the too-low-level GA approaches, Genetic Programming by mutating parse
trees offers lots of opportunity.)
----
http://www.artima.com/intv/jackpotP.html
Analyze this!
A Conversation with James Gosling, Part I
by Bill Venners
Jun 9, 2003
Summary
James Gosling talks with Bill Venners about his current research
project, code-named Jackpot, which builds annotated parse trees for
programs and can help you analyze, visualize, and refactor your program.
For the past several years, Java's creator James Gosling has been
working at Sun Labs, researching ways to analyze and manipulate
programs represented as annotated parse trees, a project called
Jackpot. Compilers have long built parse trees when they translate
source code into binary. But traditionally, programmers have worked
with source code primarily by manipulating text with editors. The goal
of the Jackpot project is to investigate the value of treating the
parse tree as the program at development time, not just at compile time.
In this interview, which will be published in multiple installments,
James Gosling talks about many aspects of programming. In this first
installment, Gosling describes the ways in which Jackpot can help
programmers analyze, visualize, and refactor their programs.
Treating Programs as Algebraic Structures
Bill Venners: What's the state of Jackpot, your current research
project?
James Gosling: Jackpot has been really cool lately. It's what I'm
spending most of my time on, and it's been a lot of fun. I was really
hoping to have something I could hand out at JavaOne this year, but
I've been finding too many entertaining things to do.
It's a very different world when a program is an algebraic structure
rather than a bag of characters, when you can actually do algebra on
programs rather than just swizzling characters around. A lot of things
become possible.
Bill Venners: Like what?
James Gosling: If you look at any of the refactoring books, most of
those refactoring actions become much more straightforward, in ways
that are fairly deep.
Moving a method isn't just cutting and pasting text. It's a lot more
than renaming the parameters and swizzling them around, because you
really want to be able to do things like construct forwarding methods.
When you construct forwarding methods, they're different from the
original methods.
You can't just replace all uses of the forwarding method by uses of the
moved method, because they actually behave slightly differently. The
difference is usually around what happens when the pivot parameter is
null. That can lead you into a deep morass of essentially theorem
proving about properties of the code fragments that you're moving, to
understand how they behave with respect to null. And you can treat all
kinds of code manipulation that way.
So Jackpot has a baby theorem prover, or algebraic simplifier, that
knows an awful lot about data flow and the implications of values. And
it really does treat your program as a piece of algebra to be
simplified and transformed. It can do an awful lot of interesting
analysis that pays off when you want to make fairly significant
pervasive changes to very large programs. That analysis pays off, for
example, when you want to replace one API with another API that is
almost the same. Often "almost the same" is actually harder than
"radically different." I spent most of the last four months working on
this baby theorem prover, and that's been a lot of fun.
Creating Visual Representations of Programs
Bill Venners: I read that Jackpot can create interesting graphical
representations of a program. What is that about?
James Gosling: Jackpot can take this underlying algebraic structure—
it's really the annotated parse tree—and generate a visual
representation from that. Our internal notion of the truth is not text.
But once it's not text, all of a sudden you can display it in really
interesting ways.
We've got an underlying rule engine that's able to do structural
pattern matching very efficiently. We can go from the structural
patterns it sees in your code to visual representations. So you can
write what is kind of like a reverse grammar, where you associate
structural patterns with what you can think of almost as TeX
descriptions of how to represent the patterns graphically. What you see
on the screen has been generated from this pattern matching. So we can,
on a user chosen basis, turn various program structures into all kinds
of visual representations.
You can, for example, turn the square root function into the obvious
mathematical notation. You can turn the identifier theta into the Greek
letter theta. You can turn division into the horizontal bar with
numbers stacked. And we've done experiments with wackier things, such
as trying to generate real time flow charts. That's kind of goofy, but
entertaining. Other things like hiding block contents, doing
interesting typography, doing typography on comments, all actually work
out reasonably well.
Bill Venners: At previous JavaOnes, I have seen some visualization
tools that I thought were useful. One of them analyzed your code and
drew diagrams that showed the coupling between packages. I felt those
diagrams could help you realize that you've got a lot of coupling going
from one package to another, which you may not realize by looking at
individual source files. Visualization tools like that can help, I
think, but a lot of tools that draw graphical representations from
source don't seem to help much. Let's say you analyze a big program and
generate inheritance charts, with thousands of boxes and lines going
all over the place. That often looks as confusing as the source code
does.
James Gosling: Yes, doing that kind of visualization is a real
challenge.
Coupling Analysis with Action
Bill Venners: What kind of analysis does Jackpot do?
James Gosling: We've got a bunch of hooks in Jackpot for plugging in
analysis modules. We want not only to be able to do analysis, but to be
able to act on that analysis. We have some pieces that do pretty
interesting things.
For example, often it's considered bad form to have public instance
variables. One piece of analysis, therefore, is to find all the public
instance variables. But we can find them and also make them private,
add all the setters and getters, and account for what it means to
actually access the variables via setters and getters. We can also do
things like find all methods whose natural home is not the class they
are actually in.
Bill Venners: How do you detect that?
James Gosling: If you look at the analysis books, there are various
ways of detecting that. For instance, if you've got a static method
that takes an object as a parameter, and it modifies that object, then
somebody probably just slapped that method in there because it was
easy. They were editing that file, so they put the method there. But
they really should have put it someplace else. We've got something that
will find those methods and actually move them, then change all the
uses of that method to do the right thing. So we're trying to couple
analysis with action.
Visualizing with JavaDoc
Bill Venners: What I mostly use for visualization is JavaDoc, because
it's an abstract view of the public interface. I generate JavaDoc a lot
as I'm designing and developing. I look at the HTML pages generated by
JavaDoc and think, well, this looks kind of confusing. And I go back
and make some changes to the code. I may not be able to see that it is
confusing just by looking at the code. So I think having different ways
to visualize code and designs as it is being developed can help guide
the design.
James Gosling: Jackpot's editor component tries essentially to do what
amounts to real time JavaDoc. JavaDoc is a funny thing. When I did the
original JavaDoc in the original compiler, even the people close around
me pretty soundly criticized it. And it was interesting, because the
usual criticism was: a good tech writer could do a lot better job than
the JavaDoc does. And the answer is, well, yeah, but how many APIs are
actually documented by good tech writers? And how many of them actually
update their documentation often enough to be useful?
Bill Venners: For me JavaDoc doesn't just serve as a way to document
the design, it serves as a way to visualize the design. If I see huge
classes with 300 public methods, or dozens of packages with only few
classes in each, I know there's a problem. It's more obvious when
you're looking at the JavaDoc than at the source.
James Gosling: Right. JavaDoc has been enormously successful and
enormously powerful. It's really been quite wonderful. And it's also
been interesting to see the way that professional tech writers have
taken to JavaDoc. A lot of the early criticism from them were things
like formatting. That's largely been solved by the sophisticated
doclets that people have been able to write. But the tech writers seem
to now spend a lot more time just documenting the semantics of what's
going on, and a lot less time fussing with structure and formatting.
And it actually feels like tech writers end up being more productive.
Bill Venners: So the tech writers are in there changing the code also,
and checking in their changes?
James Gosling: Yeah. That's certainly what happens around here. The
tech writers are intimately involved in the engineering. And actually
I've always found that to be a really good thing to do. One of my
general design principles is that it's really helpful to have a good
tech writer on the engineering team early on. If you're building
something and you have a tech writer trying to document it, and the
tech writer walks into your office and says, "I don't know how to
describe this," it means one of two things. Either you've got a really
stupid tech writer who you should fire. Or much more likely, you've got
a bad piece of design and you ought to rethink it. You have to rethink,
because an API that isn't comprehensible isn't usable.
Bill Venners: So the tech writer is giving you feedback on your design.
One of the values of design reviews is that programmers give you
feedback, and that's useful if it's an API because the users of APIs
are programmers.
James Gosling: The problem with programmers as reviewers, and
especially programmers that have been involved in the program for a
while, is that they are kind of oblivious to the complexity. And lots
of engineers are complexity junkies. Complexity is in many ways just
evil. Complexity makes things harder to understand, harder to build,
harder to debug, harder to evolve, harder to just about everything. And
yet complexity is often much easier than simplicity. There's that
really famous Blaise Pascal letter, where he starts, "I apologize for
this long letter. I didn't have the time to make it any shorter." And
that's really true.
Bill Venners: I always think the designer's job is not only to create
something that will work correctly and efficiently, but something that
is also easy for the client to understand and use.
James Gosling: Yeah, you've always got a customer on the other side,
whether that's some high end engineer, or some chemist in the lab who's
writing a piece of code. Often you've got people whose real job is
something other than software, and software is their tool. They don't
necessarily get off on all of the complexity. Making things simple can
be a real challenge.
Next Week
Come back Monday, June 16 for Part II of a conversation with Elliotte
Rusty Harold. I am now staggering the publication of several interviews
at once, to give the reader variety. The next installment of this
interview with James Gosling will appear in the near future. If you'd
like to receive a brief weekly email announcing new articles at
Artima.com, please subscribe to the Artima Newsletter.
Talk Back!
Have an opinion about refactoring tools, program visualization, or
JavaDoc? Discuss this article in the News & Ideas Forum topic, Analyze
this!.
Resources
James Gosling's Home Page:
http://java.sun.com/people/jag/
Bill Venners has interviewed James Gosling each year for the past five
years. The four previous interviews are:
James Gosling discusses semantic models, mobile behavior, abstraction
versus vagueness, testing, and repetitive stress injury. (February
2002):
http://www.artima.com/intv/goslingD.html
James Gosling speaks on inheritance and composition, JSPs and Servlets,
community design processes, and more. (May 2001):
http://www.artima.com/intv/gosling3.html
James Gosling discusses developer tools, the realtime JVM, mobile
objects, strict interfaces, and more. (May 2000):
http://www.artima.com/intv/gosling2.html
James Gosling speaks on interfaces and protocols, servers and services,
Jini, Java in the enterprise, and more. (May 1999):
http://www.artima.com/intv/gosling1.html
More information about the FoRK
mailing list