(这是我为 2001 年 5 月 10 日在麻省理工学院(MIT)举行的一场关于编程语言设计的专题讨论会准备的发言提纲。)
(These are some notes I made for a panel discussion on programming language design at MIT on May 10, 2001.)
1. 编程语言是为人服务的。
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.
当我说语言设计必须适应人类的弱点时,我并不是说语言必须为糟糕的程序员设计。事实上,我认为你应该为最优秀的程序员设计,但即使是最优秀的程序员也有局限性。我想没人会喜欢用一种所有变量都是字母 x 加上整数下标的语言来编程。
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. 为你自己和你的朋友设计。
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.
当语言是为别人设计时,那群人总是特定的:一帮不如语言设计师聪明的人。于是你得到了一种居高临下、对你指手画脚的语言。Cobol 是最极端的例子,但许多语言都充斥着这种说教精神。
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.
这与语言有多抽象无关。C 语言相当低级,但它是为了作者自己使用而设计的,这就是黑客喜欢它的原因。
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. 尽可能多地给程序员控制权。
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.
当我第一次学习 Lisp 时,我最喜欢它的一点是它把我当成平等的伙伴。在我之前学过的其他语言中,语言是语言,我的程序是我的程序,两者泾渭分明。但在 Lisp 中,我写的函数和宏与构成语言本身的函数和宏完全一样。如果我想,我可以重写这门语言。它具有与开源软件相同的魅力。
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. 追求简洁。
4. Aim for Brevity.
简洁往往被低估,甚至遭到鄙视。但如果你探寻黑客的内心,你会发现他们真的很热爱简洁。你多少次听到黑客津津乐道,比如在 APL 中,他们如何仅用几行代码就能做出令人惊叹的事情?我认为,任何聪明人真正热爱的东西,都值得我们关注。
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. 承认黑客行为的本质。
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. 如何组织大型库?
1. How to Organize Big Libraries?
库正成为编程语言中越来越重要的组成部分。它们也变得越来越庞大,这可能会带来危险。如果找到一个能满足你需求的库函数所花的时间,比你自己写一个还要长,那么所有这些代码除了让你的手册变厚之外,毫无用处。(Symbolics 的手册就是典型的例子。)因此,我认为我们必须在组织库的方法上下功夫。最理想的情况是,在设计库时,能让程序员猜出调用哪个库函数能实现正确的功能。
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. 人们真的害怕前缀语法吗?
2. Are People Really Scared of Prefix Syntax?
这是一个悬而未决的问题,因为我已经琢磨了多年,却依然没有答案。前缀语法对我来说似乎非常自然,可能数学公式除外。但 Lisp 如此不受欢迎,很大程度上可能仅仅是因为它有一种人们不熟悉的语法。如果确实如此,是否要为此做点什么,则是另一个问题。 3. 开发基于服务器的软件需要什么? 我认为,在未来二十年里,写出来的许多最令人兴奋的新应用都将是基于 Web 的应用,也就是说,程序运行在服务器上,通过浏览器与你交互。为了编写这类程序,我们可能需要一些新的东西。
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.
另一个对基于服务器的软件可能意外有用的东西,是延续(continuations)。在基于 Web 的软件中,你可以使用类似延续传递风格(continuation-passing style)的技术,在本质上无状态的 Web 会话世界中,实现类似子程序的效果。如果成本不太高的话,拥有真正的延续也许是值得的。
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. 还有哪些新抽象有待发现?
4. What New Abstractions Are Left to Discover?
我不确定这个希望有多大,但我个人非常想做的一件事,就是发现一种新的抽象——这种抽象能像引入一等函数(first class functions)、递归甚至关键字参数那样,带来巨大的改变。这可能是一个无法实现的梦想,这类东西并不经常被发现。但我一直在寻找。
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. 你可以使用任何你想用的语言。
1. You Can Use Whatever Language You Want.
过去,写应用软件意味着写桌面软件。而在桌面软件中,人们有种强烈的倾向,即用与操作系统相同的语言来写应用软件。因此在十年前,写软件几乎就意味着用 C 语言写软件。久而久之,形成了一个传统:绝对不能用小众语言来写应用软件。这个传统发展了太久,以至于像经理和风险投资人这样的非技术人员也学会了这一套。
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.
基于服务器的软件彻底粉碎了这套模式。有了基于服务器的软件,你可以使用任何你想用的语言。现在几乎还没人明白这一点(尤其是经理和风险投资人)。少数黑客明白,这就是为什么我们甚至能听到像 Perl 和 Python 这样新兴、独立语言的名字。我们之所以听说 Perl 和 Python,并不是因为人们在用它们写 Windows 应用。
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. 速度来自性能分析器(Profilers)。
2. Speed Comes from Profilers.
语言设计师,或者至少是语言实现者,喜欢写出能生成快速代码的编译器。但我认为这不是让语言对用户来说变快的原因。高德纳(Knuth)很久以前就指出,速度只在少数关键瓶颈中起作用。任何尝试过的人都知道,你无法凭空猜测这些瓶颈在哪里。性能分析器才是答案。
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. 你需要一个应用来驱动语言的设计。
3. You Need an Application to Drive the Design of a Language.
这可能不是一条绝对的铁律,但似乎最优秀的语言都是与它们所用来编写的某个应用共同演进的。C 语言是由需要它进行系统编程的人写出来的。Lisp 的开发部分是为了进行符号求导,麦卡锡(McCarthy)是如此急于开始,以至于在 1960 年关于 Lisp 的第一篇论文中,他就已经在写求导程序了。
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.
[在讨论会期间,Guy Steele 也提出了这一点,并补充建议,这个应用不应该包括为你的语言编写编译器,除非你的语言恰好就是为了写编译器而设计的。]
[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. 一门语言必须适合写临时程序(Throwaway Programs)。
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. 语法与语义相连。
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.
我最近和 Robert Morris 聊天,他指出,在具有中缀语法的语言中,运算符重载是一个更大的优势。在具有前缀语法的语言中,你定义的任何函数实际上都是一个运算符。如果你想为自己创建的新数字类型定义一个加号,你只需定义一个新函数来相加即可。如果你在具有中缀语法的语言中这样做,使用重载运算符和进行函数调用在外观上会有很大的不同。
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. 新的编程语言。
1. New Programming Languages.
回到 20 世纪 70 年代,设计新的编程语言是一种时尚。最近则不流行了。但我认为基于服务器的软件将使新语言再次成为时尚。有了基于服务器的软件,你可以使用任何你想用的语言,因此如果有人真的设计出了一门看起来比现有语言更好的语言,就会有人冒险去使用它。
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)。
2. Time-Sharing.
Richard Kelsey 在上一场讨论会中提出,这是一个时代已经再次来临的想法,我完全同意他的看法。我的猜测(似乎也是微软的猜测)是,大部分计算将从桌面转移到远程服务器上。换句话说,分时系统回来了。我认为在语言层面需要对此提供支持。例如,我知道 Richard 和 Jonathan Rees 在 Scheme 48 中做了大量实现进程调度的研究工作。
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. 效率。
3. Efficiency.
最近,人们开始觉得计算机终于足够快了。我们越来越多地听到关于字节码的消息,这至少向我暗示,我们觉得有富余的 CPU 周期可以挥霍。但我认为,对于基于服务器的软件,我们不会有这种奢侈。必须有人为软件运行的服务器买单,而每台机器能支持的用户数量将是其资本成本的分母。
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.
因此我认为效率至关重要,至少在计算瓶颈上是这样。快速进行 I/O 将尤为重要,因为基于服务器的应用会进行大量的 I/O。
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.
最终可能会发现,字节码并不是个好主意。Sun 和微软目前似乎正在展开一场字节码大战。但他们之所以这么做,是因为字节码是他们介入开发流程的一个便利位置,而不是因为字节码本身是一个好主意。最后,这整个战场可能会被绕过去。那将是一件挺有意思的事。
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. 客户端。
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.
我认为能够访问 Web 的设备将会激增,而你对它们唯一能做的假设就是它们支持简单的 HTML 和表单。你的手机上会有浏览器吗?你的 Palm 会有电话功能吗?你的 Blackberry 会换上更大的屏幕吗?你能在 Gameboy 上浏览网页吗?你的手表上呢?我不知道。如果我押注一切都留在服务器上,我就不需要知道。把所有的大脑都留在服务器上要健壮得多。
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. 面向对象编程。
2. Object-Oriented Programming.
我知道这是一个有争议的话题,但我认为面向对象编程没什么大不了的。我认为对于某些需要特定数据结构的应用(如窗口系统、模拟和 CAD 程序)来说,它是一个很好的模式。但我看不出为什么它应该成为所有编程的模式。
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.
面向对象编程的另一个吸引力在于,方法(methods)能给你带来一些一等函数的效果。但这对 Lisp 程序员来说已经是陈年旧事了。当你拥有真正的一等函数时,你可以以任何适合手头任务的方式使用它们,而不用强行把所有东西都塞进类和方法的模具中。
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. 委员会设计。
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?