# 百年の言語(原題: The Hundred-Year Language) Paul Graham, April 2003(PyCon 2003 の基調講演がもと) **中心主張**: プログラミング言語は生物種のように進化の系統樹を成しており、その樹の「主要な枝」に乗っているかどうかが、言語の百年後の生存を決める。長期的に生き残る言語は、公理(根源的なオペレータ)の集合が最小でクリーンなコアを持ち、残りの部分をその言語自身で書ける言語である。だから百年後を予測する作業は空想ではなく、**今どの言語に賭けるか**を決めるための実用的な指針になる。 **実践指針** - 言語や基盤技術を選ぶ場面では、現在の人気ではなく「進化の系統樹の主要な枝にあるか」で判断せよ。行き止まりの枝(著者はCobolを名指しし、Javaも同じ道をたどると予測する)に乗ると、後から動かせない。 - 言語やライブラリを設計する場面では、公理(根源的オペレータ)をできるだけ少なくし、残りをその言語自身で書けるようにせよ。「ホコリはホコリを生む」——余分なコアは次の余分を呼ぶ。 - 効率のためだけに言語のコアへ機能を足したくなった場面では、足さずに済ませ、意味と実装を分離してコンパイラへの最適化ヒントに落とせ。文字列がリストのサブセットにすぎないのに別の型として存在するのは、効率のためのハックである。 - 速いハードウェアが手に入った場面では、そのサイクルを「より単純な設計を得るための良い無駄」に使え。悪い無駄(SUV的な無駄)と良い無駄(贅沢に使うことで設計が単純になる無駄)を区別する。 - 並列計算を導入する場面では、開発の最終盤・最適化の段階まで待て。バージョン1で並列性を前提に書くのは不適切な最適化になる。 - 「百年後の言語」を想定して、無限の資源があると仮定してプログラムを書いてみよ。そこから最短の記述法を逆算するのが言語設計のアルゴリズムになる(運転で遠くの点を見て方向を合わせるのと同じ)。 **根拠となる事例・考え方** - 言語進化は生物進化と違い、枝が再び交わる(Fortran の枝と Algol の子孫が融合しつつある)。設計者が意図的に他言語からアイディアを取り込むためである。 - 言語が遅く進化するのは、それが技術ではなく**表記法**だからだ。進化の速度は移動手段や通信手段より数学表記のそれに近い。 - ムーアの法則がこのまま続けば百年後の計算機は7400京倍速い。仮に破れて100万倍でも、非効率なコードを生成する言語が活躍する余地は十分に広がる。 - McCarthy の1960年のLispには数値型がなかった(整数NをN個の要素を持つリストで表せる)。データ型を極限まで削るという思考実験の実例。 - Arc の最初のバージョンは Common Lisp で書かれたメタ巡回型インタプリタ(約200行)で、CLisp のバイトコードインタプリタの上で動く二重の層だった。おそろしく遅かったが、理解も変更も容易だった。層を一つ足すと約10倍遅くなる(Bill Woods)というコストを払って柔軟性を買っている。 - ボトムアッププログラミング=ある層を次の層の記述言語として使い、層を積み重ねて構成する手法。再利用性は本来オブジェクト指向ではなくこのボトムアップ性から来る。 - 「エッセイ」の語源はフランス語 essayer(試す)。最良のプログラムは、作者が何を書くべきかわからないまま書き始めたという意味でエッセイである。 **キーワード** - **進化の系統樹/主要な枝**: 言語の系譜。主流の枝に乗っている言語ほど長く生き延びる。 - **公理(根源的オペレータ)**: 言語のコアを成す最小の演算子群。残りはそれを使って書ける部分。 - **ネアンデルタール言語**: 流行したが知能ある子孫を残さなかった行き止まりの言語(Cobol を例に)。 - **良い無駄/悪い無駄**: 単純な設計を得るために計算資源を贅沢に使うのが良い無駄。 - **メタ巡回型インタプリタ (metacircular interpreter)**: ある言語のインタプリタを、その言語自身(またはサブセット)で定義したもの。 - **ボトムアッププログラミング**: 下の層を上の層のための記述言語として設計し、層を積み上げてプログラムを構成する手法。