AIニュース最前線
最新ニュースAI日報Hacker日報週報動画AIツールトレンド企業

AIニュース最前線

世界中のAI最新情報を日本語で毎時更新

最新ニュース日報トレンド企業このサイトについてRSS
© 2026 ainew.jp
お問い合わせ特定商取引法に基づく表記
ニュース一覧元記事を開く
Paul Graham·2001年5月1日 09:00·約9分で読める

言語設計に関する五つの問い

#プログラミング言語設計#開発者体験#人間中心設計#ソフトウェア工学#Paul Graham
TL;DR

プログラミング言語は人間のためのものであり、曖昧さのない言語であればコンピュータはどの言語でも問題なく動作する。

AI深層分析2026年2月25日 18:41
3
注目/ 5段階
関連性
3
新規性
2
影響度
3
信頼性
4

キーポイント

1

プログラミング言語設計の本質は人間の認知限界への対応であり、数学的優雅さよりも実用性が重要

2

優れた言語は設計者自身や優秀なプログラマーのために作られ、他者向けに設計された言語は往々にして質が低い

3

言語設計は「橋の設計」のような抽象的問題ではなく、「椅子の設計」のように人間中心のアプローチが必要

影響分析・編集コメントを表示

影響分析

この記事はプログラミング言語設計の哲学を人間中心の視点から再定義し、実用的な言語設計の原則を示している。特に「優秀なプログラマー向けに設計すること」という主張は、現代の開発者体験(DX)重視の潮流に先駆けた洞察と言える。

編集コメント

2001年の発言ながら、現代のAIツール開発におけるUX/UI設計の重要性を予見するような内容。特に生成AI時代のプロンプトエンジニアリングやAIエージェント設計にも通じる人間中心の設計思想が示されている。

言語設計に関する五つの問い

言語設計に関する五つの問い 2001年5月 (これは2001年5月10日にMITで行われたプログラミング言語設計に関するパネルディスカッションのために私が作成したメモです。) 1.

プログラミング言語は人間のためのものだ。

プログラミング言語は、人間がコンピュータと対話する手段である。

コンピュータ自体は、曖昧さのない言語であれば、どんなものでも同じように満足する。

高水準言語が存在する理由は、人間が機械語を扱いきれないからだ。

プログラミング言語の意義は、私たちの貧弱で脆弱な人間の脳が大量の詳細情報に圧倒されるのを防ぐことにある。

建築家は、設計課題の中には他のものより個人的な要素が強い種類があることを知っている。

最も純粋で抽象的な設計課題の一つは、橋の設計である。

そこでの仕事は、与えられた距離を最小の材料で架けることが主な課題だ。

反対の極端にあるのは、椅子の設計である。

椅子の設計者は、人間の臀部について考えながら時間を費やさなければならない。

ソフトウェアも同じように多様である。

ネットワークを通じてデータをルーティングするアルゴリズムの設計は、橋の設計のように、素晴らしく抽象的な問題だ。

一方、プログラミング言語の設計は椅子の設計に似ている:それはすべて人間の弱点に対処することに関わっている。

私たちの多くは、このことを認めたがらない。

人間の弱点に迎合するよりも、数学的に優雅なシステムを設計する方が、私たちの多くにははるかに魅力的に聞こえる。

そして数学的優雅さには役割がある:ある種の優雅さは、プログラムを理解しやすくする。

しかし、優雅さそれ自体が目的ではない。

言語は人間の弱点に合わせて設計されなければならないと言うとき、私は言語が悪いプログラマーのために設計されなければならないと言っているわけではない。

実際、私は最高のプログラマーのために設計すべきだと思うが、たとえ最高のプログラマーにも限界はある。

すべての変数が整数の添字付きの文字xであるような言語でプログラミングしたいと思う人はいないだろう。

自分自身と友人のために設計せよ。

プログラミング言語の歴史を見ると、最高の言語の多くは、その作者自身が使うために設計された言語であり、最悪の言語の多くは、他の人々が使うために設計されたものだ。

言語が他の人々のために設計されるとき、それは常に特定のグループの、言語設計者ほど賢くない人々のために設計される。

だから、見下すような態度の言語ができあがる。

Cobolは最も極端な例だが、多くの言語がこの精神に満ちている。

これは、言語がどれだけ抽象的かとは関係ない。

Cはかなり低水準だが、それは作者自身が使うために設計されたものであり、それがハッカーがCを好む理由だ。

悪いプログラマーのために言語を設計すべきという主張は、良いプログラマーよりも悪いプログラマーの方が多いという理由による。

それはそうかもしれない。

しかし、その少数の良いプログラマーが、ソフトウェアの過大な割合を書いている。

私が興味を持っているのは、最高のハッカーが好む言語をどう設計するかという問いだ。

私は、これは「良いプログラミング言語をどう設計するか?」という問いと同一だと考えるが、たとえそうでなくても、少なくとも興味深い問いではある。

プログラマーに可能な限りの制御を与えよ。

多くの言語(特に他の人々のために設計されたもの)は、家庭教師のような態度を持っている:彼らが良くないと思うことをあなたがするのを防ごうとする。

私は逆のアプローチが好きだ:プログラマーにできるだけ多くの制御を与えることだ。

私が初めてLispを学んだとき、最も気に入ったのは、Lispが私を対等なパートナーと見なしてくれたことだ。

それまでに私が学んだ他の言語では、言語そのものと、その言語で書かれた私のプログラムがあり、両者は非常に分離していた。

しかしLispでは、私が書いた関数やマクロは、言語そのものを構成するものと全く同じだった。

必要なら、言語自体を書き換えることもできた。

それはオープンソースソフトウェアと同じ魅力を持っていた。

簡潔さを目指せ。

簡潔さは過小評価され、軽蔑さえされている。

しかし、ハッカーの心の奥底を見れば、彼らがそれを本当に愛していることがわかるだろう。

例えばAPLでは、ほんの数行のコードで驚くべきことができる、とハッカーが嬉しそうに話すのを何度聞いたことか。

本当に賢い人々が本当に愛するものは、注意を払う価値があると私は思う。

プログラムを短くするためにできることは、ほとんど何でも良いことだと思う。

ライブラリ関数は多くあるべきだ;暗黙化できるものは何でもそうすべきだ;構文は過剰なまでに簡潔であるべきだ;ものの名前さえも短くあるべきだ。

そして、短くあるべきなのはプログラムだけではない。

マニュアルも薄くなければならない。

マニュアルの大部分は、説明、留保条件、警告、特殊なケースで占められている。

マニュアルを短くするように自分に強制すれば、最良の場合、多くの説明を必要とした言語の欠点を修正することでそれを実現できる。

ハッキングとは何かを認めよ。

多くの人々は、ハッキングが数学であること、あるいは少なくとも自然科学のようなものであることを望んでいる。

私はハッキングは建築に似ていると思う。

建築は物理学に関連している。建築家は崩壊しない建物を設計しなければならないという意味で。しかし、建築家の実際の目標は、静力学に関する発見をすることではなく、素晴らしい建物を作ることだ。

ハッカーが好きなことは、素晴らしいプログラムを作ることだ。

そして私は、少なくとも私たち自身の心の中では、この仕事が研究論文という従来の知的通貨に容易に変換できない場合でも、素晴らしいプログラムを書くことは称賛に値する行為であることを忘れてはならないと思う。

知的には、プログラマーが愛する言語を設計することは、論文にできる何らかのアイデアを体現したひどい言語を設計することと同じくらい価値がある。

大規模ライブラリをどう整理するか?

ライブラリは、プログラミング言語のますます重要な構成要素になりつつある。

また、ライブラリは大きくなっており、これは危険なことになりうる。

望むことをしてくれるライブラリ関数を見つけるのに、自分でそれを書く時間よりも長くかかるなら、そのすべてのコードはマニュアルを厚くする以外に何の役にも立っていない。

(Symbolicsのマニュアルはその好例だった。)だから、ライブラリを整理する方法を考えなければならないだろう。

理想は、プログラマーがどのライブラリ呼び出しが適切なことをするか推測できるように設計することだ。

人々は本当に前置記法を恐れているのか?

これは、私が何年も疑問に思っており、まだ答えがわからないという意味で未解決問題だ。

数学を除けば、前置記法は私には完全に自然に思える。

しかし、Lispの人気がない理由の多くは、単に馴染みのない構文にあるのかもしれない。

もしそれが本当なら、それについて何かすべきかどうかは別の問題だ。

サーバーベースのソフトウェアに必要なものは何か?

今後20年間に書かれる最もエキサイティングな新しいアプリケーションの多くは、Webベースのアプリケーション、つまりサーバー上に存在し、Webブラウザを通じてユーザーと対話するプログラムになるだろうと思う。

そして、この種のプログラムを書くためには、いくつかの新しいものが必要になるかもしれない。

必要なものの一つは、サーバーベースアプリの新しいリリース方法への対応だ。

デスクトップソフトウェアのように年に1、2回の大きなリリースを行うのではなく、サーバーベースアプリは一連の小さな変更としてリリースされる。

一日に5回から10回ものリリースがあるかもしれない。

そして原則として、誰もが常に最新版を使うことになる。

プログラムをデバッグ可能に設計する方法を知っているだろうか?

同様に、サーバーベースソフトウェアは変更可能に設計されなければならない。

簡単に変更できるようにするか、少なくとも何が小さな変更で何が重大な変更かを知る必要がある。

サーバーベースソフトウェアに役立つかもしれないもう一つのものは、意外にも継続(continuations)だ。

Webベースソフトウェアでは、継続渡しスタイルのようなものを使用して、本質的にステートレスなWebセッションの世界でサブルーチンの効果を得ることができる。

コストが高すぎなければ、実際の継続を持つことは価値があるかもしれない。

発見されるべき新しい抽象概念は何か残っているか?

これがどれほど妥当な希望かはわからないが、個人的に私が本当にやりたいことの一つは、新しい抽象概念――プログラミングに大きな影響を与えるような何か――を発見することだ。

原文を表示

Five Questions about Language Design 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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.

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

この記事をシェア

関連記事

Paul Graham2016年11月1日 09:00

今年、カリフォルニア州で死刑制度を廃止できる

カリフォルニア州の有権者は、死刑制度を廃止する提案62に投票する。筆者は、死刑制度の議論は単に殺人者を殺すことの是非ではなく、より深い問題だと述べている。

Paul Graham2003年8月1日 09:00

反撃するフィルター

Richard Jowsey氏が、スパムフィルターの精度向上のために、疑わしいメールのリンク先を確認する手法を開発した。この方法は、スパム送信者のサーバーに負荷をかける副作用を持つ。

Paul Graham2003年5月1日 09:00

ハッカーと画家

著者はコンピュータサイエンスの大学院卒業後に絵画を学び、ハッキングと絵画が異なる仕事と見なされることに疑問を呈している。

今日のまとめ

AI日報で今日の重要ニュースをまとめ読み

ニュース一覧に戻る元記事を読む