デジタルちんぶろぐ

デジタルな話題

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

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

「C++言語のカラクリ」全部読みました。意外だったのは座談会でみなさんがC++よりも先にC/アセンブラをやるべきだと言っている事。

僕は「今時なんだからC++から入ればいーじゃん」って思うわけです。何故かというと、文字列連結が'+'で出来るから。ついでに言うと配列よりvectorの方がラクだし。

C/C++の関係で言えばC++はCのスーパーセットでもあるわけだから、C++を先にやった人がCに行くと「何でこれが出来ないの?」というストレスを感じることはあっても、それで全く組めなくなるなんて事はないと思うわけです。

で、アセンブラですが、アセンブラをやるとポインタが理解し易くなるのは間違いないと思いますが、IDEでメモリダンプしながらプログラムをステップ実行させてメモリが書き換わるのを目視しても同じように理解できるんじゃないのかな?

やらなきゃいけない状況になれば勉強をせざるをえなくなるわけだし、入り口のハードルを高くしたらやる人減りますから。

投稿日時 : 2008年2月17日 22:45

コメント

# re: あえて反旗を翻す 2008/02/17 23:03 επιστημη
うん、それもアリ、つか大アリだと思ってます。
なんだけどぉ、ポインタからは逃れられないnativeの宿命を
背負ってるからメモリ・イメージを知らずには先に進めないわけで。
C/アセンブラを"先にやっとけ"は言いすぎだとは思ってますけども ^^;


# re: あえて反旗を翻す 2008/02/17 23:11 Ognac
C/Assemblerの有効性の差というより、思い入れというか経験値で左右される気もします。
私らの年代(?) はハンドアセンブラから入った人はCの便利さに魅了され、C++が登場したときは Assember/Cの発想でC++ を理解しようとしました。
しかし、逆にCの知識が足枷になって、Object志向の理解の妨げになった人も多数いました。
 今も、「Object志向はアセンブラ/Cのポインターと一緒だ」と認識し、そのレベルで認識しようとする人がいまする(object志向をCombiler/実装レベルで理解しようとしています。)
その面からみると、Assember/C の知識を発展できる人とできない人がいるので、勉強すべきか否かは断言できないだけに難しいものです。
これから学ぶ人は C++から入って、Compilerの実装レベルに興味がある人がC/Assemblerを勉強するのが吉かと。その知識が不必要な人もいるでしょうし。


# re: あえて反旗を翻す 2008/02/17 23:12 シャノン
メモリイメージを習得するには、必ずしもアセンブラを必要としませんよね。
ただ、Cはやっといた方がいいと思います。
ライブラリは別として、言語機能はとってもシンプルだから。
プログラミング一般とオブジェクト指向を同時に習得するのはちっとハードルが高いと思います。

# re: あえて反旗を翻す 2008/02/17 23:37 スーパーあんどちん
>> επιστημηさん
それを隠すために参照が導入されたりしたものだと思っているので。
# 認識が間違ってたら勉強不足です。すいません。
知らずに済ませられるものは出来るだけ先送りの方向で考えたいです。

>> Ognacさん
思い入れはかなり影響しますね。
僕も最初の仕事はアセンブラ+Cで、その頃のCコンパイラは最適化がショボかったので、高速な処理が必要な部分は殆どアセンブラでした。でも、そのおかげでポインタで躓く事も無かったし、Cコンパイラの吐いたアセンブラソースのおかげでCの勉強が出来たという部分もあります。
Ognacさんのお話とちょっと違いますが、Cを長くやっている古い人は結構「C++=オブジェクト指向」って思っている人もいて、且つ「C++は重い」、「Cでも出来るでしょ」って言ってC++を排除する傾向もあるような(少なくとも僕の経験ではそうでした)。

>> シャノンさん
Cも結構複雑だと思います。関数ポインタの宣言とか何時も悩むし(記憶力悪いもんで)。



# re: あえて反旗を翻す 2008/02/18 0:07 επιστημη
> それを隠すために参照が導入されたりしたものだと思っているので。
うーん...副次的効果でポインタが隠れますけど、隠すのが目的ではないように思えます。
参照は"組み込み型とまったく同じように見せかけたいがため"そして"無駄なオーバーヘッドを抑えんがため"じゃないかなーと。

すげーでかいクラス x, y;
y = f(x); // ここでx,yを値渡しされちゃかなわんぜー, f(&x)だとカコイクナイし


# re: あえて反旗を翻す 2008/02/18 0:16 επιστημη
ちょっとチョンボ。
y = f(x); // ここでxを値渡しされちゃかなわんぜー
「 f(&x)だとカコイクナイし」はポインタを隠すため、ですね ^^;

座談会でも言及してますが、動的束縛の実装のカラクリとして参照(=ポインタ)が用いられてるわけだし、ポリモーフィックなインスタンスの集合となるとポインタ抜きには表現できないんですよね。

class 動物 { public: virtual void 鳴く() =0; };
vector<動物*> 動物園;

動物園の全要素に鳴くを適用するわけですが、
ここで vector<動物&> とは宣言できんです。


# re: あえて反旗を翻す 2008/02/18 0:30 スーパーあんどちん
>> επιστημηさん
ちょっと軽率に返事を書いてしまいました。仰るとおりだと思います。
確かに副次的効果でポインタを隠すことが出来るっていうレベルなんでしょうね。
言われるとおりvector<参照>出来ないですから。
# こういうところで理解の浅さを露呈する。


# re: あえて反旗を翻す 2008/02/18 1:56 επιστημη
> しかし、逆にCの知識が足枷になって、Object志向の理解の妨げになった人も多数いました。

それはすっごくわかるです。
C/アセンブラを"なーにも知らない"あるいは"すっげー知ってる"ヒトは
C++/オブジェクト指向がすんなり理解できるみたい。
なまじ中途半端に知ってるとそっち方面にひきずられて
"なんちゃってC++"から先に進めないポ。って感じます。


# re: あえて反旗を翻す 2008/02/18 3:20 RAPT
アセンブラは必要になってからでいいと思うけども、
C は先にやっていた方が一度に覚えるべき構文が少なくていいかと。

C++ で普通にできて、C で素直にできないことを無理やり C でどーこーする
ような作業に関しては、とっとと C++ やったほうがいいとも思いますが。。

あと、VC とかだと IDE の操作ってゆー壁も存在してますわな。


# re: あえて反旗を翻す 2008/02/18 7:33 ひろえむ
なんか、私の発言ですね。お騒がせしているのは。 すんませんm(__)m

まぁ、結構あのあたりは物議を醸すかなとも思って印端ですが(^^;

んー、ただ、アセンブラ・Cをやったほうがいいというのは、やらなくてはいけないってことではなくて、他の方法で、それらの意味(ポインタ動作など)を習得する術があるのであれば、別にいきなりC++でもいいんじゃないかなと私も思います。

ただ、C++の挙動を理解する1つの方法として、C・アセンブラの習得というのは無意味だとは思わないんですよね(^^; 

επιστημηさんも既に書かれているようにポインタを始めとして、構造体・共用体・クラス・多態性などなどの挙動を理解するのに非常に役立てるように思います。

座談会でも話したかもしれませんが、人間って自分の知っているものごとに関連づけて考えると非常に理解が早いそうです。 なので、アセンブラの簡単な挙動からCを理解し、それからC++と進むのは非常に楽なんですよね(^^;

それに、それ以外で習得する方法のほうが大変そうだなあと思うワケです。 非常にオーバーヘッドの大きい方法なのはわかるのですが、そうやって習得したほうが楽だったなあって感じですね。

なので、他の方法でもC++の習得までの最短距離を出せる方法があるなら、もちろんその方がいいと思います。

ただ、メモリ空間などの挙動を理解する簡単な方法がアセンブラ->C->C++という流れかなあと思ったのでそうお話しました(^^;

# re: あえて反旗を翻す 2008/02/18 8:57 アキラ
まだ座談会の途中までしか読んでないですが
今のとこスーパーあんどちんさんに同意です。

ちなみに私はC++からプログラミングを始めました。

# re: あえて反旗を翻す 2008/02/18 11:19 RAPT
アセンブラからだと理解しやすいというのは、座談会にいた人たちの多くは、<del>古い</del><ins>経験が長い</ins>人たちばかりだったからかもしれませんね。
σ(^^) は C でアドレスのイメージを理解しましたが、その辺のところが感覚的に理解できる(または理解しなくても書ける)人なら、それはそれでいいのかもしれません。

# re: あえて反旗を翻す 2008/02/18 11:54 ひろえむ
んー、まぁ、古い人間なのは否定しませんがw

でも、スーパーあんどちんさんの示す方法が最短距離かというと・・・ちょっと疑問が残ります。

そういったところをIDEでメモリの動作とポインタの動作をトラッキングして・・・・という方法そのものを気がつかないのでしょうか?

示されている方法ですと、既にポインタ等の挙動やメモリの動作について理解している人が、アセンブラ・Cで習得した方法を別の方法で示しているだけで、通常、初心者がその方法へたどりつくスキルパスは近くに知っている人が1対1で教えてくれているという方法以外では偶然誰かに聞いたとかじゃないとなかなか難しいと思いますがどうでしょう?(^^;

たぶん、他の構造体などを理解するのも、別の方法をひっぱってくることになるのではないでしょうか? 

都度用意するなら、はじめからCやアセンブラなどの動きを理解したほうが速そうな気がするのは私だけでしょうか?(^^;

# re: あえて反旗を翻す 2008/02/18 11:54 ひろえむ
んー、まぁ、古い人間なのは否定しませんがw

でも、スーパーあんどちんさんの示す方法が最短距離かというと・・・ちょっと疑問が残ります。

そういったところをIDEでメモリの動作とポインタの動作をトラッキングして・・・・という方法そのものを気がつかないのでしょうか?

示されている方法ですと、既にポインタ等の挙動やメモリの動作について理解している人が、アセンブラ・Cで習得した方法を別の方法で示しているだけで、通常、初心者がその方法へたどりつくスキルパスは近くに知っている人が1対1で教えてくれているという方法以外では偶然誰かに聞いたとかじゃないとなかなか難しいと思いますがどうでしょう?(^^;

たぶん、他の構造体などを理解するのも、別の方法をひっぱってくることになるのではないでしょうか? 

都度用意するなら、はじめからCやアセンブラなどの動きを理解したほうが速そうな気がするのは私だけでしょうか?(^^;

# re: あえて反旗を翻す 2008/02/18 13:33 スーパーあんどちん
アドエスでいっぱい書いてSubmitしたのに反映されてない。
おうちに帰ってからコメントします。


# re: あえて反旗を翻す 2008/02/18 13:39 Chuki
微妙に突っかかってみる^^;

>何故かというと、文字列連結が'+'で出来るから。

このあたり、自分でメモリ空間をパチってきて放り込むもんだと思ってる人と、とりあえず文字列宣言してくっつければ...と思う人では結構言語の使いまわしというか、発展性に大きく差が出そう。
#JavaとかでStrignクラスを使ってゴッツい文字連結のループとか平気で書いてくるような人が出来上がるような...
#まぁ、最近のオプティマイザは賢いから、という議論もあるわけですが^^;

>やらなきゃいけない状況になれば勉強をせざるをえなくなるわけだし、入り口のハードルを高くしたらやる人減りますから。
 この、「やらなきゃいけない状況」のときって、まわりが大いに迷惑しちゃうから、あらかじめ知ってて欲しいなぁ、なんて思ったりするわけです^^;
#VBしかやんない、とかであれば別にいいのですが^^;

当該の本は C言語ではなく、C++言語を先に習った人にぜひ読んで欲しいなぁなんて思っています。その理由は、C++だけだとあまり気にしない「何故!?」がわかるからです。
#CやアセンブラからC++に入った人がなんとなく通った道が書いてあって面白かった、というのが私の感想です。

え?わたし? 「今の時代だからC#とかJavaから入ればいいんじゃない?でも、基本情報とかの資格はJavaじゃなくてCかアセンブラで受けてね」だったりします^^;
理由:業務アプリの会社にいるため、とりあえず、早く稼げるようになるのはC#やJavaのほうが近道だから。でも、なぜこんな言語仕様になったのかを理解するため元になった言語も知っていて欲しい。でないとゴッツいコードかいてくるから...orz



# re: あえて反旗を翻す 2008/02/18 13:40 Chuki
>アドエスでいっぱい書いてSubmitしたのに反映されてない。
そういえば、ここのコメントって文字制限ありましたね^^;


# re: あえて反旗を翻す 2008/02/18 22:30 スーパーあんどちん
本人不在で(の方が)盛り上がるのに少し悲しさを覚えるわけですが…職場では書き込みできないもんで。

この辺の感覚の違いって言うのは「仕事として」考えるか「お勉強として」考えるかによっても違ってくると思うわけです。

僕は仕事とか関係なく「ちょっとやってみよう」と思ったときには簡単なところから入らないとへこたれるので、自分の感覚でああ書いたわけです。
それから、僕は知識が多いことが問題になるとは思っていないし、C++を深く知ろうと思えばCやアセンブラ(というかCPUの動作かな)の知識はいつか必要になるだろうと思います。ただそれを最初に持ってくる必要は無い。必要になった時でいいんじゃないの?って事です。
皆さん同意されていた事だと思うのですが、C++は「オブジェクト指向」、「ジェネリック」、「構造化」そしてダラダラ書くこともできる言語なわけで、その中で自分が理解できるところから徐々に理解を深めていくという方法もまぁアリでいいんじゃないかと。勿論それがC++を学習する最短距離だとは思ってません。
επιστημηさんが言われていたように理解するのに5年以上かかる言語であるならば、それくらいの感覚で付き合わないとへこたれます(僕は)。





# re: あえて反旗を翻す 2008/02/18 22:39 スーパーあんどちん
で、C/アセンブラの知識ですが、ポインタに絞って言うと、IDEでメモリを見る云々に関してはひろえむさんの仰るとおり、近くに知っている人が居るorそのことが書かれている書籍なりWebサイトを見るなりしないと難しいでしょうね。ここら辺は現在の自分の感覚で書いちゃいました。
RAPTさんが仰るようにIDEの操作も壁になりますよね。

ところで、PCで簡単にアセンブラのお勉強というとx86になるのかな?僕はx86のアセンブラは簡単とは思えないんです。僕が簡単だと思うのはCISCでレジスタに癖が無くそこそこレジスタの数が多いものなので。68000とか。
# ただ68000はビッグエンディアンだし、ソースとデスティネーションがx86と逆なのがね
CASLでも良いと思いますが、情報処理受けたのが20年近く前なので今のCASLがその当時と同じものなのかどうか知りません。それにこの世に実在しないCPUだしアドレスがワード単位で増えるってのも馴染めない。
# それはともかく僕はワード=16ビットだと思っているけど地方(?)によっては32ビットだったりもする。



# re: あえて反旗を翻す 2008/02/18 22:48 スーパーあんどちん
で、Chukiさんに突っかかられたことに関してですが、
先ず、僕が「仕事として」考えていない時点で話がずれますね。
# 最初に書いとけば良かった。

Chukiさんが書かれていることに関しては、C++/Cだけに限らず色々な言語を経験していると自ずと想像できる内容だったりしませんか?初めてプログラミングの仕事をする人だと、どの言語でも該当するような気がしますが。

あと、仕事だと予習する時間も無く「やらなきゃなんない」状況になることけっこうありますよね。新人・ベテランとか関係なく。

それを見越して普段から勉強しておくべきと言われるのは同意ですが、中々…

# re: あえて反旗を翻す 2008/02/18 23:49 ちゅき(私の読書感想文≒チラシの裏)
>先ず、僕が「仕事として」考えていない時点で話がずれますね。
なるほど。了解っす^^

>C++/Cだけに限らず色々な言語を経験していると自ずと想像できる内容だったりしませんか?
 はい^^。ただ、その基礎がやはりアセンブラやCなので知ってて欲しいなぁ、程度のことです。
#そんなのを知らなくても組めるようにするのが、最近の言語の良い所なんでしょうけれどもね^^;

##釈迦に説法申し訳ないっすm(_ _)m

たぶん、組み込み系アプリやってる人から見て、業務系アプリを書いている人のメモリの使い方見ると眩暈起こしてひっくり返るかも^^;


# re: あえて反旗を翻す 2008/02/19 0:02 スーパーあんどちん
>C++/Cだけに限らず色々な言語を経験していると自ずと想像できる内容だったりしませんか?
> はい^^。ただ、その基礎がやはりアセンブラやCなので知ってて欲しいなぁ、程度のことです。
> #そんなのを知らなくても組めるようにするのが、最近の言語の良い所なんでしょうけれどもね^^;
そういう意味の基礎って言うとCも外れますね。結局アセンブラになっちゃう。
ちゃぶ台ひっくり返すようですが、僕だってアセンブラ(ってかCPUの動作の基本的な部分)は知ってた方がいいと思いますよ。

> ##釈迦に説法申し訳ないっすm(_ _)m
でもないです。生来の勉強嫌いで知識は浅いですから。

> たぶん、組み込み系アプリやってる人から見て、業務系アプリを書いている人のメモリの使い方見ると眩暈起こしてひっくり返るかも^^;
僕がやってたのはアプリより主にドライバーだったりするから更にかな。
でも、Case by Caseなので、有り余るメモリを存分に使ったプログラムも状況によってはアリなんじゃないですか?
僕だってPCでツール作るときなんてメモリのことなんて気にしないで組みますから。



# re: あえて反旗を翻す 2008/02/19 7:20 ひろえむ
#スーパーあんどちんさん

>僕は仕事とか関係なく「ちょっとやってみよう」と思ったときには簡単なところから入らないとへこたれるので、自分の感覚でああ書いたわけです。
>それから、僕は知識が多いことが問題になるとは思っていないし、C++を深く知ろうと思えばCやアセンブラ(というかCPUの動作かな)の知識はいつか必要になるだろうと思います。ただそれを最初に持ってくる必要は無い。必要になった時でいいんじゃないの?って事です。

あーなるほど。 それなら私も同意です(^^)
でも、やっぱりCでつっかかったのと同じ部分でもつっかかるだろうなぁと思うんですよねー(^^;

>ところで、PCで簡単にアセンブラのお勉強というとx86になるのかな?僕はx86のアセンブラは簡単とは思えないんです。僕が簡単だと思うのはCISCでレジスタに癖が無くそこそこレジスタの数が多いものなので。68000とか。

んー、まぁ、アセンブラで動作するものということであれば、そういうことになるのかと思いますが、アセンブラが必要だなと思うのはメモリ空間やそれらを操作する方法意識することが目的なので、がっつり本物じゃなくてもいいと思います。 CASL(今はちゃうのかな?(^^;)みたいなものでもいいし、エミュレーターで動くちっこいものでも十分だと思います(^^;

ただ、x86系はどこかで使う機会もあるかもしれませんね(^^;

私には今のところその機会はないのですが(^^;;;

# re: あえて反旗を翻す 2008/02/19 8:46 スーパーあんどちん
同意を得られたみたいでほっとしてます。
DLLが遅延ローディングされるんだから知識もレートバインディングされてもいいかなっと。
結局覚えなきゃ先には行けないわけだし。


# re: あえて反旗を翻す 2008/02/19 11:46 Chuki
>でも、Case by Caseなので、有り余るメモリを存分に使ったプログラムも状況によってはアリなんじゃないですか?
はい、ありかと。ただしちゃんと使うべき状況であることを理解されているという条件付ですが^^;
#自分ところの感想でも書きましたが、「適材適所」がわかるレベルになればなんでもアリかと。

##つっかかったのは、日ごろ安易な文字列連結にマジ泣かされしてるからだけっす^^;

# 遅ればせながら・・ 2008/02/19 18:12 myugaruの色々構想中・・・!
遅ればせながら・・

# 遅ればせながら・・ 2008/02/19 18:15 myugaruの色々構想中・・・!
遅ればせながら・・

# re: あえて反旗を翻す 2008/02/20 0:22 スーパーあんどちん
>> ちゅきさん
似たような経験は僕にもありますよ。わかります。

>> myugaruさん
C#は分からないんですが、がんばって読んでみました。


# 値と参照を知らない(Clearメソッドで、失敗する) 2008/02/20 13:14 Mr.Tの場所
値と参照を知らない(Clearメソッドで、失敗する)

# re: あえて反旗を翻す 2008/02/20 22:54 スーパーあんどちん
>>Mr.Tさん
VBはわからないです。
N88-BASICには参照なんてなかったし。


Post Feedback

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