50年前のプログラミング言語 50年後のプログラミング言語 #spcamp 2010 BoF
“どんな技術であれ、100年後を予想できるなんて考えるのは傲慢だと 思われるかもしれない。 しかし、我々は既に50年の歴史を持っているということを 考えて欲しい。 過去50年の言語の進化がいかにゆっくりとしたものであるかを 考えれば、100年後を見るということも考え得る範囲だろう。” http://practical-scheme.net/trans/hundred-j.html (google: 百年の言語) 百年の言語 --- The Hundred-Year Language Paul Graham /訳: 川合史朗
50年前の言語 (1960) ALGOL APL COBOL FORTRAN LISP http://www.levenez.com/lang/ (google: computer language history)
今の言語 (2010) Ruby Python Perl PHP ECMAScript Scala Haskell OCaml Erlang JavaScript, ActionScript Scala Haskell OCaml Erlang C C++ Java C# Lisp CommonLisp Scheme Clojure
【議論タイム】 50年前の言語 と 今の言語 違いはなんだろう?
【議論タイム】 「50年後の言語」を 予測しよう! …の前に
“今 (2010)”の “研究者” が 考えている言語をご紹介
すごい型システム def item(s) return “<li>” + s + “</li>” end 例: Google “regular expression type” String item(String s) { return “<li>” + s + “</li>”; } # item(123) コンパイルエラー # item(“p(略)<<<越えられない壁<<<ruby”) 壊れた出力 String(<script>含まない) item(String(/[^<>]*/) s) { return “<li>” + s + “</li>”; } # item(“プギャー> (>_<)m9”) コンパイルエラー!
「スケッチ」プログラミング “だいたいこんな感じ” コーディング list reverse(list p) { list np = null; while(p) { np = new list; np.val = p; np.next = np; p = p.next; } return np; list reverse(list p) { list np = null; while(p) { np = new list; (? = ?;)* } return np; assert(forall i<N: get(p,i) == get(rev(p),N-1-i)); A. Solar-Lezama, “Sketching Approach to Program Synthesis”, 2009 他
「50年後の言語」を 考えてみよう! 【議論タイム】 「今の言語の不満なところが こう直ってるはず!」 「50年後のテクノロジーなら こんなこともできるはず!」
ところでそもそも プログラミング言語、って何? プログラミング言語(プログラミングげんご)とは、コンピュータに対する一連の動作の指示を記述するための人工言語の総称である[1] (wikipedia: プログラミング言語) 1. ISO 5127—Information and documentation—Vocabulary, clause 01.05.10 では、プログラミング言語を「プログラムを記述するための人工言語」と定義している。
【議論タイム】 「プログラミング言語」を 「コンピュータへの指示」以外に 使えるでしょうか? …の前に、いくつかご紹介タイム
トラックの集配経路 トラックの運行スケジュールの最適化に、 プログラミング言語の最適化技法を使う Ichiro Sato, “A Specification Framework for Earth-friendly Logistics”, 2008, 他
人間の使う言語の「理解」 Chris Baker, “Wild Control Operators”, 2009, 他 (野生の制御構文)
人間の使う言語の「理解」 「xが2で割り切れるなら~」 「xが3で割り切れるなら~」 「xが2か3で割り切れるなら~」 if( x % 2 == 0 ) print(“yes”); 「xが3で割り切れるなら~」 if( x % 3 == 0 ) print(“yes”); 「xが2か3で割り切れるなら~」 if( x%2==0 || x%3==0 ) print(“yes”); △ if( x % (2 || 3)==0 ) print(“yes”); × if( x % (2 か 3) == 0 ) print(“yes”); !??
「か」は制御構文! … (x か y) … if( x % (2か3) == 0 ) print(“yes”); 制御構文の例 if(c) … 文 c の結果によって … を実行する/しない while(c) … 文 c の結果によって … を何回も実行したりしなかったり … (x か y) … if( x % (2か3) == 0 ) print(“yes”); if( x%2==0 || x%3==0 ) print(“yes”); x と y によって 周りの … を何回も実行したり!! Perl6 の “ジャンクション” / Scala 等の “限定継続”
(x*x = 2 なら x は 分数で書けない) の証明 数学の“証明”をプログラミング 「√2 は無理数」 (x*x = 2 なら x は 分数で書けない) の証明
“証明” と “プログラミング” 型 その型の関数 型チェック ライブラリAPI 定理 証明 証明が論理的に正しい保証 既知の定理
【議論タイム】 「プログラミング言語」を 「コンピュータへの指示」以外に 使えるでしょうか?
まとめ “(1) 100年後の言語は、原理的には、 現在でも設計できる。 (2) そのような言語は、もし存在すれ ば、 現在でもプログラムを書くのに 良い言語かもしれない。 こんなふうにアイディアを並べて見ていると、 100年後の言語を、今、設計したくなってこないかい?” http://practical-scheme.net/trans/hundred-j.html (google: 百年の言語) 百年の言語 --- The Hundred-Year Language Paul Graham /訳: 川合史朗