Island Life

2005/10/04

毎年恒例(?)、Franz社の2日間にわたるLispセミナーが今年も開催されるそうです。

「2日間みっちり! Lispチュートリアル&Lispセミナー&Lisp事例紹介」

去年はAllegro Common Lisp 7.0の正規表現ライブラリについて 発表させてもらったんですが、今年は残念ながら行けません。 1日目のJansによる「Lispゲームプログラミング」が気になるなあ。

Tag: Lisp

2005/09/30

最上の日々 9/28より:

1、関数型プログラミングは、たまたま並列性を最大に記述する方法でもある。それを利用すれば並列性の抽出は容易だ。

2、関数型のプログラムの構文木を直接実行するプロセッサがあるといい。でもそこまで行かなくとも二股同時実行コール命令を追加するだけでも効果がある。

2.について。面倒なのは呼び出しより帰って来た後の同期だから、 「二股同時コール」はそこまで含めてのことだろう。 ただ、プロセッサレベルでは非同期呼び出し命令と同期命令に分かれてた 方が使いでがあるし、そうなるんじゃないかと思う。(言語レベルでの並列 呼び出しをコンパイラが非同期呼び出し+同期命令に展開すればいい)

例えばPS2ではコードとデータを用意してDMAをキックすることでVUが (CPUと並行して)計算を進めてくれる。結果を受け取るには 確かVUから割り込みもかけられたと思うが、コンソールゲームでは 計算時間の予測がたてやすい場合も多くて、CPU側である程度他の計算を 進めてからポーリングして同期していた。

ハードウェアでマルチコアに複数のスレッドを振ってくれるような機構が 出来たなら、非同期呼び出し命令も同期命令もスレッド操作のプリミティブ として処理されることになるかな。

1.について。副作用無しの関数型プログラミングは、 それだけでは並列性の記述には不十分だ。

「AかつB」「AまたはB」というパターンには、AとBを独立して評価できる場合と Bの評価可能性がAの評価結果に依存する場合がある。 後者の例は(and (char? x) (char=? x #?a))。 逐次プログラミングでは両者の区別は不要だが、並列プログラミングでは 区別してもらわないと、前者でAとBを並列に評価する機会を失う。

これはかなり本質的な違いで、「『AまたはB』でAかBの いずれかが停止しなくても、もう一方が停止すれば答えが出る」 というセマンティクスは並行演算を前提としないと実現できない。

これらの演算は実用的には非常に重要だ。並列演算を適用したい大きな データセットを扱う問題であっても、得たい答えは入力の データセットより遥かに小さい場合が多い。 ということは多くの問題で、どこかでたくさん並列に流れてた データの流れがぐっとしぼられる点が必ず一つ以上あるということだ。 例えば「たくさんのものの中から(どれでも良いから)ひとつ条件を満たすものを選ぶ」 という操作は頻出するけれど、関数的な素直な記述:

(define (find pred set)
  (cond ((pred (car set)) (car set))
        (else  (find pred (cdr set)))))

からは並列性は抽出できない。

並列に条件判断を走らせて、どれかひとつが帰って来た時点でそれを採用し 他は捨てる、ということになれば、走っている並列演算をキャンセルする機構も 組み込みで必要になる。

Tag: Programming

2005/09/27

こちらでの演技中に、「せりふのテンポが遅い」というダメを出されることが良くあった。 自分で丁度良いペースだと感じるテンポはネイティブにとって遅いらしい。 意識して速めてOKをもらっても、気持ち的に急いでるみたいでどうも落ち着かなかった。

多分口が遅いんだろうと思い、一人で運転している時は いつもラジオを聴きながらシャドウイングに挑戦しているが、なかなか ついてゆくのは難しい。NPRのAll Things Consideredとか音楽番組など かなり聴き取り易いものでも、音に気をつけて発音しようとするとどんどん 遅れる。ついてゆこうとすると発音がでたらめになる。 ましてや地元の放送やCMは絶望的。

ふと、フレージングの問題なんではないかと気がついた。「塊」として とらえる単位が小さすぎるんではないかと。つまり、「塊」、として、 とらえる、単位が、小さすぎる、んでは、ないかと、という、具合に、認知して、 発音、してるから、どうしても、テンポが、悪くなる。 cold readingでも、ワンセンテンス全部覚えて目を離すことがなかなか出来ず 細切れになりがちだし。

フレーズを覚える位まで繰り返す練習をするのが良いのかもしれん。

Tags: 芝居, 英語

2005/08/30

Gaucheの起源

某所でGaucheの名前の起源について質問という程じゃないけれど 話題になっていたので、一応記しておく。いくつかの要因がたまたま 重なってついた名前にすぎず、そんなにおおげさな起源があるわけではない。

  • "The Right Thing"が極めて重視されるSchemeだが、日常の泥くさい仕事にも 使えるように不格好な拡張も入れるよ、という言い訳。gauche = awkward、 および droit <-> gauche から。
  • 音楽関係のとあるアプリを書くことを考えていて、「セロ弾きのゴーシュ」からの 連想でGaucheという名前を考えた。そのアプリを書くために思い通りに 操れる言語が欲しくて、当時構想していたScheme処理系をそれに使おうと考えた。 いつの間にか処理系自体をそう呼ぶようになった。
  • 思い立った時にコマンドラインからインタプリタをすぐに立ち上げられる ために、コマンド名は4文字にしたかった (2, 3文字だとあまり特徴が出せない、 5文字以上はタイプが面倒)。"gosh" は、-sh で終わるところがインタラクティブ シェルっぽい、右手と左手で交互にタイプできる、ということで候補にあがった。 これを使うためにはシステム名が'g'で始まることが望ましかった。 (でも 'o' の出どころは結局考え付かなかった)

Tag: Gauche

2005/08/29

天泣記2005/08/29:

ふと思ったのだが、event driven と thread の表現能力がだいたい同じだとすれば、 全部 thread なスタイルでやる GUI ライブラリというのもあり得るのだろうか。

いかにもErlangあたりがやってそう、と思ってぐぐってみた。 http://www.erlang.se/workshop/2004/ex11.pdf とか。 各ウィジェットがプロセスになっててメッセージパッシングで処理してる ように見える。

ただスタイルとしては各プロセスをオブジェクトとみなしてもあんまり変わらん ような気も。receiveで待たずにbusy loopするとか、本格的にコンカレントに 動いてるプロセスがあると差が出てくるのかも知れないけど、 触ったことがないのでよくわからない。

Tags: Programming, Erlang

More entries ...