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

Prototype-based OOP Prothon 41

ストーリー by Oliver
プロトタイプ経由完成品行き 部門より

CTE 曰く、 "プロトタイプベースのオブジェクト指向言語である、Prothonのプレ・アルファ・バージョンが発表された。Python のような構文で、Sun Labs で開発されていた Self みたいなプロトタイプベース・オブジェクト指向言語ということらしい。プロトタイプベースの普及に一役買うようになると嬉しい。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • JavaScript (スコア:4, 参考になる)

    by butaminparlour (17948) on 2004年03月27日 18時14分 (#521880)
    いちばん有名なプロトタイプベースは、JavaScript [night.nu]かな。
    • by torus (9980) on 2004年03月28日 12時27分 (#522045) ホームページ 日記
      でもJavaScript 2.0 はクラスベース [mozilla.gr.jp]になりましたよね。

      確かに、class があるほうが分かりやすい気もするけど、個人的にはスクリプト言語としては、プロトタイプベースの方がすきかな。
      --
      use Test::More 'no_plan';
      親コメント
      • Re:JavaScript (スコア:2, 参考になる)

        by G7 (3009) on 2004年03月28日 20時37分 (#522137)
        うーん。この場合、クラスベース(を中心にする)かどうかよりも、
        そのクラスの仕組みの導入の仕方が気になるところです。
        そのURLを見ましたが、
        new Classname(args)という、Java/C++系の文法を採用してるようですし、

        >処理を戻す前に B のコンストラクタを呼び出さなければならない。この呼び出しは明示的なものでも暗黙のものでもよい。

        とも書いてありますね。

        で、俺にとってはこれがかなりカッタルク感じます。
        同じクラスベースでも、SmalltalkやRubyのほうがエレガントだと思います。
        というのは、あっちは、

        ○コンストラクタは、単に"インスタンスを作って返す"という実装をされたメソッド(Class Objectの)の1つに過ぎない。
        ○コンストラクタ(クラスメソッド)が基本Objectを作ってから、
            インスタンスメソッドである該当Objectの初期化メソッドを呼ぶ、
            という形になっているので、暗黙のうちに呼ばれるだとか、呼び出し義務だとか、といった
            めんどくさい決まりごとが、何もない。ソース見たまんまに処理されて、見たまんまのObjectが生成/初期化される。

        という仕組みになっているので。

        Rubyのが一番お洒落でしょうね。
        Class Objectのnewメソッドは、空っぽ(?)のオブジェクトを作ってから、
        そのオブジェクトのinitializeメソッドを呼んであげる、っていうだけ。エレガントです。

        しかもRubyでは引数省略&複数引数まとめ渡しがが可能なので、
        任意個の引数を渡されたnewは、その引数をそのままinitializeにたらい回ししてくれる。
        親クラスのコンストラクタを3つ書いたら、子孫クラスも未来永劫3つ書かないとならない(藁)みたいな
        面倒なことが、生じないんですね。

        閑話休題。そんなわけで、なんていうか、C++系の「new Classname()」っていう文法って、
        なんか蕁麻疹が出るんだよなあ。
        「Classname.new()」のほうが数段いいなぁ。
        言い換えれば、「ClassもObjectだ」という世界にどれだけ近いか?という話とも通じるんだと思う。

        #俺言語では、ClassはObjectだし、サブクラス作りもClassのメソッドだし、なのでG7
        #しかも特異メソッドも書けるから、ある意味でRubyにもSmalltalkにも勝ってる。
        #問題(最大の弱点)は、文法が無いってゆーかPostscript系なので、コードが悲劇的に書きにくいってこと(藁
        親コメント
        • by torus (9980) on 2004年03月28日 21時12分 (#522151) ホームページ 日記
          その辺が、Ruby が class-based ではなく、真に object-oriented であるという事なんでしょうね。

          ちなみに JavaScript 処理系のことは良く知りませんが、Flash MX 2004 の Action Script 2.0(JavaScript2 とほぼ互換)処理系では、class などの新しい構文は、古い Action Script(JavaScript とほぼ互換)に対するシンタックスシュガーとして実装されているようです。

          つまり、プロトタイプベースの言語に、クラスベースの構文の皮をかぶせただけみたいですね。
          --
          use Test::More 'no_plan';
          親コメント
          • by G7 (3009) on 2004年04月03日 12時00分 (#525803)
            >プロトタイプベースの言語に、クラスベースの構文の皮をかぶせただけみたいですね

            もしその皮をその言語自体で実装できるなら、
            「他の皮」も作れて、幸せになれるところですね。

            Lisp畑のOOPみたいに、流派が無数(?)に存在できるってのは
            (少なくとも技術的には)凄く良好な状態です。

            #政治的(藁)には一子相伝のほうが良いんだろうけど、
            #そのさい、劣ったほうの子孫だけを残されてしまったら
            #目も当てられません…

            それにしてもDelphiの落とし所も良かったなあ。
            がちがちのコンパイル言語のくせに、
            クラスメソッドの多態が出来るっていうのが。
            それに前述のようなインスタンス作成手順の明示化(?)も
            ある程度達成できていたわけだし。
            特定のクラスだけ特殊なメモリマネージメントをしたいと思ったら、
            インスタンス確保用のクラスメッセージをOverrideするだけ(^^;とか。
            しかもC(++)みたいながちがちNative系の言語でもあるので、
            そのOverrideのさい、相当泥臭い書き方を併用できる。
            つまり柔軟なOOPと泥臭いコードとが綺麗に同居できるわけで。
            親コメント
        • by Anonymous Coward

          Rubyのが一番お洒落でしょうね。 Class Objectのnewメソッドは、空っぽ(?)のオブジェクトを作ってから、 そのオブジェクトのinitializeメソッドを呼んであげる、っていうだけ。エレガントです。

          CLOSもそうですね。newにあたるmake-instanceは クラスを取るメソッドで、それはクラスを引数に

          • by G7 (3009) on 2004年04月03日 12時12分 (#525805)
            >この手順、起源はどこなんでしょう。

            どうなんでしょうね?
            どうでもいいといえばいいんですが(^^;

            そりゃそうと、後知恵の謗りを覚悟で言うならば、
            この手順は「OOP者にとっては凄く自然ってゆーか当然」とも映ります。

            クラスの責務は、インスタンスの骨格(メモリ領域)を作り、
            そのインスタンスの骨に最低限の自己肉付け能力(=メソッドテーブル)を与える、というところまでで終わり。
            で、後はそのインスタンス自体に全部やらせる、ってわけです。

            この責務分割のしかたは、無理がないんですよね。
            どっかの言語(たしか有ったよね)のように
            「コンストラクタ中のこの場面では、thisが参照できません」
            みたいな馬鹿げた制約を負わずに済む。

            thisを参照したくなるようなタイミングでは既にthisに作業を委譲した「後」である、
            という風にデザインしておけば、話が非常にすんなり行きます。
            そして、いつ委譲するのが最も自然か?と問われればそれは、
            「thisが作られたら出来るだけ速やかに移行(委譲)する」
            が答えであるはずです。

            この発想は、オブジェクトで考える(^^;人にとっては、どう考えても自然です。

            そんなわけで俺としては、起源云々というよりも「自然発生」だと捉えたい、という希望(^^;があります。
            希望というのは、そういう自然(^^;な発想をしてくれる言語デザイナが実は少なくない、ということを期待しているという意味でもあります。

            逆にいえば、劣った(笑)new Hoge()方式は、誰が起源なんでしょう?
            やっぱりC++あたりなのかな?
            Delphiが存在できていることを思えば、強型系だろうとコンパイル系だろうとNative系だろうと、
            C++方式を採用する「必然」性はあまり無いはず。

            #C++の作者が物知らずor狭量だっただけ、という説に一票なのでG7
            #いまだにインスタンスを「クラス」と呼ぶ奴が居るので頭抱えてます。
            #そういう奴に限って、全般的に捉え方を間違ってやがるし、
            #手抜きしても痛痒を感じないし…
            #そういうやり方を流布したC++への恨みは、ちょっと少なくないですねえ。
            親コメント
            • >new Hoge()方式は、誰が起源なんでしょう?

              SIMULA I です。当時はまだクラスもオブジェクトもなくてそれぞれ
              「アクティビティ」や「プロセス」と呼ばれていました。つまり、
              アクティビティ「Hoge」の新しいプロセスを変数に束縛するための
              文で用いられます。具体的には次のように書きました。

              element Pat;
              activity secretary (redhaired, thumbs);
              boolean redhaired; integer thumbs;
              begin ... end;
              Pat := new secretary (true, 10);
              親コメント
          • by sumim (14668) on 2004年04月04日 6時09分 (#526032) ホームページ
            >起源

            SIMULA 67 は new 時に引数として初期値を渡すスタイルで、別段、初期化用の
            メソッド(仮想関数)が用意される様子は見られません。

            Smalltalk-72 では、isnew というインスタンス化直後だけ真となるテストで
            初期化を行なうようなしくみになっています。まだ空っぽのインスタンス
            にメッセージを送信するようなスタイルにはなっていません。インスタンスが
            インスタンス変数に値を未束縛の状態で存在できたかはちょっと微妙です。
            それが可能ならば、後で初期化というスタイルもとることはできたでしょう。

            Smalltalk-72 の影響を受けて LISP マシン LISP 用に作られた Flavors と
            いうオブジェクトシステムでは、defflavor というコンストラクタで初期値
            を束縛してしまうか、あるいは、:initable-instance-variables という
            オプションを宣言することで、make-instance 時にスロットを指定して
            後で束縛することができます。ただ、変数に値を未束縛の状態でインスタンスは
            存在できるので「空っぽのインスタンスに初期化のメソッドを起動させる」
            スタイルも選択可能だったはずです。

            Smalltalk-76 は現在の Smalltalk とほぼ同じ文法とコーディングスタイルに
            なっていたので、ほとんど間違いなくこの時点では「空っぽの…」スタイルは
            日常的に用いられるようになっていました。

            したがって、Smalltalk-72 か Flavors、遅くとも Smalltalk-76 くらいには
            確立していたスタイルであるように思います。いずれにしても、おおかたの予想
            どおり、Smalltalk か、その影響で作られた LISP 用のオブジェクトシステムが
            起源、というあたりに落ち着きそうです。
            親コメント
            • by G7 (3009) on 2004年04月04日 12時34分 (#526123)
              >まだ空っぽのインスタンス
              >にメッセージを送信するようなスタイルにはなっていません。インスタンスが
              >インスタンス変数に値を未束縛の状態で存在できたかはちょっと微妙です

              「空っぽ」といっても、ここの一連の話では、
              そのObject自体のBootstrapに必要な最低限の情報(クラスなどへの参照など)は
              与えられた状態、を指すのだと思っていました。

              クラスとかへの参照さえあれば、「そのObjectの」初期化メソッド
              (メソッドの名はオヤクソクということにすれば充分)
              を自然なかたちでCallできるわけで。
              どうせ初期化時には、クラスなどの祖先情報と、引数で渡された情報と、しか
              もらえないんだから。
              逆にいえば、その限られた(?)情報を美味しく無駄なく活かすための
              スタイルとして、今のあの方式に落ち着いたんだろうなと想像します。
              親コメント
    • by Anonymous Coward
      なんでオフトピやねん。
      • Re:JavaScript (スコア:0, オフトピック)

        >なんでオフトピやねん。 激しく同意。
        • by Anonymous Coward
          本気でオフトピ考えたちゃう?!
          • by Ying (4319) on 2004年03月28日 0時36分 (#521969)
            部門名からしてネタなのかマジなのか悩んでしまいましたが。

            プロトタイプベースに関する話題につける部門名としてはかなりピントがずれている気がします。

            親コメント
            • Re:JavaScript (スコア:2, 興味深い)

              by G7 (3009) on 2004年03月28日 0時45分 (#521975)
              >部門名からしてネタなのかマジなのか悩んでしまいましたが

              まあ部門名なんてのは無知や煽りが幾ら混ざっていてもおかしくないものなんで(^^;

              それはそれとして、ピントハズレなのは同意。
              これじゃまるで完成品はクラス指向言語であるかのようじゃないか(^^;
              俺はどっちかっていうとむしろ「逆」で、
              クラスなんていうカッタルイ存在をリファクタリングで消したらプロトタイプ指向言語になる、
              っていう印象を受けてます。

              #さすがに今更「半プロトタイプ指向(Rubyと同じくらいに)のPostScript言語「ばぶばぶ」よろしくー」なんて言えないのでG7
              #まあFreeソフトですから皆様ご自由にForkしてくださいませm(__)m
              親コメント
  • by G7 (3009) on 2004年03月28日 3時01分 (#521992)
    折角スラドなんですから:-)、言語そのものについてもダベろうよ。
    と言っても俺も説明を5%くらい流し読みしただけなんだが(^^; #まだmakeもしてないし。
    つーわけで五月雨式にいきます。

    さて。
    なんか、不思議と、綺麗な文法に見えますね。
    #ホントに良い文法なのか、それとも説明文がプレゼンとして綺麗なだけ(藁)なのかは、現段階の俺には不明だが。
    字下げコードのブロックを表現するってのは基本的には好きじゃないんだけど、
    「def .hoge」とかっていう書き方は、良い意味で新鮮な気分になれました。
    ちなみに余談だけど、「.hoge」っていう書き方は、我が「ばぶばぶ」とも似てるかな。
    Prothonがどうやってるかは知らないけど、俺言語では「"."で始まるシンボル」という扱いにしてました。はい。
    ("."で始まるシンボルの場合は、Local変数StackじゃなくObjectStackを見に行くのです。)

    withが使われてるのは面白いなあ。
    Withって元々はPascalだっけか?まあそれはともかく、
    Lispのカッコが関数の「中」に入るための印なら、
    Withは構造体やオブジェクトの「中」に入るための印なんだよね。
    そう考えると、オブジェクトの中に入ったり出たりを頻繁にしたいであろうプロトタイプOOP言語
    (しばらくクラスの中に入り浸ってクラスを定義しまくるというクラス指向言語とは、ノリが違うっていうか…)
    とWithとは、相性が良いのかも。

    Pythonとの違いの頁にて。
    「7.chr()」という記述(Rubyでは出来るわけだけどPythonじゃ出来ないのだっけか)を見て思い出したのだが、
    以前、「7というIntに123というIntというMessage(藁)を送ったら、7.123というFloatが生成される」ってのはどうよ?と
    妄想したことが有る。
    ただ、これだと7.1と7.01の違いを表現できない(藁)ので、Intリテラルの扱いを一ひねりする必要が有りそうだが…

    大文字で始まればグローバル変数っすか。
    うーん。Rubyって世界をじわじわと侵食(笑)してるよね。

    returnが明示されない関数の返し値は、selfですか。
    Smalltalkもそういう流儀だっけか。
    selfを返すのって、カスケード(連ちゃん)なメソッド呼びをしたいときに便利なんだよね。
    そいつをデフォルトにしたいキモチは、判るなあ。

    hood頁にて。Apache Portable Runtime なんていう便利なものが世の中には有るっすか。

    「Prothon is totally stackless」ってのがちょっと気になります。
    もしかしてC Stackと袂を分かつことで、"継続"を扱う [dreamhost.com]のが得意だったりするのだろうか?

    あと、Python繋がりってことで、JProthonが早めに登場してくれるといいなぁ(ぉぃ
  • by seeds (20964) on 2004年03月27日 18時46分 (#521890)
    私が、一番遊んだ(遊んでいる)プロトタイプベース言語はNewtonScriptですね。
    また面白そうな言語が出てきましたね。
    暇になったら落としてみましょうかね。
    --
    /* Seeds */
  • by Anonymous Coward on 2004年03月27日 18時35分 (#521885)
    「ぷろそん」でいいの?
  • by Taiyakiss (12783) on 2004年03月27日 21時09分 (#521915) ホームページ 日記
    んむー。
    なにやら。

    タレコミ文章で紹介されている、ココを読んだら、
    http://sumim.no-ip.com:8080/wiki/493 [no-ip.com]
    プロトタイプベース・オブジェクト指向言語ってえのは、
    哲学風に言ったら、脱構築って感じなのかな?
    思想とか構造とか世代的に。

    っていいつつ、まあ、Taiyakoが、いったい、
    哲学の何が分かってるのか分かっていないのかは、
    分かりません(ぉ たすけてください。たすけないでください。どちらでも。
    • Re:脱構築 (スコア:0, フレームのもと)

      オブジェクト指向の哲学やらなんとかやらはこちらのML [ruby-lang.org]で質問されてはいかがでしょうか?
      • by G7 (3009) on 2004年03月28日 0時52分 (#521977)
        ん?Ruby自体のMLですか?
        まあOOP哲学の話「も」良いと思いますけど、
        OOP哲学の話をしたいためダケに加入するのは、いささかオフトピかと。

        あと、RubyのMLがアリなら、他にも幾つかアリなMLが有りそうですね。
        青木淳氏(だっけ)で有名なSmalltalkなMLとか、
        JavaのどっかのMLとか。

        2chとかがどうなってるのかは、近年よく見ていないので存じません。よろしく>識者
        いずれにせよ、案外永続的な場(=スレ)をアジャイルに立てられて、
        参加者もアジャイルに参加できるんで、
        「これ、どこで話しましょうかね?」って悩んじゃうような話題には、
        2chは実は結構便利。

        #DDJ(J)が帰ってきて欲しいのでG7
        #ちょうどOOP談義みたいなものが当て嵌まる雑誌だったのに、
        #Rubyみたいな軽量OOP言語が流行ってる時世に同誌が既に無いってのは、残念至極。
        親コメント
      • by Anonymous Coward
        おいおい、デフォルトで -1 の人なんか誘わないでよ。
        pensupplyくんは責任をとってくれるのかな。
      • Re:脱構築 (スコア:0, フレームのもと)

        んなまぢれすされても。
        Taiyakissにこっちくるな(・∀・)カエレ!
        って嫌味っぽく言おうとしてみただけです。ごめん。-1しておいて。
        • by G7 (3009) on 2004年03月28日 2時58分 (#521990)
          ↑がどれに対するレスなのか判りにくい
          (スラドがぶっ壊れてるのでない限り)んだけど、
          いずれにせよ、そういう主旨で無関係(だよな)なRubyMLに振るってのは、
          RubyMLに対して随分失礼かと。

          #Taiyakiss氏という人がどれくらい重たい弾丸:-)なのかは置いといて。

          >-1しておいて。

          ん?スコアさげりゃ済むってものなの?

          …まあ、逆にいえば、下げなくても済むものなんだけどさ…
          親コメント
          • by Anonymous Coward
            前から聞いてみたかったんですが、G7 から見て Taiyakiss は
            どう感じますか? 文章は読みやすいですか? どういう人だという
            印象を受けますか?

            両者とも長くてまとまりがない文章を書き連ねて基地外扱い
            されてきたわけですが、基地外度は Taiyakiss の方がはるかに
            上ではないかと思うんですが、どうでしょうか?
            • by Anonymous Coward
              G7氏じゃないですが、

              Taiyakiss氏のコメントは一見まともな場合でも、
              変な論理展開をして関係ない話に繋げて文章を書き、
              全体として意味不明になっている場合が多いですね。
              特徴的なのは、本筋と脱線部分がはっきり分かれているところでしょうか。
              多くのマイナスモデレートがこれにあたると思います。

              文章として読みにくいのは、接続助詞を多用しすぎているためでしょう。

              短文のどうでもいいコメントに
            • Re:脱構築 (スコア:0, オフトピック)

              >G7 から見て Taiyakiss は どう感じますか?

              どうとも感じません。
              前前から言っているように、人単位で何かを感じるほどの
              濃ゆい(?)人って、スラドにゃ居ないんで。
              この感想は今に至るまで変化していませんねえ。

              そりゃノイズなら沢山有るわけだけど、そんなもんは人単位で区別する以前に
              「文章(コメントとか)が」脳内でフィルタされるでしょ。
              #脳内フィルタすら機能しないような人(読者)は掲示板サイトには無用だし:-)

              つまり、ノイズ「しか」書かない人は、そもそも認知されません。はい。
              そんな人居たっけ?というか、それって人だっけ?というか。

              ところで呼び捨てアリなんですか?
              • by Anonymous Coward

                > 前前から言っているように、人単位で何かを感じるほどの
                > 濃ゆい(?)人って、スラドにゃ居ないんで。

                いるよ!!

                この人!! [srad.jp]
              • by Anonymous Coward
                変な言い方だけど、G7氏ってG7氏的に濃ゆい人じゃないような。
              • by Anonymous Coward
                ホントに濃ゆい人は、自分のことを濃ゆいとは思っていません。
  • by Anonymous Coward on 2004年03月28日 19時14分 (#522122)
    丁度、prothonの例が載っていた。
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/86651

    キーワードの"self"の有無は、人それぞれ好みや利点のトレードオフがあるとして。withはPythonにもあったら便利そうだな。

    Pythonは、メタクラス,クラス,(クラス)インスタンスと別れている点がややこしい。慣れるとLuaみたいにテーブル操作と同じ感覚でメタクラスが書けるかな、と思っていたけど以外とそうでもない。

    上のURIの例では、
    「(Callableなインスタンス)を返すインスタンス」をクラスのコンストラクタが返すようにメタクラスを設定し、プロトタイプを実現している。
typodupeerror

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

読み込み中...