アカウント名:
パスワード:
今回のバージョンにはループ最適化に関する致命的なバグ [lucidimagination.com]があるそうです。
(重要な用途には用いないこと || 関連する最適化オプションを無効にすること) && 今後のアップデートを速やかに導入することをお薦めします。
Miyakawaさんの張ったリンク先には
> Don’t use Java 7 for anything (unless maybe you know you don’t have any loops in your java code)
って書いてありますね。ループのないコードなら OK ってことです。
Java 7 のループは if と goto で書きましょう。;-)
って書いてから「もしかして Java って goto なかったような?」と思ったら、ほんとにありませんね。使わないと気付かないもんだなぁ…
どうやったら loop が書けるんだろう?
>「もしかして Java って goto なかったような?」と思ったら、ほんとにありませんね。使わないと気付かないもんだなぁ…
懐かしのFAQだけど、バイトコードにはあるよ。http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.... [sun.com]
つまりバイトコードのアセンブラで書けば良いんだね!#そっかー。このFAQが流行ったのって、もう10年以上前の話なんだ……#そら知らん人も多いわけだ。
バイトコードのレベルで無条件ジャンプ命令があるのは当たり前だと思うけど。構造化プログラミングってのは極論すればソースコード見る人間の都合にすぎないんだし。
末尾再帰で書きましょう。最適化でループで展開されるみたいなんで・・・あれ?
Javaって末尾再帰をループに最適化してくれましたっけ?Scalaならしてくれるみたいですけど。
ところで、何でいまだに人間様が末尾再帰で書いてやらなきゃならないんですかね。人間が通常の再帰を末尾再帰に書き換えることができるなら、どうして機械にはそれができないんでしょうか。末尾再帰に書き換え不可能な再帰があるのは知ってますけど、そんなのはエラーにしても十分実用的ではないですか。だって計算量が指数関数的どころの騒ぎではないのに、アッカーマン関数なんてベンチマーク等の目的以外で実用的なプログラムに使いますか?
できますよ。CPS変換すれば再帰は全部末尾再帰になります。簡単です。ただし、非末尾再帰をCPS変換したものはスタック消費がヒープ消費に化けるだけなので節約になりませんが。
空間計算量O(n)な非末尾再帰をO(1)な末尾再帰に自動で書き換えるのは、trivialなケースを除いてはそう自明ではないような…(trivialなケースなら、CPS変換の後、念入りな依存性解析で何とかなりそうな)。 何とかならないケースでは、何と何をトレードするかについて、プログラムソースに現れないメタなコスト評価を人間がやってるように思います。それをソース上に記述できれば自動化できるんでしょうが、その意図を記述するには最初から末尾再帰で書くのが一番わかりやすくて楽なんじゃないかと。
ループしない。全てを再帰コールで実装する(メモリ的にかなり無茶だ)
ループ回数分だけコピー&ペーストする
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
ループ最適化に関するバグ (スコア:5, 参考になる)
今回のバージョンにはループ最適化に関する致命的なバグ [lucidimagination.com]があるそうです。
(重要な用途には用いないこと || 関連する最適化オプションを無効にすること) && 今後のアップデートを速やかに導入することをお薦めします。
Re: (スコア:0)
Re:ループ最適化に関するバグ (スコア:1)
Miyakawaさんの張ったリンク先には
> Don’t use Java 7 for anything (unless maybe you know you don’t have any loops in your java code)
って書いてありますね。ループのないコードなら OK ってことです。
Java 7 のループは if と goto で書きましょう。;-)
Re:ループ最適化に関するバグ (スコア:1)
って書いてから「もしかして Java って goto なかったような?」と思ったら、ほんとにありませんね。使わないと気付かないもんだなぁ…
どうやったら loop が書けるんだろう?
Re:ループ最適化に関するバグ (スコア:2, 興味深い)
>「もしかして Java って goto なかったような?」と思ったら、ほんとにありませんね。使わないと気付かないもんだなぁ…
懐かしのFAQだけど、バイトコードにはあるよ。
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.... [sun.com]
つまりバイトコードのアセンブラで書けば良いんだね!
#そっかー。このFAQが流行ったのって、もう10年以上前の話なんだ……
#そら知らん人も多いわけだ。
Re:ループ最適化に関するバグ (スコア:1, 参考になる)
バイトコードのレベルで無条件ジャンプ命令があるのは当たり前だと思うけど。
構造化プログラミングってのは極論すればソースコード見る人間の都合にすぎないんだし。
Re:ループ最適化に関するバグ (スコア:1, おもしろおかしい)
末尾再帰で書きましょう。
最適化でループで展開されるみたいなんで・・・あれ?
Re: (スコア:0)
Javaって末尾再帰をループに最適化してくれましたっけ?
Scalaならしてくれるみたいですけど。
Re: (スコア:0)
ところで、何でいまだに人間様が末尾再帰で書いてやらなきゃならないんですかね。
人間が通常の再帰を末尾再帰に書き換えることができるなら、どうして機械にはそれができないんでしょうか。
末尾再帰に書き換え不可能な再帰があるのは知ってますけど、そんなのはエラーにしても十分実用的ではないですか。だって計算量が指数関数的どころの騒ぎではないのに、アッカーマン関数なんてベンチマーク等の目的以外で実用的なプログラムに使いますか?
Re: (スコア:0)
Re: (スコア:0)
できますよ。CPS変換すれば再帰は全部末尾再帰になります。簡単です。ただし、非末尾再帰をCPS変換したものはスタック消費がヒープ消費に化けるだけなので節約になりませんが。
空間計算量O(n)な非末尾再帰をO(1)な末尾再帰に自動で書き換えるのは、trivialなケースを除いてはそう自明ではないような…(trivialなケースなら、
CPS変換の後、念入りな依存性解析で何とかなりそうな)。 何とかならないケースでは、何と何をトレードするかについて、プログラムソースに現れないメタなコスト評価を人間がやってるように思います。それをソース上に記述できれば自動化できるんでしょうが、その意図を記述するには最初から末尾再帰で書くのが一番わかりやすくて楽なんじゃないかと。
Re:ループ最適化に関するバグ (スコア:1)
ループしない。全てを再帰コールで実装する(メモリ的にかなり無茶だ)
fjの教祖様
Re: (スコア:0)
再帰呼び出しとか
極短周期のタイマイベントとか
Re: (スコア:0)
Re: (スコア:0)
ループ回数分だけコピー&ペーストする
Re: (スコア:0)