#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年代に生み出されたアイディアを食いつぶしているような状態
- 「どうせ既存のものの組み合わせさ」
- 1960年代~1970年代前半くらい、多種多様な言語が乱立する時代。アイディアなどが次々登場していた時代が
- 人気の言語はそれなりに新しい。ここ数年で新しいものはあまりないけど
- Java : 1995年
- C# : 2000年
- Scala : 2003年
- Erlang : 1986年
- Ruby : 1995年
- PHP :
- Perl :
- 「言語の世界じゃ10年くらいはまだまだはなたれ小僧」
新しい言語の動機
- 作りたかったから
- 30年前に雑誌とかみてて、プログラミング言語を作りたい、と思っている人が5人に1人とかいるだろうと思ってたら、実は全然いなかった
- 新しいパラダイム
- オブジェクト指向とか、関数型とか
- ここ20年くらい新しいパラダイムは登場していないので、どちらかと言うとそれらの組み合わせ
- 並列型と関数型の組み合わせ、とか
- 組み合わせで難しいのはバランスよくする、使いやすくすること。組み合わせるだけなら簡単
- 新しい環境
- 新しいCPU、メモリが増える、
- WEBとかMapReduceとかも「新しい環境」
- PHPなんかはWEBで普及した言語
- 新しいCPU、メモリが増える、
- 新しい制約
- データ量が爆発的に増える(ビッグデータ)、アクセス量
どこまでが言語か
- 文法
- ライブラリ
- COBOLとか、言語そのものは古臭いかもしれないけど、業務システムのライブラリやそのデザインがCOBOLに最適化されていたりする
- アーキテクチャ
- ウェブそのものがアーキテクチャを支援しているような
- デザインパターン
- 本が出た時C++プログラマは喜んだが、Smalltalkでは当然のもの(言語に組み込まれている)だった
- コミュニティ
- ユーザーコミュニティ、開発者コミュニティ
- 言語やライブラリよりも、コミュニティやエコシステムが重要。言語を選ぶときはそういう観点も大事にして欲しい
- 思想・人格
- 使っている人、作っている人の思想とか
温故知新 歴史の振り子
- 集中 vs 分散
- 昔はコンピュータが高かったので、コンピューターのところに行って、処理をお願いしていた
- 中央のコンピューターに仕事を依頼する → 集中
- コンピューターの性能が上がるよりも単価が下がる方が早かったので、処理を分散するように向かっていったらWEBが出てきた
- ブラウザという形の汎用の端末を通して、データがサーバーに集まる → 集中へ
- 今はみんな amazon に移行していってるが、amazonの中では分散されている(集中の中での分散)
- 性能 vs 生産性
- 1950年代には「世界中にコンピューターが5台あればいい」と言っていた人もいた
- 人間はリソースがあればあるだけ使ってしまうという悪い癖がある
- リソースは計算パワーにしても容量にしても、あればあるだけ使ってしまう
- コンピューターの能力を若干無駄使いしても、その方が生産性が良かったり
- 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
コメント