パスワードを忘れた? アカウント作成
494316 journal

tarosukeの日記: 手続き型言語の終(つい)のはじまり 5

日記 by tarosuke

たぶん、手続き型言語は最終的には廃れるんじゃないかと思う。手続き型言語は手順を記述するのに対し、関数型(あるいは宣言型とでも)言語は意味を記述する。この差は手続き型言語でコンパイラにいコードを吐かせるはプログラマが良い手続きを知っている必要があるが、関数型では良い手続きは開発環境が知っていれば良い。最適化についても同様で、手続き型言語のコンパイラは意味を知るところから始めなければならないのに対し、関数型言語のコンパイラはソース自体が意味だ。スタートラインからして違う。なので、プログラミング言語は最終的には関数型にほぼ収束するんじゃなかろうか。

とゆーわけで、mappは関数型、しかも4bitsのMCUからデカブツまで、OSナシからいわゆるアプリケーションまで扱えるマルチパラダイム言語を目指す事にー。

さてここで、というか早速だがちょっと前のschemeについての日記にもあるが、オブジェクト指向である必要はあるかという問題がある。もれとしちゃオブジェクト指向を捨てないでおきたい。...しかし、このブツはこれこれこういうヤツでし。という記述を再帰的に適用するにはどんな記述をすれば良いのやらー。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by oddmake (1445) on 2007年05月17日 20時10分 (#1158675) 日記
    やはり長門さんや朝倉さんがSQL喋っているのは変です。

    # えっ?
    --
    /.configure;oddmake;oddmake install
  • 私は、手続き指向型の言語は永久に残るような気がします。
    だって。。。Suicaの中にあるワンチップマイコンとかで関数型だったりGCとかやったりするのは
    経済的にアレだし。

    手続き型言語に関数型っぽい考え方も浸透していく、というのは有りそうですが。

    ああそうか、おっしゃっているのは、やがては関数型で記述してもマイコン向けコードが
    吐けるようななる、ってことなのですね。うーん...

    例えば for ループのような、シンプルで機械語的・メモリ的にもコストが低いものに対して、
    再帰のほうがいいんですよ (再帰でも書けますよ、ではなく) と言える、積極的で
    納得できる理由ってあるのかなぁ? と。
    • 「関数型=GC付き」ではないよ。モレが想定しているのはハードウェアのレジスタまで叩ける関数型言語。外部に影響を及ぼせたりする時点で総合的には関数型ではなくなっているんだけど、だから宣言型と表現する方が近いかな? なので...

      >やがては関数型で記述してもマイコン向けコードが吐けるようななる

      そんな感じ。でも「マイコン向けコードが」ではなく「マイコン向けコード*も*」同一の処理系で吐けるような処理系。

      >例えば for ループのような、シンプルで機械語的・メモリ的にもコストが低いものに対して、
      >再帰のほうがいいんですよ (再帰でも書けますよ、ではなく) と言える、積極的で
      >納得できる理由ってあるのかなぁ? と。

      これはモレの想定している物とはだいぶ違う。espyさめがちょっと前に書いたscheme云々のあれを想定してみて。あれで全要素の集合を定義してるじゃない。あの例だと結局全部の要素を使うんだけど、たとえば使わない要素があると使われない要素の分を計算しなかったりするんだよね。だから手続きでfor使ってループ回してるところを要素の集合を定義して...ってやるとソースがアルゴリズムから自由になるし処理系も自由にアルゴリズムを選べるようになる。

      例えば集合が0-100なら実装上はループで要素を作った上で途中の「変換」にそれぞれ適用するとかになる。これはループになった例だけどSMTなプロセッサがなら分割して同時に動かすかもしれないし、集合にホントのリストやベクタを使えばforeach的な動作になる。他にも有用な集合があるかも知れないが、やっぱりこれも同じように書ける。

      そうなるとたとえばO(n2)の処理があったとすると手続き型では相当大変な最適化をしなければO(n2)にしかならないけど、宣言型なら処理系がアルゴリズムを知ってればO(nlogn)になるだろうし、処理系がそのアルゴリズムを辞書的に知らなくても推論してO(nlogn)にしてくれるかも知れないし。

      また集合に「順序を守れ」と修飾しておけば(たぶん)ループのままになる。たとえばアクセス順を指定したベクタをレジスタに張り付けて元の集合からマップしてくるようにすると順序通りに値が格納されていくとか。要はレジスタアクセスで順番の指定があった場合に重要なのはアクセス順を守る事であってループ内からアクセスする事ではない。だから宣言型でもこの手の指定ができればハードウェアをベッタベタ触るようなコードも書けるはずなのだ。

      手続き型になれた人が宣言型を使って苛立ったり、現状ではマイコンに宣言型言語を使えないのはその言語でこの手の指定ができないからであって言語が宣言型だからなのではない。とモレは考えてる。
      #再帰でループを再現するのはループと同じ事をするだけの、たぶん悪い例なんじゃないかな。
      親コメント
    • 「意味(定義)だけ書けばOK」
      結局これを利点と考えられるかどうかになるんじゃないですかね。
typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...