Lisp関係でこれだけ熱い人たちが集まってくるのは,結構すごいね.あとLL言語に比べて,何かしらのこだわりが強い人が多かった感がある.楽しいだけじゃない,熱意というか.まだ初心者な私にも何かしら凄さを感じさせてくれました.
話の内容的にあんまり追えてないので,詳しいまとめなどは,他の参加者を参照してくださいorz.
==== ##開会の言葉@ひげぽんさん
##50万行オーダーのプロジェクトを俺Lispで書く
- mitamex さん
- ゼンリン電子地図帳Ziを開発
docomo 標準バンドルのゼンリン地図+ナビの開発など
目的はプロジェクトの成功
- Lispを使いたいからじゃない
- 切り分けて制作
実際問題としてLispしか選択肢がなかった
- 小さなコア
チーム開発では
- Lisp に拒絶反応を起こす人がいる
L4u
- Lisp for you! <- 破壊的
- 大規模開発用
- スケーラブル
- 超並列型
- Rubyみたいな普通の言語っぽい見た目
- Erlangみたいに超並列型
- プロファイラー実装
- 最適化しやすい
超並列型
- アクターモデル
- クライアント/サーバモデルと同じ感覚で作れる?
みんなに使ってもらうためにエディタも作った
S式
- tuple を導入
- まずはJSONで開発して,後でS式に置き換える
- それとは気がつかないうちにS式を使ってる感じに.
携帯電話のリモートデバッグ
- Doja はソケット使えないので,ポーリングして GET でコマンドを受け取る
サーバサイド L4u
- 携帯でもサーバでも同じ処理が動く
どこでもREPL
- ホスト言語との連携を前提
- L4u で不得意な部分はホスト言語に置き換えた
delegate/cc
- 呼び出した時点でL4uの処理は止まる.戻りが発生したら,継続.
プリプロセッサ・マクロ
- 同じシリーズの携帯でもコードを分ける必要があるので,プリプロセッサを使う.
- どんな構文でも最後にはS式に変換される
超並列指向
- Erlang と同じものを目指している
L4uは人に優しい構文
- Lisp は人間に優しくなく,コンピュータにやさしい言語.
- return/breakとかloop/while が使える
- かっこを減らす工夫をしている.
- なぜCLOSがあるのにJavaっぽいクラスを使うのか
- ホスト言語で書き直す手間を低減させるために.
Lisp と言わないのがポイント
##HyperSpec ひとめぐり
- NANRI さん
###HyperSpec
ANSI Common Lisp の使用
CLtL2 とは
- Common List the Language 2nd Edition
感心したところ,他の言語にないところを紹介
###数の体系
- 数の種類
- 整数,有理数,実数,複素数
- 正確数と非正確数の区別
- 1⁄3 != 0.3333…. とかの区別
- 有理数の正準化
- 2⁄1 -> 2 になど
- 複素数の正準化
- (1 2) -> 1 になど
- (1.0 0.0) だと,非正確数なので正準化は行われない
###Common Lisp には
- コンパイラが含まれます
- compile によりコンパイルできる
- 他の言語の言語仕様では,Java/Haskell以外では見つからなかった.
- 逆アセンブル関数 disassenmble がある
- デバッガが含まれます
- Common Lisp ではエラーが起こるとデバッガに移行する.
- エディタを起動する関数がある
- ed
##scheme on PINBALL(仮)
- PINBALL で稼いでる人
- 200fpsで動くらしい.140fpsを下回ると,動きがぎくしゃくするらしい.
- PINBALL のルールが複雑で,それを記述するために Ypsilon を作った.
- 5ms 以内に処理を行わなければならないので,GC が起こるようだと厳しい.
- しかしユーザに GC がないような言語で書いてもらうと,メモリリークを起こす.
- そこで Scheme
###Ypsilon
- R6RS 準拠の ピンボールゲームのための Scheme インタープリタ
- マルチコアに最適化した Concurrent GC
- ゲームに特化すると,マルチコアが前提でもOK
- 極めて短い GC 停止時間と並列実行によるパフォーマンス
- システム全体の信頼性・レスポンスを重視
- VM の並列化が現在進行中
- ネイティブ・コード生成も予定中
###YpsilonVM の開発
基本的な最適化
- Direct Threading
- Dispatch のコストを少なく.
- Super Instruction
- プログラムに必要な VM 命令数を少なくすることにより,Dispatch の回数を少なくする.
- Data-Cache の利用効率が上がる
- トレードオフ
- かなり頻繁に使用されるコードでなければ,実行コードの局所性が失われることになり逆効果をもたらす.
- あまり使われない処理を埋め込んでも,そこが使われる頻度が少なかったら,nop と同じ意味になり,局所性がなくなる.
- Operand Fusion
- Super Instruction と同じトレードオフがある.組み合わせ.
- Cache Access
- 近年の CPU ではメモリアクセスがボトルネックになっている.
- D-Cache と CacheLine のコンフリクトが問題
- 広範囲に発生する場合は優先的に解消を図って,限定的な場合は放置する.
- VM では I-Cache が一般プログラム以上に重要
Scheme 専用の最適化
- コンセプト
- ポータブル
- 高いメンテナンス性
- デバッグ機能
- Backtrace を有効にする.
- Scheme では末尾呼び出しでが継続で保存されない.
- エラーにならないと使わない機能なので,どうするか.
- Stack GC
- コードに弱点のない
- コンカレントGC が有効に働くこと
- Stack GC と Stack Closure の組み合わせで大きな効果を出す
Concurrent GC
- Mark Phase
- Mutator を止める
- ルート集合をとる.
- Mutator を再開する.
- Mutator の実行と並列に Collector が Mark を行う.
- Mutator を止める.
- Mutator が変更のあったルート集合を集める
- Mutator を再開する.
- Sweep Phase
- ゴミは確定している
- Mutator はゴミにアクセスしない.
- Collector はヒープをみてゴミを回収する.
- 簡単ではない理由
- Mutator と Collector が激しい競合を起こす.
- Mark Phase 中に Mutator がアロケーションを行っている.
- Incremental Update 方式に変更
- Mutator が早くなったが,アロケーションも多くなり,素食べーションが発生.
- スタベーション
- メモリ消費に回収が追いつかなくなること.
- Sweep Phase での競合が目立つ
- なぜ競合が起きるのか?
- Concurrent Sweep だから.
- Collector が現在 Sweep を行っている領域からにはアクセスしないように変更.
- そしてイタチごっこになった.
- Heap の使用量を減らす方向で VM の最適化を行う.
- まだまだイタチごっこは終わらない.
##Lightning Talk
- ナベアツ問題
- Gauche で日本語的にやってた.
- quine
- 自分自身を出力する
- format = printf
- let1 = 昔の LET
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/quine.html
- 設計なしでどうするか
- 某L言語の糖衣構文ですべて解決
- ケーゾク小説
- Scheme と P言語で小説
- 動的Cコンパイラモジュール dyncomp
- Tiny C Compiler を組み込んで C の記法を S 式で(cise)
- 評価,即コンパイル
- CL/Scheme
- Gauche でロボット制御
- NetTanser++
- 5万か・・・・
- Reading Gauche
- Gauche のコードいいよ