| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 | 
							- May 2001
 
- (These are some notes I made
 
- for a panel discussion on programming language design
 
- at MIT on May 10, 2001.)1. Programming Languages Are for People.Programming languages
 
- are how people talk to computers.  The computer would be just as
 
- happy speaking any language that was unambiguous.  The reason we
 
- have high level languages is because people can't deal with
 
- machine language.  The point of programming
 
- languages is to prevent our poor frail human brains from being 
 
- overwhelmed by a mass of detail.Architects know that some kinds of design problems are more personal
 
- than others.  One of the cleanest, most abstract design problems
 
- is designing bridges.  There your job is largely a matter of spanning
 
- a given distance with the least material.  The other end of the
 
- spectrum is designing chairs.  Chair designers have to spend their
 
- time thinking about human butts.Software varies in the same way. Designing algorithms for routing
 
- data through a network is a nice, abstract problem, like designing
 
- bridges.  Whereas designing programming languages is like designing
 
- chairs: it's all about dealing with human weaknesses.Most of us hate to acknowledge this.  Designing systems of great
 
- mathematical elegance sounds a lot more appealing to most of us
 
- than pandering to human weaknesses.  And there is a role for mathematical
 
- elegance: some kinds of elegance make programs easier to understand.
 
- But elegance is not an end in itself.And when I say languages have to be designed to suit human weaknesses,
 
- I don't mean that languages have to be designed for bad programmers.
 
- In fact I think you ought to design for the 
 
- best programmers, but
 
- even the best programmers have limitations.  I don't think anyone
 
- would like programming in a language where all the variables were
 
- the letter x with integer subscripts.2. Design for Yourself and Your Friends.If you look at the history of programming languages, a lot of the best
 
- ones were languages designed for their own authors to use, and a
 
- lot of the worst ones were designed for other people to use.When languages are designed for other people, it's always a specific
 
- group of other people: people not as smart as the language designer.
 
- So you get a language that talks down to you.  Cobol is the most
 
- extreme case, but a lot of languages are pervaded by this spirit.It has nothing to do with how abstract the language is.  C is pretty
 
- low-level, but it was designed for its authors to use, and that's
 
- why hackers like it.The argument for designing languages for bad programmers is that
 
- there are more bad programmers than good programmers.  That may be
 
- so.  But those few good programmers write a disproportionately
 
- large percentage of the software.I'm interested in the question, how do you design a language that
 
- the very best hackers will like?  I happen to think this is
 
- identical to the question, how do you design a good programming
 
- language?, but even if it isn't, it is at least an interesting
 
- question.3. Give the Programmer as Much Control as Possible.Many languages
 
- (especially the ones designed for other people) have the attitude
 
- of a governess: they try to prevent you from
 
- doing things that they think aren't good for you.  I like the   
 
- opposite approach: give the programmer as much
 
- control as you can.When I first learned Lisp, what I liked most about it was
 
- that it considered me an equal partner.  In the other languages
 
- I had learned up till then, there was the language and there was my   
 
- program, written in the language, and the two were very separate.
 
- But in Lisp the functions and macros I wrote were just like those
 
- that made up the language itself.  I could rewrite the language
 
- if I wanted.  It had the same appeal as open-source software.4. Aim for Brevity.Brevity is underestimated and even scorned.
 
- But if you look into the hearts of hackers, you'll see that they
 
- really love it.  How many times have you heard hackers speak fondly
 
- of how in, say, APL, they could do amazing things with just a couple
 
- lines of code?  I think anything that really smart people really
 
- love is worth paying attention to.I think almost anything
 
- you can do to make programs shorter is good.  There should be lots
 
- of library functions; anything that can be implicit should be;
 
- the syntax should be terse to a fault; even the names of things
 
- should be short.And it's not only programs that should be short.  The manual should
 
- be thin as well.  A good part of manuals is taken up with clarifications
 
- and reservations and warnings and special cases.  If you force  
 
- yourself to shorten the manual, in the best case you do it by fixing
 
- the things in the language that required so much explanation.5. Admit What Hacking Is.A lot of people wish that hacking was
 
- mathematics, or at least something like a natural science.  I think
 
- hacking is more like architecture.  Architecture is
 
- related to physics, in the sense that architects have to design
 
- buildings that don't fall down, but the actual goal of architects
 
- is to make great buildings, not to make discoveries about statics.What hackers like to do is make great programs.
 
- And I think, at least in our own minds, we have to remember that it's
 
- an admirable thing to write great programs, even when this work 
 
- doesn't translate easily into the conventional intellectual
 
- currency of research papers.  Intellectually, it is just as
 
- worthwhile to design a language programmers will love as it is to design a
 
- horrible one that embodies some idea you can publish a paper
 
- about.1. How to Organize Big Libraries?Libraries are becoming an
 
- increasingly important component of programming languages.  They're
 
- also getting bigger, and this can be dangerous.  If it takes longer
 
- to find the library function that will do what you want than it
 
- would take to write it yourself, then all that code is doing nothing
 
- but make your manual thick.  (The Symbolics manuals were a case in 
 
- point.)  So I think we will have to work on ways to organize
 
- libraries.  The ideal would be to design them so that the programmer
 
- could guess what library call would do the right thing.2. Are People Really Scared of Prefix Syntax?This is an open
 
- problem in the sense that I have wondered about it for years and
 
- still don't know the answer.  Prefix syntax seems perfectly natural
 
- to me, except possibly for math.  But it could be that a lot of 
 
- Lisp's unpopularity is simply due to having an unfamiliar syntax.   
 
- Whether to do anything about it, if it is true, is another question. 
 
- 3. What Do You Need for Server-Based Software?
 
- I think a lot of the most exciting new applications that get written
 
- in the next twenty years will be Web-based applications, meaning
 
- programs that sit on the server and talk to you through a Web
 
- browser.  And to write these kinds of programs we may need some
 
- new things.One thing we'll need is support for the new way that server-based 
 
- apps get released.  Instead of having one or two big releases a
 
- year, like desktop software, server-based apps get released as a
 
- series of small changes.  You may have as many as five or ten
 
- releases a day.  And as a rule everyone will always use the latest
 
- version.You know how you can design programs to be debuggable?
 
- Well, server-based software likewise has to be designed to be
 
- changeable.  You have to be able to change it easily, or at least
 
- to know what is a small change and what is a momentous one.Another thing that might turn out to be useful for server based
 
- software, surprisingly, is continuations.  In Web-based software
 
- you can use something like continuation-passing style to get the
 
- effect of subroutines in the inherently 
 
- stateless world of a Web
 
- session.  Maybe it would be worthwhile having actual continuations,
 
- if it was not too expensive.4. What New Abstractions Are Left to Discover?I'm not sure how
 
- reasonable a hope this is, but one thing I would really love to    
 
- do, personally, is discover a new abstraction-- something that would
 
- make as much of a difference as having first class functions or
 
- recursion or even keyword parameters.  This may be an impossible
 
- dream.  These things don't get discovered that often.  But I am always
 
- looking.1. You Can Use Whatever Language You Want.Writing application
 
- programs used to mean writing desktop software.  And in desktop
 
- software there is a big bias toward writing the application in the
 
- same language as the operating system.  And so ten years ago,
 
- writing software pretty much meant writing software in C.
 
- Eventually a tradition evolved:
 
- application programs must not be written in unusual languages.  
 
- And this tradition had so long to develop that nontechnical people
 
- like managers and venture capitalists also learned it.Server-based software blows away this whole model.  With server-based
 
- software you can use any language you want.  Almost nobody understands
 
- this yet (especially not managers and venture capitalists).
 
- A few hackers understand it, and that's why we even hear
 
- about new, indy languages like Perl and Python.  We're not hearing
 
- about Perl and Python because people are using them to write Windows
 
- apps.What this means for us, as people interested in designing programming
 
- languages, is that there is now potentially an actual audience for
 
- our work.2. Speed Comes from Profilers.Language designers, or at least
 
- language implementors, like to write compilers that generate fast
 
- code.  But I don't think this is what makes languages fast for users.
 
- Knuth pointed out long ago that speed only matters in a few critical
 
- bottlenecks.  And anyone who's tried it knows that you can't guess
 
- where these bottlenecks are.  Profilers are the answer.Language designers are solving the wrong problem.  Users don't need
 
- benchmarks to run fast.  What they need is a language that can show
 
- them what parts of their own programs need to be rewritten.  That's
 
- where speed comes from in practice.  So maybe it would be a net 
 
- win if language implementors took half the time they would
 
- have spent doing compiler optimizations and spent it writing a
 
- good profiler instead.3. You Need an Application to Drive the Design of a Language.This may not be an absolute rule, but it seems like the best languages
 
- all evolved together with some application they were being used to
 
- write.  C was written by people who needed it for systems programming.
 
- Lisp was developed partly to do symbolic differentiation, and
 
- McCarthy was so eager to get started that he was writing differentiation
 
- programs even in the first paper on Lisp, in 1960.It's especially good if your application solves some new problem.
 
- That will tend to drive your language to have new features that   
 
- programmers need.  I personally am interested in writing
 
- a language that will be good for writing server-based applications.[During the panel, Guy Steele also made this point, with the
 
- additional suggestion that the application should not consist of
 
- writing the compiler for your language, unless your language
 
- happens to be intended for writing compilers.]4. A Language Has to Be Good for Writing Throwaway Programs.You know what a throwaway program is: something you write quickly for
 
- some limited task.  I think if you looked around you'd find that  
 
- a lot of big, serious programs started as throwaway programs.  I
 
- would not be surprised if most programs started as throwaway
 
- programs.  And so if you want to make a language that's good for
 
- writing software in general, it has to be good for writing throwaway
 
- programs, because that is the larval stage of most software.5. Syntax Is Connected to Semantics.It's traditional to think of
 
- syntax and semantics as being completely separate.  This will
 
- sound shocking, but it may be that they aren't.
 
- I think that what you want in your language may be related
 
- to how you express it.I was talking recently to Robert Morris, and he pointed out that
 
- operator overloading is a bigger win in languages with infix
 
- syntax.  In a language with prefix syntax, any function you define
 
- is effectively an operator.  If you want to define a plus for a
 
- new type of number you've made up, you can just define a new function
 
- to add them.  If you do that in a language with infix syntax,
 
- there's a big difference in appearance between the use of an
 
- overloaded operator and a function call.1. New Programming Languages.Back in the 1970s
 
- it was fashionable to design new programming languages.  Recently
 
- it hasn't been.  But I think server-based software will make new  
 
- languages fashionable again.  With server-based software, you can
 
- use any language you want, so if someone does design a language that
 
- actually seems better than others that are available, there will be
 
- people who take a risk and use it.2. Time-Sharing.Richard Kelsey gave this as an idea whose time
 
- has come again in the last panel, and I completely agree with him.
 
- My guess (and Microsoft's guess, it seems) is that much computing
 
- will move from the desktop onto remote servers.  In other words,  
 
- time-sharing is back.  And I think there will need to be support
 
- for it at the language level.  For example, I know that Richard
 
- and Jonathan Rees have done a lot of work implementing process  
 
- scheduling within Scheme 48.3. Efficiency.Recently it was starting to seem that computers
 
- were finally fast enough.  More and more we were starting to hear
 
- about byte code, which implies to me at least that we feel we have
 
- cycles to spare.  But I don't think we will, with server-based
 
- software.   Someone is going to have to pay for the servers that
 
- the software runs on, and the number of users they can support per
 
- machine will be the divisor of their capital cost.So I think efficiency will matter, at least in computational
 
- bottlenecks.  It will be especially important to do i/o fast,
 
- because server-based applications do a lot of i/o.It may turn out that byte code is not a win, in the end.  Sun and
 
- Microsoft seem to be facing off in a kind of a battle of the byte
 
- codes at the moment.  But they're doing it because byte code is a
 
- convenient place to insert themselves into the process, not because
 
- byte code is in itself a good idea.  It may turn out that this
 
- whole battleground gets bypassed.  That would be kind of amusing.1. Clients.This is just a guess, but my guess is that
 
- the winning model for most applications will be purely server-based.
 
- Designing software that works on the assumption that everyone will 
 
- have your client is like designing a society on the assumption that
 
- everyone will just be honest.  It would certainly be convenient, but
 
- you have to assume it will never happen.I think there will be a proliferation of devices that have some
 
- kind of Web access, and all you'll be able to assume about them is
 
- that they can support simple html and forms.  Will you have a
 
- browser on your cell phone?  Will there be a phone in your palm  
 
- pilot?  Will your blackberry get a bigger screen? Will you be able
 
- to browse the Web on your gameboy?  Your watch?  I don't know.  
 
- And I don't have to know if I bet on
 
- everything just being on the server.  It's
 
- just so much more robust to have all the 
 
- brains on the server.2. Object-Oriented Programming.I realize this is a
 
- controversial one, but I don't think object-oriented programming
 
- is such a big deal.  I think it is a fine model for certain kinds
 
- of applications that need that specific kind of data structure,   
 
- like window systems, simulations, and cad programs.  But I don't
 
- see why it ought to be the model for all programming.I think part of the reason people in big companies like object-oriented
 
- programming is because it yields a lot of what looks like work.
 
- Something that might naturally be represented as, say, a list of
 
- integers, can now be represented as a class with all kinds of
 
- scaffolding and hustle and bustle.Another attraction of
 
- object-oriented programming is that methods give you some of the
 
- effect of first class functions.  But this is old news to Lisp
 
- programmers.  When you have actual first class functions, you can
 
- just use them in whatever way is appropriate to the task at hand,
 
- instead of forcing everything into a mold of classes and methods.What this means for language design, I think, is that you shouldn't
 
- build object-oriented programming in too deeply.  Maybe the
 
- answer is to offer more general, underlying stuff, and let people design
 
- whatever object systems they want as libraries.3. Design by Committee.Having your language designed by a committee is a big pitfall,  
 
- and not just for the reasons everyone knows about.  Everyone
 
- knows that committees tend to yield lumpy, inconsistent designs.  
 
- But I think a greater danger is that they won't take risks.
 
- When one person is in charge he can take risks
 
- that a committee would never agree on.Is it necessary to take risks to design a good language though?
 
- Many people might suspect
 
- that language design is something where you should stick fairly
 
- close to the conventional wisdom.  I bet this isn't true.
 
- In everything else people do, reward is proportionate to risk.
 
- Why should language design be any different?
 
 
  |