『言語設計者たちが考えること』――プログラミングの世界を作った神々の饗宴
言語設計者たちが考えること Federico Biancuzzi、Shane Warden(編集) 伊藤真浩、頃末和義、佐藤嘉一、鈴木幸敏、村上雅章 (翻訳) オライリージャパン 2010年9月 ISBN-10: 4873114713 ISBN-13: 978-4873114712 3780円(税込) |
■広大なプログラミング言語の世界を作った人々
本書は、新旧18のプログラミング言語を設計した、20人超の「言語設計者」へのインタビューを集めたものです。原著(英語)は17言語の設計者に対するインタビューですが、日本語版はRubyのまつもとゆきひろ氏へのインタビューを追加しています。
「言語設計者」と一口にいっても、かなりの幅があります。そもそも「言語」自体、C++やJava、C#といった広く使われている汎用言語から、awkのように比較的用途が限定された言語、あるいはUMLのようにプログラミング言語でないものまで、さまざまです。
18言語のうち、使ったことがない言語は8つ、名前すら聞いたことがなかった言語は2つあり(APLとForth)、「プログラミングの世界は広大だ」と思い知らされました。
APLとForthが世に出たのは、1970年代だそうです。インタビュー中に出てくる出来事は当時のものが多かったため、1970年代のインタビューを載せたものなのかと思いながら読んでいました。
読了後、インターネットでAPLとForthについて調べてみたところ、APL(NARS2000という、比較的新しい実装はあるものの)は最近あまり使われていないようでしたが、Forthは現在でも組み込みなどのレイヤでばりばり現役だと知り、驚きました。
■設計思想、バックグラウンドは十人十色
世の中にはさまざまなプログラミング言語があり、その存在理由もさまざまです。存在する理由は、時代背景や適用領域によってかなり異なります。
言語設計者にも、さまざまなタイプがいます。学歴や職歴といった「バックグラウンド」、プログラミング言語が生まれた「背景」や「設計思想」などが、プログラミング言語の性格に色濃い影響を与えています。
いろいろな言語設計者の「生の意見」が聞けるのは、ソフトウェアにかかわる人間にとっては非常に興味深いです。ここで、「言語」そして「言語設計者」を、いくつかの切り口から分類して考えてみます。
○数学者vs.エンジニア
計算機科学、情報科学が発展した歴史にも関係すると思うのですが、特に古い言語の設計者は、数学で学位を取得した人が多いようです。新しい言語では、LuaやHaskell設計者のバックグラウンドが数学です。
一方、Rubyのまつもとゆきひろ氏は、自ら「第2世代の言語設計者」とうたっているとおり、1980年代までに出てきた言語設計者たちとは明らかにバックグラウンドが違うように見えます。なお、彼は「数学が苦手だった」ともいっています。
UMLのGrady Booch氏は自らを「エンジニア」と呼んでいますし、それ以外でもエンジニア的な発想、「実用性」に重きを置いた方法で言語の設計を行った人は何人もいました。
○汎用vs.特定用途向け
DSL(Domain Specific Language)とは、特定の用途に特化した言語で、Java、C++、Perlといった汎用プログラミング言語とは反対の概念です。
本書では、SQLやawkといったDSLを取り上げています。DSLではありませんが、もともと教育用として設計されたBASICも、汎用言語とは一線を画しているといえるでしょう。
awkの設計者の1人Peter Weinberger氏は、awkが広まるにつれて強まる「汎用言語的な機能追加の要望」に対して、どう対応したかを語っています。「要求を何でも取り入れてしまうと、汎用言語と同じようなことができるものの、ひどく不格好な言語になってしまう」「汎用言語の設計とDSLの設計には違いがある」そうです。
○プログラミング言語のパラダイムシフト
言語を分類する際、「パラダイム」という観点による分類方法があります。主流のパラダイムが別のものに移ることを「パラダイムシフト」と呼びますが、歴史をひもとくと、プログラム言語のパラダイムシフトとは、「抽象化のレベルを上げる」ことだといってもいいでしょう。
次のパラダイムシフトがどのような形で起こるのか――プログラム言語を使う立場としては、仕事のやり方に影響が出るため、かなり興味がある事柄です。多くの設計者が「今後は並行性にどう対応していくかが大きな課題」と語っています。この課題について、C#のAnders Hejlsberg氏をはじめ、何人かが「関数型言語がカギになる可能性がある」と指摘しています。
別のパラダイムシフトとしては、SaaS、SOAのさらなる普及が考えられます。SOAに関してはObjective-CのBrad Cox氏がいろいろ語っていました。
■意見や批判がぶつかる面白さ
本書を「読みもの」として見た場合、さまざま言語設計者たちが語る「生の言葉」は、それだけでエンジニアにとっては大きな魅力です。前述のとおり、立場やバックグラウンドによって意見が大きく分かれますし、ほかの言語を公然と批判している人も結構います。
印象的だったのが、C++のBjarne Stroustrup氏がJavaについて語っているくだりです。彼はSun(現Oracle)の大々的なマーケティング戦略を「効果的だった」と認めつつも、ある種の嫌悪感を表明しています。言語が人気を得るかどうかは多くの要素が関係しています。彼がが指摘するとおり、純粋に技術的な観点だけではなく、マーケティングなどの要素も(特に近年では)重要な位置を占めています。
そのほか、Javaについては「ごてごてしてる」だの「その場しのぎの設計が多い」だの、いろいろな人が意見を述べていて、C#のAnders Hejlsberg氏はType Erasureについてかなり強い形で批判しています。
一方、JavaのJames Gosling氏やObjective-CのTom Love氏、それ以外にも数人が何かしらの形でC++を批判しています。ほかにもいろいろな批判のし合いがあって、彼らの強い「信念」のようなものを感じました。
面白かったのはPerlのLarry Wall氏で、彼は数学者でもエンジニアでもなく、音楽などを勉強していたようです。そんな彼の言葉は、個性豊かな言語設計者たちの中でもひときわ異彩を放っていて、彼の章を読み終わった後、再びPerlを触りたくなりました。
■言語という世界を作る「神々」の意見を聞いてみる
言語設計者は、プログラマにとっては(いろいろな意味で)神のような存在の人たちです。神々が語る言葉は、どれも重みがあり、かつ示唆に富んでいます。日常業務で直接役立つTipsはあまりないかもしれませんが、彼ら神々の理念や思想を自分の中に取り入れることは、長期的に見て血肉になるのではないでしょうか。
プログラム言語、処理系は、ソフトウェアの基礎となる部分です。これらの理解が浅いことはすなわち、「エンジニアとしての基礎体力がない」ことを意味します。
日本では(特にSIerでは)「プログラミングは単純な作業」と見なされる場合が多いです。わたし自身、SIerの現場で仕事をした経験がありますが、そこで働くプログラマやSEの大半は、基礎体力が不足しているように見えました。基礎体力がしっかりしているエンジニアもそれなりにいましたが、大半はSIerの社員ではなく、子会社あるいは協力会社(不思議な言葉ですよね)の人々でした。
この問題についてはここでは深入りしませんが、ソフトウェアにかかわる仕事をしている人は、目の前の業務をこなすだけではなく、さらに一歩踏み出してみるべきではないでしょうか。プログラム言語や処理系の設計思想、「今後どのような方向に進むのか」といったことへの意識は重要です。
そのとき、神々の言葉が何らかの参考になると思います。
■そのほか、雑感
○多様性と溝
ここからは個人的な感想になるのですが、先ほど書いたとおり、言語や言語設計者にはいろいろなタイプが存在していて、その間には“溝”ができていることが多いと感じます。
言語に限らず、世の中には多種多様な技術やレイヤ、業務領域が存在しますが、それぞれの知識やプラクティスが特定部分に限定しているように思えます。「分断化された技術や知識をうまく統合する」ことが、いまの時代に求められているはずです。
使い古された「ゼネラリストvs.スペシャリスト」という言い方はあまりしたくありませんが、わたしとしてはいわゆる「ゼネラリスト」として、これらの溝を埋めていきたいと考えています。
○続編は?
歴史的に重要(と個人的に思うもの)であるにもかかわらず、本書が取り上げていない言語としては、以下のものがあります(FORTRAN以外の3つは、わたしが大学の授業で習った経験があります)。
- C
- Pascal
- Lisp
- FORTRAN
また、現在広く使われているものの、本書に載っていない言語もあります。
- PHP
- JavaScript
これらが取り上げられていない理由を、あれこれ考えるのも楽しいかもしれません。あるいは、本書の続編でも出るのでしょうか。もし続編が出るとしたら、上に挙げた言語以外に、以下のものを取り上げてもらえると個人的にはうれしいです。
・Scala (設計者:Martin Odersky氏)
Javaの歴史上、最もインパクトのあった新機能・設計変更の1つとして、Genericsの導入があります。Java 5で取り入れられたGenericsやJavaコンパイラ(javac)などの設計を行ったのがMartin Odersky博士で、Scalaの設計者です。
わたしのコラムを読んでいる人はご存じかと思いますが、わたし自身、2010年9月からScalaを勉強し始め、最近では個人的なプログラムの多くはScalaで書いています。
個人的な理由もありますが、「現在最も成功している言語の1つであるJavaの主要機能を設計した彼が、なぜ新しい言語を作ったのか」というトピックは、多くのエンジニアにとって興味深いものだと思います。また、現在Javaを採用しているエンジニアにとっても、重要な示唆を含む内容になるのではないでしょうか。
・SGML(設計者:Charles Goldfarb氏)
今日のインターネットや情報システムの発展は、HTMLおよびXMLを抜きにして語れないと思いますが、これらの基となったSGMLの成り立ち、設計思想も気になります。SGMLは「複雑」といった理由でXMLに置き換わるのですが、その「複雑な仕様」について設計者が何を語るのか、現在のインターネットをどう見ているのか……ぜひ聞いてみたいところです。
■まとめ
本書は、ソフトウェアにかかわる人であれば、読んで損はないと思います。読みものとしても興味深いし、いちエンジニアとして、言語設計者の考え方から影響を受けることもあるでしょう。わたしは一度読み終えた後に「そういえば何かこんなことをいっていた人がいたな」と思って読み返しました。今後も、たまに読み返す気がします。
冒頭で、英語版と日本語版という話が出ましたが、日本語版の文章は若干分かりにくいように思えます(また、分かりにくさは章によってばらつきがありました)。原著を読んでいないので、もともとの英語が難解なのか、それとも日本語訳が分かりにくいのかは断言できませんが。
全500ページとかなりボリュームはありますが、最初から通読する必要はありません。興味のある章から読んでいくといいと思います。
(『海外でも通用するエンジニアになる』コラムニスト 鹿島和郎)