myugaruの色々構想中・・・!

「C#」「画像処理」「XNA未対応PCでゲームIDE作りの無謀な野望」

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  98  : 記事  0  : コメント  542  : トラックバック  59

ニュース

myugaru
仕事(昔)=ヲタク系プログラマー~マスコミ系サポートデスク
仕事(今)=電子機器系サービス業
趣味a=パズルゲーム全般、シューティングは主に見学
趣味b=画像処理関係の勉強
趣味c=プログラミング言語の勉強
趣味d=アキバ系ヲタク
趣味e=芸能アイドル系ヲタク
d,e色の強いもう一つのブログ
最新目標=シューティングゲームを作る

わんくまりんく

わんくま同盟blog C#,VB.NET掲示板

ぶろぐつーる

あわせて読みたい

はてなりんぐ

書庫

日記カテゴリ

ギャラリ

お友達

リンク

今日やっとまとまってお小遣いを使えるチャンスがめぐってきたので。

念願のC++言語のカラクリ購入させてもらいました!><b

 

めっちゃ楽しみです。実は←でオヌヌメするとか言いつつまだ読んでなかったのはオイラだったのです・・;。

επιστημηさん、おゆるしくだされOTL

 

それに関連して、先日のスーパーあんどちんさんの「あえて反旗を翻す」という記事に今頃乗っかってみます。

たとえばC#から入ってみると、そこには全くポインター演算の無い世界が広がっています。・・・本当にそうなんでしょうか?

実際には言語上の怪しい・・・そうそれこそカラクリでもってそれは巧妙に隠されているだけですよね。それは参照型か値型かの違いとC#のマニュアルには書いてあります。その違いの把握ってのは、やっぱりポインターという概念の把握と全く同じことであって言葉上「ポインター」って単語が出てきていないに過ぎません。 そこを突き詰めるとアセンブラーやらCやらで色々と面倒だったことがC++やらC#やらで高級になって不要になったわけじゃなくて、やっぱり先人たちの最初に築き上げたコンピュータプログラミングの基盤というのはどれも形を変えて今も生き残っています。

そういうのをスマートに理解するには参照型たら値型たら言うよりもCとかアセンブラーをちょろっとやったほうが断然分かり良いと私には思えます。そういう私はアセンブラーはほぼ知らずですが一応C言語から入ったクチです。

果たしてC#から入って一切アセンブラー的な教育(しごき?洗礼??)を受けないで下のコードを参照だから、とか値だから、とかをどうやって頭に描いてるのかすごく興味を感じるところです。

using System;
namespace Console1
{
    class Class1
    {
        internal int N;
        public Class1(int n)
        {
            N = n;
        }
    }
    struct Struct1
    {
        internal int N;
        public Struct1(int n)
        {
            N = n;
        }
    }
    static class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Class1 ca = new Class1(10);
            Class1 cb = ca;
            cb.N++;
            Console.WriteLine("ca.n={0}, cb.n={1}", ca.N, cb.N);
            Struct1 sa = new Struct1(10);
            Struct1 sb = sa;
            sb.N++;
            Console.WriteLine("sa.n={0}, sb.n={1}", sa.N, sb.N);
        }
    }
}

上のコードの青い部分赤い部分は識別子の並び的には全くイコールの部分に見える。しかし結果は以下のように違う。 違いは”参照型”か”値型”かなのである。

投稿日時 : 2008年2月19日 18:12

コメント

# re: 遅ればせながら・・ 2008/02/19 22:17 ながせ
C言語も突き詰めてしまうとCRTとかになってしまったり。

私みたいな電気回路設計なんかを生業としていると、C言語より上っていのうのはまた別の世界だったりもします。
(一応趣味でC#もやっているんですが・・・)

自分のレイヤーから外の世界ってあまり気にしなくてもよいんじゃないかと私は思います。

# re: 遅ればせながら・・ 2008/02/19 23:10 myugaru
To ながせさん
正直に言うと今一生懸命コンピュータの事とか勉強とかしてる子見るとちょっぴり羨ましくなったりもしたのであります。自分もうちょっと勉強しとけばよかったなって・・・ちょっとだけ負け惜しみで偉そうなこと書いたというのもあるのであります。
コメントありがとうございます。

# re: 遅ればせながら・・ 2008/02/19 23:42 επιστημη
お買い上げありがとうございますぅ。

// メモリ・イメージを抜きにしてこのコードに
// 納得できるだろうか? なんちてー
class Parent { public string name; public Chind ボーズ; }
class Child { public string name; public Parent オヤヂ; }


# re: 遅ればせながら・・ 2008/02/19 23:54 myugaru
こんばんわ。επιστημη さん
著者降臨!!!
しょこたん本買ったってしょこたんからコメントなんてもらえないですもんね!
うーん、わんくま同盟だけのプレミアム特典ですね!
気合入れて読ませてもらいます。
おおそれは循環参照すねー。ナイス例題ありがとうございます。
コメントありがとうございました。


# re: 遅ればせながら・・ 2008/02/20 0:26 スーパーあんどちん
その文脈だと僕が「アセンブラとCを先にやるべき」と言っているみたいですが…
structとclassの違いってデフォルトがpublicかprivateだけじゃないの?
とか言ってみるテスト

# re: 遅ればせながら・・ 2008/02/20 1:02 myugaru
To スーパーあんどちんさん
すみません。ご挨拶もせずリンクも無断張りしてしまいました。
あとで訂正をいれさせてもらいます。
それと、C#の場合はclassとstructはCやC++のそれとは全く違った文法上の意味を持たされているのです。
C#では
・classは「ポインター」になる
・structは「実体」になる
のです。これは言語上ポインターを使いたいかどうかを宣言のclassやらstructやらのキーワードで使い分けろという一見無謀に見えるAnders Hejlsberg氏の考えた言語仕様なのであります。
上の例題はつまりC言語へ翻訳しますと
Class1 *ca = new Class1(10);
Class1 *cb = ca;
cb->N++;

Struct1 sa = new Struct1(10);
Struct1 sb = sa;
sb.N++;
みたいになっているのであります。なので結果が違っているのです。(上よくみていただくと結果が違うのが大事なのであります。)

# re: 遅ればせながら・・ 2008/02/20 6:45 スーパーあんどちん
挨拶とか無断張りとか気にしなくても良いですよ。
クラスと構造体の違いは実行結果見てわかってました。
デフォルトの違いってC++の話で、まぁ冗談と思ってもらえれば。


# re: 遅ればせながら・・ 2008/02/20 9:03 まさる
あれ~?なんでみんなAmazonですぐ届くの?
私2/6に注文したのに、まだ発送されないんですが(T T)

#と、参照型、値型には触れずに失礼・・・(^^;

# re: 遅ればせながら・・ 2008/02/20 10:40 Chuki

重版待ち来たー!アヒャ
#冗談っす>まさるさん。実現しそうな勢い!?>επιστημηさん



# re: 遅ればせながら・・ 2008/02/20 14:26 myugaru
To スーパーあんどちんさん
すみませんすみません、なんというか本当に余計な事書いてしまったかもしれません、すみませんでした。

# re: 遅ればせながら・・ 2008/02/21 2:25 NyaRuRu
わたしゃ N88 BASIC から入っていまは C# とか使ってますが,N88 BASIC で変数確保とかポインタとかで苦労した記憶はあんまりないですなぁ.

さて,確かに C# には C++ の知識があれば理解しやすい部分がありますが,逆に元々 C++ が苦手としていた分野のうち,新たに C# がカバーするようになった部分に,C++ 屋さんがなじみがないという理由であまり積極的に使われていないような印象を受けることもあります.

例えばアセンブラ時代に行われていたらしい,実行時プログラム生成するようなテクニックは,C++ が割と一掃してしまった感があります.
C++ ではその代わりに template を使ったコンパイル時メタプログラミングが流行りましたが,C# はこの辺が苦手です.
ただし reflection が使える C# では,実行時の reflection + generics という応用があるわけですが,元々 C++ 大好きという人はどうもこの方面がお気に召さないみたいなんですよね.元々 C++ 大好きという人は,なんかどうしてもコンパイル時メタプログラミングでやりたいという方が多いという印象を受けます.というか私が C# をさわり始めたころがまさにそんな使い方ばかりしていたわけですが.

最近の私と言えば,実行時に式木を動的生成して IL に変換するタイプのメタプログラミングに興味があって,DLR などで主に遊んでいます.これも言ってみれば,太古から受け継がれた先人達の知恵ですが,「これ面白いですよねー」と C++ 系の人に話しても今ひとつ受けが悪い気がするんですよね……気のせいでしょうか?

例えば以下で紹介されている "Fast Switching with LINQ" みたいなのは,私が C++ を主に使っていた時代には自分では思い付けなかったであろうプログラミングスタイルで,とても新鮮でした.
http://d.hatena.ne.jp/siokoshou/20070411#p1


# re: 遅ればせながら・・ 2008/02/21 2:35 NyaRuRu
(途中で送信しちゃったので続き)

というわけで,今更ながらに関数型言語やコンパイラの作り方系の本の教育(しごき?洗礼??) を受けながら,「実行時コード生成さいこー」とか「言語言語変換おもしれー」とか叫びつつ,LINQ や DLR で遊んでいる私です.

>やっぱり先人たちの最初に築き上げたコンピュータプログラミングの基盤というのはどれも形を変えて今も生き残っています。

ほんと同感です.

# re: 遅ればせながら・・ 2008/02/21 16:16 myugaru
To NyaRuRuさん
はじめまして。DirectXの勉強にNyaRuRuさんの記事がとても参考になって励みになっております。コメントありがとうございます。

>reflection が使える C# では,実行時の reflection + generics という応用があるわけですが,元々 C++ 大好きという人はどうもこの方面がお気に召さないみたいなんですよね.

リフレクションは素晴らしい発明だなあと私は感じました。でもC言語だったらコンパイルすると完全に消滅してしまうようなローカルスコープな変数名までも格納しちゃってる点は著作権的な部分で不安な人も多いのではないでしょうか?私が凡人だから何か大きな意図に気付いてないだけなのでしょうか。

>LINQ や DLR で遊んでいる私です.

私は自分のプログラミングでLINQの使い道を考えてたのですが、画像処理でビットマップのピクセル群の一部分にフィルターを掛けたりするのに使えそうかしら?とか漠然と思っています。動的言語はほとんどわからないです。でも最近話題も多いですし乗り遅れない程度には勉強しておこうかなと思います。


Post Feedback

タイトル
名前
Url:
コメント