1 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 01:03:42 ] 前スレ 【Java】次世代Java・J2SE1.6の動向【Mustang】 pc8.2ch.net/test/read.cgi/tech/1081698555/ 関連スレ 【JavaFive】C#からJ2SE5.xへ進化【TigerShot】 pc8.2ch.net/test/read.cgi/tech/1094891986/ www.itmedia.co.jp/news/articles/0404/07/news018.html マルチタスク実現へJava言語改良 Sun幹部によると、2005年に一般リリース予定の「J2SE 1.6」には、 Javaバーチャルマシン(JVM)のアプリケーション共有を強化する「分離」機能が備わり、 ローカライズコンピューティング処理実行のための分離が可能になるという。 米Sun Microsystemsは、Javaバーチャルマシン(JVM)内部での アプリケーションマルチタスク実現に向けてJava言語の改良に取り組んでいる。 カリフォルニア州サンノゼで開催のClusterWorld Conference & Expoで4月6日、同社幹部が明らかにした。 SunのJavaアーキテクト、ムラリ・カウンディンヤ氏によると、 今秋β版が登場し、2005年に一般リリース予定の「J2SE 1.6」には、 JVMのアプリケーション共有を強化する「分離」機能が備わる。 この機能によってローカライズコンピューティング処理実行のための分離が 可能になり、第2のJVMを要求することなくJVM内部でマルチタスクが行えるようになるという。 またJ2SE 1.6では、Javaプログラム間の高速通信を可能にする Sockets Direct Protocolのサポートが計画されている。カウンディンヤ氏によると、 J2SEに施された改良は、その後間もなくJ2EEにも組み込まれる予定。
2 名前:デフォルトの名無しさん [2006/05/18(木) 01:05:40 ] トラックバック:pc8.2ch.net/test/read.cgi/tech/1094891986/ 以下のスレは、埋まったら今度はこのスレを本スレとしませんか? 【JavaFive】C#からJ2SE5.xへ進化【TigerShot】 pc8.2ch.net/test/read.cgi/tech/1094891986/
3 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 01:10:17 ] マ板のスレみたいな名前だからなぁ・・・
4 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 01:15:46 ] アンチ厨が群がってくると? マ板とは区別できるだろうと期待したい。 馬鹿には馬鹿しか集まらないが、 知的な議論が交わされれば オッサン共はこちらを荒らすことは無いだろう。 もしこっちがあれたらム板のC言語やC++スレ、C#スレまで 荒れることになる恐れがあるので。
5 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 03:23:27 ] 現代から次世代、次々世代まで Tiger JDK5.0 ttp://java.sun.com/j2se/1.5.0/ja/docs/ja/index.html 言わずもがな、リリース最新バージョン Mustang JDK6.0 ttp://java.sun.com/javase/6/docs/index.html [beta] ttps://mustang.dev.java.net/ [weekly binary snapshot] ttp://java.sun.com/javase/webnotes/6/version-6.html [Version6 or 1.6?] おお、JavaOne期間でロゴ変わってる Dolphin JDK7 ttps://dolphin.dev.java.net/ まだ、できてない、2006年春スタート予定だったはず。 >>1 の話ってちょいと昔のかなぁ、と思いつつ・・・ BercelonaプロジェクトのMVMの話、どうなってんだろ、と思い出した つ ttp://research.sun.com/projects/barcelona/mvm/ まだまだ研究レベルで、実際はDolphinで載ればいい方かな、と思ってんだけど。 Dolphinは、言語スペックに大幅改修入るみたいだし、なんとか一緒に入るのかな? 実現されればWebサーバ側で、JVMがデーモンのように上がってる、なんて事になったりして・・・
6 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 19:22:03 ] Mustang ベータ2が来月。リリースが9月だっけか。。 Dolphinは2008年半ばだそうな。
7 名前:デフォルトの名無しさん [2006/05/18(木) 19:41:51 ] Windows Vistaへの対応が気になるところ。 Windows版だけ、6月無理とか、制限あったりとかしそうな悪寒。
8 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 20:02:09 ] Vista発売の方が延びるから問題ない。
9 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 20:03:17 ] Vista 対応って、具体的に何を期待してんだろ?
10 名前:デフォルトの名無しさん [2006/05/18(木) 20:17:37 ] XP SP2上と同じように動くこと。 現状、Vista公開β候補版でボロボロなので。
11 名前:デフォルトの名無しさん [2006/05/18(木) 22:17:28 ] ttp://journal.mycom.co.jp/articles/2006/05/18/javaone3/ >Mustangの次のバージョンのJava SEはDolphin(Java SE 7)である。DolphinではJavaプ >ラットフォームがエコシステムへと発展する方向での拡張を目指すという。具体的にど >のような拡張が行われるのかは現在議論が重ねられている最中だが、現時点では次 >のような新機能の追加が発表されている。 > >プロパティのサポート >メソッドリファレンスのレポート >クロージャのサポート >言語レベルでのXMLのサポート >JVM上で動作する動的言語のサポート >スクリプト言語サポートの拡張 >モジュール化のサポート >Swingアプリケーション開発のためのツールの充実 Dolphinってこんなに変わるのかよ。プロパティ・サポートとかクロージャのサポートって、 かなり大きな変更のように思うが...
12 名前:デフォルトの名無しさん mailto:sage [2006/05/18(木) 23:47:51 ] クロージャってC# 2.0の匿名メソッドみたいなアフォなものに なるんだろうな。 ttp://d.hatena.ne.jp/akiramei/20060503/p2 VM自体がクラス前提になっているから、猛烈にクソなものが平気で 出てくる。
13 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 00:00:07 ] >>12 なんでいきなり言い切ってるんだろうか.... C#がクソな実装したからってJavaがそうなるとは限らんだろうに。 実際、いままでJavaの実装で、このC#のようなクソな実装ってあったか? おれはもしJavaで同じことやったら、実行速度上のデメリットがあっても、 ソースコードとの一致を取って、ループの度に匿名インスタンス生成を 選択するんじゃないかと思う。 それがMS一社で決めてるC#と、コミュニティで決めてるJavaの違いじゃ ないかと。
14 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 00:27:05 ] それってruby の yield? Genericsみたいにもめても、何とかなるんじゃない?
15 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 01:49:07 ] >>13 Generics
16 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 01:53:58 ] GenericsってJavaのほうが実装早いだろ
17 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 01:56:46 ] Genericsはそんなにクソでもないと思うがなあ。 イレイジャのこと言ってるんだけど、妥当な妥協ポイントだと思うよ。 おかげでcommonsとかそのまま使えてるわけで。
18 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 03:37:39 ] >>11 この新機能ってJSRで言うとどれなのかリストあるのかね?
19 名前:(・∀・)キタコレ!! [2006/05/19(金) 12:01:51 ] 「あとは方法を検討するだけ」--サンがJavaのオープンソース化を約束 japan.cnet.com/news/ent/story/0,2000056022,20114107,00.htm
20 名前:デフォルトの名無しさん [2006/05/19(金) 12:19:32 ] 要は不良債権処理でしょ。マクネリもクビ切られるほどSunがヤバイ状況だから。
21 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 13:21:22 ] まくにーりーって会長職にいるんだけど・・・?
22 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 17:31:28 ] Linuxディストリにも標準バンドルされる、というのは良いことだな。
23 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 17:34:01 ] >>19 会場盛り上がったよ >>21 明日出てくるよ
24 名前:デフォルトの名無しさん [2006/05/19(金) 20:21:37 ] 「JavaVMは汎用OS上で動かさない」---JRockitの開発マネージャにJavaVMの今後を聞く ---今,JavaVMにどんな機能が求められているのか 環境の変化に対応しなければならない。それは「サーバー仮想化」という動きだ。 VMwareやXenなどのHypervisor技術に基づいた仮想化ソフトを利用するケースが増えている。 一つのハードウエア上で多くのアプリケーションを動作させることになるが, 単に動作させるだけでなく,アプリケーション間の干渉がないようにすることが求められている。 そのためにはアプリケーションごとにリソースを制御しなければならない。 ---リソースの割り当てはOSが担うのではないのか その通り。だが汎用OS(WindowsやLinuxなど)では力不足だ。実行時に(プロセスごとの) 優先順位を付けることはできるが,一定量の(メモリー,CPU,ネットワーク帯域などの) リソースをアプリケーションに確実に割り当てることはできないのが実情だ。状況によっては, メモリー上のデータがディスクに書き出されてしまうこともある。そうなれば性能は大きく低下する。 ---そうした問題をどうすれば解決できるのか “汎用OSを利用しない”というアプローチがある。それを当社では進めている。ハード ウエア上でHypervisor(技術に基づいたソフト)を動作させ,その上にJavaVM専用のOS 「Bare Metal」(開発プロジェクト名),さらにその上でJavaVMを動作させる。そのよう な動作環境において,JavaVMごとにリソースを確実に割り当てるという方法だ。汎用OSを 利用しないので確実にリソースを割り当てることが可能だ。JavaVMから見るとBare Metal はOSに見えるが,汎用OSの機能は備えず,一つのJRockitプロセスを動作させるのに必要 な機能のみ提供する。 itpro.nikkeibp.co.jp/article/NEWS/20060519/238478/
25 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 21:08:00 ] >>24 つまりどうなるの? VMとOSの間に仮想化ソフトをかますってこと??
26 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 22:31:44 ] JRockitって、いつの間に無償になってたんだ
27 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 23:05:29 ] >>12 >>13 なんかあちこちで勘違いされてるっぽいけど、C#2.0の匿名デリゲートの 仕様は、(レキシカル)クロージャとして妥当だよ。レキシカルクロージャは、 (実行時ではなく)生成時の環境をキャプチャするので、>>12 のリンク先の ような挙動は、極めて普通。Schemeのlambda式によるクロージャや、 RubyのProcオブジェクトによるクロージャの挙動と基本的には同じ。
28 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 23:22:58 ] あと、C#の匿名デリゲートの振る舞いについては、langsmith MLの197から 始まっている議論が参考になると思う。
29 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 23:32:53 ] そもそもレキシカルスコープというもの自体が、プログラマの感覚から 離れててコンピュータの都合に合わせているもののように思う。
30 名前:デフォルトの名無しさん mailto:sage [2006/05/19(金) 23:53:35 ] >>29 そういう考え方ができないとは言わないけど、歴史的に見れば、逆だと思う。 プログラマの都合に合わせるためにできたのが、レキシカルスコープ。 初期のプログラミング言語のほとんどが、グローバルスコープしか無い のに対して、最近の言語のほとんどがレキシカルスコープを採用している のも、それを示していると思う。
31 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:00:49 ] レキシカルスコープだけに歴史・・・いやなんでもない プロパティサポートとか次世代の話続けて
32 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:16:20 ] じゃあ、プロパティの話を。プロパティ自体は、そんなに大きな変更ではない と思うけど、どうやって取り入れるんだろうね。簡単に考え付くのが、Groovy みたいにx.hoge -> x.getHoge()、x.hoge = y -> x.setHoge(y)とコンパイラが 変換するというもの。これなら言語仕様の変更は最小限で済みそうだし、 Java VMも変更する必要が無い。ただ、プロパティと同名のフィールドが あった場合にどちらを優先するか、とかいくつか考えることはあるが。
33 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:34:59 ] >>30 すまん、Perlでいえばlocalとmyを逆に考えて書いてしまった.... レキシカル=ローカル だよな。 しかし>>12 の例で言えば、 delegate { Console.Write ("{0} ", i); }; ってのは、ループカウンタ i の値をクロージャというもんのコンストラクタに渡したような もんであり、 i という変数を渡したわけじゃないんじゃないか? i がそのまま参照として渡されたような印象をうけるC#の動作の方に違和感があるん だけど。
34 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:36:55 ] またレキシカルの話題をかいちゃったので、プロパティの話も書くね。 おれはGroovyの@Propertyみたいなのを採用するのかな、と思う。 >>32 のいうように、x.hogeとかいう部分はあくまでx.getHoge()のままで、 getter/setterの定義を「@Property hoge」みたいな感じで定義できる、 とかシンタックスシュガー的なもんなのかなあ、と。
35 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:40:53 ] モジュール化の話は詳細が出てたね。 共有ライブラリで、外部に提供する関数名を限定できるみたいに、 どのクラス、どのメソッドをエクスポートするか定義できるようになる みたい。 パッケージにスーパーパッケージみたいなものを定義できて、そのなかに 複数のパッケージをまとめて、しかも外部から見えるのはこのクラスとこの クラスね、とかやれるみたいだね。 Perlのモジュールと似たような感じかな? 一番よくわからん項目は「メソッドリファレンス」かなあ。これなんだろ。 おれは>>11 に載ってる項目よりも、NIO2がいつになったら出るのかもう、 待ちくたびれるっつうの。はやくJavaからファイルのメタデータにアクセス できるようにしてくれよ。
36 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 00:59:44 ] >>33 > delegate { Console.Write ("{0} ", i); }; > ってのは、ループカウンタ i の値をクロージャというもんのコンストラクタに渡したような > もんであり、 i という変数を渡したわけじゃないんじゃないか? レキシカルクロージャと言った場合、一般的には、まさにiという変数 そのものを渡すようなものを指す。もっと知りたい場合は、Schemeや Rubyなどの、クロージャを持っている他の言語について調べてみると 良いと思う。 ちなみにこのような仕様になっていることによって、どんなメリットがある かというと、例えば、次のような「制御構造」を抽象化したライブラリを 作れるという点が挙げられる。JavaやCなどの言語では、制御構造は あくまで組み込みのものだけど、クロージャがある言語では、新しい 制御構造を提供するライブラリを簡単に作ることができる。 int sum = 0; list.each(delegate(int i){ sum += i; }); Console.WriteLine(sum);// listの要素の合計を出力
37 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 01:05:54 ] getとsetでプロパティがいいと思います
38 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 01:18:59 ] >>36 あ、なるほど、sumという外側のローカル変数そのものが渡っているというイメージね。 参考になったよ。逆に言えば、もともとアクセスできるものを引数で渡している>>12 の 例が、ちょっと使い方を誤ってるということかな。
39 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:10:42 ] 言語レベルでのXMLのサポートって、 E4Xみたいなもんが乗るのかな?
40 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:24:26 ] >>39 なんか、文字通りJavaのソースの中にXMLをそのままかけるらしいぞ。 イメージ的には XML data = <test><dataset><key name="test"><value>test</value></key></dataset></test> とかそのまま書けるって感じというか。 正直、まだ利点を見いだせない。シンプルなjavaを複雑にしてないだろうか?
41 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:28:51 ] VB9にも似たのがあった気が。 誰がつかうんだろう
42 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:29:20 ] Java的には、クロージャって引数の数によって識別されるRunnableが あって、いままでいろんなものでそれぞれリスナを作ってたところを、 そういう共通的なRunnableを使って実装する、というイメージなのかな、 という気がした。 inputFile.eachLine( closure(String line) { 行の処理 }); ってなことだよね?
43 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:29:39 ] そんなん入れるならヒアドキュメント入れろ
44 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:31:34 ] >>40 またパ...
45 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 02:37:03 ] まあ なんたら.execute( new Runnable() { public void run() { ほげほげ } }); って長くてうざかったし、そのシンタックスシュガーを提供してくれる だけでもうれしいかな。 Wicketだとこの手の書き方大量にするんで.... );
46 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 04:18:37 ] もうJavaの拡張はいいよーまた覚えることが増えるだけじゃん こんなの初心者はついていけないぞ。教えきらん。 >>34 俺もそう思う。たんにgetter/setterの定義を書かなくて済むようになるだけで、 x.getXxx() が x.xxx と書ける訳じゃないと思う。そこまで気が利くとは思えん。 >>36 その例は「制御構造」とはいわないのでは?いうのかな? >>40 はげどう。JSONサポートならほしいけど、XMLサポートはいらね。 >>43 うおー超はげどう。ヒアドキュメントはだれも要求しないのか?
47 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 04:46:50 ] >>46 いや、 x.xxxだったらpublicのフィールドあったときかぶっちゃうじゃない記法www
48 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 05:48:38 ] >>47 publicのフィールドがあればそっちをつかう、なければsetter/getterを使う、というルールでいいんじゃない? あるいは逆に、setter/getterがあればそれをつかい、なければフィールドを探すか。 どっちにしろ、どうルールを決めるかの問題。 いらないけどね。 それより、配列や文字列の長さをELからも参照できるようになってほしい。 str.getLength()じゃなくてstr.length()だから、ELからはstr.lengthとは参照できない。 関数使わなきゃいけないのなんてかっこわるい。全然オブジェクト指向じゃない。
49 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 08:55:32 ] シンタックスシュガーでいいのでは? だからべつにgetやsetをかくと重複していますというエラーがでればいい isをどうするかは今でも同じ話だしな 互換性を考えればコレしかないかと どのみちIDEの機能で意識はしてないけど、プロパティ扱いでまとめてくれると見やすいからね 折りたためるようになってくれればいい
50 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 09:32:17 ] >>36 その例は「レキシカル」クロージャの有益な例にはなってないよね。 クロージャの有益な例というだけで。 >>30 それは少し極端かな。両方の理由があった。 効率のいい実装、デバッグしやすい意味など。
51 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 09:45:30 ] >>48 そのlengthもプロパティで解決だね。 >>35 メソッドリファレンスは、 単純な(doAction()のみなど)Listenerを設定する時に、 extends 〜Listenerなクラスを定義しなくても、 既存のクラスのメソッドをそのまま指定できるんでしょ、たぶん。 C++でいうところのstd::mem_fun_refじゃないかと。 boost::signalsと一緒に使ったりする。
52 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 11:16:08 ] >>40 そいで for (XML d : test.dataset[0].key) { System.out.println(d.key.value); } とかアクセスできたらまんまE4Xじゃないか。俺的には超OK。
53 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 11:59:47 ] >>50 36だけど、例として挙げたプログラムだと、レキシカルクロージャの特徴で あるキャプチャされた変数が無限の寿命を持つという点を生かしてない という話かな?確かにその通りではあるんだけど、それを生かしたプログラムは、 Schemeではよく出てくるけど、C#ではオブジェクトがあればほとんどの場合、 代用できてしまうので微妙かなと思う。
54 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 12:02:43 ] >>52 その例を見て思ったんだが、もしかして、プロパティの導入目的は、 言語レベルでのXMLのサポートを、より効果的に行うためなのかも。
55 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 13:00:54 ] >>53 そう。あとdynamic bindingでも、lexical bindingでも同じ意味。 Schemeのようなクロージャは強力すぎるけど、 C++の式テンプレートくらいの機能は欲しいなあ。 C#の匿名メソッドは、>>12 のページにあるように、 引数に与えられた式を使ってクラスを定義するみたいだから、 変数や関数の参照は、名前呼び出し風って事になるのかな。ちょっと使いにくそう。 > オブジェクトがあればほとんどの場合、代用できてしまう まさに式テンプレートですね。 Javaに式テンプレート入れると、型システムのルールが、 クロージャの引き数のところだけ変わるから無理そうだけれども…
56 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 15:32:18 ] >>55 >そう。あとdynamic bindingでも、lexical bindingでも同じ意味。 確かにそうだね。というわけで、dynamic bindingじゃできない例を作ってみた。 クロージャの話でよく出てくる古典的な例なので、またかよって思うかもしれんが、 そこは見逃してくれるとありがたい。Converterってのは、.NET Framework 2.0 で入ったdelegate型で、ある型を受け取って別の型(同じ型でもいいけど)を返す メソッドを表す型ね。 using System; class TestLexicalClosure { /* カウンタを作って返すメソッド */ static Converter<int, int> Counter(int start){ return delegate(int n){ return start += n; }; } static void Main(string[] args){ Converter<int, int> counter = Counter(0); //カウンタを作る Console.WriteLine(counter1(1)); // => 1が表示される Console.WriteLine(counter1(2)); // => 3が表示される } } > 引数に与えられた式を使ってクラスを定義するみたいだから、 > 変数や関数の参照は、名前呼び出し風って事になるのかな。ちょっと使いにくそう。 これは意味がよくわからなかった。もうちょっと詳しく言ってくれるとありがたい。
57 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 15:34:32 ] ミスった。counter1って書いてあるところは、counterの間違い。
58 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 16:49:51 ] もう、マクロでよくね?
59 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 17:32:29 ] >>56 class TestLexicalClosure { int _start; /* カウンタを作って返すメソッド */ static Converter<int, int> Counter(int start){ _start = start; return delegate(int n){ return _start += n; }; } じゃなくてもいいの? blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx ant0x.udap.jp/material/mat_AnonymousMethod.htm www.divakk.co.jp/blog/aoyagi/archive/2005/10/27/7038.aspx とか読むとめまいしてくるんだけど… 結論としてはC#のanonymous methodと同じものならJavaにはいらない。
60 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 17:57:00 ] >>59 55のコードで大丈夫。実行して、ちゃんと動作することも確認した。 あと、59のコードだと、複数のCounter()を複数回呼んで、複数個の カウンタを作っても、カウンタの値が共有されてしまうので、まずい。 ポイントは、匿名デリゲートから参照されている外側のローカル変数は、 それが宣言されたスコープを抜けても生きているということ。 >とか読むとめまいしてくるんだけど… >結論としてはC#のanonymous methodと同じものならJavaにはいらない。 俺はむしろC#のanonymous method的な振る舞いじゃないと嫌だなあ。 あと、anonymous method(というかクロージャ)の振る舞いに関して、 どの辺がめまいがすると感じた?
61 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 18:39:43 ] あのコードみて問題ないと感じるのがすごいな なぜそうなるかは実装側の都合という状態
62 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 18:43:16 ] 一番内側のブロックがクラスに変換されるの? > 匿名メソッド@C# >>59 の二つ目のページ読むとそんな感じなんだが。 >>56 では、Counter()が一番内側のブロックだから、 引数は変換されたクラスのメンバ変数になるってこと?
63 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 20:30:15 ] >>61 >>59 の3番目のリンク先は、仕様書のバグということで問題だと 思うが、1番目と2番目のリンク先の挙動は、本当に問題無いよ。 実装側の都合でそうなっていると勘違いしているようだけど、 レキシカルクロージャになるように匿名delegateを実装したら そのような実装になったというだけのこと。あと、1番目のリンク先 の人はレキシカルクロージャという概念を勘違いしてて、コメント 欄で突っ込まれまくってる。 >>62 実装としては、一番内側のブロックが…とかいうのではなく、匿名 デリゲートから匿名デリゲートの外側のローカル変数を参照していた 場合、参照されている変数をメンバ変数として持つクラスが生成される ということ。
64 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 20:37:29 ] >>63 いや、なぜそうなるか、は昔からいわれてたけど それが本当に書く人が理解でき照るかというのとは別だと思う 書いた本人ならまだしも、他人のコードをさらっと斜め読みして 結果を予想できるかという割れると厳しいかも
65 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 20:45:13 ] >>64 > それが本当に書く人が理解でき照るかというのとは別だと思う それは確かにその通りだけど、このスレではなんか、匿名delegateの セマンティクスが実装の都合だという風に誤解されてるようなので、 それは違うんだと言いたかった。 > 書いた本人ならまだしも、他人のコードをさらっと斜め読みして > 結果を予想できるかという割れると厳しいかも レキシカルクロージャという概念に馴染みの無いユーザが驚く可能性は あるかもしれないけど、よっぽどトリッキーな使い方をしてない限り、 どう動くかというのは、簡単に予想できるんじゃないかなあ。
66 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:19:49 ] 二つ目のページで、 static D[] F() { D[] result = new D[3]; int x; for (int i = 0; i < 3; i++) { int y = i * 2; x = i * 2; result[i] = delegate { Console.WriteLine(x + y); }; } return result; } だと、[4 6 8](=[0 2 4]+[4 4 4])なんだろ? 変換結果のILはどうなるんだ? メソッドb__0()は、xとyをどうやってaccessするんだ? 別のインスタンス内にあるはずだが…(宣言のある場所で閉じ込めるインスタンス生成) それとも「一番内側の」ブロックで生成するインスタンスに全部含めるのか? そうすると[8 8 8]か?
67 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 21:48:53 ] delegate自体C#の構文はよくないねぇ
68 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:27:16 ] >>66 ILを含めると長くなるので、その辺は省略して、宣言だけ示すと、大体こんな感じになる。 DisplayClass3のフィールドとして、DisplayClass1のフィールドを持っているので、b__0(匿名 デリゲートのコード本体)からはxとy両方にアクセスできる。 class <>c__DisplayClass1 { public int x; } class <>c__DisplayClass3 { public DisplayClass1 <>8__locals2; public int y; void <F>b__0(){/* 匿名デリゲートの中身が入る */} } というわけで、結果は[4 6 8]で正しい
69 名前:デフォルトの名無しさん mailto:sage [2006/05/20(土) 22:36:35 ] 苦労じゃなんて使うんかい
70 名前:デフォルトの名無しさん mailto:sage [2006/05/21(日) 03:36:44 ] おればかだから>>12 ,27,33,36の話がよくわかんなくて、groovyでコード >>12 の参照先とほぼ同じ書いてみてやっと分かった。 def closures = [] for( i in 0..10) { closures[i] = { println i } } for( c in closures) { c() } 結果は同じように10がずらっと表示された。 これは、closuresに入っている各クロージャは、クロージャ外側の変数 i に そのままアクセスできるわけだけど、実際に実行されるc()の段階では、 i は既に10になっちゃってるから、これがずらっと表示されると考えて やっとしっくりきた。 >>56 は def makeCounter( start) { return { n -> return start += n } } def closure = makeCounter(0) println( closure(1)) println( closure(2)) ってな感じなんで、つまりクロージャから参照された変数 start は、変数自体がスコープを 越えてもクロージャ内では普通につかえるし、クロージャがある限り存在しつづける、と。 インナークラスがエンクロージングクラスのインスタンス変数にアクセスできるようなもん だけど、クロージャにはクロージャのスコープがあるので、一度クロージャが使った変数は クロージャ内で存在し続ける、ということか。
71 名前:70 mailto:sage [2006/05/21(日) 03:37:53 ] groovyでコード>>12 の参照先とほぼ同じ書いてみて ↓ groovyで>>12 の参照先とほぼ同じコード書いてみて
72 名前:デフォルトの名無しさん mailto:sage [2006/05/22(月) 23:01:22 ] んで、結局Dolphinで対応されるのは どういう機能なわけ。まだ曖昧にも決定してない?クロージャって単語だけが歩いてる?
73 名前:デフォルトの名無しさん [2006/05/23(火) 03:13:41 ] 匿名クラスのシンタックスシュガーには間違いなさそうだな。
74 名前:デフォルトの名無しさん mailto:sage [2006/05/25(木) 06:26:42 ] 嬉しい誤算発見 JavaでのサブピクセルAAレンダリングはJavaのレンダリング使うからか リモートデスクトップ経由でも有効だね ピクセルの構成が一致してないとつらいとは思うが
75 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 01:39:14 ] プロパティマンセー obj.setWidth(obj.getWidth() + 1)) なんて書かなくてもよくなりてぇえええ
76 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 04:15:52 ] じゃ、 obs.width = obj.width +1 ; になるわけか・・・・ なんか、VBのProcedureみたい。(VB4の知識で書いてます悪しからず)
77 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 06:14:57 ] >>75 ,76 ほんとにそうなるの? おれはgetter/setterの定義を書かなくて済むようになるだけだと思ってた。 ソースきぼん。
78 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 08:33:46 ] >>77 むしろそっちがソースキボン。 getter/setter だけなんて、中途半端じゃん。
79 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 09:09:56 ] >>78 いや、ソースはない。「プロパティがサポートされる」と聞いて、どうせgetter/setterが自動生成される程度で、getXxx()/setXxx()は使わないといけないのだろうと思った。それだけ。
80 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 13:25:01 ] >>79 getter/setterの定義よりも、それらにアクセスするコードを書く回数の方が 圧倒的に多いので、getter/setter自動生成だけだと、新しい言語機構を 導入するメリットが少なすぎる。だから、たぶんアクセスするときの便宜も 図られるんじゃないかなあ。
81 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 13:54:31 ] こんなんもいけるんかのう? obs.width++;
82 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 15:16:13 ] >>78 ライトアクセスとリードアクセスを区別して grep できないのはやだなぁ。
83 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 18:35:27 ] >>82 呼び出し階層の検索でいけるんじゃないの? たぶん。 あ、ごめん、これはEclipseの話だな。。。
84 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 23:12:33 ] とはいえピリオドでやっちまうとメンバ変数のwidthとgetWidthメソッドとの判断が難しいよな obs@widthとかobs->widthとかなんか特殊な構文が追加なのかも getsetかかせるよりはいいけどね
85 名前:デフォルトの名無しさん mailto:sage [2006/05/26(金) 23:26:41 ] >>84 C/C++ で使われてる -> よりは @ に賛成。 Character.isJavaIdentifierStart('@') も false 返すみたいだし、 やろうと思えばできるのかな? あと、JSR 295 見ると、converter や validator 使って何かやるみたいね? obs@width = "120"; とかやると勝手に StringToIntegerConverter を 使ったコードを挿入してくれるのかな? とか妄想してみる。
86 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 00:14:26 ] 245なんかのProperty Resolver APIが言語に入るんでしょ。 operator.のoverload。 Property Binding API, Method Biding APIなんかも。
87 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 11:49:33 ] >>80 Javaにそんな気の利いたことを望んではいけない。 ヒアドキュメントすらない言語だ、「互換性」を楯にして、最小限の使用追加だけですませるだろう。 しかしほんとに後付けの機能がふえるよな。もうぜんぜんシンプルな言語じゃなくなった。
88 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 11:58:45 ] プロパティに関しても1.1での後付考えかただし1.0はアルファ品質だったしな それでもプロパティはEODでは? 用意するほうはIDEがやってくれるけど使うほうが原始的杉 Genericsは開発効率がよくなりバグが大幅に減るすばらしいものだが 落ちこぼれるやつが多数いる この程度でおちこぼれるのならそいつはこの業種向いてないとは思うのだが ひとつの判断材料にはなるかも lockはsynchronizedのように専用構文がないと厳しいような なんでもそうだが資源解法でfinallyあてにするのは苦しいよな
89 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:01:11 ] いますでにgetXXX, setXXXの存在を前提として作られているフレームワークが やまほどあるので、基本的にはシンタックスシュガーになるんだろうな。 obj.prop = xxx とか書くにしても、バイトコード上では setProp(xxx)になってるとか。
90 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:07:39 ] そりゃそうだろ
91 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 12:21:18 ] >>88 俺はC++も好きなタイプなので、 Javaの言語領域で機能増えるのは嬉しい気持ちもある反面、 やりすぎて失敗しないのを祈りたい気持ち。 既に十分複雑だからね。抱えているプログラマ層を考えると。
92 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 13:03:03 ] Perlがあんだけ使われてるのみると、記号が増える分には問題なさそうだ。
93 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 13:36:50 ] ヒアドキュメントって、国際化対応とかどうするの?
94 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 17:59:29 ] それでなくても、ヒアドキュメントなんか、めったに使わないからな。 めったに使わないもののためにコンパイラ作りにくくすることもない。
95 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 19:15:47 ] ヒアドキュメントはあかんでしょ なんでヒアドキュメントかっていうと基本的に書く側の都合じゃない そこに書きたいっていう。 視認性は悪くなるし文法なんて無茶苦茶。 あれを使いたくなる理由は、簡易テンプレートエンジンとして使えるからだと思うんだけど テンプレート処理がしたいんだったらIDEとか開発ツールのアシストで 何とかなると思うんですけどね。 ScriptingAPIと同じ扱いでいいんじゃないかと思う。 あれも構造が類推できないスクリプト言語がソースにヒアドキュメント形式で生で埋め込まれてたらと思うとぞっとする・・・
96 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 19:54:22 ] >>94 ちょっとまて、ヒアドキュメントごときでなんでコンパイラが作りにくくなるのだ? あんなの、字句解析部をちょこっといじれば済む機能だぞ。 おまえ、コンパイラの作り方もわかってないだろ。 >>95 ヒアドキュメントで済むことをIDEとか開発ツールのアシストを使わなきゃいけないということに疑問をもたないのか。 HTMLページをまるごと埋め込むのならアホだけど、テストデータとその期待値を埋め込むのなら ヒアドキュメントはすごい便利なんだけど。 つーか、「そんな機能必要ない」「IDEのサポートがあれば十分」とかいってるやつらって、実際その機能が追加されたら「これはEoDを実現するすばらしい機能だ」とか言い出すんだろ。 Genericsだって、最初は「C++のテンプレートは複雑だから同じような機能はJavaには必要ない」とか揃っていってたくせに、いざ実装されるとみんなGenericsマンセーなんだよな。 プロパティだって、今までgetterとsetterはEclipseが自動生成してくれるから問題ないとか言ってたくせに、それが実装されると「これは便利だ」とか言い出すんだぜ、絶対。 Javaにない機能は「そんなの必要ない」と言い切り、実装されれば「すばらしい進化だ」と手のひらを返す。ほんと学習しねーよな。 >>93 なんで国際化が必要なん?ふつうにStringリテラルと同じ扱いでいいじゃん。
97 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 20:01:41 ] ヒアドキュメント作るとして、懸念があるとすれば改行記号の扱いぐらいかな?
98 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 20:02:14 ] >>96 だから当時「いらない」と言ってた人たちは恥ずかしくなって黙ってしまって、 今度は別の人が別の機能に「いらない」といってる、くらいの想像力はないのか? 実際まったく同じ人だったらキモイだろう。 ヒアドキュメントはあれば便利だと思う。 一方でコンパイルされたバイトコードの中(つまりはclassファイル)の中に そのヒアドキュメントの内容が埋め込まれるんだったらダサすぎなのでペケかな。
99 名前:デフォルトの名無しさん mailto:sage [2006/05/27(土) 20:04:24 ] >>96 > 最初は「C++のテンプレートは複雑だから同じような機能はJavaには必要ない」とか そんな阿呆な事言ってた奴は居るのか? 少なくとも俺は聞いたこと無いぞ。 erasure よりマシな実装方法もあったんじゃないの? って話なら結構聞いたけど。
100 名前:98 mailto:sage [2006/05/27(土) 20:07:46 ] あ、しかしまあ、String document = ""が自動生成されると考えると さほどヘンでもないか。 しかし一方で、ヒアドキュメントってドキュメント中に変数値を簡単に 埋め込めないとあまり使い道がないと思うんだがどうだろうね。 式言語っぽく${変数名}なんてのを採用すると、式言語パースが必要に なるかな。