#devsumi 2012 言語の世界 メモ

投稿日:

言語の世界

  • 松本さん

  • マニアックな話ばかりするので、明日の仕事には役に立ちません。他のセッション出たほうが役に立つと思いますw

  • Rubyを作ったけど、言語好きです

プログラミング言語って

  • プログラム = 手順書
  • プログラミング言語 = 手順書記述用人工言語
    • コンピューターは道具、何かコンピュータで達成したいことがある
    • コンピュータに達成させたいことを記述するもの
    • 自分の理想はなにか、思考の表現をするため、具体化された思考を記述するための実行言語
  • せめぎあうふたつの立場
    • 機械のためか、人のためか、という立場がせめぎ合う

プログラミング言語の歴史的な話

  • FORTRAN
    • FORmula TRANslator
    • 1954年に登場した、世界最初のプログラミング言語
    • アセンブラも存在していなくて、マシン語をそのまま書くような時代に登場したので、画期的だった
    • 「コンピューターのためではなく、人間が楽をするために」
    • 背景:コンピュータが遅かった
      • 1985年のスーパーコンピューターとiPhone4の処理能力がだいたい同じ
    • フォートランの頃は「言語の常識」がなかった
  • LISP
    • LISt Processor
    • 人間のために始まったもの。機械の都合ではない、という点でFORTRANとは対照的
    • ラムダ計算モデルを表現するために作られたものを、そのままコンピュータで動かせば動くんじゃね?って動かしたら動いた
    • IBM704計算機
      • car : content of address registerr
      • cdr : content fo data register
    • ガーベージコレクタ
      • 実装されていた。一般的になるのはJavaの登場によって
  • FORTRANとLISPでバトルしてたら、最終的にAlgolが勝った
    • Algol -> PL/1 とか Pascal とか
    • みなさんが使っている C, C++, Java あたりは Algol 属
  • Lisp へのゆり戻し
    • Smalltalk、Ruby
  • プログラミング言語におけるカンブリア爆発
    • 1960年代~1970年代前半くらい、多種多様な言語が乱立する時代。アイディアなどが次々登場していた時代が
      • C : 1972年
      • Simula : 1967年
      • Shell : 1971年
    • 変な言語も
      • Prolog, APL, アクターモデル
    • 2002年、はRubyもJSもJavaもあった。この10年くらいプログラミング言語は大きな変化はなかった
    • 1960年代~1970年代に生み出されたアイディアを食いつぶしているような状態
      • 「どうせ既存のものの組み合わせさ」
  • 人気の言語はそれなりに新しい。ここ数年で新しいものはあまりないけど
    • Java : 1995年
    • C# : 2000年
    • Scala : 2003年
    • Erlang : 1986年
    • Ruby : 1995年
    • PHP :
    • Perl :
    • 「言語の世界じゃ10年くらいはまだまだはなたれ小僧」

新しい言語の動機

  • 作りたかったから
    • 30年前に雑誌とかみてて、プログラミング言語を作りたい、と思っている人が5人に1人とかいるだろうと思ってたら、実は全然いなかった
  • 新しいパラダイム
    • オブジェクト指向とか、関数型とか
    • ここ20年くらい新しいパラダイムは登場していないので、どちらかと言うとそれらの組み合わせ
      • 並列型と関数型の組み合わせ、とか
      • 組み合わせで難しいのはバランスよくする、使いやすくすること。組み合わせるだけなら簡単
  • 新しい環境
    • 新しいCPU、メモリが増える、
      • WEBとかMapReduceとかも「新しい環境」
      • PHPなんかはWEBで普及した言語
  • 新しい制約
    • データ量が爆発的に増える(ビッグデータ)、アクセス量

どこまでが言語か

  • 文法
  • ライブラリ
    • COBOLとか、言語そのものは古臭いかもしれないけど、業務システムのライブラリやそのデザインがCOBOLに最適化されていたりする
  • アーキテクチャ
    • ウェブそのものがアーキテクチャを支援しているような
  • デザインパターン
    • 本が出た時C++プログラマは喜んだが、Smalltalkでは当然のもの(言語に組み込まれている)だった
  • コミュニティ
    • ユーザーコミュニティ、開発者コミュニティ
    • 言語やライブラリよりも、コミュニティやエコシステムが重要。言語を選ぶときはそういう観点も大事にして欲しい
  • 思想・人格
    • 使っている人、作っている人の思想とか

温故知新 歴史の振り子

  • 集中 vs 分散
    • 昔はコンピュータが高かったので、コンピューターのところに行って、処理をお願いしていた
    • 中央のコンピューターに仕事を依頼する → 集中
    • コンピューターの性能が上がるよりも単価が下がる方が早かったので、処理を分散するように向かっていったらWEBが出てきた
    • ブラウザという形の汎用の端末を通して、データがサーバーに集まる → 集中へ
    • 今はみんな amazon に移行していってるが、amazonの中では分散されている(集中の中での分散)
  • 性能 vs 生産性
    • 1950年代には「世界中にコンピューターが5台あればいい」と言っていた人もいた
      • 人間はリソースがあればあるだけ使ってしまうという悪い癖がある
      • リソースは計算パワーにしても容量にしても、あればあるだけ使ってしまう
    • コンピューターの能力を若干無駄使いしても、その方が生産性が良かったり
  • 静的 vs 動的
    • 実行性能をとって柔軟にするか、その逆にするか
  • 正確さ vs 柔軟さ
    • 積極的により早く間違いを見つけようとするか、柔軟にしてTDDなどで間違いを見つけるアプローチか

未来にある言語はどういうものか

  • APL
    • 3年前のこのセッションで話しました
    • 記号を多用する配列言語。ライフ言語プログラムが1行で書ける
    • 昔は専用の端末を使わないと記号を打てなかったのが、今はユニコードなので全部入ってる
    • 予想通り、流行らなかった
  • Whitespace
    • スペースとタブで構成されているので、これを実行するとhello worldが実行される
    • ネタですけど
  • 「新しいぶどう酒は新しい革袋に」
    • これからの時代に即したプログラミング言語が必要
    • ビッグデータ、マルチコア、クラウド etc
    • Erlang / node.js / R / SQL の発展形

Erlang

  • 関数型 + 分散型
  • 信頼性の高い分散モデルを作れる
    • 大規模システムでCPUが増えたり、クラウドでシステムを構築するノードが増えた時、メッセージパッシングによる分散は価値を発揮できそう
    • Erlang がそのまま流行る、というよりも Erlang っぽい実装をされたり、 Erlang の後継が出たりとか

Node.js

  • サーバーサイドJSの典型
  • たくさんアクセスが来るからと言って実際のCPU数よりもスレッドを上げるとパフォーマンスが落ちる。それをカバーするために非同期IOによって多重化している
    • Node.js そのものが来るというよりも、既存の言語に大量アクセス対応をする機能がサポートするかもしれない

R

  • 統計、解析が非常に得意な言語
  • すたティスティクができるエンジニアの給料が上がっているので、統計ができる方はぜひ
    • Oracle が R-ODM という Oracle に対するアクセス機能がある R を作っている
    • ビッグデータと統計を組み合わせたものに未来があると思っている

sql

  • SQLそのもの、というよりも SQLの発展形
  • SQL の良いところは宣言的にデータを取得できる
    • 「こんなデータがほしい」といえば、裏で何やってるかわからないけどデータが出てくる。非常に抽象度が高い
    • こういう宣言度の高いものが来ると思っている
  • SQLそのもの、ではなく、宣言的に使えて結果が取得できるような何か

言語の楽しさ

  • プログラミングの楽しさ
    • 言語そのものが楽しい
    • なぜ言語が楽しいか、というと、やはり本質はプログラミングの楽しさ
  • 自分の思ったとおりにコンピュータが動くというのは楽しい
  • 中学の頃、ポケコンでBASICでプログラミングしてた
    • 400ステップとか
    • 命令した通りにコンピュータが動くのが可愛い。犬にお手ってやると手を出して可愛いのと同じだと思ってる
  • 言語 = プログラミング
    • 言語の楽しさはプログラミングの楽しさに密接な関連がある
  • 処理系を作るのがとても楽しい
    • コンパイラ → 構文解析
    • コンピュータサイエンスのあらゆる領域に、すこしずつ触ることができる
  • 言語設計
    • どんな言語を作るか
    • プログラミング言語によって発想の仕方が変わる。つまり、言語設計 = 発想をプログラミング
    • RUbyを使っているとRubyの発想にそまっていく
      • まつもとさんが決めた仕様なので、Rubyプログラマはまんまとまつもとさんにプログラミングされているw