SSブログ

一週間に一回Rubyプログラミングねた8-遅延評価 [プログラミング]

今までは高階関数とその応用を見てきました。それもRubyじゃなくJavaScriptでw。ブロック関係で気になるところといえば、あとは遅延評価ぐらいのものだと思います。今回は取り残したそこを一般的な理解まで持って行こうというもの。さてはて、他の高階関数の利用のように簡単に理解できるものか…。

 
今回はJavaScriptじゃなくて、Rubyでいきます。理由は分かりやすいソースがなかったから。Rubyでも単純で分かりやすいものでもないのだけど、本当なら高階関数を学ぶより、Rubyのブロックを自分の作った関数でどう利用するかが問題だったりはするんだけどね。でも、今回は一度高階関数を見たことがあったので、あえて他の言語で見ていきました。



とりあえず、ググってここを見た。
 http://www.geocities.jp/m_hiroi/light/abcruby18.html
Common Lisp 入門:番外編 遅延ストリームのプログラムをそのまま Ruby に書き直したものです。Ruby らしいプログラムではありませんが、あしからずご了承ください

とあるけど、普通にRubyのソースとしては普通に読めそう。

途中で「高階関数も定義できます」とか書いてあるんだけど、そもそもその前のDelayクラスで、initializeが高階関数になっているし、受けるブロックも高階関数にしたければできるんだと思う。高階関数に高階関数のオブジェクト突っ込んで何が悪いんじゃってことになるんだろうけど、あえてそれを書く意味が分からない。今までは

「遅延」と言っているけど、実質的には「処理の保留と継続」をやっているように見える。少なくとも、このページではirbを使っているから、逐次処理を手動でやっているとしか思えない。何か理解が違う方向へ行っているのかもしれないが、正直あまりメリットが感じられない。そして、他の局面で使うというケースが思いつかなかったりする。

他の遅延評価のページは、処理として馬鹿正直に計算するよりか十分に速いという結果を出しているが、ここでは無限に処理できるけど、その計算は続けてまだしていない、ということしか伝わってこないのだ。そんでforceで処理させる、みたいな。もっと大事なことを見落とてしているかもしれないけど、遅延評価初心者の私にしてみれば、便利さが伝わってこない。

エラトステネスの篩にしても、Rubyでは書き方によって速くなるわけでもないし、イマイチな感じ。もっと遅延評価が実感できる実例がないのだろうか。これでは再帰関数の無限ループの処理を明示的に進められるようにしているとしか理解できない。実際JavaScriptの例で、小飼弾さんかどこかのブログでも無限ループになるケースを簡略化して例示していた。それが納得いかなかったから他のを探していたのだから、このページではあまり見るものがないのかな。




他にソースを探してみる。更にググってもいいが、こういう時には比較的玉石混交じゃない本を読んだほうがいいだろう。Ruby1.6の時のかなり古い本なんだけど、遅延評価がきちんと載ってる。

Rubyプログラミング入門

Rubyプログラミング入門

  • 作者: 原 信一郎
  • 出版社/メーカー: オーム社
  • 発売日: 2000/10
  • メディア: 単行本


ん~そこでもフィボナッチ数列と、エラトステネスのふるいをやっとったのだが、得られるメリットは「オンデマンド実行」と「無限に続くオブジェクトの列を表現できる」ことらしく、結局、計算をすっ飛ばして先を処理できるものではなかった。そりゃそうだよな~。

結局、シングルスレッドでは一気に処理するのが手続き的に、人間の思考的に簡単なんだけど、長々と処理をしているとマズい局面があるので、処理をバッチ的にいっぺんに処理をするのではなく、ある程度やったら途中で止められる仕組みを作っておいたほうがいいのだろう。ただそれってやっぱり遅延評価というより、「処理の保留と継続」という意味合いが近い気がする。無限に続く処理対象を途中で保留しておけば、その後やるかどうかは必要になった時に決めて、中途半端でも続行できる仕組みということだろうか。




結局、今までのコンパイルされている言語は静的なバイナリを動かしていたけど、スクリプトのLL言語でインタプリタ型ということもありこういう書き方も可能だということなんでしょう。関数型プログラミングとの相性は良さそうだけど、結局Rubyのブロックみたいな関数自体をオブジェクトのようにする仕組み、いわゆるクロージャがあれば、大体みんな高階関数で出来る事はやれるって事で。


ググってたら、2,3年前LL言語の衰退を見て、やっぱりJavaじゃないとパフォーマンスが出ないから、ビッグデータの時代はJavaでしょとか言う話が書いてあった。下の意見は半分その反論だけれど。

 http://terurou.hateblo.jp/entry/20110210/1297355136

色々あると思うけど、それって結局守備範囲が違うんじゃないかと思うんだよね。Javaではダックタイピングをするようにはできていないし、LL言語でUMLとかで小難しい設計をしてうんぬんというものでもない。Javaでも小規模のプロジェクトを作ることは当然できるし、LL言語でも大掛かりなシステムを組めることはGitHubなどのWebサービスを見ていたらできなくはないことは分かる。何かピッチャーもガンガン打席で打てとか、外野手にピッチャーをさせるみたいな事をさせようとしているとしか思えないんだが。

にしても、コンピュータ技術者は辛辣な言い方しかできないのかね。上の人の場合、あながち間違ってはいないし、正論は言っているのだが、普通に感想を述べている人に向かってゴミクズはないだろうと思うんだけど。見当違いなことを言っている人にも、それなりの前提があるし言葉が足りない事も多い。どちらにしても、ひとつの言語を崇拝したり、一般的なものに中二病的に拒否反応をするのは、自分がきちんと他のものにどっぷりと浸かっていないと言う事をあからさまに言っているだけで、自分がそれぐらいの能力しかないのを露呈させていることも多かろう。

にしても、IDEがすごいからJavaはいいとか、生産性うんぬんと言ってることをクズって言ってるのも、同様にかなりクズ発想だよね。この世の中にはJavaしかまともに出来ない人もゴマンといるし、他の言語に自ら手を出すような人は大体コンピュータヲタクであるはずだ。私のような仕事で泣く泣くいろいろな言語を身につけなくてはならなかった良くあるケースは別にして、この先にあるかどうかわからない仕事のために、たくさんの言語を身につけるのは仕事だけのモチベーションではかなり無理があると言わざるをえない。

だから、みんなが知っている言語で現状を乗り切っていくという方向性は、ビジネス、ひいては文化の構築においては、生産性は非常に問題となる。作りっきりで見放してもいいものだったら作る奴はいいけど、後々誰かがメンテしないといけないし、その時につぶしが利かない言語なんてみんなが困るだけなのだ。結局、商売としてどれだけスムーズにリスク回避を出来るかというのが大人の社会人というものだろう。人の発言をクズ扱いしてオナニーしているのは、女の子じゃない限りは見たくない。発言の仕方がクズなのは人間としてどうかとは思うけど。他山の石以て玉を攻むべし、ですか。

にしても、公共のコンピューター端末にWindowsが思いのほか使われているのはコスト問題とWindows以外を扱える技術者がいないからなんだろうね。写真プリント端末とか、デジタルサイネージな自動販売機や、コンビニ端末とか、液晶パネルを使った電光掲示板とか。Windowsでやればデバッグもやりやすいだろうし、そもそもの開発マシンがそのまま同じアーキテクチャで動くのは圧倒的に楽だ。さすがにATMとかは他の国みたいにWindowsじゃないだろうな。銀行の勘定系までx86マシンにしちまったセブン銀行とかは、端末もサーバもWindowsじゃないとは言えないが、そんなところの口座なんて開きたくもない。

何でもスペックが必要なWindowsでやるのはどうかと思うけど、組み込み系みたいな地道な制作をしているより、誰でも使えるWindowsで比較的スペックの高いマシン(今となっては比較的スペックが高いわけでも値段が高いわけでもないんだけど)を使って、あまりレベルの高くない人を雇って実現させる方が高い人件費をカットできるのだ。というか、組み込み系だった携帯だって、Androidを入れて相当手を抜いているじゃないですか。時代はそういう方向にあるのですよ。

多くの人間が、SEから営業に行かざるを得ない状況で(両方やってる人も多いだろうけど)、彼はずっと技術者をやれていればいいねぇ。35歳説は短いにしても、人月勘定をまともに出来ないクソSEはデスマーチの元だ。どんなにプログラマとして秀でていても、社会人的にはクズになりかねない。その時に自分がクズと気付く頃には、営業成績が伸ばせない1サラリーマンでしかないんだろうな。




と、脱線したなぁ、また。
何だか遅延評価にはバラ色の未来を想像しすぎたので、モチベーションが下がっちゃったなぁ。でもRuby2で標準ライブラリに組み込まれているみたいなので、遅延評価を簡単に使ってみたいと思う。

ちょっと長くなったから次回はRuby2.0を入れるところから。

タグ:Ruby
コメント(0) 
共通テーマ:資格・学び

コメント 0