- Rubyについて Part49
749 :デフォルトの名無しさん[sage]:2014/07/28(月) 20:45:02.50 ID:xAvZeiSh - やはり>>737が危惧したように、分かっていないのに
分かったつもりでいる馬鹿が何人かいるみたいだ >>739 > C++でいうテンプレートを使うと、 > いわゆるジェネリックプログラミングもメタプログラミングもできる C++ のテンプレートはコンパイル時に適用されるスマートなマクロ構文である 対してメタプログラミングは一般には実行時に適用されるものを指すから、 「C++でテンプレートを使うと、メタプログラミングもできる」という文章は間違い 正しくは「C++でテンプレートを使うと、テンプレートメタプログラミングができる」と書く > Javaのジェネリクスは、ジェネリックプログラミングに使えるが、 > 型消去が入るから原則的に実行時情報を利用するリフレクションとは組み合わせられない Javaの総称型(generics)は、クラス/メソッド定義時にデータ型を特定せず、 それを参照するコードに応じて決定するコンパイル時の機能(型多相ともいう) だからコンパイル終了時に型情報が消えるはずもないし、プログラム実行時には それをRTI(Runtime Type Information,実行時型情報) の API を介して自由に参照できる なお、この RTI は RMI 等におけるシリアライゼーションを目的に初期から導入されていたものだが、 それを一般のプログラマが使いやすいスタイルで包んだものをリフレクションと呼ぶようになった したがって「Javaのジェネリクスは、リフレクションとは組み合わせられない」も明らかな間違い
|
- Rubyについて Part49
750 :デフォルトの名無しさん[sage]:2014/07/28(月) 21:04:58.36 ID:xAvZeiSh - >>741
>>749 で書いたように、「静的型付け」言語における総称型を使った クラス/メソッド定義のデータ型は、コンパイル終了時には必ず決まる コンパイル時にはデータ型を決めず、実行時まで決定を送らせるやりかたは、 「動的型付け」と呼ばれる そして静的型付け言語で動的型付けを模倣する手法が、 たとえば C/C++ における(>>742 がレスした) void * になる >>745 > Windowsでメッセージ投げるときにLPARAMやWPARAMにキャストしてるはずだけど? > あれこそ総称型だろ? これも間違い(理由はすでに書いているので省略する) > そーいえばWindowsで「リフレクション」って別の意味で使われてるけどさ > あれもたいがいだよね、 英単語 reflection には、プログラミングでよく用いられる「自己反映」という意味とは別に、 一般的な「反射」という意味がある(写真の世界でいう「リフレクタ(反射鏡)」を憶い出そう) だから Win32 API でメッセージをそのまま送り返す動作を反射と呼ぶのは、 「日本語訳として紛らわしい」けど、英語としての意味では正しい(原文を読めば分かる)
|
- Rubyについて Part49
751 :デフォルトの名無しさん[sage]:2014/07/28(月) 21:20:25.76 ID:xAvZeiSh - >>746
Java における動的型付けは値のキャストと型情報のパラメタ渡しだけで実現できるから、 それは総称型(generics)が導入される以前から使われていた技法だ 総称型はコンパイル時における(=静的な)多相型付けのために導入された仕掛けであり、 総称型で動的型付けコードを書いても型安全性は保証されない したがって、総称型と動的型付けとごっちゃにすべきではない
|