ポール・グレアムの「言語の設計に関する5つの問題」を翻訳中なのですが、

("Five Questions about Language Design" http://www.paulgraham.com/langdes.html)
コンピュータ言語に関する話がわからないので、プログラミングに詳しい方に質問です。

[1] 「continuations」って何ですか? 次のような文脈で出てきます。
  「それ以外でサーバ・ベースのソフトウェアで有用だとわかる可能性があるのは、驚くなかれ、continuationsだ」
  「ウェブ・ベースのソフトではcontinuation-passing styleのようなものを使うことができる」

[2] [1]に関連しますが、正直、この一文はぜんぜんわかりません。お助けを。
   In Web-based software you can use something like continuation-passing style to get the effect of subroutines in the inherently stateless world of a Web session.

[3] first class functionsとkeyword parameterってどう訳せばいいですか?
  「どれくらい可能性があるのかわからないが、私が個人的にぜひしたいことの1つは、first class functions、再帰、keyword parameterといった、大きな特徴となる新しい抽象的な概念の発見だ」

回答はいずれか1つでOKです。よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2007/02/12 12:47:28
  • 終了:2007/02/12 14:28:14

ベストアンサー

id:Kumappus No.2

くまっぷす回答回数3784ベストアンサー獲得回数1852007/02/12 14:05:20

ポイント120pt

[1] 「continuations」って何ですか? 次のような文脈で出てきます。

うーん、これはちょっと訳しても一般の人(C言語あたりのプログラム経験があるひとを含む)が理解できるかどうか微妙ですね。

continuationは「継続」とも訳されますがカタカナでコンティニュエーションまたは英語のままでcontinuationと使われることが多いように思います(古手のひとはまずそのまま使う。一般に普及していない概念なんでしょうね)。

http://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A

Wikipadiaにもありますけど、こう書かれると私もちんぷんかんぷん(笑)。サブルーチンだとあるプログラムの流れのごく一部しか保存しませんが、コンティニュエーションを使った場合は全部を保存するという違いがあります。コンティニュエーションを使う一番わかりやすい例はコルーチンです。

http://madeira.cc.hokudai.ac.jp/RD/yamamoto/Essay/11.html

実際によく使われる例は

http://d.hatena.ne.jp/kohtani/20061227/p1

複数のスレッドがあって片方を止めて(状態を保存したまま)他のスレッドの処理に移り、処理が終わったら元に戻るような場合です。

プログラミング言語でいうとCだとsetjmp()/longjmp()が(一応)continuationの例と言えますし、コンティニュエーションが明示的な売り物になっている言語としてはLispの一種(といっていいのかな)であるSchemeなどがあります。

なのでここはそういうことを踏まえて英語のままで書くことをお勧めします。

[2] [1]に関連しますが、正直、この一文はぜんぜんわかりません。お助けを。

   In Web-based software you can use something like continuation-passing style to get the effect of subroutines in the inherently stateless world of a Web session.

「Webベースのソフトウェアではcontinuation-passingのような形式を使うことで本来的にステートレスな世界であるWebセッションにサブルーチンと同じ効果を得ることができる。」

Webセッションはクッキーや大域変数でも使わない限り1回1回アクセスするたびに前の状態が保存されないため、内部的な状態の変化を意識しないと書けないアプリケーションロジックを作るのが大変だったのですが、continuationを使うことで楽になるよ ということでしょう。

https://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/show/info/Abo...

みたいなコンティニュエーションが可能なフレームワークがいくつかあるようです。


[3] first class functionsとkeyword parameterってどう訳せばいいですか?

  「どれくらい可能性があるのかわからないが、私が個人的にぜひしたいことの1つは、first class functions、再帰、keyword parameterといった、大きな特徴となる新しい抽象的な概念の発見だ」

first class functions

http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/...

http://sky.zero.ad.jp/~zaa54437/programming/concepts/index3.htm

関数型言語などで扱われる用語で訳はそのままfirst class functionsでも第一級関数でもよさげ。

keyword parameter

http://math-sci.hp.infoseek.co.jp/DylanInfo/Functions/ParameterL...

これの真ん中あたりにありますが、普通プログラミング言語で関数に値を渡すときは順番が固定されますが、キーワードパラメータの場合は(Dylanの場合)キーワード:値 という形で渡すことが可能になります。Dylanの場合はキーワードを指定しない場合は関数宣言側でのデフォルト値が使われます。

訳はキーワードパラメータ、でしょうね。

そういえば「各言語が解決するもの」に出てきた言語名がいろいろ…そういえばあれにはHaskellがいなかったような…

id:lionfan

Kumappus様、いつもありがとうございます。とても丁寧な解説にもかかわらず、いまだにcontinuationがわかりませんでした(泣)

やっぱポインタと構造体で挫折した人が翻訳しちゃいけませんよねえ?

さてさて、グレアムのページに "Learning from Founders"が載り、Yasushi Aokiさんによる翻訳がすでに出ているようです。

「創業者に学ぶ」by Yasushi Aoki

http://www.aoky.net/articles/paul_graham/foundersatwork.htm

また同じくYasushi Aokiさんの訳として、

"How to Start a Startup"

http://www.paulgraham.com/start.html

を翻訳した「スタートアップの始め方」

http://www.aoky.net/articles/paul_graham/start.htm

がありました。超うれしいです。

2007/02/12 14:19:25

その他の回答(1件)

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692007/02/12 13:17:53

ポイント35pt

[1]continuation-passing styleは「継続渡しスタイル」といって再帰の手法の一つです。

http://torus.jp/memo/x200605/tailcall.rd.html

id:lionfan

SALINGER様、ありがとうございます!!

2007/02/12 13:33:39
id:Kumappus No.2

くまっぷす回答回数3784ベストアンサー獲得回数1852007/02/12 14:05:20ここでベストアンサー

ポイント120pt

[1] 「continuations」って何ですか? 次のような文脈で出てきます。

うーん、これはちょっと訳しても一般の人(C言語あたりのプログラム経験があるひとを含む)が理解できるかどうか微妙ですね。

continuationは「継続」とも訳されますがカタカナでコンティニュエーションまたは英語のままでcontinuationと使われることが多いように思います(古手のひとはまずそのまま使う。一般に普及していない概念なんでしょうね)。

http://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A

Wikipadiaにもありますけど、こう書かれると私もちんぷんかんぷん(笑)。サブルーチンだとあるプログラムの流れのごく一部しか保存しませんが、コンティニュエーションを使った場合は全部を保存するという違いがあります。コンティニュエーションを使う一番わかりやすい例はコルーチンです。

http://madeira.cc.hokudai.ac.jp/RD/yamamoto/Essay/11.html

実際によく使われる例は

http://d.hatena.ne.jp/kohtani/20061227/p1

複数のスレッドがあって片方を止めて(状態を保存したまま)他のスレッドの処理に移り、処理が終わったら元に戻るような場合です。

プログラミング言語でいうとCだとsetjmp()/longjmp()が(一応)continuationの例と言えますし、コンティニュエーションが明示的な売り物になっている言語としてはLispの一種(といっていいのかな)であるSchemeなどがあります。

なのでここはそういうことを踏まえて英語のままで書くことをお勧めします。

[2] [1]に関連しますが、正直、この一文はぜんぜんわかりません。お助けを。

   In Web-based software you can use something like continuation-passing style to get the effect of subroutines in the inherently stateless world of a Web session.

「Webベースのソフトウェアではcontinuation-passingのような形式を使うことで本来的にステートレスな世界であるWebセッションにサブルーチンと同じ効果を得ることができる。」

Webセッションはクッキーや大域変数でも使わない限り1回1回アクセスするたびに前の状態が保存されないため、内部的な状態の変化を意識しないと書けないアプリケーションロジックを作るのが大変だったのですが、continuationを使うことで楽になるよ ということでしょう。

https://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/show/info/Abo...

みたいなコンティニュエーションが可能なフレームワークがいくつかあるようです。


[3] first class functionsとkeyword parameterってどう訳せばいいですか?

  「どれくらい可能性があるのかわからないが、私が個人的にぜひしたいことの1つは、first class functions、再帰、keyword parameterといった、大きな特徴となる新しい抽象的な概念の発見だ」

first class functions

http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/...

http://sky.zero.ad.jp/~zaa54437/programming/concepts/index3.htm

関数型言語などで扱われる用語で訳はそのままfirst class functionsでも第一級関数でもよさげ。

keyword parameter

http://math-sci.hp.infoseek.co.jp/DylanInfo/Functions/ParameterL...

これの真ん中あたりにありますが、普通プログラミング言語で関数に値を渡すときは順番が固定されますが、キーワードパラメータの場合は(Dylanの場合)キーワード:値 という形で渡すことが可能になります。Dylanの場合はキーワードを指定しない場合は関数宣言側でのデフォルト値が使われます。

訳はキーワードパラメータ、でしょうね。

そういえば「各言語が解決するもの」に出てきた言語名がいろいろ…そういえばあれにはHaskellがいなかったような…

id:lionfan

Kumappus様、いつもありがとうございます。とても丁寧な解説にもかかわらず、いまだにcontinuationがわかりませんでした(泣)

やっぱポインタと構造体で挫折した人が翻訳しちゃいけませんよねえ?

さてさて、グレアムのページに "Learning from Founders"が載り、Yasushi Aokiさんによる翻訳がすでに出ているようです。

「創業者に学ぶ」by Yasushi Aoki

http://www.aoky.net/articles/paul_graham/foundersatwork.htm

また同じくYasushi Aokiさんの訳として、

"How to Start a Startup"

http://www.paulgraham.com/start.html

を翻訳した「スタートアップの始め方」

http://www.aoky.net/articles/paul_graham/start.htm

がありました。超うれしいです。

2007/02/12 14:19:25
  • id:Kumappus
    グレアムさん、どうやらこの頃(2001年)関数型言語でのWebアプリ開発にはまりかけていたのかもしれませんね。
    http://www.flightless-wing.com/index.php?%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%2FHaskell%2F%A5%A6%A5%A7%A5%D6%A5%B5%A1%BC%A5%D0
    「モナド」が出てきてないのでまだHaskellまでは行き着いていなかったのかな?
  • id:garyo
    continuationはrubyで使えるそうなので調べてみました。
    callccという関数です。c言語のsetjmp,longjmpで説明してありました。

    setjmp() == callcc {|c| }
    longjmp() == c.call
    つまり、現在実行中の位置を覚えて別な処理に行った後、またその処理の続きに戻れる機能です。

    >>
    「普通のやつらの上を行け」でPaul Grahamが述べているYahoo! Storeのシステムはまさにこの技術を実装している。アプリケーションは継続をクロージャにラップしてセッションIDをキーとするハッシュテーブルに登録しておき、httpサーバはユーザーからのフォームのsubmitがあるとセッションIDを元に登録された継続を呼び出すのだ。
    <<
    http://www.shiro.dreamhost.com/scheme/docs/cont-j.html

    これが言っていることは、通常のWEBアプリはどうしても状態遷移的な作りになってしまうが、継続機能を使うことで、シーケンスな処理に書き換えることができるという意味だと思います。

    例)状態遷移的な処理
    1.イベントループで待つ
    2.イベントがくる
    3.現在のステートとイベントを見て処理を行い状態を遷移する。
      →1へ

    例)継続を使ったシーケンス処理(オンラインショップなど)
    例えば、
    ログイン
    注文
    決済
    ログアウトという処理があったとき

    1.ユーザーのログインイベントがくる
    2.ウエブサーバーから応答を返す、IDと現在の処理の位置を「継続(callcc)」の戻り値で保存
    3.注文イベントが来る。
    IDを元に前回の処理位置を求め、続きを行う。
    ウエブサーバーから応答を返し、その時の処理の位置を「継続(callcc)」の戻り値で保存
    ・・・以下同様

    とやることでシーケンシャルなプログラムが書けるということを言っているのではないでしょうか。



    こちらにcallccの例が載っています。
    「境界を越える: 継続とWeb開発、そしてJavaプログラミング」
    http://www-06.ibm.com/jp/developerworks/java/060412/j_j-cb03216.shtml
  • id:lionfan
    Kumappus様、garyo様、たいへん遅くなってしまいましたが、丁寧なご回答ありがとうございました。たいへん参考になりました。
    いつかRubyやLispを覚えてみたいです。本は買ったのですが頭が追いつかず・・・。
  • id:Kumappus
    今からやるなら(僕もまだ全然覚えてないですが)Haskellがナウいです。
  • id:lionfan
    Haskellですか、ありがとうございます。
    ちょっと調べてみます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません