薄いブログ
2007/01/08(月) 18:17:53
去年はなんかこう,無駄に毎日エライ長文更新というスタイルを貫いてきたので,今年は凄い長いスパンで更新されて内容も凄い短いという,なんかこう凄い薄いブログスタイルで行こうとか思った. なんかこう,やる気が出ないな.ていうか,風邪を引いているのである.だいぶ良くなってきたけど,頭がぼーっとして思考がまとまらない. せっかくの日曜が丸々潰れてしまったんだけど,どのみち北海道は暴風雪だったので,まぁいいかと.むしろタイムリーとさえ言えるかもしれない. 明日から講義が始まるので,なんとしてでも今日中に治さないといけない. 今年は研究 (らしい研究活動) をちゃんと進めて,論文書いて,ちゃんとどっかの学会で発表しないとなぁ.さすがに去年はダラダラどうでも良い事しすぎた.もうブログなんて書いてる場合じゃないよ,ホント.Lispについての正しい認識と、それでもLisperがLispを使う理由 ここに書いてある Lisp の暗黒面って,別に Lisp に限った話では無く,ようするに動的型 (いや,これも静的検証ツールやしっかりした処理系があれば済む話だけど) の粘土みたいな言語で未知のシステムを作る際には,必ずハマルようなポイントなのではないだろうか. 逆に,Web とかなんとかで,既にフレームワークが存在するようなドメインだったら,それこそ言語とかは何使っても同じだと思う.だから,フレームワークの有無しで言語の優劣を付けるとか言うのは,なんというかどうしようもなく本末転倒というか. 俺なんかはとりあえずテキトーなシステム書き過ぎで,もうかなり研究関係のやっつけコードがたまってきていて,今年はまずそいつらをちゃんと書き直すところから始めないといけないんだけど. ボクは,とりあえずシステムが動くところ,まではなんとかモチベーションが続くんだけど,いったん動くと興味が一気に無くなるというダメ人間なので.今まで誤魔化し誤魔化しでやってきたんだけど,さすがにそろそろ限界でしょう. そんなこんなで,去年の年末辺りは研究のモチベーションが限りなく低くなってたんだけど.今年こそツケをちゃんと全部払って,次のステージに研究をすすめる所存であります. みたいなことを,ここを読みながら思った.遅い人 まぁ,ボクの場合は,思い付いてから実装するまでは比較的速いんだけど,コードが汚くなりすぎて… (とりあえず S 式にシンボル突っ込んで,やっつけのとりあえずルールを大量に書いて,とか.そして後々,仕様変更に仕様変更を重ねた後,巨大な S 式の塊に泣かされたり,スルーしておいた最適化パスを有効にするのを忘れたりという.あと,テストとかコメントちゃんと書け !! ← 過去の俺) # ちなみに,ボクは ET とかいう謎の言語 (パターンマッチが使える,ルール型の Lisp ? というか Prolog というか) を常用しているので,ツールもライブラリも揃ってなさ過ぎて,より大変. それをちゃんとまとめて,成果を積み上げて,アイデアを理論として論文化していくみたいなのが苦手という. まぁ,ようするに性格がテキトー過ぎて研究に向いてない,ということなんだけど (駄目) いや,Shiro さんみたいに優秀な人 (具体的には,かなり遠くの仕様変更まで,(ぼんやりとでも) あらかじめ見通して設計できる人) ならば,それでも最終的にはちゃんとシステムを完成させられるし,そういう人ならば,Lisp の欠点 (的なもの) は相対的に薄まり,利点だけが強調される結果になるのではないだろうか. 逆に,sumii さんみたいな,未知のシステムであっても最初からある程度目星を付けて進んで行けるような方ならば,OCaml みたいにシステム全部の整合性が取れていないと実行もできないような静的型の言語でも,欠点が欠点とならず,利点だけが強調される結果になるのではないだろうか. いや,ボクが ML とか Haskell とか D とかがあんまり好きじゃないのは,逆に構文指向の言語だから,というのもあるんだけど.要するに,「とりあえず S 式」 ができないから (心理的に) 窮屈というか,つまり気分の問題.やろうと思えば,どの言語でもボクがやりたいことはたぶんできるのだろうとは思う. ただし Ruby 作者も言っている ように,気分の問題,ってのは馬鹿にできなくて,オブジェクト指向なんちゃらってのの最大の利点 は,やっぱり気分の問題な気が. 結局,プログラミングという行為は非常に属人性が強いので,言語機能がどうこう,ツールがどうこう,フレームワークがどうこう,という議論はいろいろ虚しい,というのがボクが以前からずっと思ってきたことで.そこらへんは (ボク的には) 非常にどうでも良い. ものすごくどうでも良いことだけど,なんで言語オタクとかいう人々ってのは,Prolog とか GHC/KL1 は (故意かか本当に知らないのかはともかく) はなから無視するのだろうね (笑)いつか言語ヲタになりたい。 実用性はともかく,新たな知見という意味では,Haskell とかに勝るとも劣らないぐらい豊かな世界が広がっていると思うのですが.KL1 はともかく,Prolog ならば処理系も Web 上のリソースも日本語の本もいっぱいあるし. いや,特に深い意味は無く,最近 「それ Prolog」 「それなんて KL1 ?」 と思う機会がやたら多かったもので.あー,やっぱりどうしようもなく認知度低いんだなと.改めて. % [Erlang] Erlang デビューしてみた 基本的なところは ML とか Haskell とか触ったことあれば、迷うところはあんまり無さそう。変数名が大文字かアンダースコアで始まらないといけないってのが、ちょっと変わってる感じ。 それ Prolog w (Prolog は,大文字で始まる識別子が変数になる)% [Erlang] Erlang のちょっとした特徴 同じ名前でも引数の数が違うと別の関数 まあ、要するに関数のオーバーロードだから、Java とかから見ればめずらしいわけでもないかもしれないけど、関数型言語として見るとめずらしい感じ。引数の数によってシグネチャが変わるから、それぞれに export するかどうか選べるのが肝。とりあえず、関数内関数がうまく作れない (クロージャだと再帰できないし) ので、その代わりとして使ってるが、デフォルト値を持った関数を書く時なんかもすっきりする気がする。 ... なんだかんだ言ってもパターンマッチがサイコー やっぱパターンマッチが有ると無いとじゃ、流れの把握しやすさが段違いだと思う。その事実は動的型付け言語でも変わることは無い。Ruby とか Python もとっととパターンマッチを採用するべきだと思うよ。 Erlang とか良く知りませんが,ここらへんは思いっきり Prolog (というか,ルール型プログラミング言語) の特徴でしょう. あと,並列関数型言語ということで,並列論理型言語の GHC/KL1 とも,プログラミングテクニック などが思いっきり重なるでしょうし (並列論理型言語GHCとその応用 ) # GHC/KL1 は,論理型言語,と言いながらも,並列性を実現する際に不利になるバックトラックなどは廃止されているため,限りなく関数型言語に近い,というか,非決定的な意味論を持つ関数型言語と言っても良いような.Erlang と KL1 の関係などはよく知りませんが # 追記 : 変数に再束縛できない ってのも,Prolog 由来だと思います.もともと,この特徴によって並列計算が容易になるという性質に目を付けたのが,並列論理型言語.その際,バックトラックは,変数を一度破壊しないといけなくて (ボックスモデル) 並列計算に不利なので廃止されたという.あと,やっぱりパターンマッチがある言語 の中に,Prolog は入ってないのね w (むしろ本家なのに.70 年代からあるから,かなり歴史は古いはず) Scheme にパターンマッチってあったっけ ? そもそも,関数型言語のガード部でのパターンマッチと,ルール型言語のそれはけっこう異なると思いますし. マルチプロセッサ向けソフトウェアパラダイムとは? (ユメのチカラ) それなんて第五世代コンピュータ計画,と ムーアの法則によりインテルの単一 CPU パワーの激増によって淘汰された超並列計算機アーキテクチャとプログラミングが,ムーアの法則の限界に直面し再び表舞台に復活するかもしれない,という歴史の皮肉.やはり時代を先取りしすぎだったのでしょうねぇ.第五世代コンピュータプロジェクトは死なず!\(^O^)/ # KL1 ってのは,極端な超並列言語で,全てのアトムがガードで同期を取りながら非決定的に並列実行されます.当然専用のハードウェアも作られました.日本が世界をリードしていた黄金のような時代の話です.その後貿易摩擦という当時の事情 (日本脅威論が非常に強まった時代) によって IBM と INTEL によって潰されたのですが (ファイゲンバウムの 第五世代コンピュータ―日本の挑戦 とか,持ってるけどまだ読んでないから怪しい知識だけど)20XX年のユビキタス、ロボット、Web/Tech総研 今後は map の並列化とかが注目されるだろうって… それこそ,FORTRAN 作ったジョン・バッカスさんの FP まんまですから… っ !! チューリング賞受賞講演 Can Programming be Liberated from the von Neumann Style? は 1977 だから,ちょうど 30 年前か… (ため息) まさしく人類の夢.超並列計算パラダイムは滅びぬ,何度でも甦るさ,と. 今,風邪で非常に頭がぼーっとしているので,何書いてるかわからなくなってきたのでこの辺で. 最初は 5 行ぐらいで終わらせるつもりだったのになぁ… とりあえず風呂に入ってすっきりしたよ.微妙に熱があったらしく,丸一日ぐらいずっと汗だくで寝込んでいたから. jijixi さんの件といい,ボクが記事を書いた直後に,モロに関連する記事がいっぱい上がってきてタイムリーだなぁと.本当にシンクロニシティってあるのかもしれない.ユング万歳 (どうみても心理学的錯覚です) 最上の日々 1月8日(月) ▼ ITPro: スペシャルインタビュー: 世界がRubyを愛する理由 単にmapとreduceを加えれば良いのでは?と思ってしまった。 mapとreduceと後はsortのような配列演算ライブラリを整備するだけで、並列化可能な部分の99%は自動的に並列化される。Rubyでも簡単に対応できる。あとはiteratorにvariantかpragmaを入れて評価順を不定にし、破壊的変更を不可にするのを加えると良いかも。 なぜ、それはRubyの役目では無いと思うのかと、考える。上記のような変更は言語の変更としては小さいが、プログラミングのスタイルを大きく変えてしまう。そのことへの忌避感があるのでは無いかと思った。 それなんて (ry ちなみに,リンク先のような,まつもとさんの公式の場 (?) での発言は,いつもいろいろ素晴らしいと思う. 私は,もっともっとプログラミング言語が作られるべきだと思っています。アプリケーションは,それこそ無数に書かれていて,その結果デザインパターンのような定石が生まれてきた。それに比べて,これまでに作られたプログラミング言語は数千か数万でしょうか。まだプログラミング言語をデザインするノウハウが確立するところまできていません。若い技術者にどんどんプログラミング言語の開発に挑戦してほしいですね。 どうして APL や FP やコネクションマシン (65,536台のプロセッサから構成される超並列コンピュータ ) が流行らなかったかというと. もちろんハードウェアの成熟度 (当時の集積度レベルでは,特殊な超並列チップの性能向上よりも,汎用的で大量に量産され,シンプルな単一 CPU の速度向上の方がはるかに劇的だった) などの,歴史的要因もいっぱいあったんだろうけど. 結局のところ,いつもの,パラダイム (人間の平均) の進歩は技術の進歩よりもはるかに遅いということなのかも.天才が 10000 歩歩いても歴史は動かない,歴史は,10000 人が 1 歩歩いた時に動くでござるよ薫どの,みたいな話 (るろうに剣心) 現状のプログラムは,プログラミング言語,というよりも,プログラミングパラダイムの影響に強く制限されていると思う. 良くいわれるような,「○○が流行らなかったのは,実際にやってみると○○の需要は思ったよりも少なかったから」,ではなく,「○○は難しいから無意識の内にみんな使わないようにしている」,の方が正解なのではないか.例えば並列性についてもそう. そのような無意識的な抵抗感が消えた時こそ,バッカスの夢 「プログラミングはフォン・ノイマンスタイルから開放され得るか ?」 が実現するのだろう.もう 30 年も経ってしまったけど.from 1977 to 2007 歴史は巡る.いろんな言語が消えては現れ,現れては消え.行く言語やスタイルの流れは絶えずして,しかも元の言語にあらず.
雑談 |TB:1 |CM:6 |
|
▲
コメント
わたしも最初Prologのユニフィケーションとかを連想したのですが、 知ってのとおりPrologは入門手前で止まっているので 本当に違うのか、違うとしてどう違うのかが わからなかったので書きませんでした。 いろいろコメントとか見ていると、Erlangって Prologと関係が深いのですね。 ふみゅ。
URL |
きむら #grGQ8zlQ|2007/01/08(月) 17:47 [ 編集 ]
いろいろ。 フレームワークがあるってことは、解き方が分かってる問題ってことですな。解き方が分かってるなら何使っても同じというのはある意味当然。解き方がわからない問題にどうアタックするかってとこで、違いが出てくるんじゃないでしょうか。 Schemeのパターンマッチとしては "match" マクロが有名です。Andrew Wright氏のlegacy macroを使った実装に基づくものが多いですが、同じ仕様でhigienic macroにしている処理系もあります。Gaucheでは(use util.match)で使えます。 Erlangも最初はPrologの派生としてスタートしたんじゃありませんでしたっけ。 KL1は大学院演習で触っただけですが、Erlangは明示的にプロセスを生成する(従って、並列計算もプログラマが明示する)のに対し、KL1ではプロセスは再帰関数の中に隠蔽されて、並列計算は暗黙になりますね。(大学院演習は「KL1で何でも好きなものを作る」だったのでSchemeインタプリタを作りました…って並列計算のメリットがあまりない(一応引数は並列に評価したりしてたかな))
URL |
shiro #-|2007/01/08(月) 17:48 [ 編集 ]
パターンマッチは,その名の通り,データ構造をリテラル的にパターンで表現して,変数に割り当てる,という機構です. SML と Prolog のどっちが先,とかはよくわかりませんが (同時発生的な気も) ユニフィケーションは,双方向的なパターンマッチのことです. パターンマッチは,単にマッチするかどうかをチェックして,もしマッチするならば割り当てるだけですが. ユニフィケーションは,変数を具体化して,マッチするかどうかを調べるという,よりアグレッシブな行為になっております. んで,その際には,必要最小限の具体化で単一化 (同一化) する,というのが一般的な約束になってまして,mgu (最も一般的な単一化子 ; most general unifier) と呼ばれたりもします. 要するに,単一化というのは,項や S 式と言った複雑なデータ構造を連立方程式のようにふたつ取って,mgu を求める行為と言えます. 例えば,[1 2 3] というリストがあったとして, [X | Xs] というパターンにマッチすると X = 1 Xs = [2 3] になります (パターン変数は,何にでもマッチする). しかし,例えば [1 X 3] というリストに対して [A 2 C] というパターンをマッチしようとしても,失敗してしまいます. なぜなら,1 や 3 は変数では無いからです. そこで,単一化では,A という変数を無理矢理 1 に具体化します.同様に C を 3 に具体化します.X は変数なので,2 にマッチすることができます. 最終的に,どちらも [1 2 3] [1 2 3] に具体化されます. この時の mgu (変数の束縛関係) は,{X = 2, A = 1, C = 3} となります. こんな感じで,Prolog だと,複雑な項やリストを単一化の繰り返しで組み上げて行くことが簡単にできます. ----- なんかよくわからない記述になってしまいましたが,そもそも Prolog だと,どっちもユニフィケーションと呼んでいて,特に区別をしていない気も. 関数型言語では,なぜユニフィケーションがそれほど使われていないのかはけっこう不思議なところですが,単に歴史的な事情かもしれません. 関数論理型言語とかでは,さらに強力な制約解消器であるナローイングとかいう機構が使われていたり (よく知りませんが) これは単一化を繰り返し適用することで,連立方程式などの等式制約をそのまま解くことができたり. あと,Shiro さんも指摘されてますが,Erlang の先祖はやっぱり Prolog のようです.http://d.hatena.ne.jp/lethevert/20061129/p5 GHC/KL1 はほぼ完全に滅びたのに,Erlang は電話会社だったかどっかで実用化されたらしく,長寿ですな.
URL |
あろは #wNX6xxGw|2007/01/08(月) 19:02 [ 編集 ]
>> フレームワークがあるってことは、解き方が分かってる問題ってことですな。解き方が分かってるなら何使っても同じというのはある意味当然。 これはおっしゃる通りだと思います.ですから私は,フレームワークやライブラリがあることが言語の力 (選ぶ理由),みたいな主張を見るたびに,それはどうなのだろうか,と思ってしまうんですよね (だからどうこう,というわけではありませんが). # もちろん,使い易いフレームワークを作る力がある言語,というのは素晴らしいことですが >> Schemeのパターンマッチとしては "match" マクロが有名です。 あ,やっぱり標準では無いですよね. >> Erlangは明示的にプロセスを生成する(従って、並列計算もプログラマが明示する) なるほど… 理想的には暗黙的な KL1 のように,コンパイラががんばって最適化してくれるというのが望ましいと思いますが. Erlang のような手動のアプローチの方が現実的だった,というのもあるのでしょうかね.
URL |
あろは #wNX6xxGw|2007/01/08(月) 19:36 [ 編集 ]
引用 −−−−http://www.personal-media.co.jp/book/comp/062_f.html#part1 アルゴリズムの研究も必要である。ハロルドストーン(IBMワトソン研)はIEEE Computer誌にコネクションマシン上の文献検索アルゴリズムは一見高次の並列度を有しているように見えるが、インデックスを利用したシーケンシャルアルゴリズムを用いれば同じ主記憶サイズのたった1台のプロセッサで実行した方が速いという結果を詳細に導きだしている。このように必ずしもプルートフォースなアプローチで並列度が出たと喜んでいてもすぐ足をすくわれかねない。 引用終わり アルゴリズムの研究ってどのくらい進んだんでしょう? 下々のものは、賢い人たちが考えたスケールするアルゴリズムが必要だと思うのですが、そこらへんも再利用可能な形でまとまっていないような気がします。
URL |
hyoshiok #OLXj00Ls|2007/01/10(水) 01:15 [ 編集 ]
コメントありがとうございます m(_ _)m >> 引用 これこそが,まさに,コネクションマシンが廃れた原因,そのものズバリだと思います. つまり,当時のハードウェア水準では,どれだけ工夫しても,単一プロセッサの方が簡単に早くなった (まだ集積度が十分では無かったから,物量戦では,巨大メーカの資本の前に,ベンチャー企業はなす術も無かった (これは RISC/CISC 競争も同じだと思います.理論的には RISC の方が有利そうなんですが… 現実的には,INTEL の資本力の圧勝です (もちろん他にも,思ったよりも,メモリの速度が CPU の速度に比べて進歩しなさ過ぎたなどのいろいろな要因が,命令列のサイズが小さくなる CISK に有利に働いたなど,歴史的な要因も多数あると思いますが) ソフトウェアとは異なり,生産力勝負のハードウェアの世界は,必ずしも理論通りにはいかないのですねぇ) ということです. # 本当にすいません.もちろん,ミラクルリナックスの hyoshiok 様には釈迦に説法ということは重々承知しておりますが (大汗) また,コネクションマシンのプロセッサは,ほんとに数勝負で,それぞれは 1 bit と,あまりにもプリミティブだった,というのも,オーバーヘッドが大きくなりすぎる結果を招き,敗因だったのかもしれません. ただ,逆に,半導体製造技術が進み,単一プロセッサの速度向上にかげりが見え始めた (もう 20 年ぐらい前からずっと言われている台詞という批判もありますが) 現在,アルゴリズムはもちろん,純粋にハードウェアの方でも,工夫の余地はいろいろ出てきていると思います. むしろ今こそ並列分散 ! と. # もう CPU は十分速くなって,マシンパワーは十分,という主張もあると思いますが.逆に,メモリが常に律速ならば,プロセッサを増やさないと無駄が大きくなりすぎる,という主張も (これが,ダニエルヒリスがコネクションマシンを作った理由) # すごい昔の文章なので,恥ずかしいですが… ほとんど同じこと書いてる (苦笑)http://alohakun.blog7.fc2.com/blog-entry-179.html >> アルゴリズムの研究ってどのくらい進んだんでしょう? なにやらエラソウなことを書いておいて恐縮ですが,私は専門家では無いので,具体的な進歩や,現在の研究の最前線について語るべき言葉を持っていません (本当にすいません) 話題の PS3 も,職人芸的なプログラムの調整をがんばらないと,ポテンシャルが発揮できないと聞きますしねぇ. Google の例のアレも,とても一般的とは言えないと思いますし. まさしくおっしゃる通りだと思います. (情報量ゼロですいません…) ただ,アルゴリズムを考える際の表記法 (仕様記述言語,プログラミング言語) が,まだ全然力不足だとは感じています. 人間の思考は本質的に逐次処理である,という方もいるようですが,それははたして本当なのでしょうか ? 単に表現するための方法やツールが未成熟なだけかもしれません.http://www.ueda.info.waseda.ac.jp/~ueda/readings/GHC-intro.pdf 私は逐次実行の方の言語処理系にしかかかわってないのですが,ET 言語 (の N (ondeterministic) ルール) は,ポテンシャル的には強く並列実行を意識した言語仕様になっております. 並列実行が当り前になるためには,現状のプログラミング言語はほぼ全て力不足であり (むしろ制約にすらなっている),地道な表記法の進歩こそが,急がば回れで,一番の近道とも思います (だからこそ研究しているわけですが). # それこそ,π計算などの理論面では,sumii 先生などがご専門だと思うのですが… (などと無責任に丸投げしてみる) 例えば KL1/GHC は,(SICP の 3 章だったかあたりにも出てきますが) ストリームプログラミングというパラダイムを切り開きました. そこでは,生産者と消費者が,自動的に同期を取りながら,パイプライン的に処理を行っていくことにより,自然に並列処理を記述することができています (要求駆動,データドリブンとも呼ばれます).http://www.klic.org/software/klic/lang/node2.html ここらへんはアルゴリズム,というほど固まっていて一般的になっているわけではないですが,言語の力によって思考が大きく広がることの好例だと思います. # このようなプログラミング手法は,フォンノイマンマシンの亡霊に囚われていると,非常に不自然で難しく思われるかもしれませんが… 本来,どっちが不自然とかいうことは無いと思います.むしろ,常にフォンノイマンボトルネックを抱えつづける方が,不自然と言えば不自然と言うこともできると思います. もう眠いので,具体的にリンク先を探すことはちょっとできませんが,このブログでも以前からコネクションマシンや並列プログラミングについては何度も何度も取り上げてきたはずなので,もし御興味がありましたら,本ブログ横の google カスタムで検索してみてください.
URL |
あろは #wNX6xxGw|2007/01/10(水) 03:43 [ 編集 ]
コメントの投稿
トラックバック
『マルチプロセッサ向けソフトウェアパラダイムとは?(その2)』
「マルチプロセッサ向けソフトウェアパラダイムとは?」で、今後はますますマルチプロ
ユメのチカラ |2007/01/17(水) 21:26
トラックバックURLはこちら
http://alohakun.blog7.fc2.com/tb.php/605-2833df4e