アカウント名:
パスワード:
今回のバージョンにはループ最適化に関する致命的なバグ [lucidimagination.com]があるそうです。
(重要な用途には用いないこと || 関連する最適化オプションを無効にすること) && 今後のアップデートを速やかに導入することをお薦めします。
例えばVisual Studioがループ最適化に致命的なバグを持ったまま出荷されたらどうなるだろうか?間違いなく叩かれるだろう「こんなもん使い物になんねーよ」「金払ってんだからちゃんとしたもの売れ」そんな声が聞こえてくるようだ
では無償版のVisual Studio Expressの方だったらどうか?やはり叩かれるだろう「無償版だからって手抜いてんじゃねーよ」「有償版を買えってことですね分かります」そんなところか
ならばGPLなgccだったらどうだろう?それでもやはり叩かれるだろう「人柱さん何やってんの?」「良くもまあこんなんでstable宣言できたな?」「OSSの方が品質が高いとか思っている奴は情弱」ボロクソに言われるだろう
それならどうしてJavaはこんな致命的なバグ持ちで出荷されても許されるのか?悲しいかな、これこそが日本人の中立であろうとした時の立ち位置だからだ
世界で中立とか公平とかいう場合、どんなものも同じ価値となり、それがgccだろうと、JDKだろうと、同じように評価されるしかしながら同じことを日本人にやらせると、どういうわけだか劣っている方を大目に、優っている方を減じて評価してしまう習性があるいわゆるケンカ両成敗という考えかたこそが、日本人の考える公平とか中立という立ち位置になる似ているようでいて全く違う考え方なのだが、大抵の日本人は悲しいかな違いが分からないなにしろ自分は中立な立場に立っていると勘違いしているので、違いもへったくれもないわけだ
これだから日本人と議論するのは疲れるんだ物事を公平に見るということができず、常にどちらか側につくことで両者の優位性を打ち消すことを、公平に見るということだと誤解しているので話にならないどうしてダメなものはダメと言えないのか?
長々書いてるけど、要約すると「水に落ちた犬は叩け」ってことでOK?
あなたは、どなたと戦っておられるのでしょうか。
日本人でもそれ以外のかたでも「こんなバグ許されないだろ」という意見のほうが圧倒的に見かけます、私の観測する範囲では。そのVisual StudioやGCCの例と同じぐらい叩かれているように思います。
俺日本人だけど、Javaはそもそも信用するに値しないプロダクトだと思ってます。Adobeよりはマシに見えてある面ではAdobeより酷い。「GC頑張って広めたね、OO特化言語の最低ラインを示せたね、エライエライ」的な。コンセプトはともかく、本気出して使うべき言語じゃねぇと常々思ってます。FlashにしろPDFにしろJavaにしろSMTPにしろFTPにしろ、新しい世界を提示したらさっさと死んでマトモな後継の苗床になってくれと常々…
なので今回の件も「ああやっぱり。さっさと沈め」ってだけで別に叩く気は毛頭有りません。
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変換の後、念入りな依存性解析で何とかなりそうな)。 何とかならないケースでは、何と何をトレードするかについて、プログラムソースに現れないメタなコスト評価を人間がやってるように思います。それをソース上に記述できれば自動化できるんでしょうが、その意図を記述するには最初から末尾再帰で書くのが一番わかりやすくて楽なんじゃないかと。
ループしない。全てを再帰コールで実装する(メモリ的にかなり無茶だ)
ループ回数分だけコピー&ペーストする
> 関連する最適化オプションを無効にする具体的にはどういう起動オプションを指定したらいいんですかね。リンク先はただ「使うな」だけで回避策は書かれていないみたいですし。
超不慣れな英語を必死に読み解いた限りでは、「Java7のUpdate 2よりも前を使う場合は"-XX:-UseLoopPredicate JVM option"を無効にしろ」と書いてあるような気がします。
んでもって、手元のDebianのOpenJDK7でデフォルトどうなってるか確認したかったんですが
$ java -XX:+PrintFlagsFinal -server -version(snip)bool UseLoopPredicate = true {C2 product}(snip)java version “1.7.0_147-icedtea”OpenJDK Runtime Environment (IcedTea7 2.0pre) (7~b147-2.0~pre1-1)OpenJDK Server VM (build 21.0-b17, mixed mode)
となって、「-server」を付けて起動した場合(Server版HotSpotVM)は該当の最適化がデフォルトで有効になるみたいです。(「-server」付けないと該当行が出ません)
引き続き、どんな条件でfalseになるのかチマチマ調べようかと・・・
ちなみに、OpenJDK7のパッケージはexperimentalにあります [debian.org]
引き続きACです。
$ java -XX:-UseLoopPredicate -XX:+PrintFlagsFinal -server -version(snip)bool UseLoopPredicate := false {C2 product}(snip)java version "1.7.0_147-icedtea"OpenJDK Runtime Environment (IcedTea7 2.0pre) (7~b147-2.0~pre1-1)OpenJDK Server VM (build 21.0-b17, mixed mode)
な結果が得られたので、とりあえずJava7を使う場合は「-XX:-UseLoopPredicate」を付ける、でいいんでしょうかね?また、{C2 product}はServer版で使用可能になるということなので、Server
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
ループ最適化に関するバグ (スコア:5, 参考になる)
今回のバージョンにはループ最適化に関する致命的なバグ [lucidimagination.com]があるそうです。
(重要な用途には用いないこと || 関連する最適化オプションを無効にすること) && 今後のアップデートを速やかに導入することをお薦めします。
Re:ループ最適化に関するバグ (スコア:1, おもしろおかしい)
例えばVisual Studioがループ最適化に致命的なバグを持ったまま出荷されたらどうなるだろうか?
間違いなく叩かれるだろう「こんなもん使い物になんねーよ」「金払ってんだからちゃんとしたもの売れ」そんな声が聞こえてくるようだ
では無償版のVisual Studio Expressの方だったらどうか?
やはり叩かれるだろう「無償版だからって手抜いてんじゃねーよ」「有償版を買えってことですね分かります」そんなところか
ならばGPLなgccだったらどうだろう?
それでもやはり叩かれるだろう「人柱さん何やってんの?」「良くもまあこんなんでstable宣言できたな?」「OSSの方が品質が高いとか思っている奴は情弱」ボロクソに言われるだろう
それならどうしてJavaはこんな致命的なバグ持ちで出荷されても許されるのか?
悲しいかな、これこそが日本人の中立であろうとした時の立ち位置だからだ
世界で中立とか公平とかいう場合、どんなものも同じ価値となり、それがgccだろうと、JDKだろうと、同じように評価される
しかしながら同じことを日本人にやらせると、どういうわけだか劣っている方を大目に、優っている方を減じて評価してしまう習性がある
いわゆるケンカ両成敗という考えかたこそが、日本人の考える公平とか中立という立ち位置になる
似ているようでいて全く違う考え方なのだが、大抵の日本人は悲しいかな違いが分からない
なにしろ自分は中立な立場に立っていると勘違いしているので、違いもへったくれもないわけだ
これだから日本人と議論するのは疲れるんだ
物事を公平に見るということができず、常にどちらか側につくことで両者の優位性を打ち消すことを、公平に見るということだと誤解しているので話にならない
どうしてダメなものはダメと言えないのか?
Re:ループ最適化に関するバグ (スコア:1)
長々書いてるけど、要約すると「水に落ちた犬は叩け」ってことでOK?
Re: (スコア:0)
Re: (スコア:0)
えー、できればあなたの国のことわざではなく、日本のことわざで要約してくれませんかね?
Re:ループ最適化に関するバグ(スコア:-1, オフトピ) (スコア:0)
あなたは、どなたと戦っておられるのでしょうか。
日本人でもそれ以外のかたでも「こんなバグ許されないだろ」という意見のほうが圧倒的に見かけます、私の観測する範囲では。そのVisual StudioやGCCの例と同じぐらい叩かれているように思います。
Re: (スコア:0)
Re: (スコア:0)
俺日本人だけど、Javaはそもそも信用するに値しないプロダクトだと思ってます。
Adobeよりはマシに見えてある面ではAdobeより酷い。
「GC頑張って広めたね、OO特化言語の最低ラインを示せたね、エライエライ」的な。
コンセプトはともかく、本気出して使うべき言語じゃねぇと常々思ってます。
FlashにしろPDFにしろJavaにしろSMTPにしろFTPにしろ、新しい世界を提示したらさっさと死んでマトモな後継の苗床になってくれと常々…
なので今回の件も「ああやっぱり。さっさと沈め」ってだけで別に叩く気は毛頭有りません。
Re: (スコア:0)
気持ちはわからんでもないけど、それって作り直し症候群じゃないかなぁ。
とはいえ、Javascriptだけは「コンセプトはともかく、本気出して使うべき言語じゃねぇ」と思う。
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)
Re: (スコア:0)
> 関連する最適化オプションを無効にする
具体的にはどういう起動オプションを指定したらいいんですかね。リンク先はただ「使うな」だけで回避策は書かれていないみたいですし。
Re:ループ最適化に関するバグ (スコア:1, 参考になる)
超不慣れな英語を必死に読み解いた限りでは、
「Java7のUpdate 2よりも前を使う場合は"-XX:-UseLoopPredicate JVM option"を無効にしろ」
と書いてあるような気がします。
んでもって、手元のDebianのOpenJDK7でデフォルトどうなってるか確認したかったんですが
となって、「-server」を付けて起動した場合(Server版HotSpotVM)は該当の最適化が
デフォルトで有効になるみたいです。(「-server」付けないと該当行が出ません)
引き続き、どんな条件でfalseになるのかチマチマ調べようかと・・・
ちなみに、OpenJDK7のパッケージはexperimentalにあります [debian.org]
Re: (スコア:0)
引き続きACです。
な結果が得られたので、とりあえずJava7を使う場合は「-XX:-UseLoopPredicate」を付ける、でいいんでしょうかね?
また、{C2 product}はServer版で使用可能になるということなので、Server
Re:ループ最適化に関するバグ (スコア:2, 参考になる)
掲示いただいたURIからpointされてるバグをBug Paradeで確認してみました。
Hotspot crashes with sigsegv from PorterStemmer [sun.com]
-Xintフラグを付けず、-serverフラグを付けると再現可能
Work Around→実行時に-XX:-UseLoopPredicateを指定する
修正内容→ http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/4e761e7e6e12 [java.net]
Loop unroll optimization causes incorrect result [sun.com]
testAssignSameArrayInstanceテストでループが巻き戻らない場合に(?)正常な結果が得られない。-XX:LoopUnrollLimit=1を指定して実行すると正常な結果が得られる。
Work Around→なし
修正内容→ http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/e3cbc9ddd434 [java.net] http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/rev/e3cbc9ddd434 [java.net] http://hg.openjdk.java.net/hsx/hotspot-rt/hotspot/rev/e3cbc9ddd434 [java.net]
SIGSEGV in PhaseIdealLoop::build_loop_late_post on T5440 [sun.com]
Work Around→なし
修正内容→ http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/c96c3eb1efae [java.net]
-XX:-UseLoopPredicate で避けられるのは最初のものだけですね。