ILC2012個人的まとめ#2 二日目

一日目は9時半からだったが、二日目以降は8:40からなので、この日より、朝5時に起きて6時に家を出る毎日となった。普通にきつかった。

Fifty Years of a Lisp User

和田先生によるLispの歴史の話。

  • AUTOMATA STUDIES
  • 1955 EDSAC
  • 1958 パラメトロン計算機 PC-1
    • 4200パラメトロンで、18bitで512wordのメモリを搭載
  • portscriptで書いた星(和田先生のブログにたくさんある奴)
  • SICPの図形言語
  • ライフゲイムのデモ。早い
  • よく知られている、日本製Lispシステムの一覧表
    • この表は中西先生が1974年に作られたもの?
    • KLISPはM式も扱えた
    • HLISPは「Hashed Lisp」、hconsというものがある
    • TAOLisp
      • car, cdr に加えて、 cbr, ccr があった。つまり、 c{a,b,c,d}r と揃った
      • Lispのcarとcdr自体はIBMのcpuレジスタ由来で、そのcpuの方では cpr, ctr が別にあったので、自分の中でごっちゃになりそうだ…
    • KCLはGNU CommonLispになった
  • Lispマシーンについて
    • FLATS : Formula + Lisp + Association + Tuple + Set との事。つまり、数式 + Lisp + 連想(リスト?) + タプル + 集合
    • ELIS
    • 他にもいろいろ(メモしきれなかったようだ)
  • 可視化されたGCアニメーション
    • PDP-8 Lisp
      • パンチ穴の開いたテープ紙の写真
      • 1word は 12bit、 1line は …
      • このテープ紙をスキャンして対応するデータを読み込む
    • GC可視化の実演
      • シンプルなガベージジェネレータ(一時セルを生成して使わずに放置するループプログラム)のコードを実行すると、グラフィカルに表示されている空きメモリをどんどん消費していって、一定タイミングでGCが動いて、今度は逆に空きメモリがどんどん回復していく、という繰り返しをシミュレータ上で実演
  • 最後に、伊勢神宮神宮式年遷宮( http://ja.wikipedia.org/wiki/%E7%A5%9E%E5%AE%AE%E5%BC%8F%E5%B9%B4%E9%81%B7%E5%AE%AE )のgoogle mapの上から見た写真が出て「コピーGC」という解説が。海外の人は分かったかな?

A Class Based Object-Oriented Programming Framework Based on CLOS

CLOSに、C++/Java風の多重継承やインターフェース強化を行ったもの、との事

  • CLOS/CB (CLOS/Class-Based)
  • 以下が追加されている
    • declass() クラス定義マクロ
    • deinterface() インターフェース定義マクロ
    • demeth() メソッド定義マクロ。おまけで demeth*() もある
    • decstr() コンストラクタ定義マクロ
  • Consistency Checker があるとの事
  • Java風の利用用途を想定しているとの事
    • マルチスレッド、ゲーム、AWT/Swing、グラフィック(ACLCG利用)、…
  • Javaアプレット風のINPUT欄にS式(例えば、「(sin x)」とか)を入力すると、そのグラフが表示されるデモ
  • 同様に、ケプラーの法則(天体の動きの奴)のグラフィカルなデモ

Scheme to C++ Simple Translator Scm2cpp

  • Jafferさんの scm2c がベース
  • 目的の一つとして「readableな」C++コードを吐く、というのがある
  • webサービスとして、フォームの入力欄にSchemeコードと追加宣言を書くと、それをC++コードにしてくれるサービスが置いてある
  • C++テンプレートによってLispマクロを実現?
    • これによりパフォーマンスを実現?
    • 「(define (add x y) (+ x y))」というSchemeコードがあるとして、これだけではxとyの型は確定しないけど、それをC++のテンプレート機能でうまいこと処理する、みたいな話だったと思う(実際のプレゼンでは変換後のC++コードとかもあったけどメモしきれてない)
  • Boost.MPL Boost.Phoenix を使用?
  • リストとベクタの型変換
  • Schemeの「eq?」「eqv?」「equal?」もC++テンプレートで実装
    • この時にリストやベクタはポインタ配列として判定する事で高速化しているらしい
  • 利用目的は数値計算がメインとの事
    • シンボル操作や文字列操作回りはまだ不具合があるとの事
  • 継続の実装にはBoost.coroutineを使用
  • 末尾再帰最適化どうしてるの?という質問があって自分も気になったけど回答聞き取れなかった。
    • 普通に考えるとgccの-O3とか任せにするしかなさそうだけど

Generating Probability random numbers using Common Lisp

早い正規乱数(取得結果が正規分布になるような乱数)がほしい!という話。
実際自分も正規乱数は重要だと思うのにあんま真面目に提供されてる事が少ないと思ってたのですごい共感した。

  • 乱数源にはメルセンヌツイスターを使用
  • 想定用途は、コンピュータシミュレーションと、(モンテカルロ法マルコフ連鎖の)機械学習
  • これを作った動機は、シンプルなAPIと最良のパフォーマンスを得る事
  • (分布の)形状パラメータを必要に応じて指定可能
  • 離散型確率分布も可能
  • 標準分布も可能(形状パラメータを指定しない場合は標準分布になる)
  • 利用可能なアルゴリズム
    • Box-Muller法
      • 問題点
        • 実装は簡単だが早くはない
        • 計算時にオーバーフローする可能性のある箇所が存在する
    • Polar法
      • Box-Muller法より早い
    • Ziggurat法
      • Polar法よりも早い
    • 形状パラメータはαとβを指定する。これにより、β分布にしたりできる
      • β分布にする指定方法は四パターンあり、どれも結果は同じだが実行にかかる時間が違う?(英語聞き取り怪しい)
  • 離散型確率分布にする為のアルゴリズム
    • 逆変換法
    • テーブルから生成
      • すごいでかいテーブルを作り、そこからランダム選択する
      • 色々な手段でテーブルを最適化する事が可能(かなり詳しく解説されてたけど省略)
  • 二項分布にする為のアルゴリズム
  • 上記の各アルゴリズムを任意選択可能
  • アルゴリズムによっては、形状パラメータ等が固定ならば一部を先行評価する事で高速化できるものがあり、それらをコンパイラマクロを使って高速化している
  • それぞれの分布、アルゴリズム、CL処理系、他言語との比較、の図と結果表示
  • Ziggurat法は運が悪いと永遠に終わらない可能性がある???という質問が出た。回答聞き取れなかった
  • Ziggrat法は近似的な手法なので、「精度は?」という質問が出た。これも回答聞き取れなかった(すいません、基本的にスクリーンに出なかった話は上手く聞き取れてないです)

おひる以降

この日も会場で弁当を受け取り、適当に食べたと思う(うろおぼえ)。
この日の午後は京都の時代祭を見物に行く、という話で、外国から来てる人の多くは事前に黒田さんに指定席のチケットを取ってもらっていたらしい。
立ち見もできるようなので、弁当を食べた後に何回か見に行ったりした。
(けどフルで見る程ではないなと思ってすぐ帰ってきたりしてた。基本は昔の人の格好をした人が行列で道を通っていくだけなので)
これと同時に、会場ではLispマシーン展示の作業等が行われていて、いじってよい状態だったりしたので、みんなでキーボードさわってみたりマニュアル読んだりしていた。

夕方からは火まつり?を見るという話だったけど、先行隊(時代祭を指定席で見れたグループ)の話では電車とかがすごい混んでて今からだとまず無理、みたいな話だったので、そのまま残りメンバーで飲み会へ。丁度運良く、残ってた15人ぐらいが入れる店に行けた。
部屋は一つだけどテーブルが二つで、自然と「英語テーブル」と「日本語テーブル」のような感じに。
色々と面白い話を聞いた。
しかし自分は家に帰らないといけないので9時すぎぐらいにあわてて一人で帰宅。家事風呂その他で寝れたの2時ぐらい。